]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ConsoleWrappers.c
ShellPkg: Ease the shell's MAN file Title Header syntax requirements.
[mirror_edk2.git] / ShellPkg / Application / Shell / ConsoleWrappers.c
index 38491216f39a87635428ad23ed4dc73485683ad7..04a7513a3346fabb272c70c58c74bfe184e7f190 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Function definitions for shell simple text in and out on top of file handles.\r
 \r
-  Copyright (c) 2013 Hewlett-Packard Development Company, L.P.\r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2010 - 2015, 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
 \r
 #include "Shell.h"\r
 \r
+extern BOOLEAN AsciiRedirection;\r
+\r
 typedef struct {\r
   EFI_SIMPLE_TEXT_INPUT_PROTOCOL  SimpleTextIn;\r
   SHELL_FILE_HANDLE               FileHandle;\r
   EFI_HANDLE                      TheHandle;\r
+  UINT64                          RemainingBytesOfInputFile;\r
 } SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL;\r
 \r
 typedef struct {\r
@@ -43,19 +46,7 @@ ConInWaitForKey (
   IN  VOID            *Context\r
   )\r
 {\r
-  UINT64 Position;\r
-  UINT64 Size;\r
-  //\r
-  // Someone is waiting on the keystroke event, if there's\r
-  // a key pending, signal the event\r
-  //\r
-  // Context is the pointer to EFI_SIMPLE_TEXT_INPUT_PROTOCOL\r
-  //\r
-  ShellInfoObject.NewEfiShellProtocol->GetFilePosition(((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)Context)->FileHandle, &Position);\r
-  ShellInfoObject.NewEfiShellProtocol->GetFileSize    (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)Context)->FileHandle, &Size    );\r
-  if (Position < Size) {\r
-    gBS->SignalEvent (Event);\r
-  }\r
+  gBS->SignalEvent (Event);\r
 }\r
 \r
 /**\r
@@ -92,10 +83,38 @@ FileBasedSimpleTextInReadKeyStroke(
   )\r
 {\r
   UINTN Size;\r
-  Size = sizeof(CHAR16);\r
+  UINTN CharSize;\r
+\r
+  //\r
+  // Verify the parameters\r
+  //\r
   if (Key == NULL || This == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
+\r
+  //\r
+  // Check if we have any characters left in the stream.\r
+  //\r
+  if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile == 0) {\r
+    return (EFI_NOT_READY);\r
+  }\r
+\r
+  Size = sizeof(CHAR16);\r
+\r
+  if(!AsciiRedirection) {\r
+    CharSize = sizeof(CHAR16);\r
+  } else {\r
+    CharSize = sizeof(CHAR8);\r
+  } \r
+  //\r
+  // Decrement the amount of free space by Size or set to zero (for odd length files)\r
+  //\r
+  if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile > CharSize) {\r
+    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= CharSize;\r
+  } else {\r
+    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile = 0;\r
+  }\r
+\r
   Key->ScanCode = 0;\r
   return (ShellInfoObject.NewEfiShellProtocol->ReadFile(\r
     ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->FileHandle,\r
@@ -122,6 +141,8 @@ CreateSimpleTextInOnFile(
 {\r
   SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *ProtocolToReturn;\r
   EFI_STATUS                            Status;\r
+  UINT64                                CurrentPosition;\r
+  UINT64                                FileSize;\r
 \r
   if (HandleLocation == NULL || FileHandleToUse == NULL) {\r
     return (NULL);\r
@@ -131,7 +152,15 @@ CreateSimpleTextInOnFile(
   if (ProtocolToReturn == NULL) {\r
     return (NULL);\r
   }\r
-  ProtocolToReturn->FileHandle                  = FileHandleToUse;\r
+\r
+  ShellGetFileSize    (FileHandleToUse, &FileSize);\r
+  ShellGetFilePosition(FileHandleToUse, &CurrentPosition);\r
+\r
+  //\r
+  // Initialize the protocol members\r
+  //\r
+  ProtocolToReturn->RemainingBytesOfInputFile  = FileSize - CurrentPosition;\r
+  ProtocolToReturn->FileHandle                 = FileHandleToUse;\r
   ProtocolToReturn->SimpleTextIn.Reset         = FileBasedSimpleTextInReset;\r
   ProtocolToReturn->SimpleTextIn.ReadKeyStroke = FileBasedSimpleTextInReadKeyStroke;\r
   \r
@@ -255,7 +284,9 @@ FileBasedSimpleTextOutQueryMode (
   OUT UINTN                           *Rows\r
   )\r
 {\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *PassThruProtocol = ((SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)This)->OriginalSimpleTextOut;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *PassThruProtocol;\r
+  \r
+  PassThruProtocol = ((SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)This)->OriginalSimpleTextOut;\r
   \r
   // Pass the QueryMode call thru to the original SimpleTextOutProtocol\r
   return (PassThruProtocol->QueryMode(\r