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
;
45 CONST CHAR16
*TempParam
;
50 ShellStatus
= SHELL_SUCCESS
;
53 InShellFileHandle
= NULL
;
54 OutShellFileHandle
= NULL
;
58 // initialize the shell lib (we must be in non-auto-init...)
60 Status
= ShellInitialize();
61 ASSERT_EFI_ERROR(Status
);
63 Status
= CommandInit();
64 ASSERT_EFI_ERROR(Status
);
67 // parse the command line
69 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
70 if (EFI_ERROR(Status
)) {
71 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
72 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
73 FreePool(ProblemParam
);
74 ShellStatus
= SHELL_INVALID_PARAMETER
;
79 if (ShellCommandLineGetCount(Package
) > 3) {
80 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
81 ShellStatus
= SHELL_INVALID_PARAMETER
;
82 } else if (ShellCommandLineGetCount(Package
) < 3) {
83 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
84 ShellStatus
= SHELL_INVALID_PARAMETER
;
86 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
87 ASSERT(TempParam
!= NULL
);
88 InFileName
= ShellFindFilePath(TempParam
);
89 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
90 if (InFileName
== NULL
) {
91 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, TempParam
);
92 ShellStatus
= SHELL_NOT_FOUND
;
94 if (ShellIsDirectory(InFileName
) == EFI_SUCCESS
){
95 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, InFileName
);
96 ShellStatus
= SHELL_INVALID_PARAMETER
;
98 if (ShellIsDirectory(OutFileName
) == EFI_SUCCESS
){
99 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, OutFileName
);
100 ShellStatus
= SHELL_INVALID_PARAMETER
;
102 if (ShellStatus
== SHELL_SUCCESS
) {
103 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
104 if (EFI_ERROR(Status
)) {
105 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
106 ShellStatus
= SHELL_NOT_FOUND
;
108 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
109 if (EFI_ERROR(Status
)) {
110 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
111 ShellStatus
= SHELL_NOT_FOUND
;
114 if (ShellStatus
== SHELL_SUCCESS
) {
115 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
116 ASSERT_EFI_ERROR(Status
);
117 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
118 ASSERT(InBuffer
!= NULL
);
119 InSize2
= (UINTN
)InSize
;
120 Status
= gEfiShellProtocol
->ReadFile(InShellFileHandle
, &InSize2
, InBuffer
);
122 ASSERT_EFI_ERROR(Status
);
123 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
124 if (Status
== EFI_BUFFER_TOO_SMALL
) {
125 OutBuffer
= AllocateZeroPool((UINTN
)OutSize
);
126 ASSERT(OutBuffer
!= NULL
);
127 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
129 if (EFI_ERROR(Status
)) {
130 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
131 ShellStatus
= SHELL_DEVICE_ERROR
;
133 OutSize2
= (UINTN
)OutSize
;
134 Status
= gEfiShellProtocol
->WriteFile(OutShellFileHandle
, &OutSize2
, OutBuffer
);
135 if (EFI_ERROR(Status
)) {
136 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, OutFileName
, Status
);
137 ShellStatus
= SHELL_DEVICE_ERROR
;
144 ShellCommandLineFreeVarList (Package
);
146 if (InShellFileHandle
!= NULL
) {
147 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
149 if (OutShellFileHandle
!= NULL
) {
150 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
152 SHELL_FREE_NON_NULL(InFileName
);
153 SHELL_FREE_NON_NULL(InBuffer
);
154 SHELL_FREE_NON_NULL(OutBuffer
);
156 return (ShellStatus
);