1 /** @file
2    File explorer lib.
3 
4 Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 **/
7 
8 #ifndef _FILE_EXPLORER_H_
9 #define _FILE_EXPLORER_H_
10 
11 #include <PiDxe.h>
12 #include <Guid/FileSystemVolumeLabelInfo.h>
13 #include <Guid/FileInfo.h>
14 #include <Guid/MdeModuleHii.h>
15 
16 #include <Protocol/HiiConfigAccess.h>
17 #include <Protocol/DevicePath.h>
18 #include <Protocol/SimpleFileSystem.h>
19 #include <Protocol/DevicePathToText.h>
20 #include <Protocol/FormBrowser2.h>
21 
22 #include <Library/DebugLib.h>
23 #include <Library/BaseMemoryLib.h>
24 #include <Library/UefiBootServicesTableLib.h>
25 #include <Library/MemoryAllocationLib.h>
26 #include <Library/BaseLib.h>
27 #include <Library/UefiLib.h>
28 #include <Library/DevicePathLib.h>
29 #include <Library/FileExplorerLib.h>
30 #include <Library/HiiLib.h>
31 #include <Library/PrintLib.h>
32 
33 #include "FormGuid.h"
34 
35 #define FILE_EXPLORER_CALLBACK_DATA_SIGNATURE     SIGNATURE_32 ('f', 'e', 'c', 'k')
36 
37 
38 #pragma pack(1)
39 
40 ///
41 /// HII specific Vendor Device Path definition.
42 ///
43 typedef struct {
44   VENDOR_DEVICE_PATH             VendorDevicePath;
45   EFI_DEVICE_PATH_PROTOCOL       End;
46 } HII_VENDOR_DEVICE_PATH;
47 
48 #pragma pack()
49 
50 typedef struct {
51   EFI_HANDLE                        DeviceHandle;
52   EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
53   EFI_FILE_HANDLE                   FileHandle;
54   UINT16                            *FileName;
55 
56   BOOLEAN                           IsRoot;
57   BOOLEAN                           IsDir;
58 } FILE_CONTEXT;
59 
60 typedef struct {
61   UINTN           Signature;
62   LIST_ENTRY      Link;
63   UINT16          *DisplayString;
64   UINT16          *HelpString;
65   EFI_STRING_ID   DisplayStringToken;
66   EFI_STRING_ID   HelpStringToken;
67   VOID            *VariableContext;
68 } MENU_ENTRY;
69 
70 typedef struct {
71   UINTN           Signature;
72   LIST_ENTRY      Head;
73   UINTN           MenuNumber;
74   BOOLEAN         Used;
75 } MENU_OPTION;
76 
77 typedef struct {
78   //
79   // Shared callback data.
80   //
81   UINTN                          Signature;
82 
83   //
84   // File explorer formset callback data.
85   //
86   EFI_HII_HANDLE                 FeHiiHandle;
87   EFI_HANDLE                     FeDriverHandle;
88   EFI_HII_CONFIG_ACCESS_PROTOCOL FeConfigAccess;
89   EFI_FORM_BROWSER2_PROTOCOL     *FormBrowser2;
90   MENU_OPTION                    *FsOptionMenu;
91   CHAR16                         *FileType;
92   CHOOSE_HANDLER                 ChooseHandler;
93   EFI_DEVICE_PATH_PROTOCOL       *RetDevicePath;
94 
95 } FILE_EXPLORER_CALLBACK_DATA;
96 
97 #define FILE_EXPLORER_PRIVATE_FROM_THIS(a)  CR (a, FILE_EXPLORER_CALLBACK_DATA, FeConfigAccess, FILE_EXPLORER_CALLBACK_DATA_SIGNATURE)
98 
99 extern UINT8    FileExplorerVfrBin[];
100 
101 #define MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')
102 #define MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')
103 
104 ///
105 /// Define the maximum characters that will be accepted.
106 ///
107 #define MAX_CHAR                480
108 #define FILE_OPTION_OFFSET      0x8000
109 #define FILE_OPTION_MASK        0x7FFF
110 #define QUESTION_ID_UPDATE_STEP 200
111 #define MAX_FILE_NAME_LEN       20
112 #define MAX_FOLDER_NAME_LEN     20
113 #define NEW_FILE_QUESTION_ID_BASE   0x5000;
114 #define NEW_FOLDER_QUESTION_ID_BASE 0x6000;
115 
116 /**
117   This function processes the results of changes in configuration.
118   When user select a interactive opcode, this callback will be triggered.
119   Based on the Question(QuestionId) that triggers the callback, the corresponding
120   actions is performed. It handles:
121 
122   1) the addition of boot option.
123   2) the addition of driver option.
124   3) exit from file browser
125   4) update of file content if a dir is selected.
126   5) boot the file if a file is selected in "boot from file"
127 
128 
129   @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
130   @param Action          Specifies the type of action taken by the browser.
131   @param QuestionId      A unique value which is sent to the original exporting driver
132                          so that it can identify the type of data to expect.
133   @param Type            The type of value for the question.
134   @param Value           A pointer to the data being sent to the original exporting driver.
135   @param ActionRequest   On return, points to the action requested by the callback function.
136 
137   @retval  EFI_SUCCESS           The callback successfully handled the action.
138   @retval  EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.
139   @retval  EFI_DEVICE_ERROR      The variable could not be saved.
140   @retval  EFI_UNSUPPORTED       The specified Action is not supported by the callback.
141 
142 **/
143 EFI_STATUS
144 EFIAPI
145 LibCallback (
146   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
147   IN  EFI_BROWSER_ACTION                     Action,
148   IN  EFI_QUESTION_ID                        QuestionId,
149   IN  UINT8                                  Type,
150   IN  EFI_IFR_TYPE_VALUE                     *Value,
151   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
152   );
153 
154 
155 /**
156   This function allows a caller to extract the current configuration for one
157   or more named elements from the target driver.
158 
159 
160   @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
161   @param Request         - A null-terminated Unicode string in <ConfigRequest> format.
162   @param Progress        - On return, points to a character in the Request string.
163                          Points to the string's null terminator if request was successful.
164                          Points to the most recent '&' before the first failing name/value
165                          pair (or the beginning of the string if the failure is in the
166                          first name/value pair) if the request was not successful.
167   @param Results         - A null-terminated Unicode string in <ConfigAltResp> format which
168                          has all values filled in for the names in the Request string.
169                          String to be allocated by the called function.
170 
171   @retval  EFI_SUCCESS            The Results is filled with the requested values.
172   @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
173   @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.
174   @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
175 
176 **/
177 EFI_STATUS
178 EFIAPI
179 LibExtractConfig (
180   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
181   IN  CONST EFI_STRING                       Request,
182   OUT EFI_STRING                             *Progress,
183   OUT EFI_STRING                             *Results
184   );
185 
186 /**
187   This function processes the results of changes in configuration.
188 
189 
190   @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
191   @param Configuration   - A null-terminated Unicode string in <ConfigResp> format.
192   @param Progress        - A pointer to a string filled in with the offset of the most
193                          recent '&' before the first failing name/value pair (or the
194                          beginning of the string if the failure is in the first
195                          name/value pair) or the terminating NULL if all was successful.
196 
197   @retval  EFI_SUCCESS            The Results is processed successfully.
198   @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
199   @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
200 
201 **/
202 EFI_STATUS
203 EFIAPI
204 LibRouteConfig (
205   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
206   IN  CONST EFI_STRING                       Configuration,
207   OUT EFI_STRING                             *Progress
208   );
209 
210 /**
211   Update the file explower page with the refershed file system.
212 
213   @param KeyValue        Key value to identify the type of data to expect.
214 
215   @retval  EFI_SUCCESS   Update the file explorer form success.
216   @retval  other errors  Error occur when parse one directory.
217 
218 **/
219 EFI_STATUS
220 LibUpdateFileExplorer (
221   IN UINT16                       KeyValue
222   );
223 
224 
225 /**
226   Get the device path info saved in the menu structure.
227 
228   @param KeyValue        Key value to identify the type of data to expect.
229 
230 **/
231 VOID
232 LibGetDevicePath (
233   IN UINT16                       KeyValue
234   );
235 
236 #endif
237