]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ConsoleWrappers.c
ShellPkg: Fixes the shell so output redirection works for the 'mode' command
[mirror_edk2.git] / ShellPkg / Application / Shell / ConsoleWrappers.c
index 3212af9a08ce5b6264851396bb036ddf289b8ba8..38491216f39a87635428ad23ed4dc73485683ad7 100644 (file)
@@ -1,6 +1,7 @@
 /** @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
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
 \r
 **/\r
 \r
-#include <Uefi.h>\r
-#include <ShellBase.h>\r
-\r
-#include "ConsoleWrappers.h"\r
 #include "Shell.h"\r
 \r
 typedef struct {\r
@@ -28,6 +25,7 @@ typedef struct {
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOut;\r
   SHELL_FILE_HANDLE               FileHandle;\r
   EFI_HANDLE                      TheHandle;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *OriginalSimpleTextOut;\r
 } SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;\r
 \r
 /**\r
@@ -81,8 +79,8 @@ FileBasedSimpleTextInReset(
 /**\r
   ReadKeyStroke function for the fake simple text input.\r
 \r
-  @param[in] This     A pointer to the SimpleTextIn structure.\r
-  @param[in,out] Key  A pointer to the Key structure to fill.\r
+  @param[in] This      A pointer to the SimpleTextIn structure.\r
+  @param[in, out] Key  A pointer to the Key structure to fill.\r
 \r
   @retval   EFI_SUCCESS The read was successful.\r
 **/\r
@@ -257,7 +255,14 @@ FileBasedSimpleTextOutQueryMode (
   OUT UINTN                           *Rows\r
   )\r
 {\r
-  return (EFI_UNSUPPORTED);\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *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
+    PassThruProtocol,\r
+    ModeNumber,\r
+    Columns,\r
+    Rows));\r
 }\r
 \r
 /**\r
@@ -390,8 +395,9 @@ FileBasedSimpleTextOutOutputString (
   Function to create a EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on top of a \r
   SHELL_FILE_HANDLE to support redirecting output from a file.\r
 \r
-  @param[in]  FileHandleToUse The pointer to the SHELL_FILE_HANDLE to use.\r
-  @param[in]  HandleLocation  The pointer of a location to copy handle with protocol to.\r
+  @param[in]  FileHandleToUse  The pointer to the SHELL_FILE_HANDLE to use.\r
+  @param[in]  HandleLocation   The pointer of a location to copy handle with protocol to.\r
+  @param[in]  OriginalProtocol The pointer to the original output protocol for pass thru of functions.\r
 \r
   @retval NULL                There was insufficient memory available.\r
   @return                     A pointer to the allocated protocol structure;\r
@@ -399,8 +405,9 @@ FileBasedSimpleTextOutOutputString (
 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*\r
 EFIAPI\r
 CreateSimpleTextOutOnFile(\r
-  IN SHELL_FILE_HANDLE  FileHandleToUse,\r
-  IN EFI_HANDLE         *HandleLocation\r
+  IN SHELL_FILE_HANDLE               FileHandleToUse,\r
+  IN EFI_HANDLE                      *HandleLocation,\r
+  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *OriginalProtocol\r
   )\r
 {\r
   SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ProtocolToReturn;\r
@@ -415,6 +422,7 @@ CreateSimpleTextOutOnFile(
     return (NULL);\r
   }\r
   ProtocolToReturn->FileHandle                      = FileHandleToUse;\r
+  ProtocolToReturn->OriginalSimpleTextOut           = OriginalProtocol;\r
   ProtocolToReturn->SimpleTextOut.Reset             = FileBasedSimpleTextOutReset;\r
   ProtocolToReturn->SimpleTextOut.TestString        = FileBasedSimpleTextOutTestString;\r
   ProtocolToReturn->SimpleTextOut.QueryMode         = FileBasedSimpleTextOutQueryMode;\r
@@ -429,12 +437,12 @@ CreateSimpleTextOutOnFile(
     FreePool(ProtocolToReturn);\r
     return (NULL);\r
   }\r
-  ProtocolToReturn->SimpleTextOut.Mode->MaxMode       = 0;\r
-  ProtocolToReturn->SimpleTextOut.Mode->Mode          = 0;\r
-  ProtocolToReturn->SimpleTextOut.Mode->Attribute     = 0;\r
-  ProtocolToReturn->SimpleTextOut.Mode->CursorColumn  = 0;\r
-  ProtocolToReturn->SimpleTextOut.Mode->CursorRow     = 0;\r
-  ProtocolToReturn->SimpleTextOut.Mode->CursorVisible = FALSE;\r
+  ProtocolToReturn->SimpleTextOut.Mode->MaxMode       = OriginalProtocol->Mode->MaxMode;\r
+  ProtocolToReturn->SimpleTextOut.Mode->Mode          = OriginalProtocol->Mode->Mode;\r
+  ProtocolToReturn->SimpleTextOut.Mode->Attribute     = OriginalProtocol->Mode->Attribute;\r
+  ProtocolToReturn->SimpleTextOut.Mode->CursorColumn  = OriginalProtocol->Mode->CursorColumn;\r
+  ProtocolToReturn->SimpleTextOut.Mode->CursorRow     = OriginalProtocol->Mode->CursorRow;\r
+  ProtocolToReturn->SimpleTextOut.Mode->CursorVisible = OriginalProtocol->Mode->CursorVisible;\r
 \r
   Status = gBS->InstallProtocolInterface(\r
     &(ProtocolToReturn->TheHandle), \r