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 "BootMaint.h"
26 UpdateFileExplorePage (
27 IN BMM_CALLBACK_DATA
*CallbackData
,
28 BM_MENU_OPTION
*MenuOption
32 Update the File Explore page.
35 MenuOption - Pointer to menu options to display.
44 BM_MENU_ENTRY
*NewMenuEntry
;
45 BM_FILE_CONTEXT
*NewFileContext
;
49 NewFileContext
= NULL
;
53 // Clean up file explore page.
55 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 0xff);
58 // Remove all op-codes from dynamic page
60 CallbackData
->Hii
->UpdateForm (
62 CallbackData
->FeHiiHandle
,
63 FORM_FILE_EXPLORER_ID
,
68 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 0);
70 Location
= (UINT8
*) &UpdateData
->Data
;
72 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
73 NewMenuEntry
= BOpt_GetMenuEntry (MenuOption
, Index
);
74 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
76 if (NewFileContext
->IsBootLegacy
) {
80 if ((NewFileContext
->IsDir
) || (BOOT_FROM_FILE_STATE
== CallbackData
->FeCurrentState
)) {
82 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
85 NewMenuEntry
->DisplayStringToken
,
88 EFI_IFR_FLAG_INTERACTIVE
| EFI_IFR_FLAG_NV_ACCESS
,
89 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
94 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
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
;
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
),
112 UpdateData
->DataCount
++;
113 Location
= Location
+ ((EFI_IFR_OP_HEADER
*) Location
)->Length
;
116 CallbackData
->Hii
->UpdateForm (
118 CallbackData
->FeHiiHandle
,
119 FORM_FILE_EXPLORER_ID
,
127 IN BMM_CALLBACK_DATA
*CallbackData
,
133 Update the file explower page with the refershed file system.
136 CallbackData - BMM context data
137 KeyValue - Key value to identify the type of data to expect.
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.
145 UINT16 FileOptionMask
;
146 BM_MENU_ENTRY
*NewMenuEntry
;
147 BM_FILE_CONTEXT
*NewFileContext
;
149 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 Status
= BOpt_FindFiles (CallbackData
, NewMenuEntry
);
184 if (EFI_ERROR (Status
)) {
185 ExitFileExplorer
= TRUE
;
188 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
189 BOpt_DestroyMenuEntry (NewMenuEntry
);
191 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
194 switch (CallbackData
->FeCurrentState
) {
195 case BOOT_FROM_FILE_STATE
:
197 // Here boot from file
199 BootThisFile (NewFileContext
);
200 ExitFileExplorer
= TRUE
;
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
;
208 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
211 CallbackData
->MenuEntry
= NewMenuEntry
;
212 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
215 // Clean up file explore page.
217 RefreshUpdateData (FALSE
, 0, FALSE
, 0, 1);
220 // Remove the Subtitle op-code.
222 CallbackData
->Hii
->UpdateForm (
224 CallbackData
->FeHiiHandle
,
231 // Create Subtitle op-code for the display string of the option.
233 RefreshUpdateData (TRUE
, (EFI_PHYSICAL_ADDRESS
) (UINTN
) CallbackData
->FeCallbackHandle
, FALSE
, 0, 1);
235 CreateSubTitleOpCode (
236 NewMenuEntry
->DisplayStringToken
,
240 CallbackData
->Hii
->UpdateForm (
242 CallbackData
->FeHiiHandle
,
255 return ExitFileExplorer
;
260 FileExplorerCallback (
261 IN EFI_FORM_CALLBACK_PROTOCOL
*This
,
263 IN EFI_IFR_DATA_ARRAY
*Data
,
264 OUT EFI_HII_CALLBACK_PACKET
**Packet
268 Callback Function for file exploration and file interaction.
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.
277 EFI_SUCCESS - Callback ended successfully.
278 Others - Contain some errors.
282 BMM_CALLBACK_DATA
*Private
;
283 FILE_EXPLORER_NV_DATA
*NvRamMap
;
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
;
291 if (KEY_VALUE_SAVE_AND_EXIT
== KeyValue
) {
293 // Apply changes and exit formset.
295 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
296 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
297 if (EFI_ERROR (Status
)) {
301 BOpt_GetBootOptions (Private
);
302 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
303 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
304 Status
= Var_UpdateDriverOption (
306 Private
->FeHiiHandle
,
307 NvRamMap
->DescriptionData
,
308 NvRamMap
->OptionalData
,
309 NvRamMap
->ForceReconnect
311 if (EFI_ERROR (Status
)) {
315 BOpt_GetDriverOptions (Private
);
316 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
319 CreateCallbackPacket (Packet
, EXIT_REQUIRED
| NV_NOT_CHANGED
);
320 } else if (KEY_VALUE_NO_SAVE_AND_EXIT
== KeyValue
) {
322 // Discard changes and exit formset.
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
) {
329 // Exit File Explorer formset.
331 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);
333 if (UpdateFileExplorer (Private
, KeyValue
)) {
334 CreateCallbackPacket (Packet
, EXIT_REQUIRED
);