| /** @file | |
| Add external EblCmd Lib | |
| Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> | |
| Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
| 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. | |
| **/ | |
| #include <Uefi.h> | |
| #include <Library/UefiLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/EblAddExternalCommandLib.h> | |
| #include <Protocol/EblAddCommand.h> | |
| STATIC BOOLEAN gInstalledCommand = FALSE; | |
| STATIC EFI_EVENT mEblCommandRegistration = NULL; | |
| STATIC const EBL_COMMAND_TABLE *mAddExternalCmdLibTemplate = NULL; | |
| STATIC UINTN mAddExternalCmdLibTemplateSize = 0; | |
| EBL_ADD_COMMAND_PROTOCOL *gEblExternalCommand = NULL; | |
| /** | |
| Return a keypress or optionally timeout if a timeout value was passed in. | |
| An optional callback function is called every second when waiting for a | |
| timeout. | |
| @param Key EFI Key information returned | |
| @param TimeoutInSec Number of seconds to wait to timeout | |
| @param CallBack Callback called every second during the timeout wait | |
| @return EFI_SUCCESS Key was returned | |
| @return EFI_TIMEOUT If the TimoutInSec expired | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EblGetCharKey ( | |
| IN OUT EFI_INPUT_KEY *Key, | |
| IN UINTN TimeoutInSec, | |
| IN EBL_GET_CHAR_CALL_BACK CallBack OPTIONAL | |
| ) | |
| { | |
| if (gEblExternalCommand != NULL) { | |
| return gEblExternalCommand->EblGetCharKey (Key, TimeoutInSec, CallBack); | |
| } | |
| return EFI_TIMEOUT; | |
| } | |
| /** | |
| This routine is used prevent command output data from scrolling off the end | |
| of the screen. The global gPageBreak is used to turn on or off this feature. | |
| If the CurrentRow is near the end of the screen pause and print out a prompt | |
| If the use hits Q to quit return TRUE else for any other key return FALSE. | |
| PrefixNewline is used to figure out if a newline is needed before the prompt | |
| string. This depends on the last print done before calling this function. | |
| CurrentRow is updated by one on a call or set back to zero if a prompt is | |
| needed. | |
| @param CurrentRow Used to figure out if its the end of the page and updated | |
| @param PrefixNewline Did previous print issue a newline | |
| @return TRUE if Q was hit to quit, FALSE in all other cases. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| EblAnyKeyToContinueQtoQuit ( | |
| IN UINTN *CurrentRow, | |
| IN BOOLEAN PrefixNewline | |
| ) | |
| { | |
| if (gEblExternalCommand != NULL) { | |
| return gEblExternalCommand->EblAnyKeyToContinueQtoQuit (CurrentRow, PrefixNewline); | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| Update mFvbEntry. Add new entry, or update existing entry if Fvb protocol is | |
| reinstalled. | |
| @param Event The Event that is being processed | |
| @param Context Event Context | |
| **/ | |
| VOID | |
| EFIAPI | |
| EblAddCommandNotificationEvent ( | |
| IN EFI_EVENT Event, | |
| IN VOID *Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| if (!gInstalledCommand) { | |
| Status = gBS->LocateProtocol (&gEfiEblAddCommandProtocolGuid, NULL, (VOID **)&gEblExternalCommand); | |
| if (!EFI_ERROR (Status)) { | |
| gEblExternalCommand->AddCommands (mAddExternalCmdLibTemplate, mAddExternalCmdLibTemplateSize); | |
| gInstalledCommand = TRUE; | |
| } | |
| } | |
| } | |
| /** | |
| The user Entry Point for the driver. The user code starts with this function | |
| as the real entry point for the image goes into a library that calls this | |
| function. | |
| @param[in] ImageHandle The firmware allocated handle for the EFI image. | |
| @param[in] SystemTable A pointer to the EFI System Table. | |
| @retval EFI_SUCCESS The entry point is executed successfully. | |
| @retval other Some error occurs when executing this entry point. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EblAddExternalCommands ( | |
| IN const EBL_COMMAND_TABLE *EntryArray, | |
| IN UINTN ArrayCount | |
| ) | |
| { | |
| if (mAddExternalCmdLibTemplate != NULL) { | |
| return EFI_ALREADY_STARTED; | |
| } | |
| mAddExternalCmdLibTemplate = EntryArray; | |
| mAddExternalCmdLibTemplateSize = ArrayCount; | |
| EfiCreateProtocolNotifyEvent ( | |
| &gEfiEblAddCommandProtocolGuid, | |
| TPL_CALLBACK, | |
| EblAddCommandNotificationEvent, | |
| NULL, | |
| &mEblCommandRegistration | |
| ); | |
| return EFI_SUCCESS; | |
| } | |