ShellPkg: Fixes the shell so output redirection works for the 'mode' command

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chris Phillips <chrisp@hp.com>
reviewed-by: Jaben Carsey <Jaben.Carsey@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14800 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chris Phillips 2013-10-24 17:47:57 +00:00 committed by jcarsey
parent 85a3fa3ad7
commit dcf9b428e6
3 changed files with 35 additions and 19 deletions

View File

@ -1,6 +1,7 @@
/** @file /** @file
Function definitions for shell simple text in and out on top of file handles. Function definitions for shell simple text in and out on top of file handles.
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -24,6 +25,7 @@ typedef struct {
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOut; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOut;
SHELL_FILE_HANDLE FileHandle; SHELL_FILE_HANDLE FileHandle;
EFI_HANDLE TheHandle; EFI_HANDLE TheHandle;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *OriginalSimpleTextOut;
} SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL; } SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
/** /**
@ -253,7 +255,14 @@ FileBasedSimpleTextOutQueryMode (
OUT UINTN *Rows OUT UINTN *Rows
) )
{ {
return (EFI_UNSUPPORTED); EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *PassThruProtocol = ((SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)This)->OriginalSimpleTextOut;
// Pass the QueryMode call thru to the original SimpleTextOutProtocol
return (PassThruProtocol->QueryMode(
PassThruProtocol,
ModeNumber,
Columns,
Rows));
} }
/** /**
@ -386,8 +395,9 @@ FileBasedSimpleTextOutOutputString (
Function to create a EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on top of a Function to create a EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on top of a
SHELL_FILE_HANDLE to support redirecting output from a file. SHELL_FILE_HANDLE to support redirecting output from a file.
@param[in] FileHandleToUse The pointer to the SHELL_FILE_HANDLE to use. @param[in] FileHandleToUse The pointer to the SHELL_FILE_HANDLE to use.
@param[in] HandleLocation The pointer of a location to copy handle with protocol to. @param[in] HandleLocation The pointer of a location to copy handle with protocol to.
@param[in] OriginalProtocol The pointer to the original output protocol for pass thru of functions.
@retval NULL There was insufficient memory available. @retval NULL There was insufficient memory available.
@return A pointer to the allocated protocol structure; @return A pointer to the allocated protocol structure;
@ -395,8 +405,9 @@ FileBasedSimpleTextOutOutputString (
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*
EFIAPI EFIAPI
CreateSimpleTextOutOnFile( CreateSimpleTextOutOnFile(
IN SHELL_FILE_HANDLE FileHandleToUse, IN SHELL_FILE_HANDLE FileHandleToUse,
IN EFI_HANDLE *HandleLocation IN EFI_HANDLE *HandleLocation,
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *OriginalProtocol
) )
{ {
SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ProtocolToReturn; SHELL_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ProtocolToReturn;
@ -411,6 +422,7 @@ CreateSimpleTextOutOnFile(
return (NULL); return (NULL);
} }
ProtocolToReturn->FileHandle = FileHandleToUse; ProtocolToReturn->FileHandle = FileHandleToUse;
ProtocolToReturn->OriginalSimpleTextOut = OriginalProtocol;
ProtocolToReturn->SimpleTextOut.Reset = FileBasedSimpleTextOutReset; ProtocolToReturn->SimpleTextOut.Reset = FileBasedSimpleTextOutReset;
ProtocolToReturn->SimpleTextOut.TestString = FileBasedSimpleTextOutTestString; ProtocolToReturn->SimpleTextOut.TestString = FileBasedSimpleTextOutTestString;
ProtocolToReturn->SimpleTextOut.QueryMode = FileBasedSimpleTextOutQueryMode; ProtocolToReturn->SimpleTextOut.QueryMode = FileBasedSimpleTextOutQueryMode;
@ -425,12 +437,12 @@ CreateSimpleTextOutOnFile(
FreePool(ProtocolToReturn); FreePool(ProtocolToReturn);
return (NULL); return (NULL);
} }
ProtocolToReturn->SimpleTextOut.Mode->MaxMode = 0; ProtocolToReturn->SimpleTextOut.Mode->MaxMode = OriginalProtocol->Mode->MaxMode;
ProtocolToReturn->SimpleTextOut.Mode->Mode = 0; ProtocolToReturn->SimpleTextOut.Mode->Mode = OriginalProtocol->Mode->Mode;
ProtocolToReturn->SimpleTextOut.Mode->Attribute = 0; ProtocolToReturn->SimpleTextOut.Mode->Attribute = OriginalProtocol->Mode->Attribute;
ProtocolToReturn->SimpleTextOut.Mode->CursorColumn = 0; ProtocolToReturn->SimpleTextOut.Mode->CursorColumn = OriginalProtocol->Mode->CursorColumn;
ProtocolToReturn->SimpleTextOut.Mode->CursorRow = 0; ProtocolToReturn->SimpleTextOut.Mode->CursorRow = OriginalProtocol->Mode->CursorRow;
ProtocolToReturn->SimpleTextOut.Mode->CursorVisible = FALSE; ProtocolToReturn->SimpleTextOut.Mode->CursorVisible = OriginalProtocol->Mode->CursorVisible;
Status = gBS->InstallProtocolInterface( Status = gBS->InstallProtocolInterface(
&(ProtocolToReturn->TheHandle), &(ProtocolToReturn->TheHandle),

View File

@ -1,6 +1,7 @@
/** @file /** @file
Function definitions for shell simple text in and out on top of file handles. Function definitions for shell simple text in and out on top of file handles.
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -50,8 +51,9 @@ CloseSimpleTextInOnFile(
Function to create a EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on top of a Function to create a EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on top of a
SHELL_FILE_HANDLE to support redirecting output from a file. SHELL_FILE_HANDLE to support redirecting output from a file.
@param[in] FileHandleToUse The pointer to the SHELL_FILE_HANDLE to use. @param[in] FileHandleToUse The pointer to the SHELL_FILE_HANDLE to use.
@param[in] HandleLocation The pointer of a location to copy handle with protocol to. @param[in] HandleLocation The pointer of a location to copy handle with protocol to.
@param[in] OriginalProtocol The pointer to the original output protocol for pass thru of functions.
@retval NULL There was insufficient memory available. @retval NULL There was insufficient memory available.
@return A pointer to the allocated protocol structure; @return A pointer to the allocated protocol structure;
@ -59,8 +61,9 @@ CloseSimpleTextInOnFile(
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*
EFIAPI EFIAPI
CreateSimpleTextOutOnFile( CreateSimpleTextOutOnFile(
IN SHELL_FILE_HANDLE FileHandleToUse, IN SHELL_FILE_HANDLE FileHandleToUse,
IN EFI_HANDLE *HandleLocation IN EFI_HANDLE *HandleLocation,
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *OriginalProtocol
); );
/** /**

View File

@ -2,6 +2,7 @@
Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation, Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation,
manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL. manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL.
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -1008,7 +1009,7 @@ UpdateStdInStdOutStdErr(
} }
if (!EFI_ERROR(Status)) { if (!EFI_ERROR(Status)) {
ShellParameters->StdErr = TempHandle; ShellParameters->StdErr = TempHandle;
gST->StdErr = CreateSimpleTextOutOnFile(TempHandle, &gST->StandardErrorHandle); gST->StdErr = CreateSimpleTextOutOnFile(TempHandle, &gST->StandardErrorHandle, gST->StdErr);
} }
} }
@ -1051,7 +1052,7 @@ UpdateStdInStdOutStdErr(
} }
if (!EFI_ERROR(Status)) { if (!EFI_ERROR(Status)) {
ShellParameters->StdOut = TempHandle; ShellParameters->StdOut = TempHandle;
gST->ConOut = CreateSimpleTextOutOnFile(TempHandle, &gST->ConsoleOutHandle); gST->ConOut = CreateSimpleTextOutOnFile(TempHandle, &gST->ConsoleOutHandle, gST->ConOut);
} }
} }
} }
@ -1069,7 +1070,7 @@ UpdateStdInStdOutStdErr(
TempHandle = CreateFileInterfaceEnv(StdOutVarName); TempHandle = CreateFileInterfaceEnv(StdOutVarName);
ASSERT(TempHandle != NULL); ASSERT(TempHandle != NULL);
ShellParameters->StdOut = TempHandle; ShellParameters->StdOut = TempHandle;
gST->ConOut = CreateSimpleTextOutOnFile(TempHandle, &gST->ConsoleOutHandle); gST->ConOut = CreateSimpleTextOutOnFile(TempHandle, &gST->ConsoleOutHandle, gST->ConOut);
} }
// //
@ -1085,7 +1086,7 @@ UpdateStdInStdOutStdErr(
TempHandle = CreateFileInterfaceEnv(StdErrVarName); TempHandle = CreateFileInterfaceEnv(StdErrVarName);
ASSERT(TempHandle != NULL); ASSERT(TempHandle != NULL);
ShellParameters->StdErr = TempHandle; ShellParameters->StdErr = TempHandle;
gST->StdErr = CreateSimpleTextOutOnFile(TempHandle, &gST->StandardErrorHandle); gST->StdErr = CreateSimpleTextOutOnFile(TempHandle, &gST->StandardErrorHandle, gST->StdErr);
} }
// //