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
;
44 CONST CHAR16
*OutFileName
;
49 ShellStatus
= SHELL_SUCCESS
;
52 InShellFileHandle
= NULL
;
53 OutShellFileHandle
= NULL
;
57 // initialize the shell lib (we must be in non-auto-init...)
59 Status
= ShellInitialize();
60 ASSERT_EFI_ERROR(Status
);
62 Status
= CommandInit();
63 ASSERT_EFI_ERROR(Status
);
66 // parse the command line
68 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
69 if (EFI_ERROR(Status
)) {
70 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
71 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
72 FreePool(ProblemParam
);
73 ShellStatus
= SHELL_INVALID_PARAMETER
;
78 if (ShellCommandLineGetCount(Package
) > 3) {
79 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
80 ShellStatus
= SHELL_INVALID_PARAMETER
;
81 } else if (ShellCommandLineGetCount(Package
) < 3) {
82 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
83 ShellStatus
= SHELL_INVALID_PARAMETER
;
85 InFileName
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
86 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
87 if (InFileName
== NULL
) {
88 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1));
89 ShellStatus
= SHELL_NOT_FOUND
;
91 if (ShellIsDirectory(InFileName
) == EFI_SUCCESS
){
92 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, InFileName
);
93 ShellStatus
= SHELL_INVALID_PARAMETER
;
95 if (ShellIsDirectory(OutFileName
) == EFI_SUCCESS
){
96 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, OutFileName
);
97 ShellStatus
= SHELL_INVALID_PARAMETER
;
99 if (ShellStatus
== SHELL_SUCCESS
) {
100 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
101 if (EFI_ERROR(Status
)) {
102 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
103 ShellStatus
= SHELL_NOT_FOUND
;
105 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
106 if (EFI_ERROR(Status
)) {
107 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
108 ShellStatus
= SHELL_NOT_FOUND
;
111 if (ShellStatus
== SHELL_SUCCESS
) {
112 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
113 ASSERT_EFI_ERROR(Status
);
114 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
115 ASSERT(InBuffer
!= NULL
);
116 Status
= gEfiShellProtocol
->ReadFile(InShellFileHandle
, &InSize2
, InBuffer
);
118 ASSERT_EFI_ERROR(Status
);
119 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
120 if (Status
== EFI_BUFFER_TOO_SMALL
) {
121 OutBuffer
= AllocateZeroPool((UINTN
)OutSize
);
122 ASSERT(OutBuffer
!= NULL
);
123 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
125 if (EFI_ERROR(Status
)) {
126 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
127 ShellStatus
= SHELL_DEVICE_ERROR
;
129 OutSize2
= (UINTN
)OutSize
;
130 Status
= gEfiShellProtocol
->WriteFile(OutShellFileHandle
, &OutSize2
, OutBuffer
);
131 if (EFI_ERROR(Status
)) {
132 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, OutFileName
, Status
);
133 ShellStatus
= SHELL_DEVICE_ERROR
;
140 ShellCommandLineFreeVarList (Package
);
142 if (InShellFileHandle
!= NULL
) {
143 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
145 if (OutShellFileHandle
!= NULL
) {
146 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
148 SHELL_FREE_NON_NULL(InFileName
);
149 SHELL_FREE_NON_NULL(InBuffer
);
150 SHELL_FREE_NON_NULL(OutBuffer
);
152 return (ShellStatus
);