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
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.
18 File explorer related functions.
23 // Include common header file for this module.
25 #include "CommonHeader.h"
27 #include "Generic/Bds.h"
28 #include "BootMaint.h"
29 #include "BdsPlatform.h"
32 UpdateFileExplorePage (
33 IN BMM_CALLBACK_DATA
*CallbackData
,
34 BM_MENU_OPTION
*MenuOption
38 Update the File Explore page.
41 MenuOption - Pointer to menu options to display.
50 BM_MENU_ENTRY
*NewMenuEntry
;
51 BM_FILE_CONTEXT
*NewFileContext
;
55 NewFileContext
= NULL
;
59 // Clean up file explore page.
61 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
64 // Remove all op-codes from dynamic page
66 CallbackData
->Hii
->UpdateForm (
68 CallbackData
->FeHiiHandle
,
69 FORM_FILE_EXPLORER_ID
,
74 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 0);
76 Location
= (UINT8
*) &UpdateData
->Data
;
78 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
79 NewMenuEntry
= BOpt_GetMenuEntry (MenuOption
, Index
);
80 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
82 if (NewFileContext
->IsBootLegacy
) {
86 if ((NewFileContext
->IsDir
) || (BOOT_FROM_FILE_STATE
== CallbackData
->FeCurrentState
)) {
88 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
91 NewMenuEntry
->DisplayStringToken
,
94 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
95 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
100 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
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
;
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
),
118 UpdateData
->DataCount
++;
119 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
122 CallbackData
->Hii
->UpdateForm (
124 CallbackData
->FeHiiHandle
,
125 FORM_FILE_EXPLORER_ID
,
133 IN BMM_CALLBACK_DATA
*CallbackData
,
139 Update the file explower page with the refershed file system.
142 CallbackData - BMM context data
143 KeyValue - Key value to identify the type of data to expect.
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.
151 UINT16 FileOptionMask
;
152 BM_MENU_ENTRY
*NewMenuEntry
;
153 BM_FILE_CONTEXT
*NewFileContext
;
155 BOOLEAN ExitFileExplorer
;
159 NewFileContext
= NULL
;
160 ExitFileExplorer
= FALSE
;
162 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& KeyValue
);
164 if (UNKNOWN_CONTEXT
== CallbackData
->FeDisplayContext
) {
166 // First in, display file system.
168 BOpt_FreeMenu (&FsOptionMenu
);
169 BOpt_FindFileSystem (CallbackData
);
170 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &FsOptionMenu
);
172 UpdateFileExplorePage (CallbackData
, &FsOptionMenu
);
174 CallbackData
->FeDisplayContext
= FILE_SYSTEM
;
176 if (FILE_SYSTEM
== CallbackData
->FeDisplayContext
) {
177 NewMenuEntry
= BOpt_GetMenuEntry (&FsOptionMenu
, FileOptionMask
);
178 } else if (DIRECTORY
== CallbackData
->FeDisplayContext
) {
179 NewMenuEntry
= BOpt_GetMenuEntry (&DirectoryMenu
, FileOptionMask
);
182 CallbackData
->FeDisplayContext
= DIRECTORY
;
184 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
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
;
194 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
195 BOpt_DestroyMenuEntry (NewMenuEntry
);
197 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
200 switch (CallbackData
->FeCurrentState
) {
201 case BOOT_FROM_FILE_STATE
:
203 // Here boot from file
205 BootThisFile (NewFileContext
);
206 ExitFileExplorer
= TRUE
;
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
;
214 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
217 CallbackData
->MenuEntry
= NewMenuEntry
;
218 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
221 // Clean up file explore page.
223 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 1);
226 // Remove the Subtitle op-code.
228 CallbackData
->Hii
->UpdateForm (
230 CallbackData
->FeHiiHandle
,
237 // Create Subtitle op-code for the display string of the option.
239 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 1);
241 CreateSubTitleOpCode (
242 NewMenuEntry
->DisplayStringToken
,
246 CallbackData
->Hii
->UpdateForm (
248 CallbackData
->FeHiiHandle
,
261 return ExitFileExplorer
;
266 FileExplorerCallback (
267 IN EFI_FORM_CALLBACK_PROTOCOL
*This
,
269 IN EFI_IFR_DATA_ARRAY
*Data
,
270 OUT EFI_HII_CALLBACK_PACKET
**Packet
274 Callback Function for file exploration and file interaction.
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.
283 EFI_SUCCESS - Callback ended successfully.
284 Others - Contain some errors.
288 BMM_CALLBACK_DATA
*Private
;
289 FILE_EXPLORER_NV_DATA
*NvRamMap
;
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
;
297 if (KEY_VALUE_SAVE_AND_EXIT
== KeyValue
) {
299 // Apply changes and exit formset.
301 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
302 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
303 if (EFI_ERROR (Status
)) {
307 BOpt_GetBootOptions (Private
);
308 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
309 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
310 Status
= Var_UpdateDriverOption (
312 Private
->FeHiiHandle
,
313 NvRamMap
->DescriptionData
,
314 NvRamMap
->OptionalData
,
315 NvRamMap
->ForceReconnect
317 if (EFI_ERROR (Status
)) {
321 BOpt_GetDriverOptions (Private
);
322 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
325 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
326 } else if (KEY_VALUE_NO_SAVE_AND_EXIT
== KeyValue
) {
328 // Discard changes and exit formset.
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
) {
335 // Exit File Explorer formset.
337 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);
339 if (UpdateFileExplorer (Private
, KeyValue
)) {
340 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);