2 File explorer related functions.
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "BootMaint.h"
18 UpdateFileExplorePage (
19 IN BMM_CALLBACK_DATA
*CallbackData
,
20 BM_MENU_OPTION
*MenuOption
24 Update the File Explore page.
27 MenuOption - Pointer to menu options to display.
35 BM_MENU_ENTRY
*NewMenuEntry
;
36 BM_FILE_CONTEXT
*NewFileContext
;
40 NewFileContext
= NULL
;
45 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
46 NewMenuEntry
= BOpt_GetMenuEntry (MenuOption
, Index
);
47 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
49 if (NewFileContext
->IsBootLegacy
) {
53 if ((NewFileContext
->IsDir
) || (BOOT_FROM_FILE_STATE
== CallbackData
->FeCurrentState
)) {
55 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
58 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
59 NewMenuEntry
->DisplayStringToken
,
60 STRING_TOKEN (STR_NULL_STRING
),
61 EFI_IFR_FLAG_CALLBACK
,
67 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
69 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
70 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
71 } else if (ADD_DRIVER_OPTION_STATE
== CallbackData
->FeCurrentState
) {
72 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
77 NewMenuEntry
->DisplayStringToken
,
78 STRING_TOKEN (STR_NULL_STRING
),
79 EFI_IFR_FLAG_CALLBACK
,
80 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
87 CallbackData
->FeHiiHandle
,
89 FORM_FILE_EXPLORER_ID
,
90 FORM_FILE_EXPLORER_ID
,
98 IN BMM_CALLBACK_DATA
*CallbackData
,
104 Update the file explower page with the refershed file system.
107 CallbackData - BMM context data
108 KeyValue - Key value to identify the type of data to expect.
111 TRUE - Inform the caller to create a callback packet to exit file explorer.
112 FALSE - Indicate that there is no need to exit file explorer.
116 UINT16 FileOptionMask
;
117 BM_MENU_ENTRY
*NewMenuEntry
;
118 BM_FILE_CONTEXT
*NewFileContext
;
120 BOOLEAN ExitFileExplorer
;
124 NewFileContext
= NULL
;
125 ExitFileExplorer
= FALSE
;
127 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& KeyValue
);
129 if (UNKNOWN_CONTEXT
== CallbackData
->FeDisplayContext
) {
131 // First in, display file system.
133 BOpt_FreeMenu (&FsOptionMenu
);
134 BOpt_FindFileSystem (CallbackData
);
135 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &FsOptionMenu
);
137 UpdateFileExplorePage (CallbackData
, &FsOptionMenu
);
139 CallbackData
->FeDisplayContext
= FILE_SYSTEM
;
141 if (FILE_SYSTEM
== CallbackData
->FeDisplayContext
) {
142 NewMenuEntry
= BOpt_GetMenuEntry (&FsOptionMenu
, FileOptionMask
);
143 } else if (DIRECTORY
== CallbackData
->FeDisplayContext
) {
144 NewMenuEntry
= BOpt_GetMenuEntry (&DirectoryMenu
, FileOptionMask
);
147 CallbackData
->FeDisplayContext
= DIRECTORY
;
149 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
151 if (NewFileContext
->IsDir
) {
152 RemoveEntryList (&NewMenuEntry
->Link
);
153 BOpt_FreeMenu (&DirectoryMenu
);
154 Status
= BOpt_FindFiles (CallbackData
, NewMenuEntry
);
155 if (EFI_ERROR (Status
)) {
156 ExitFileExplorer
= TRUE
;
159 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
160 BOpt_DestroyMenuEntry (NewMenuEntry
);
162 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
165 switch (CallbackData
->FeCurrentState
) {
166 case BOOT_FROM_FILE_STATE
:
168 // Here boot from file
170 BootThisFile (NewFileContext
);
171 ExitFileExplorer
= TRUE
;
174 case ADD_BOOT_OPTION_STATE
:
175 case ADD_DRIVER_OPTION_STATE
:
176 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
177 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
179 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
182 CallbackData
->MenuEntry
= NewMenuEntry
;
183 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
186 // Create Subtitle op-code for the display string of the option.
188 RefreshUpdateData ();
190 CreateSubTitleOpCode (
191 NewMenuEntry
->DisplayStringToken
,
199 CallbackData
->FeHiiHandle
,
214 return ExitFileExplorer
;
219 FileExplorerCallback (
220 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
221 IN EFI_BROWSER_ACTION Action
,
222 IN EFI_QUESTION_ID QuestionId
,
224 IN EFI_IFR_TYPE_VALUE
*Value
,
225 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
230 This function processes the results of changes in configuration.
233 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
234 Action - Specifies the type of action taken by the browser.
235 QuestionId - A unique value which is sent to the original exporting driver
236 so that it can identify the type of data to expect.
237 Type - The type of value for the question.
238 Value - A pointer to the data being sent to the original exporting driver.
239 ActionRequest - On return, points to the action requested by the callback function.
242 EFI_SUCCESS - The callback successfully handled the action.
243 EFI_OUT_OF_RESOURCES - Not enough storage is available to hold the variable and its data.
244 EFI_DEVICE_ERROR - The variable could not be saved.
245 EFI_UNSUPPORTED - The specified Action is not supported by the callback.
249 BMM_CALLBACK_DATA
*Private
;
250 FILE_EXPLORER_NV_DATA
*NvRamMap
;
254 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
255 return EFI_INVALID_PARAMETER
;
258 Status
= EFI_SUCCESS
;
259 Private
= FE_CALLBACK_DATA_FROM_THIS (This
);
260 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;
263 // Retrive uncommitted data from Form Browser
265 NvRamMap
= &Private
->FeFakeNvData
;
266 BufferSize
= sizeof (FILE_EXPLORER_NV_DATA
);
267 Status
= GetBrowserData (NULL
, NULL
, &BufferSize
, (UINT8
*) NvRamMap
);
268 if (EFI_ERROR (Status
)) {
272 if (QuestionId
== KEY_VALUE_SAVE_AND_EXIT_BOOT
|| QuestionId
== KEY_VALUE_SAVE_AND_EXIT_DRIVER
) {
274 // Apply changes and exit formset
276 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
277 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
278 if (EFI_ERROR (Status
)) {
282 BOpt_GetBootOptions (Private
);
283 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
284 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
285 Status
= Var_UpdateDriverOption (
287 Private
->FeHiiHandle
,
288 NvRamMap
->DescriptionData
,
289 NvRamMap
->OptionalData
,
290 NvRamMap
->ForceReconnect
292 if (EFI_ERROR (Status
)) {
296 BOpt_GetDriverOptions (Private
);
297 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
300 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
301 } else if (QuestionId
== KEY_VALUE_NO_SAVE_AND_EXIT_BOOT
|| QuestionId
== KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER
) {
303 // Discard changes and exit formset
305 NvRamMap
->OptionalData
[0] = 0x0000;
306 NvRamMap
->DescriptionData
[0] = 0x0000;
307 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
308 } else if (QuestionId
< FILE_OPTION_OFFSET
) {
310 // Exit File Explorer formset
312 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
314 if (UpdateFileExplorer (Private
, QuestionId
)) {
315 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;