]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/FileExplorer.c
EdkGenericPlatformBdsLib added
[mirror_edk2.git] / EdkModulePkg / Library / EdkGenericPlatformBdsLib / BootMaint / FileExplorer.c
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 FileExplorer.c
15
16 AgBStract:
17
18 File explorer related functions.
19
20 --*/
21
22 #include "Bds.h"
23 #include "BootMaint.h"
24
25 VOID
26 UpdateFileExplorePage (
27 IN BMM_CALLBACK_DATA *CallbackData,
28 BM_MENU_OPTION *MenuOption
29 )
30 /*++
31 Routine Description:
32 Update the File Explore page.
33
34 Arguments:
35 MenuOption - Pointer to menu options to display.
36
37 Returns:
38 None.
39
40 --*/
41 {
42 UINT8 *Location;
43 UINTN Index;
44 BM_MENU_ENTRY *NewMenuEntry;
45 BM_FILE_CONTEXT *NewFileContext;
46 FORM_ID FormId;
47
48 NewMenuEntry = NULL;
49 NewFileContext = NULL;
50 FormId = 0;
51
52 //
53 // Clean up file explore page.
54 //
55 RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff);
56
57 //
58 // Remove all op-codes from dynamic page
59 //
60 CallbackData->Hii->UpdateForm (
61 CallbackData->Hii,
62 CallbackData->FeHiiHandle,
63 FORM_FILE_EXPLORER_ID,
64 FALSE,
65 UpdateData
66 );
67
68 RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 0);
69
70 Location = (UINT8 *) &UpdateData->Data;
71
72 for (Index = 0; Index < MenuOption->MenuNumber; Index++) {
73 NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);
74 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;
75
76 if (NewFileContext->IsBootLegacy) {
77 continue;
78 }
79
80 if ((NewFileContext->IsDir) || (BOOT_FROM_FILE_STATE == CallbackData->FeCurrentState)) {
81 //
82 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
83 //
84 CreateTextOpCode (
85 NewMenuEntry->DisplayStringToken,
86 STR_NULL_STRING,
87 STR_NULL_STRING,
88 EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
89 (UINT16) (FILE_OPTION_OFFSET + Index),
90 Location
91 );
92 } else {
93 //
94 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
95 //
96 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {
97 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;
98 } else if (ADD_DRIVER_OPTION_STATE == CallbackData->FeCurrentState) {
99 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;
100 }
101
102 CreateGotoOpCode (
103 FormId,
104 NewMenuEntry->DisplayStringToken,
105 STRING_TOKEN (STR_NULL_STRING),
106 EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
107 (UINT16) (FILE_OPTION_OFFSET + Index),
108 Location
109 );
110 }
111
112 UpdateData->DataCount++;
113 Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
114 }
115
116 CallbackData->Hii->UpdateForm (
117 CallbackData->Hii,
118 CallbackData->FeHiiHandle,
119 FORM_FILE_EXPLORER_ID,
120 TRUE,
121 UpdateData
122 );
123 }
124
125 BOOLEAN
126 UpdateFileExplorer (
127 IN BMM_CALLBACK_DATA *CallbackData,
128 IN UINT16 KeyValue
129 )
130 /*++
131
132 Routine Description:
133 Update the file explower page with the refershed file system.
134
135 Arguments:
136 CallbackData - BMM context data
137 KeyValue - Key value to identify the type of data to expect.
138
139 Returns:
140 TRUE - Inform the caller to create a callback packet to exit file explorer.
141 FALSE - Indicate that there is no need to exit file explorer.
142
143 --*/
144 {
145 UINT16 FileOptionMask;
146 BM_MENU_ENTRY *NewMenuEntry;
147 BM_FILE_CONTEXT *NewFileContext;
148 FORM_ID FormId;
149 BOOLEAN ExitFileExplorer;
150 EFI_STATUS Status;
151
152 NewMenuEntry = NULL;
153 NewFileContext = NULL;
154 ExitFileExplorer = FALSE;
155
156 FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue);
157
158 if (UNKNOWN_CONTEXT == CallbackData->FeDisplayContext) {
159 //
160 // First in, display file system.
161 //
162 BOpt_FreeMenu (&FsOptionMenu);
163 BOpt_FindFileSystem (CallbackData);
164 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu);
165
166 UpdateFileExplorePage (CallbackData, &FsOptionMenu);
167
168 CallbackData->FeDisplayContext = FILE_SYSTEM;
169 } else {
170 if (FILE_SYSTEM == CallbackData->FeDisplayContext) {
171 NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask);
172 } else if (DIRECTORY == CallbackData->FeDisplayContext) {
173 NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask);
174 }
175
176 CallbackData->FeDisplayContext = DIRECTORY;
177
178 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;
179
180 if (NewFileContext->IsDir ) {
181 RemoveEntryList (&NewMenuEntry->Link);
182 BOpt_FreeMenu (&DirectoryMenu);
183 Status = BOpt_FindFiles (CallbackData, NewMenuEntry);
184 if (EFI_ERROR (Status)) {
185 ExitFileExplorer = TRUE;
186 goto exit;
187 }
188 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu);
189 BOpt_DestroyMenuEntry (NewMenuEntry);
190
191 UpdateFileExplorePage (CallbackData, &DirectoryMenu);
192
193 } else {
194 switch (CallbackData->FeCurrentState) {
195 case BOOT_FROM_FILE_STATE:
196 //
197 // Here boot from file
198 //
199 BootThisFile (NewFileContext);
200 ExitFileExplorer = TRUE;
201 break;
202
203 case ADD_BOOT_OPTION_STATE:
204 case ADD_DRIVER_OPTION_STATE:
205 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {
206 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;
207 } else {
208 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;
209 }
210
211 CallbackData->MenuEntry = NewMenuEntry;
212 CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath;
213
214 //
215 // Clean up file explore page.
216 //
217 RefreshUpdateData (FALSE, 0, FALSE, 0, 1);
218
219 //
220 // Remove the Subtitle op-code.
221 //
222 CallbackData->Hii->UpdateForm (
223 CallbackData->Hii,
224 CallbackData->FeHiiHandle,
225 FormId,
226 FALSE,
227 UpdateData
228 );
229
230 //
231 // Create Subtitle op-code for the display string of the option.
232 //
233 RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 1);
234
235 CreateSubTitleOpCode (
236 NewMenuEntry->DisplayStringToken,
237 &UpdateData->Data
238 );
239
240 CallbackData->Hii->UpdateForm (
241 CallbackData->Hii,
242 CallbackData->FeHiiHandle,
243 FormId,
244 TRUE,
245 UpdateData
246 );
247 break;
248
249 default:
250 break;
251 }
252 }
253 }
254 exit:
255 return ExitFileExplorer;
256 }
257
258 EFI_STATUS
259 EFIAPI
260 FileExplorerCallback (
261 IN EFI_FORM_CALLBACK_PROTOCOL *This,
262 IN UINT16 KeyValue,
263 IN EFI_IFR_DATA_ARRAY *Data,
264 OUT EFI_HII_CALLBACK_PACKET **Packet
265 )
266 /*++
267 Routine Description:
268 Callback Function for file exploration and file interaction.
269
270 Arguments:
271 This - File explorer callback protocol pointer.
272 KeyValue - Key value to identify the type of data to expect.
273 Data - A pointer to the data being sent to the original exporting driver.
274 Packet - A pointer to a packet of information which a driver passes back to the browser.
275
276 Returns:
277 EFI_SUCCESS - Callback ended successfully.
278 Others - Contain some errors.
279
280 --*/
281 {
282 BMM_CALLBACK_DATA *Private;
283 FILE_EXPLORER_NV_DATA *NvRamMap;
284 EFI_STATUS Status;
285
286 Status = EFI_SUCCESS;
287 Private = FE_CALLBACK_DATA_FROM_THIS (This);
288 UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->FeCallbackHandle;
289 NvRamMap = (FILE_EXPLORER_NV_DATA *) Data->NvRamMap;
290
291 if (KEY_VALUE_SAVE_AND_EXIT == KeyValue) {
292 //
293 // Apply changes and exit formset.
294 //
295 if (ADD_BOOT_OPTION_STATE == Private->FeCurrentState) {
296 Status = Var_UpdateBootOption (Private, NvRamMap);
297 if (EFI_ERROR (Status)) {
298 return Status;
299 }
300
301 BOpt_GetBootOptions (Private);
302 CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);
303 } else if (ADD_DRIVER_OPTION_STATE == Private->FeCurrentState) {
304 Status = Var_UpdateDriverOption (
305 Private,
306 Private->FeHiiHandle,
307 NvRamMap->DescriptionData,
308 NvRamMap->OptionalData,
309 NvRamMap->ForceReconnect
310 );
311 if (EFI_ERROR (Status)) {
312 return Status;
313 }
314
315 BOpt_GetDriverOptions (Private);
316 CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);
317 }
318
319 CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);
320 } else if (KEY_VALUE_NO_SAVE_AND_EXIT == KeyValue) {
321 //
322 // Discard changes and exit formset.
323 //
324 NvRamMap->OptionalData[0] = 0x0000;
325 NvRamMap->DescriptionData[0] = 0x0000;
326 CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);
327 } else if (KeyValue < FILE_OPTION_OFFSET) {
328 //
329 // Exit File Explorer formset.
330 //
331 CreateCallbackPacket (Packet, EXIT_REQUIRED);
332 } else {
333 if (UpdateFileExplorer (Private, KeyValue)) {
334 CreateCallbackPacket (Packet, EXIT_REQUIRED);
335 }
336 }
337
338 return Status;
339 }