2 Main file for EfiCompress shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDebug1CommandsLib.h"
20 Function for 'compress' command.
22 @param[in] ImageHandle Handle to the Image (NULL if Internal).
23 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
27 ShellCommandRunEfiCompress (
28 IN EFI_HANDLE ImageHandle
,
29 IN EFI_SYSTEM_TABLE
*SystemTable
35 SHELL_STATUS ShellStatus
;
36 SHELL_FILE_HANDLE InShellFileHandle
;
37 SHELL_FILE_HANDLE OutShellFileHandle
;
45 CONST CHAR16
*OutFileName
;
46 CONST CHAR16
*TempParam
;
51 ShellStatus
= SHELL_SUCCESS
;
54 InShellFileHandle
= NULL
;
55 OutShellFileHandle
= NULL
;
59 // initialize the shell lib (we must be in non-auto-init...)
61 Status
= ShellInitialize();
62 ASSERT_EFI_ERROR(Status
);
64 Status
= CommandInit();
65 ASSERT_EFI_ERROR(Status
);
68 // parse the command line
70 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
71 if (EFI_ERROR(Status
)) {
72 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
73 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"eficompress", ProblemParam
);
74 FreePool(ProblemParam
);
75 ShellStatus
= SHELL_INVALID_PARAMETER
;
80 if (ShellCommandLineGetCount(Package
) > 3) {
81 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"eficompress");
82 ShellStatus
= SHELL_INVALID_PARAMETER
;
83 } else if (ShellCommandLineGetCount(Package
) < 3) {
84 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"eficompress");
85 ShellStatus
= SHELL_INVALID_PARAMETER
;
87 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
88 ASSERT(TempParam
!= NULL
);
89 InFileName
= ShellFindFilePath(TempParam
);
90 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
91 if (InFileName
== NULL
) {
92 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", TempParam
);
93 ShellStatus
= SHELL_NOT_FOUND
;
95 if (ShellIsDirectory(InFileName
) == EFI_SUCCESS
){
96 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"eficompress", InFileName
);
97 ShellStatus
= SHELL_INVALID_PARAMETER
;
99 if (ShellIsDirectory(OutFileName
) == EFI_SUCCESS
){
100 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"eficompress", OutFileName
);
101 ShellStatus
= SHELL_INVALID_PARAMETER
;
103 if (ShellStatus
== SHELL_SUCCESS
) {
104 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
105 if (EFI_ERROR(Status
)) {
106 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", ShellCommandLineGetRawValue(Package
, 1));
107 ShellStatus
= SHELL_NOT_FOUND
;
109 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
110 if (EFI_ERROR(Status
)) {
111 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", ShellCommandLineGetRawValue(Package
, 2));
112 ShellStatus
= SHELL_NOT_FOUND
;
115 if (ShellStatus
== SHELL_SUCCESS
) {
116 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
117 ASSERT_EFI_ERROR(Status
);
118 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
119 if (InBuffer
== NULL
) {
120 Status
= EFI_OUT_OF_RESOURCES
;
122 InSize2
= (UINTN
) InSize
;
123 Status
= gEfiShellProtocol
->ReadFile (InShellFileHandle
, &InSize2
, InBuffer
);
125 ASSERT_EFI_ERROR (Status
);
126 Status
= Compress (InBuffer
, InSize
, OutBuffer
, &OutSize
);
127 if (Status
== EFI_BUFFER_TOO_SMALL
) {
128 OutBuffer
= AllocateZeroPool ((UINTN
) OutSize
);
129 if (OutBuffer
== NULL
) {
130 Status
= EFI_OUT_OF_RESOURCES
;
132 Status
= Compress (InBuffer
, InSize
, OutBuffer
, &OutSize
);
136 if (EFI_ERROR(Status
)) {
137 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
138 ShellStatus
= ((Status
== EFI_OUT_OF_RESOURCES
) ? SHELL_OUT_OF_RESOURCES
: SHELL_DEVICE_ERROR
);
140 OutSize2
= (UINTN
)OutSize
;
141 Status
= gEfiShellProtocol
->WriteFile(OutShellFileHandle
, &OutSize2
, OutBuffer
);
142 if (EFI_ERROR(Status
)) {
143 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", OutFileName
);
144 ShellStatus
= SHELL_DEVICE_ERROR
;
151 ShellCommandLineFreeVarList (Package
);
153 if (InShellFileHandle
!= NULL
) {
154 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
156 if (OutShellFileHandle
!= NULL
) {
157 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
159 SHELL_FREE_NON_NULL(InFileName
);
160 SHELL_FREE_NON_NULL(InBuffer
);
161 SHELL_FREE_NON_NULL(OutBuffer
);
163 return (ShellStatus
);