--- /dev/null
+/*++\r
+\r
+Copyright (c) 2004, Intel Corporation \r
+All rights reserved. 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
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ ConsoleOut.c\r
+\r
+Abstract:\r
+\r
+ Console based on Win32 APIs. \r
+\r
+ This file creates an Win32 window and attaches a SimpleTextOut protocol.\r
+\r
+--*/\r
+\r
+#include "Console.h"\r
+//\r
+// Private worker functions.\r
+//\r
+\r
+#if 0
+STATIC\r
+VOID\r
+UnixSimpleTextOutScrollScreen (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
+ );\r
+\r
+#endif
+STATIC\r
+VOID\r
+UnixSimpleTextOutPutChar (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
+ IN CHAR16 Char\r
+ );\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutSetAttribute (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN Attribute\r
+ );\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutSetMode (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN ModeNumber\r
+ );\r
+
+//\r
+// Modeule Global for Simple Text Out Mode.\r
+//\r
+#define MAX_SIMPLE_TEXT_OUT_MODE \\r
+ (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))\r
+\r
+STATIC UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {\r
+ { 80, 25 }, \r
+#if 0
+ { 80, 50 }, \r
+ { 80, 43 }, \r
+ { 100, 100 }, \r
+ { 100, 999 } \r
+#endif
+};\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutReset (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ ExtendedVerification - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
+\r
+ UnixSimpleTextOutSetMode (This, 0);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutOutputString (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN CHAR16 *String\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ String - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+ CHAR16 *Str;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ for (Str = String; *Str != '\0'; Str++) {\r
+ switch (*Str) {\r
+#if 0
+ case '\n':\r
+ if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) {\r
+ UnixSimpleTextOutScrollScreen (Private);\r
+ }\r
+\r
+ if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) {\r
+ Private->Position.Y++;\r
+ This->Mode->CursorRow++;\r
+ }\r
+ break;\r
+\r
+ case '\r':\r
+ Private->Position.X = 0;\r
+ This->Mode->CursorColumn = 0;\r
+ break;\r
+\r
+ case '\b':\r
+ if (Private->Position.X > 0) {\r
+ Private->Position.X--;\r
+ This->Mode->CursorColumn--;\r
+ }\r
+ break;\r
+\r
+#endif
+ default:\r
+ UnixSimpleTextOutPutChar (Private, *Str);\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+VOID\r
+UnixSimpleTextOutPutChar (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
+ IN CHAR16 Char\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Console - TODO: add argument description\r
+ Char - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ TODO: add return values\r
+\r
+--*/\r
+{\r
+ char c = Char;
+ Console->UnixThunk->Write (1, &c, 1);
+}\r
+\r
+#if 0
+STATIC\r
+VOID\r
+UnixSimpleTextOutScrollScreen (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Console - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ TODO: add return values\r
+\r
+--*/\r
+{\r
+}\r
+#endif
+
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutTestString (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN CHAR16 *String\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ String - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ //\r
+ // BugBug: The correct answer would be a function of what code pages\r
+ // are currently loaded? For now we will just return success.\r
+ //\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutQueryMode (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN ModeNumber,\r
+ OUT UINTN *Columns,\r
+ OUT UINTN *Rows\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ ModeNumber - TODO: add argument description\r
+ Columns - TODO: add argument description\r
+ Rows - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_INVALID_PARAMETER - TODO: Add description for return value\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
+ *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutSetMode (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN ModeNumber\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ ModeNumber - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_INVALID_PARAMETER - TODO: Add description for return value\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+\r
+ This->Mode->Mode = (INT32) ModeNumber;\r
+\r
+ This->EnableCursor (This, TRUE);\r
+ This->ClearScreen (This);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutSetAttribute (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN Attribute\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ Attribute - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+#if 0
+ Private->Attribute = (WORD) Attribute;\r
+#endif
+ This->Mode->Attribute = (INT32) Attribute;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutClearScreen (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+ // DWORD ConsoleWindow;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ This->SetCursorPosition (This, 0, 0);\r
+ Private->UnixThunk->Write (1, "\e[2J", 4);
+
+\r
+#if 0
+ Private->UnixThunk->FillConsoleOutputCharacter (\r
+ Private->NtOutHandle,\r
+ ' ',\r
+ Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
+ Private->Possition,\r
+ &ConsoleWindow\r
+ );\r
+ Private->UnixThunk->FillConsoleOutputAttribute (\r
+ Private->NtOutHandle,\r
+ Private->Attribute,\r
+ Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
+ Private->Possition,\r
+ &ConsoleWindow\r
+ );\r
+#endif
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutSetCursorPosition (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN UINTN Column,\r
+ IN UINTN Row\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ Column - TODO: add argument description\r
+ Row - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ char buf[12];
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+#if 0
+ Private->Position.X = (WORD) Column;\r
+#endif
+ This->Mode->CursorColumn = (INT32) Column;\r
+\r
+#if 0
+ Private->Position.Y = (WORD) Row;\r
+#endif
+ This->Mode->CursorRow = (INT32) Row;\r
+#if 0
+ Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);\r
+#endif
+\r
+ buf[0] = '\e';
+ buf[1] = '[';
+ buf[2] = '0' + ((Row / 100) % 10);
+ buf[3] = '0' + ((Row / 10) % 10);
+ buf[4] = '0' + ((Row / 1) % 10);
+ buf[5] = ';';
+ buf[6] = '0' + ((Column / 100) % 10);
+ buf[7] = '0' + ((Column / 10) % 10);
+ buf[8] = '0' + ((Column / 1) % 10);
+ buf[9] = 'H';
+ Private->UnixThunk->Write (1, buf, 10);
+
+ return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSimpleTextOutEnableCursor (\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
+ IN BOOLEAN Enable\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ Enable - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+#if 0
+ CONSOLE_CURSOR_INFO Info;\r
+#endif
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
+ Private->CursorEnable = Enable;\r
+ This->Mode->CursorVisible = Enable;\r
+\r
+#if 0
+ Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
+ Info.bVisible = Enable;\r
+ Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
+#endif
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+UnixSimpleTextOutOpenWindow (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Private - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ TODO: add return values\r
+\r
+--*/\r
+{\r
+ EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;\r
+ CHAR16 *WindowName;\r
+\r
+ //WindowName = Private->UnixIo->EnvString;\r
+#if 0
+ Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
+ if (*WindowName == '?') {\r
+ Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;\r
+ WindowName = L"EFI Emulator Error Console";\r
+ }\r
+#endif
+ WindowName = L"EFI Emulator Error Console";\r
+\r
+ AddUnicodeString (\r
+ "eng",\r
+ gUnixConsoleComponentName.SupportedLanguages,\r
+ &Private->ControllerNameTable,\r
+ WindowName\r
+ );\r
+\r
+ //\r
+ // Fill in protocol member functions\r
+ //\r
+ SimpleTextOut = &Private->SimpleTextOut;\r
+ SimpleTextOut->Reset = UnixSimpleTextOutReset;\r
+ SimpleTextOut->OutputString = UnixSimpleTextOutOutputString;\r
+ SimpleTextOut->TestString = UnixSimpleTextOutTestString;\r
+ SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode;\r
+ SimpleTextOut->SetMode = UnixSimpleTextOutSetMode;\r
+ SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute;\r
+ SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen;\r
+ SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition;\r
+ SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor;\r
+\r
+ //\r
+ // Initialize SimpleTextOut protocol mode structure\r
+ //\r
+ SimpleTextOut->Mode = &Private->SimpleTextOutMode;\r
+ SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;\r
+ SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
+\r
+#if 0
+ //\r
+ // Open the window an initialize it!\r
+ //\r
+ Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer (\r
+ GENERIC_WRITE | GENERIC_READ,\r
+ FILE_SHARE_WRITE | FILE_SHARE_READ,\r
+ NULL,\r
+ CONSOLE_TEXTMODE_BUFFER,\r
+ NULL\r
+ );\r
+ Private->UnixThunk->SetConsoleTitle (WindowName);\r
+#endif
+\r
+ return SimpleTextOut->SetMode (SimpleTextOut, 0);\r
+}\r
+\r
+EFI_STATUS\r
+UnixSimpleTextOutCloseWindow (\r
+ IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Console - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+#if 0
+ Console->UnixThunk->CloseHandle (Console->NtOutHandle);\r
+#endif
+ return EFI_SUCCESS;\r
+}\r