]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ConsoleLogger.c
console logger - support disabling the console out.
[mirror_edk2.git] / ShellPkg / Application / Shell / ConsoleLogger.c
index 4b0d94d2452f1f07f0dd4ef8949fa885c2864a86..58518cabe94238afd230c1b172c6093fba06759e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Provides interface to shell console logger.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -39,51 +39,59 @@ ConsoleLoggerInstall(
   EFI_STATUS Status;\r
   ASSERT(ConsoleInfo != NULL);\r
 \r
-  *ConsoleInfo = AllocatePool(sizeof(CONSOLE_LOGGER_PRIVATE_DATA));\r
-  ASSERT(ConsoleInfo != NULL);\r
+  (*ConsoleInfo) = AllocateZeroPool(sizeof(CONSOLE_LOGGER_PRIVATE_DATA));\r
+  if ((*ConsoleInfo) == NULL) {\r
+    return (EFI_OUT_OF_RESOURCES);\r
+  }\r
 \r
-  (*ConsoleInfo)->Signature        = CONSOLE_LOGGER_PRIVATE_DATA_SIGNATURE;\r
-  (*ConsoleInfo)->OldConOut        = NULL;\r
-  (*ConsoleInfo)->OldConHandle     = NULL;\r
-  (*ConsoleInfo)->Buffer           = NULL;\r
-  (*ConsoleInfo)->BufferSize       = 0;\r
-  (*ConsoleInfo)->OriginalStartRow = 0;\r
-  (*ConsoleInfo)->CurrentStartRow  = 0;\r
-  (*ConsoleInfo)->RowsPerScreen    = 0;\r
-  (*ConsoleInfo)->ColsPerScreen    = 0;\r
-  (*ConsoleInfo)->Attributes       = NULL;\r
-  (*ConsoleInfo)->AttribSize       = 0;\r
-  (*ConsoleInfo)->ScreenCount      = ScreensToSave;\r
-  (*ConsoleInfo)->HistoryMode.MaxMode       = 1;\r
-  (*ConsoleInfo)->HistoryMode.Mode          = 0;\r
-  (*ConsoleInfo)->HistoryMode.Attribute     = 0;\r
-  (*ConsoleInfo)->HistoryMode.CursorColumn  = 0;\r
-  (*ConsoleInfo)->HistoryMode.CursorRow     = 0;\r
-  (*ConsoleInfo)->HistoryMode.CursorVisible = FALSE;\r
-  (*ConsoleInfo)->OurConOut.Reset           = ConsoleLoggerReset;\r
-  (*ConsoleInfo)->OurConOut.OutputString    = ConsoleLoggerOutputString;\r
-  (*ConsoleInfo)->OurConOut.TestString      = ConsoleLoggerTestString;\r
-  (*ConsoleInfo)->OurConOut.QueryMode       = ConsoleLoggerQueryMode;\r
-  (*ConsoleInfo)->OurConOut.SetMode         = ConsoleLoggerSetMode;\r
-  (*ConsoleInfo)->OurConOut.SetAttribute    = ConsoleLoggerSetAttribute;\r
-  (*ConsoleInfo)->OurConOut.ClearScreen     = ConsoleLoggerClearScreen;\r
+  (*ConsoleInfo)->Signature                   = CONSOLE_LOGGER_PRIVATE_DATA_SIGNATURE;\r
+  (*ConsoleInfo)->OldConOut                   = gST->ConOut;\r
+  (*ConsoleInfo)->OldConHandle                = gST->ConsoleOutHandle;\r
+  (*ConsoleInfo)->Buffer                      = NULL;\r
+  (*ConsoleInfo)->BufferSize                  = 0;\r
+  (*ConsoleInfo)->OriginalStartRow            = 0;\r
+  (*ConsoleInfo)->CurrentStartRow             = 0;\r
+  (*ConsoleInfo)->RowsPerScreen               = 0;\r
+  (*ConsoleInfo)->ColsPerScreen               = 0;\r
+  (*ConsoleInfo)->Attributes                  = NULL;\r
+  (*ConsoleInfo)->AttribSize                  = 0;\r
+  (*ConsoleInfo)->ScreenCount                 = ScreensToSave;\r
+  (*ConsoleInfo)->HistoryMode.MaxMode         = 1;\r
+  (*ConsoleInfo)->HistoryMode.Mode            = 0;\r
+  (*ConsoleInfo)->HistoryMode.Attribute       = 0;\r
+  (*ConsoleInfo)->HistoryMode.CursorColumn    = 0;\r
+  (*ConsoleInfo)->HistoryMode.CursorRow       = 0;\r
+  (*ConsoleInfo)->HistoryMode.CursorVisible   = FALSE;\r
+  (*ConsoleInfo)->OurConOut.Reset             = ConsoleLoggerReset;\r
+  (*ConsoleInfo)->OurConOut.OutputString      = ConsoleLoggerOutputString;\r
+  (*ConsoleInfo)->OurConOut.TestString        = ConsoleLoggerTestString;\r
+  (*ConsoleInfo)->OurConOut.QueryMode         = ConsoleLoggerQueryMode;\r
+  (*ConsoleInfo)->OurConOut.SetMode           = ConsoleLoggerSetMode;\r
+  (*ConsoleInfo)->OurConOut.SetAttribute      = ConsoleLoggerSetAttribute;\r
+  (*ConsoleInfo)->OurConOut.ClearScreen       = ConsoleLoggerClearScreen;\r
   (*ConsoleInfo)->OurConOut.SetCursorPosition = ConsoleLoggerSetCursorPosition;\r
-  (*ConsoleInfo)->OurConOut.EnableCursor    = ConsoleLoggerEnableCursor;\r
-  (*ConsoleInfo)->OurConOut.Mode            = NULL;\r
-  (*ConsoleInfo)->Enabled                   = TRUE;\r
+  (*ConsoleInfo)->OurConOut.EnableCursor      = ConsoleLoggerEnableCursor;\r
+  (*ConsoleInfo)->OurConOut.Mode              = gST->ConOut->Mode;\r
+  (*ConsoleInfo)->Enabled                     = TRUE;\r
 \r
   Status = ConsoleLoggerResetBuffers(*ConsoleInfo);\r
   if (EFI_ERROR(Status)) {\r
+    SHELL_FREE_NON_NULL((*ConsoleInfo));\r
+    *ConsoleInfo = NULL;\r
     return (Status);\r
   }\r
 \r
   Status = gBS->InstallProtocolInterface(&gImageHandle, &gEfiSimpleTextOutProtocolGuid, EFI_NATIVE_INTERFACE, (VOID*)&((*ConsoleInfo)->OurConOut));\r
-\r
-  (*ConsoleInfo)->OldConOut = gST->ConOut;\r
-  (*ConsoleInfo)->OldConHandle = gST->ConsoleOutHandle;\r
+  if (EFI_ERROR(Status)) {\r
+    SHELL_FREE_NON_NULL((*ConsoleInfo)->Buffer);\r
+    SHELL_FREE_NON_NULL((*ConsoleInfo)->Attributes);\r
+    SHELL_FREE_NON_NULL((*ConsoleInfo));\r
+    *ConsoleInfo = NULL;\r
+    return (Status);\r
+  }\r
 \r
   gST->ConsoleOutHandle = gImageHandle;\r
-  gST->ConOut = &(*ConsoleInfo)->OurConOut;\r
+  gST->ConOut           = &(*ConsoleInfo)->OurConOut;\r
 \r
   return (Status);\r
 }\r
@@ -92,7 +100,7 @@ ConsoleLoggerInstall(
   Return the system to the state it was before InstallConsoleLogger\r
   was installed.\r
 \r
-  @param[in,out] ConsoleInfo   The object from the install function.\r
+  @param[in] ConsoleInfo  The object from the install function.\r
 \r
   @retval EFI_SUCCESS     The operation was successful\r
   @return other           The operation failed.  This was from UninstallProtocolInterface.\r
@@ -620,7 +628,10 @@ ConsoleLoggerDoPageBreak(
   }\r
   if (*Resp == ShellPromptResponseContinue) {\r
     FreePool(Resp);\r
-    ShellInfoObject.ConsoleInfo->RowCounter = 0;\r
+    ShellInfoObject.ConsoleInfo->RowCounter                   = 0;\r
+//    ShellInfoObject.ConsoleInfo->OurConOut.Mode->CursorRow    = 0;\r
+//    ShellInfoObject.ConsoleInfo->OurConOut.Mode->CursorColumn = 0;\r
+\r
     return (EFI_SUCCESS);\r
   } else if (*Resp == ShellPromptResponseQuit) {\r
     FreePool(Resp);\r
@@ -649,16 +660,23 @@ ConsoleLoggerDoPageBreak(
 EFI_STATUS\r
 EFIAPI\r
 ConsoleLoggerPrintWithPageBreak(\r
-  IN CHAR16   *String,\r
+  IN CONST CHAR16   *String,\r
   IN CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo\r
   )\r
 {\r
   CONST CHAR16  *Walker;\r
   CONST CHAR16  *LineStart;\r
+  CHAR16        *StringCopy;\r
   CHAR16        TempChar;\r
 \r
-  for ( Walker = String\r
-      , LineStart = String\r
+  StringCopy = NULL;\r
+  StringCopy = StrnCatGrow(&StringCopy, NULL, String, 0);\r
+  if (StringCopy == NULL) {\r
+    return (EFI_OUT_OF_RESOURCES);\r
+  }\r
+\r
+  for ( Walker = StringCopy\r
+      , LineStart = StringCopy\r
       ; Walker != NULL && *Walker != CHAR_NULL\r
       ; Walker++\r
      ){\r
@@ -755,6 +773,7 @@ ConsoleLoggerPrintWithPageBreak(
         //\r
         // We got an error which means 'break' and halt the printing\r
         //\r
+        SHELL_FREE_NON_NULL(StringCopy);\r
         return (EFI_DEVICE_ERROR);\r
       }\r
     }\r
@@ -764,6 +783,7 @@ ConsoleLoggerPrintWithPageBreak(
     ConsoleLoggerOutputStringSplit (LineStart, ConsoleInfo);\r
   }\r
 \r
+  SHELL_FREE_NON_NULL(StringCopy);\r
   return (EFI_SUCCESS);\r
 }\r
 \r
@@ -792,6 +812,9 @@ ConsoleLoggerOutputString (
 {\r
   CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;\r
   ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);\r
+  if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {\r
+    return (EFI_UNSUPPORTED);\r
+  }\r
   ASSERT(ShellInfoObject.ConsoleInfo == ConsoleInfo);\r
   if (!ShellInfoObject.ConsoleInfo->Enabled) {\r
     return (EFI_DEVICE_ERROR);\r
@@ -882,8 +905,8 @@ ConsoleLoggerQueryMode (
 EFI_STATUS\r
 EFIAPI\r
 ConsoleLoggerSetMode (\r
-  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
-  IN  UINTN                         ModeNumber\r
+  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL   *This,\r
+  IN  UINTN                             ModeNumber\r
   )\r
 {\r
   EFI_STATUS                  Status;\r
@@ -900,6 +923,7 @@ ConsoleLoggerSetMode (
   // Check that the buffers are still correct for logging\r
   //\r
   if (!EFI_ERROR (Status)) {\r
+    ConsoleInfo->OurConOut.Mode = gST->ConOut->Mode;\r
     ConsoleLoggerResetBuffers(ConsoleInfo);\r
   }\r
 \r
@@ -970,9 +994,12 @@ ConsoleLoggerClearScreen (
   INT32             *Attributes;\r
   UINTN             Row;\r
   UINTN             Column;\r
+  CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;\r
 \r
+  if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {\r
+    return (EFI_UNSUPPORTED);\r
+  }\r
 \r
-  CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;\r
   ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   //\r
@@ -1033,8 +1060,12 @@ ConsoleLoggerSetCursorPosition (
   )\r
 {\r
   EFI_STATUS                  Status;\r
-\r
   CONSOLE_LOGGER_PRIVATE_DATA *ConsoleInfo;\r
+\r
+  if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {\r
+    return (EFI_UNSUPPORTED);\r
+  }\r
+\r
   ConsoleInfo = CONSOLE_LOGGER_PRIVATE_DATA_FROM_THIS(This);\r
   //\r
   // Forward the request to the original ConOut\r
@@ -1143,8 +1174,6 @@ ConsoleLoggerResetBuffers(
     return (EFI_OUT_OF_RESOURCES);\r
   }\r
 \r
-  ConsoleInfo->OurConOut.Mode = gST->ConOut->Mode;\r
-  ConsoleInfo->OldConOut = gST->ConOut;\r
   CopyMem (&ConsoleInfo->HistoryMode, ConsoleInfo->OldConOut->Mode, sizeof (EFI_SIMPLE_TEXT_OUTPUT_MODE));\r
 \r
   return (EFI_SUCCESS);\r