3 Copyright (c) 2004 - 2008, 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 "BootMaint.h"
25 UpdateFileExplorePage (
26 IN BMM_CALLBACK_DATA
*CallbackData
,
27 BM_MENU_OPTION
*MenuOption
31 Update the File Explore page.
34 MenuOption - Pointer to menu options to display.
42 BM_MENU_ENTRY
*NewMenuEntry
;
43 BM_FILE_CONTEXT
*NewFileContext
;
47 NewFileContext
= NULL
;
52 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
53 NewMenuEntry
= BOpt_GetMenuEntry (MenuOption
, Index
);
54 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
56 if (NewFileContext
->IsBootLegacy
) {
60 if ((NewFileContext
->IsDir
) || (BOOT_FROM_FILE_STATE
== CallbackData
->FeCurrentState
)) {
62 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.
65 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
66 NewMenuEntry
->DisplayStringToken
,
67 STRING_TOKEN (STR_NULL_STRING
),
68 EFI_IFR_FLAG_CALLBACK
,
74 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.
76 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
77 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
78 } else if (ADD_DRIVER_OPTION_STATE
== CallbackData
->FeCurrentState
) {
79 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
84 NewMenuEntry
->DisplayStringToken
,
85 STRING_TOKEN (STR_NULL_STRING
),
86 EFI_IFR_FLAG_CALLBACK
,
87 (UINT16
) (FILE_OPTION_OFFSET
+ Index
),
94 CallbackData
->FeHiiHandle
,
96 FORM_FILE_EXPLORER_ID
,
97 FORM_FILE_EXPLORER_ID
,
105 IN BMM_CALLBACK_DATA
*CallbackData
,
111 Update the file explower page with the refershed file system.
114 CallbackData - BMM context data
115 KeyValue - Key value to identify the type of data to expect.
118 TRUE - Inform the caller to create a callback packet to exit file explorer.
119 FALSE - Indicate that there is no need to exit file explorer.
123 UINT16 FileOptionMask
;
124 BM_MENU_ENTRY
*NewMenuEntry
;
125 BM_FILE_CONTEXT
*NewFileContext
;
127 BOOLEAN ExitFileExplorer
;
131 NewFileContext
= NULL
;
132 ExitFileExplorer
= FALSE
;
134 FileOptionMask
= (UINT16
) (FILE_OPTION_MASK
& KeyValue
);
136 if (UNKNOWN_CONTEXT
== CallbackData
->FeDisplayContext
) {
138 // First in, display file system.
140 BOpt_FreeMenu (&FsOptionMenu
);
141 BOpt_FindFileSystem (CallbackData
);
142 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &FsOptionMenu
);
144 UpdateFileExplorePage (CallbackData
, &FsOptionMenu
);
146 CallbackData
->FeDisplayContext
= FILE_SYSTEM
;
148 if (FILE_SYSTEM
== CallbackData
->FeDisplayContext
) {
149 NewMenuEntry
= BOpt_GetMenuEntry (&FsOptionMenu
, FileOptionMask
);
150 } else if (DIRECTORY
== CallbackData
->FeDisplayContext
) {
151 NewMenuEntry
= BOpt_GetMenuEntry (&DirectoryMenu
, FileOptionMask
);
154 CallbackData
->FeDisplayContext
= DIRECTORY
;
156 NewFileContext
= (BM_FILE_CONTEXT
*) NewMenuEntry
->VariableContext
;
158 if (NewFileContext
->IsDir
) {
159 RemoveEntryList (&NewMenuEntry
->Link
);
160 BOpt_FreeMenu (&DirectoryMenu
);
161 Status
= BOpt_FindFiles (CallbackData
, NewMenuEntry
);
162 if (EFI_ERROR (Status
)) {
163 ExitFileExplorer
= TRUE
;
166 CreateMenuStringToken (CallbackData
, CallbackData
->FeHiiHandle
, &DirectoryMenu
);
167 BOpt_DestroyMenuEntry (NewMenuEntry
);
169 UpdateFileExplorePage (CallbackData
, &DirectoryMenu
);
172 switch (CallbackData
->FeCurrentState
) {
173 case BOOT_FROM_FILE_STATE
:
175 // Here boot from file
177 BootThisFile (NewFileContext
);
178 ExitFileExplorer
= TRUE
;
181 case ADD_BOOT_OPTION_STATE
:
182 case ADD_DRIVER_OPTION_STATE
:
183 if (ADD_BOOT_OPTION_STATE
== CallbackData
->FeCurrentState
) {
184 FormId
= FORM_BOOT_ADD_DESCRIPTION_ID
;
186 FormId
= FORM_DRIVER_ADD_FILE_DESCRIPTION_ID
;
189 CallbackData
->MenuEntry
= NewMenuEntry
;
190 CallbackData
->LoadContext
->FilePathList
= ((BM_FILE_CONTEXT
*) (CallbackData
->MenuEntry
->VariableContext
))->DevicePath
;
193 // Create Subtitle op-code for the display string of the option.
195 RefreshUpdateData ();
197 CreateSubTitleOpCode (
198 NewMenuEntry
->DisplayStringToken
,
206 CallbackData
->FeHiiHandle
,
221 return ExitFileExplorer
;
226 FileExplorerCallback (
227 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
228 IN EFI_BROWSER_ACTION Action
,
229 IN EFI_QUESTION_ID QuestionId
,
231 IN EFI_IFR_TYPE_VALUE
*Value
,
232 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
237 This function processes the results of changes in configuration.
240 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
241 Action - Specifies the type of action taken by the browser.
242 QuestionId - A unique value which is sent to the original exporting driver
243 so that it can identify the type of data to expect.
244 Type - The type of value for the question.
245 Value - A pointer to the data being sent to the original exporting driver.
246 ActionRequest - On return, points to the action requested by the callback function.
249 EFI_SUCCESS - The callback successfully handled the action.
250 EFI_OUT_OF_RESOURCES - Not enough storage is available to hold the variable and its data.
251 EFI_DEVICE_ERROR - The variable could not be saved.
252 EFI_UNSUPPORTED - The specified Action is not supported by the callback.
256 BMM_CALLBACK_DATA
*Private
;
257 FILE_EXPLORER_NV_DATA
*NvRamMap
;
261 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
262 return EFI_INVALID_PARAMETER
;
265 Status
= EFI_SUCCESS
;
266 Private
= FE_CALLBACK_DATA_FROM_THIS (This
);
267 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;
270 // Retrive uncommitted data from Form Browser
272 NvRamMap
= &Private
->FeFakeNvData
;
273 BufferSize
= sizeof (FILE_EXPLORER_NV_DATA
);
274 Status
= GetBrowserData (NULL
, NULL
, &BufferSize
, (UINT8
*) NvRamMap
);
275 if (EFI_ERROR (Status
)) {
279 if (QuestionId
== KEY_VALUE_SAVE_AND_EXIT_BOOT
|| QuestionId
== KEY_VALUE_SAVE_AND_EXIT_DRIVER
) {
281 // Apply changes and exit formset
283 if (ADD_BOOT_OPTION_STATE
== Private
->FeCurrentState
) {
284 Status
= Var_UpdateBootOption (Private
, NvRamMap
);
285 if (EFI_ERROR (Status
)) {
289 BOpt_GetBootOptions (Private
);
290 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &BootOptionMenu
);
291 } else if (ADD_DRIVER_OPTION_STATE
== Private
->FeCurrentState
) {
292 Status
= Var_UpdateDriverOption (
294 Private
->FeHiiHandle
,
295 NvRamMap
->DescriptionData
,
296 NvRamMap
->OptionalData
,
297 NvRamMap
->ForceReconnect
299 if (EFI_ERROR (Status
)) {
303 BOpt_GetDriverOptions (Private
);
304 CreateMenuStringToken (Private
, Private
->FeHiiHandle
, &DriverOptionMenu
);
307 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
308 } else if (QuestionId
== KEY_VALUE_NO_SAVE_AND_EXIT_BOOT
|| QuestionId
== KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER
) {
310 // Discard changes and exit formset
312 NvRamMap
->OptionalData
[0] = 0x0000;
313 NvRamMap
->DescriptionData
[0] = 0x0000;
314 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
315 } else if (QuestionId
< FILE_OPTION_OFFSET
) {
317 // Exit File Explorer formset
319 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;
321 if (UpdateFileExplorer (Private
, QuestionId
)) {
322 *ActionRequest
= EFI_BROWSER_ACTION_REQUEST_EXIT
;