]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg: Change StdIn redirection
authorJaben Carsey <jaben.carsey@intel.com>
Fri, 17 Jan 2014 17:51:09 +0000 (17:51 +0000)
committerjcarsey <jcarsey@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 17 Jan 2014 17:51:09 +0000 (17:51 +0000)
This changes how StdIn redirection works such that the file is opened and parsed for length up front and not each time.  This prevents TPL issues.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15140 6f19259b-4bc3-4df7-8a09-765794883524

ShellPkg/Application/Shell/ConsoleWrappers.c

index 49ba6e90e7bcad3100c898c5310b4bc2ece09e88..fddf5c4ba07f0dd389337920dd92ec058b18efeb 100644 (file)
@@ -2,7 +2,7 @@
   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
+  Copyright (c) 2010 - 2014, 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
@@ -19,6 +19,7 @@ typedef struct {
   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 +44,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 +81,32 @@ FileBasedSimpleTextInReadKeyStroke(
   )\r
 {\r
   UINTN Size;\r
-  Size = sizeof(CHAR16);\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
+  //\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 > Size) {\r
+    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= Size;\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 +133,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 +144,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