2 Main file for EfiCompress shell Debug1 function.
4 Copyright (c) 2005 - 2011, 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"
19 Function for 'compress' command.
21 @param[in] ImageHandle Handle to the Image (NULL if Internal).
22 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
26 ShellCommandRunEfiCompress (
27 IN EFI_HANDLE ImageHandle
,
28 IN EFI_SYSTEM_TABLE
*SystemTable
34 SHELL_STATUS ShellStatus
;
35 SHELL_FILE_HANDLE InShellFileHandle
;
36 SHELL_FILE_HANDLE OutShellFileHandle
;
42 CONST CHAR16
*OutFileName
;
47 ShellStatus
= SHELL_SUCCESS
;
50 InShellFileHandle
= NULL
;
51 OutShellFileHandle
= NULL
;
55 // initialize the shell lib (we must be in non-auto-init...)
57 Status
= ShellInitialize();
58 ASSERT_EFI_ERROR(Status
);
60 Status
= CommandInit();
61 ASSERT_EFI_ERROR(Status
);
64 // parse the command line
66 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
67 if (EFI_ERROR(Status
)) {
68 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
69 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
70 FreePool(ProblemParam
);
71 ShellStatus
= SHELL_INVALID_PARAMETER
;
76 if (ShellCommandLineGetCount(Package
) > 3) {
77 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
78 ShellStatus
= SHELL_INVALID_PARAMETER
;
79 } else if (ShellCommandLineGetCount(Package
) < 3) {
80 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
81 ShellStatus
= SHELL_INVALID_PARAMETER
;
83 InFileName
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
84 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
85 if (InFileName
== NULL
) {
86 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1));
87 ShellStatus
= SHELL_NOT_FOUND
;
89 if (ShellIsDirectory(InFileName
) == EFI_SUCCESS
){
90 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, InFileName
);
91 ShellStatus
= SHELL_INVALID_PARAMETER
;
93 if (ShellIsDirectory(OutFileName
) == EFI_SUCCESS
){
94 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, OutFileName
);
95 ShellStatus
= SHELL_INVALID_PARAMETER
;
97 if (ShellStatus
== SHELL_SUCCESS
) {
98 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
99 if (EFI_ERROR(Status
)) {
100 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
101 ShellStatus
= SHELL_NOT_FOUND
;
103 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
104 if (EFI_ERROR(Status
)) {
105 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
106 ShellStatus
= SHELL_NOT_FOUND
;
109 if (ShellStatus
== SHELL_SUCCESS
) {
110 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
111 ASSERT_EFI_ERROR(Status
);
112 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
113 ASSERT(InBuffer
!= NULL
);
114 Status
= gEfiShellProtocol
->ReadFile(InShellFileHandle
, &((UINTN
)InSize
), InBuffer
);
115 ASSERT_EFI_ERROR(Status
);
116 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
117 if (Status
== EFI_BUFFER_TOO_SMALL
) {
118 OutBuffer
= AllocateZeroPool((UINTN
)OutSize
);
119 ASSERT(OutBuffer
!= NULL
);
120 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
122 if (EFI_ERROR(Status
)) {
123 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
124 ShellStatus
= SHELL_DEVICE_ERROR
;
126 Status
= gEfiShellProtocol
->WriteFile(OutShellFileHandle
, &((UINTN
)OutSize
), OutBuffer
);
127 if (EFI_ERROR(Status
)) {
128 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, OutFileName
, Status
);
129 ShellStatus
= SHELL_DEVICE_ERROR
;
136 ShellCommandLineFreeVarList (Package
);
138 if (InShellFileHandle
!= NULL
) {
139 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
141 if (OutShellFileHandle
!= NULL
) {
142 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
144 SHELL_FREE_NON_NULL(InFileName
);
145 SHELL_FREE_NON_NULL(InBuffer
);
146 SHELL_FREE_NON_NULL(OutBuffer
);
148 return (ShellStatus
);