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
;
154 NewFileContext
= NULL
;
155 ExitFileExplorer
= FALSE
;
157 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& KeyValue
);
159 if (UNKNOWN_CONTEXT
== CallbackData
->FeDisplayContext
) {
161 // First in, display file system.
163 BOpt_FreeMenu (&FsOptionMenu
);
164 BOpt_FindFileSystem (CallbackData
);
165 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &FsOptionMenu
);
167 UpdateFileExplorePage (CallbackData
, &FsOptionMenu
);
169 CallbackData
->FeDisplayContext
= FILE_SYSTEM
;
171 if (FILE_SYSTEM
== CallbackData
->FeDisplayContext
) {
172 NewMenuEntry
= BOpt_GetMenuEntry (&FsOptionMenu
, FileOptionMask
);
173 } else if (DIRECTORY
== CallbackData
->FeDisplayContext
) {
174 NewMenuEntry
= BOpt_GetMenuEntry (&DirectoryMenu
, FileOptionMask
);
177 CallbackData
->FeDisplayContext
= DIRECTORY
;
179 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
181 if (NewFileContext
->IsDir
) {
182 RemoveEntryList (&NewMenuEntry
->Link
);
183 BOpt_FreeMenu (&DirectoryMenu
);
184 Status
= BOpt_FindFiles (CallbackData
, NewMenuEntry
);
185 if (EFI_ERROR (Status
)) {
186 ExitFileExplorer
= TRUE
;
189 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
190 BOpt_DestroyMenuEntry (NewMenuEntry
);
192 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
195 switch (CallbackData
->FeCurrentState
) {
196 case BOOT_FROM_FILE_STATE
:
198 // Here boot from file
200 BootThisFile (NewFileContext
);
201 ExitFileExplorer
= TRUE
;
204 case ADD_BOOT_OPTION_STATE
:
205 case ADD_DRIVER_OPTION_STATE
:
206 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
207 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
209 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
212 CallbackData
->MenuEntry
= NewMenuEntry
;
213 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
216 // Clean up file explore page.
218 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 1);
221 // Remove the Subtitle op-code.
223 CallbackData
->Hii
->UpdateForm (
225 CallbackData
->FeHiiHandle
,
232 // Create Subtitle op-code for the display string of the option.
234 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 1);
236 CreateSubTitleOpCode (
237 NewMenuEntry
->DisplayStringToken
,
241 CallbackData
->Hii
->UpdateForm (
243 CallbackData
->FeHiiHandle
,
256 return ExitFileExplorer
;
261 FileExplorerCallback (
262 IN EFI_FORM_CALLBACK_PROTOCOL
*This
,
264 IN EFI_IFR_DATA_ARRAY
*Data
,
265 OUT EFI_HII_CALLBACK_PACKET
**Packet
269 Callback Function for file exploration and file interaction.
272 This - File explorer callback protocol pointer.
273 KeyValue - Key value to identify the type of data to expect.
274 Data - A pointer to the data being sent to the original exporting driver.
275 Packet - A pointer to a packet of information which a driver passes back to the browser.
278 EFI_SUCCESS - Callback ended successfully.
279 Others - Contain some errors.
283 BMM_CALLBACK_DATA
*Private
;
284 FILE_EXPLORER_NV_DATA
*NvRamMap
;
287 Status
= EFI_SUCCESS
;
288 Private
= FE_CALLBACK_DATA_FROM_THIS (This
);
289 UpdateData
->FormCallbackHandle
= (EFI_PHYSICAL_ADDRESS
) (UINTN
) Private
->FeCallbackHandle
;
290 NvRamMap
= (FILE_EXPLORER_NV_DATA
*) Data
->NvRamMap
;
292 if (KEY_VALUE_SAVE_AND_EXIT
== KeyValue
) {
294 // Apply changes and exit formset.
296 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
297 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
298 if (EFI_ERROR (Status
)) {
302 BOpt_GetBootOptions (Private
);
303 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
304 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
305 Status
= Var_UpdateDriverOption (
307 Private
->FeHiiHandle
,
308 NvRamMap
->DescriptionData
,
309 NvRamMap
->OptionalData
,
310 NvRamMap
->ForceReconnect
312 if (EFI_ERROR (Status
)) {
316 BOpt_GetDriverOptions (Private
);
317 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
320 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
321 } else if (KEY_VALUE_NO_SAVE_AND_EXIT
== KeyValue
) {
323 // Discard changes and exit formset.
325 NvRamMap
->OptionalData
[0] = 0x0000;
326 NvRamMap
->DescriptionData
[0] = 0x0000;
327 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
328 } else if (KeyValue
< FILE_OPTION_OFFSET
) {
330 // Exit File Explorer formset.
332 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);
334 if (UpdateFileExplorer (Private
, KeyValue
)) {
335 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);