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.
22 #include "Generic/Bds.h"
23 #include "bootmaint.h"
24 #include "BdsPlatform.h"
27 UpdateFileExplorePage (
28 IN BMM_CALLBACK_DATA
*CallbackData
,
29 BM_MENU_OPTION
*MenuOption
33 Update the File Explore page.
36 MenuOption - Pointer to menu options to display.
45 BM_MENU_ENTRY
*NewMenuEntry
;
46 BM_FILE_CONTEXT
*NewFileContext
;
50 NewFileContext
= NULL
;
54 // Clean up file explore page.
56 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
59 // Remove all op-codes from dynamic page
61 CallbackData
->Hii
->UpdateForm (
63 CallbackData
->FeHiiHandle
,
64 FORM_FILE_EXPLORER_ID
,
69 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 0);
71 Location
= (UINT8
*) &UpdateData
->Data
;
73 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
74 NewMenuEntry
= BOpt_GetMenuEntry (MenuOption
, Index
);
75 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
77 if (NewFileContext
->IsBootLegacy
) {
81 if ((NewFileContext
->IsDir
) || (BOOT_FROM_FILE_STATE
== CallbackData
->FeCurrentState
)) {
83 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
86 NewMenuEntry
->DisplayStringToken
,
89 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
90 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
95 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
97 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
98 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
99 } else if (ADD_DRIVER_OPTION_STATE
== CallbackData
->FeCurrentState
) {
100 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
105 NewMenuEntry
->DisplayStringToken
,
106 STRING_TOKEN (STR_NULL_STRING
),
107 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
108 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
113 UpdateData
->DataCount
++;
114 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
117 CallbackData
->Hii
->UpdateForm (
119 CallbackData
->FeHiiHandle
,
120 FORM_FILE_EXPLORER_ID
,
128 IN BMM_CALLBACK_DATA
*CallbackData
,
134 Update the file explower page with the refershed file system.
137 CallbackData - BMM context data
138 KeyValue - Key value to identify the type of data to expect.
141 TRUE - Inform the caller to create a callback packet to exit file explorer.
142 FALSE - Indicate that there is no need to exit file explorer.
146 UINT16 FileOptionMask
;
147 BM_MENU_ENTRY
*NewMenuEntry
;
148 BM_FILE_CONTEXT
*NewFileContext
;
150 BOOLEAN ExitFileExplorer
;
153 NewFileContext
= NULL
;
154 ExitFileExplorer
= FALSE
;
156 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& KeyValue
);
158 if (UNKNOWN_CONTEXT
== CallbackData
->FeDisplayContext
) {
160 // First in, display file system.
162 BOpt_FreeMenu (&FsOptionMenu
);
163 BOpt_FindFileSystem (CallbackData
);
164 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &FsOptionMenu
);
166 UpdateFileExplorePage (CallbackData
, &FsOptionMenu
);
168 CallbackData
->FeDisplayContext
= FILE_SYSTEM
;
170 if (FILE_SYSTEM
== CallbackData
->FeDisplayContext
) {
171 NewMenuEntry
= BOpt_GetMenuEntry (&FsOptionMenu
, FileOptionMask
);
172 } else if (DIRECTORY
== CallbackData
->FeDisplayContext
) {
173 NewMenuEntry
= BOpt_GetMenuEntry (&DirectoryMenu
, FileOptionMask
);
176 CallbackData
->FeDisplayContext
= DIRECTORY
;
178 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
180 if (NewFileContext
->IsDir
) {
181 RemoveEntryList (&NewMenuEntry
->Link
);
182 BOpt_FreeMenu (&DirectoryMenu
);
183 BOpt_FindFiles (CallbackData
, NewMenuEntry
);
184 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
185 BOpt_DestroyMenuEntry (NewMenuEntry
);
187 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
190 switch (CallbackData
->FeCurrentState
) {
191 case BOOT_FROM_FILE_STATE
:
193 // Here boot from file
195 BootThisFile (NewFileContext
);
196 ExitFileExplorer
= TRUE
;
199 case ADD_BOOT_OPTION_STATE
:
200 case ADD_DRIVER_OPTION_STATE
:
201 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
202 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
204 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
207 CallbackData
->MenuEntry
= NewMenuEntry
;
208 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
211 // Clean up file explore page.
213 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 1);
216 // Remove the Subtitle op-code.
218 CallbackData
->Hii
->UpdateForm (
220 CallbackData
->FeHiiHandle
,
227 // Create Subtitle op-code for the display string of the option.
229 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 1);
231 CreateSubTitleOpCode (
232 NewMenuEntry
->DisplayStringToken
,
236 CallbackData
->Hii
->UpdateForm (
238 CallbackData
->FeHiiHandle
,
251 return ExitFileExplorer
;
256 FileExplorerCallback (
257 IN EFI_FORM_CALLBACK_PROTOCOL
*This
,
259 IN EFI_IFR_DATA_ARRAY
*Data
,
260 OUT EFI_HII_CALLBACK_PACKET
**Packet
264 Callback Function for file exploration and file interaction.
267 This - File explorer callback protocol pointer.
268 KeyValue - Key value to identify the type of data to expect.
269 Data - A pointer to the data being sent to the original exporting driver.
270 Packet - A pointer to a packet of information which a driver passes back to the browser.
273 EFI_SUCCESS - Callback ended successfully.
274 Others - Contain some errors.
278 BMM_CALLBACK_DATA
*Private
;
279 FILE_EXPLORER_NV_DATA
*NvRamMap
;
282 Status
= EFI_SUCCESS
;
283 Private
= FE_CALLBACK_DATA_FROM_THIS (This
);
284 UpdateData
->FormCallbackHandle
= (EFI_PHYSICAL_ADDRESS
) (UINTN
) Private
->FeCallbackHandle
;
285 NvRamMap
= (FILE_EXPLORER_NV_DATA
*) Data
->NvRamMap
;
287 if (KEY_VALUE_SAVE_AND_EXIT
== KeyValue
) {
289 // Apply changes and exit formset.
291 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
292 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
293 if (EFI_ERROR (Status
)) {
297 BOpt_GetBootOptions (Private
);
298 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
299 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
300 Status
= Var_UpdateDriverOption (
302 Private
->FeHiiHandle
,
303 NvRamMap
->DescriptionData
,
304 NvRamMap
->OptionalData
,
305 NvRamMap
->ForceReconnect
307 if (EFI_ERROR (Status
)) {
311 BOpt_GetDriverOptions (Private
);
312 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
315 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
316 } else if (KEY_VALUE_NO_SAVE_AND_EXIT
== KeyValue
) {
318 // Discard changes and exit formset.
320 NvRamMap
->OptionalData
[0] = 0x0000;
321 NvRamMap
->DescriptionData
[0] = 0x0000;
322 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
323 } else if (KeyValue
< FILE_OPTION_OFFSET
) {
325 // Exit File Explorer formset.
327 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);
329 if (UpdateFileExplorer (Private
, KeyValue
)) {
330 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);