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