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