]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/EfiCompress.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / EfiCompress.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for EfiCompress shell Debug1 function.\r
3\r
4 Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDebug1CommandsLib.h"\r
16#include "Compress.h"\r
17\r
18SHELL_STATUS\r
19EFIAPI\r
20ShellCommandRunEfiCompress (\r
21 IN EFI_HANDLE ImageHandle,\r
22 IN EFI_SYSTEM_TABLE *SystemTable\r
23 )\r
24{\r
25 EFI_STATUS Status;\r
26 LIST_ENTRY *Package;\r
27 CHAR16 *ProblemParam;\r
28 SHELL_STATUS ShellStatus;\r
29 SHELL_FILE_HANDLE InShellFileHandle;\r
30 SHELL_FILE_HANDLE OutShellFileHandle;\r
31 UINT64 OutSize;\r
32 VOID *OutBuffer;\r
33 UINT64 InSize;\r
34 VOID *InBuffer;\r
35 CHAR16 *InFileName;\r
36 CONST CHAR16 *OutFileName;\r
37\r
38 InFileName = NULL;\r
39 OutFileName = NULL;\r
40 OutSize = 0;\r
41 ShellStatus = SHELL_SUCCESS;\r
42 Status = EFI_SUCCESS;\r
43 OutBuffer = NULL;\r
44 InShellFileHandle = NULL;\r
45 OutShellFileHandle = NULL;\r
46 InBuffer = NULL;\r
47\r
48 //\r
49 // initialize the shell lib (we must be in non-auto-init...)\r
50 //\r
51 Status = ShellInitialize();\r
52 ASSERT_EFI_ERROR(Status);\r
53\r
54 Status = CommandInit();\r
55 ASSERT_EFI_ERROR(Status);\r
56\r
57 //\r
58 // parse the command line\r
59 //\r
60 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
61 if (EFI_ERROR(Status)) {\r
62 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
63 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
64 FreePool(ProblemParam);\r
65 ShellStatus = SHELL_INVALID_PARAMETER;\r
66 } else {\r
67 ASSERT(FALSE);\r
68 }\r
69 } else {\r
70 if (ShellCommandLineGetCount(Package) > 3) {\r
71 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
72 ShellStatus = SHELL_INVALID_PARAMETER;\r
73 } else if (ShellCommandLineGetCount(Package) < 3) {\r
74 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
75 ShellStatus = SHELL_INVALID_PARAMETER;\r
76 } else {\r
77 InFileName = ShellFindFilePath(ShellCommandLineGetRawValue(Package, 1));\r
78 OutFileName = ShellCommandLineGetRawValue(Package, 2);\r
79 Status = ShellOpenFileByName(InFileName, &InShellFileHandle, EFI_FILE_MODE_READ, 0);\r
80 if (EFI_ERROR(Status)) {\r
81 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 1), Status);\r
82 ShellStatus = SHELL_NOT_FOUND;\r
83 }\r
84 Status = ShellOpenFileByName(OutFileName, &OutShellFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);\r
85 if (EFI_ERROR(Status)) {\r
86 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 2), Status);\r
87 ShellStatus = SHELL_NOT_FOUND;\r
88 }\r
89 if (FileHandleIsDirectory(InShellFileHandle) == EFI_SUCCESS){\r
90 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, InFileName);\r
91 ShellStatus = SHELL_INVALID_PARAMETER;\r
92 }\r
93 if (FileHandleIsDirectory(OutShellFileHandle) == EFI_SUCCESS){\r
94 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, OutFileName);\r
95 ShellStatus = SHELL_INVALID_PARAMETER;\r
96 }\r
97 Status = gEfiShellProtocol->GetFileSize(InShellFileHandle, &InSize);\r
98 ASSERT_EFI_ERROR(Status);\r
99 InBuffer = AllocateZeroPool((UINTN)InSize);\r
100 ASSERT(InBuffer != NULL);\r
101 Status = gEfiShellProtocol->ReadFile(InShellFileHandle, &((UINTN)InSize), InBuffer);\r
102 ASSERT_EFI_ERROR(Status);\r
103 Status = Compress(InBuffer, InSize, OutBuffer, &OutSize);\r
104 if (Status == EFI_BUFFER_TOO_SMALL) {\r
105 OutBuffer = AllocateZeroPool((UINTN)OutSize);\r
106 ASSERT(OutBuffer != NULL);\r
107 Status = Compress(InBuffer, InSize, OutBuffer, &OutSize);\r
108 }\r
109 if (EFI_ERROR(Status)) {\r
110 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_EFI_COMPRESS_FAIL), gShellDebug1HiiHandle, Status);\r
111 ShellStatus = SHELL_DEVICE_ERROR;\r
112 } else {\r
113 Status = gEfiShellProtocol->WriteFile(OutShellFileHandle, &((UINTN)OutSize), OutBuffer);\r
114 if (EFI_ERROR(Status)) {\r
115 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, OutFileName, Status);\r
116 ShellStatus = SHELL_DEVICE_ERROR;\r
117 }\r
118 }\r
119 }\r
120\r
121 ShellCommandLineFreeVarList (Package);\r
122 }\r
123 if (InFileName != NULL) {\r
124 FreePool(InFileName);\r
125 }\r
126 if (InShellFileHandle != NULL) {\r
127 gEfiShellProtocol->CloseFile(InShellFileHandle);\r
128 }\r
129 if (OutShellFileHandle != NULL) {\r
130 gEfiShellProtocol->CloseFile(OutShellFileHandle);\r
131 }\r
132 if (InBuffer != NULL) {\r
133 FreePool(InBuffer);\r
134 }\r
135 if (OutBuffer != NULL) {\r
136 FreePool(OutBuffer);\r
137 }\r
138\r
139 return (ShellStatus);\r
140}\r