2 Main file for EfiDecompress shell Debug1 function.
4 Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Protocol/Decompress.h>
21 ShellCommandRunEfiDecompress (
22 IN EFI_HANDLE ImageHandle
,
23 IN EFI_SYSTEM_TABLE
*SystemTable
29 SHELL_STATUS ShellStatus
;
30 SHELL_FILE_HANDLE InFileHandle
;
31 SHELL_FILE_HANDLE OutFileHandle
;
38 CONST CHAR16
*OutFileName
;
42 EFI_DECOMPRESS_PROTOCOL
*Decompress
;
47 ShellStatus
= SHELL_SUCCESS
;
56 // initialize the shell lib (we must be in non-auto-init...)
58 Status
= ShellInitialize();
59 ASSERT_EFI_ERROR(Status
);
61 Status
= CommandInit();
62 ASSERT_EFI_ERROR(Status
);
65 // parse the command line
67 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
68 if (EFI_ERROR(Status
)) {
69 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
70 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
71 FreePool(ProblemParam
);
72 ShellStatus
= SHELL_INVALID_PARAMETER
;
77 if (ShellCommandLineGetCount(Package
) > 3) {
78 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
79 ShellStatus
= SHELL_INVALID_PARAMETER
;
80 } else if (ShellCommandLineGetCount(Package
) < 3) {
81 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
82 ShellStatus
= SHELL_INVALID_PARAMETER
;
84 InFileName
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
85 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
86 Status
= ShellOpenFileByName(InFileName
, &InFileHandle
, EFI_FILE_MODE_READ
, 0);
87 if (EFI_ERROR(Status
)) {
88 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
89 ShellStatus
= SHELL_NOT_FOUND
;
91 Status
= ShellOpenFileByName(OutFileName
, &OutFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
92 if (EFI_ERROR(Status
)) {
93 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
94 ShellStatus
= SHELL_NOT_FOUND
;
96 if (FileHandleIsDirectory(InFileHandle
) == EFI_SUCCESS
){
97 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, InFileName
);
98 ShellStatus
= SHELL_INVALID_PARAMETER
;
100 if (FileHandleIsDirectory(OutFileHandle
) == EFI_SUCCESS
){
101 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, OutFileName
);
102 ShellStatus
= SHELL_INVALID_PARAMETER
;
104 Status
= FileHandleGetSize(InFileHandle
, &temp
);
105 ASSERT(temp
<= (UINT32
)(-1));
106 InSize
= (UINTN
)temp
;
107 ASSERT_EFI_ERROR(Status
);
108 InBuffer
= AllocatePool(InSize
);
109 ASSERT(InBuffer
!= NULL
);
110 Status
= gEfiShellProtocol
->ReadFile(InFileHandle
, &InSize
, InBuffer
);
111 ASSERT_EFI_ERROR(Status
);
113 Status
= gBS
->LocateProtocol(&gEfiDecompressProtocolGuid
, NULL
, (VOID
**)&Decompress
);
114 ASSERT_EFI_ERROR(Status
);
116 Status
= Decompress
->GetInfo(Decompress
, InBuffer
, (UINT32
)InSize
, &OutSize
, &ScratchSize
);
117 ASSERT_EFI_ERROR(Status
);
119 OutBuffer
= AllocatePool(OutSize
);
120 ScratchBuffer
= AllocatePool(ScratchSize
);
121 ASSERT(OutBuffer
!= NULL
);
122 ASSERT(ScratchBuffer
!= NULL
);
124 Status
= Decompress
->Decompress(Decompress
, InBuffer
, (UINT32
)InSize
, OutBuffer
, OutSize
, ScratchBuffer
, ScratchSize
);
125 ASSERT_EFI_ERROR(Status
);
127 if (EFI_ERROR(Status
)) {
128 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
129 ShellStatus
= SHELL_DEVICE_ERROR
;
131 OutSizeTemp
= OutSize
;
132 Status
= gEfiShellProtocol
->WriteFile(OutFileHandle
, &OutSizeTemp
, OutBuffer
);
133 OutSize
= (UINT32
)OutSizeTemp
;
134 if (EFI_ERROR(Status
)) {
135 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, OutFileName
, Status
);
136 ShellStatus
= SHELL_DEVICE_ERROR
;
141 ShellCommandLineFreeVarList (Package
);
143 if (InFileName
!= NULL
) {
144 FreePool(InFileName
);
146 if (InFileHandle
!= NULL
) {
147 gEfiShellProtocol
->CloseFile(InFileHandle
);
149 if (OutFileHandle
!= NULL
) {
150 gEfiShellProtocol
->CloseFile(OutFileHandle
);
152 if (InBuffer
!= NULL
) {
155 if (OutBuffer
!= NULL
) {
158 if (ScratchBuffer
!= NULL
) {
159 FreePool(ScratchBuffer
);
162 return (ShellStatus
);