/** @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
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
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
CHAR16 *StringSegment;\r
CHAR16 *StringSegmentEnd;\r
CHAR16 StringSegmentEndChar;\r
+ INT32 OrigAttribute;\r
\r
ASSERT(ConsoleInfo != NULL);\r
TempCharHolder = CHAR_NULL;\r
RetVal = EFI_SUCCESS;\r
+ OrigAttribute = ConsoleInfo->OldConOut->Mode->Attribute;\r
\r
//\r
// Disable cursor visibility and move it to the top left corner\r
if (EFI_ERROR (Status)) {\r
RetVal = Status;\r
}\r
+ } else {\r
+ ConsoleInfo->OldConOut->SetAttribute (\r
+ ConsoleInfo->OldConOut,\r
+ OrigAttribute\r
+ );\r
}\r
\r
return (RetVal);\r
; Index < ConsoleInfo->ColsPerScreen\r
; Index++\r
){\r
- *(ConsoleInfo->Attributes + (CopySize/sizeof(ConsoleInfo->Attributes)) + Index) = ConsoleInfo->HistoryMode.Attribute;\r
+ *(ConsoleInfo->Attributes + (CopySize/sizeof(ConsoleInfo->Attributes[0])) + Index) = ConsoleInfo->HistoryMode.Attribute;\r
}\r
\r
//\r
}\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
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
//\r
// check if that is the last column\r
//\r
- if ((INTN)ConsoleInfo->ColsPerScreen == ConsoleInfo->OurConOut.Mode->CursorColumn - 1) {\r
+ if ((INTN)ConsoleInfo->ColsPerScreen == ConsoleInfo->OurConOut.Mode->CursorColumn + 1) {\r
//\r
// output a line similar to the linefeed character.\r
//\r
//\r
// Update LineStart Variable\r
//\r
- LineStart = Walker;\r
+ LineStart = Walker + 1;\r
\r
//\r
// increment row count and zero the column\r
//\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
ConsoleLoggerOutputStringSplit (LineStart, ConsoleInfo);\r
}\r
\r
+ SHELL_FREE_NON_NULL(StringCopy);\r
return (EFI_SUCCESS);\r
}\r
\r
IN CHAR16 *WString\r
)\r
{\r
+ EFI_INPUT_KEY Key;\r
+ UINTN EventIndex;\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.HaltOutput) {\r
+ //\r
+ // just get some key\r
+ //\r
+ gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
+ gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ ShellInfoObject.HaltOutput = FALSE;\r
+ }\r
if (!ShellInfoObject.ConsoleInfo->Enabled) {\r
return (EFI_DEVICE_ERROR);\r
} else if (ShellInfoObject.PageBreakEnabled) {\r
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
// 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
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
// Record console output history\r
//\r
if (!EFI_ERROR (Status)) {\r
- Screen = &ConsoleInfo->Buffer[(ConsoleInfo->ColsPerScreen + 1) * ConsoleInfo->CurrentStartRow];\r
+ Screen = &ConsoleInfo->Buffer[(ConsoleInfo->ColsPerScreen + 2) * ConsoleInfo->CurrentStartRow];\r
Attributes = &ConsoleInfo->Attributes[ConsoleInfo->ColsPerScreen * ConsoleInfo->CurrentStartRow];\r
for ( Row = ConsoleInfo->OriginalStartRow\r
; Row < (ConsoleInfo->RowsPerScreen * ConsoleInfo->ScreenCount)\r
//\r
// Skip the NULL on each column end in text buffer only\r
//\r
- Screen++;\r
+ Screen += 2;\r
}\r
ConsoleInfo->HistoryMode.CursorColumn = 0;\r
ConsoleInfo->HistoryMode.CursorRow = 0;\r
)\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
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