2 Main file for EfiCompress 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"
20 ShellCommandRunEfiCompress (
21 IN EFI_HANDLE ImageHandle
,
22 IN EFI_SYSTEM_TABLE
*SystemTable
28 SHELL_STATUS ShellStatus
;
29 SHELL_FILE_HANDLE InShellFileHandle
;
30 SHELL_FILE_HANDLE OutShellFileHandle
;
36 CONST CHAR16
*OutFileName
;
41 ShellStatus
= SHELL_SUCCESS
;
44 InShellFileHandle
= NULL
;
45 OutShellFileHandle
= NULL
;
49 // initialize the shell lib (we must be in non-auto-init...)
51 Status
= ShellInitialize();
52 ASSERT_EFI_ERROR(Status
);
54 Status
= CommandInit();
55 ASSERT_EFI_ERROR(Status
);
58 // parse the command line
60 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
61 if (EFI_ERROR(Status
)) {
62 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
63 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
64 FreePool(ProblemParam
);
65 ShellStatus
= SHELL_INVALID_PARAMETER
;
70 if (ShellCommandLineGetCount(Package
) > 3) {
71 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
72 ShellStatus
= SHELL_INVALID_PARAMETER
;
73 } else if (ShellCommandLineGetCount(Package
) < 3) {
74 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
75 ShellStatus
= SHELL_INVALID_PARAMETER
;
77 InFileName
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
78 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
79 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
80 if (EFI_ERROR(Status
)) {
81 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
82 ShellStatus
= SHELL_NOT_FOUND
;
84 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
85 if (EFI_ERROR(Status
)) {
86 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
87 ShellStatus
= SHELL_NOT_FOUND
;
89 if (FileHandleIsDirectory(InShellFileHandle
) == EFI_SUCCESS
){
90 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, InFileName
);
91 ShellStatus
= SHELL_INVALID_PARAMETER
;
93 if (FileHandleIsDirectory(OutShellFileHandle
) == EFI_SUCCESS
){
94 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, OutFileName
);
95 ShellStatus
= SHELL_INVALID_PARAMETER
;
97 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
98 ASSERT_EFI_ERROR(Status
);
99 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
100 ASSERT(InBuffer
!= NULL
);
101 Status
= gEfiShellProtocol
->ReadFile(InShellFileHandle
, &((UINTN
)InSize
), InBuffer
);
102 ASSERT_EFI_ERROR(Status
);
103 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
104 if (Status
== EFI_BUFFER_TOO_SMALL
) {
105 OutBuffer
= AllocateZeroPool((UINTN
)OutSize
);
106 ASSERT(OutBuffer
!= NULL
);
107 Status
= Compress(InBuffer
, InSize
, OutBuffer
, &OutSize
);
109 if (EFI_ERROR(Status
)) {
110 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
111 ShellStatus
= SHELL_DEVICE_ERROR
;
113 Status
= gEfiShellProtocol
->WriteFile(OutShellFileHandle
, &((UINTN
)OutSize
), OutBuffer
);
114 if (EFI_ERROR(Status
)) {
115 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, OutFileName
, Status
);
116 ShellStatus
= SHELL_DEVICE_ERROR
;
121 ShellCommandLineFreeVarList (Package
);
123 if (InFileName
!= NULL
) {
124 FreePool(InFileName
);
126 if (InShellFileHandle
!= NULL
) {
127 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
129 if (OutShellFileHandle
!= NULL
) {
130 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
132 if (InBuffer
!= NULL
) {
135 if (OutBuffer
!= NULL
) {
139 return (ShellStatus
);