Refine the comments.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / FileExplorer.c
CommitLineData
5c08e117 1/** @file\r
2 File explorer related functions.\r
3\r
4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "BootMaint.h"\r
16\r
17/**\r
18 Update the File Explore page.\r
19\r
20 @param CallbackData The BMM context data.\r
21 @param MenuOption Pointer to menu options to display.\r
22\r
23**/\r
24VOID\r
25UpdateFileExplorePage (\r
26 IN BMM_CALLBACK_DATA *CallbackData,\r
27 BM_MENU_OPTION *MenuOption\r
28 )\r
29{\r
30 UINTN Index;\r
31 BM_MENU_ENTRY *NewMenuEntry;\r
32 BM_FILE_CONTEXT *NewFileContext;\r
33 EFI_FORM_ID FormId;\r
34\r
35 NewMenuEntry = NULL;\r
36 NewFileContext = NULL;\r
37 FormId = 0;\r
38\r
39 RefreshUpdateData ();\r
75bf9d0e 40 mStartLabel->Number = FORM_FILE_EXPLORER_ID;\r
5c08e117 41\r
42 for (Index = 0; Index < MenuOption->MenuNumber; Index++) {\r
43 NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);\r
44 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
45\r
46 if (NewFileContext->IsBootLegacy) {\r
47 continue;\r
48 }\r
49\r
50 if ((NewFileContext->IsDir) || (BOOT_FROM_FILE_STATE == CallbackData->FeCurrentState)) {\r
51 //\r
52 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.\r
53 //\r
75bf9d0e
LG
54 HiiCreateActionOpCode (\r
55 mStartOpCodeHandle,\r
5c08e117 56 (UINT16) (FILE_OPTION_OFFSET + Index),\r
57 NewMenuEntry->DisplayStringToken,\r
58 STRING_TOKEN (STR_NULL_STRING),\r
59 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 60 0\r
5c08e117 61 );\r
62 } else {\r
63 //\r
64 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.\r
65 //\r
66 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
67 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
68 } else if (ADD_DRIVER_OPTION_STATE == CallbackData->FeCurrentState) {\r
69 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
70 }\r
71\r
75bf9d0e
LG
72 HiiCreateGotoOpCode (\r
73 mStartOpCodeHandle,\r
5c08e117 74 FormId,\r
75 NewMenuEntry->DisplayStringToken,\r
76 STRING_TOKEN (STR_NULL_STRING),\r
77 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 78 (UINT16) (FILE_OPTION_OFFSET + Index)\r
5c08e117 79 );\r
80 }\r
81 }\r
82\r
75bf9d0e 83 HiiUpdateForm (\r
5c08e117 84 CallbackData->FeHiiHandle,\r
85 &mFileExplorerGuid,\r
86 FORM_FILE_EXPLORER_ID,\r
75bf9d0e
LG
87 mStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID\r
88 mEndOpCodeHandle // LABEL_END\r
5c08e117 89 );\r
90}\r
91\r
92/**\r
93 Update the file explower page with the refershed file system.\r
94\r
95\r
96 @param CallbackData BMM context data\r
97 @param KeyValue Key value to identify the type of data to expect.\r
98\r
99 @retval TRUE Inform the caller to create a callback packet to exit file explorer.\r
100 @retval FALSE Indicate that there is no need to exit file explorer.\r
101\r
102**/\r
103BOOLEAN\r
104UpdateFileExplorer (\r
105 IN BMM_CALLBACK_DATA *CallbackData,\r
106 IN UINT16 KeyValue\r
107 )\r
108{\r
109 UINT16 FileOptionMask;\r
110 BM_MENU_ENTRY *NewMenuEntry;\r
111 BM_FILE_CONTEXT *NewFileContext;\r
112 EFI_FORM_ID FormId;\r
113 BOOLEAN ExitFileExplorer;\r
114 EFI_STATUS Status;\r
115\r
116 NewMenuEntry = NULL;\r
117 NewFileContext = NULL;\r
118 ExitFileExplorer = FALSE;\r
119\r
120 FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue);\r
121\r
122 if (UNKNOWN_CONTEXT == CallbackData->FeDisplayContext) {\r
123 //\r
124 // First in, display file system.\r
125 //\r
126 BOpt_FreeMenu (&FsOptionMenu);\r
127 BOpt_FindFileSystem (CallbackData);\r
128 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu);\r
129\r
130 UpdateFileExplorePage (CallbackData, &FsOptionMenu);\r
131\r
132 CallbackData->FeDisplayContext = FILE_SYSTEM;\r
133 } else {\r
134 if (FILE_SYSTEM == CallbackData->FeDisplayContext) {\r
135 NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask);\r
136 } else if (DIRECTORY == CallbackData->FeDisplayContext) {\r
137 NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask);\r
138 }\r
139\r
140 CallbackData->FeDisplayContext = DIRECTORY;\r
141\r
142 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
143\r
144 if (NewFileContext->IsDir ) {\r
145 RemoveEntryList (&NewMenuEntry->Link);\r
146 BOpt_FreeMenu (&DirectoryMenu);\r
147 Status = BOpt_FindFiles (CallbackData, NewMenuEntry);\r
148 if (EFI_ERROR (Status)) {\r
149 ExitFileExplorer = TRUE;\r
150 goto exit;\r
151 }\r
152 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu);\r
153 BOpt_DestroyMenuEntry (NewMenuEntry);\r
154\r
155 UpdateFileExplorePage (CallbackData, &DirectoryMenu);\r
156\r
157 } else {\r
158 switch (CallbackData->FeCurrentState) {\r
159 case BOOT_FROM_FILE_STATE:\r
160 //\r
161 // Here boot from file\r
162 //\r
163 BootThisFile (NewFileContext);\r
164 ExitFileExplorer = TRUE;\r
165 break;\r
166\r
167 case ADD_BOOT_OPTION_STATE:\r
168 case ADD_DRIVER_OPTION_STATE:\r
169 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
170 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
171 } else {\r
172 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
173 }\r
174\r
175 CallbackData->MenuEntry = NewMenuEntry;\r
176 CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath;\r
177\r
178 //\r
179 // Create Subtitle op-code for the display string of the option.\r
180 //\r
181 RefreshUpdateData ();\r
75bf9d0e 182 mStartLabel->Number = FormId;\r
5c08e117 183\r
75bf9d0e
LG
184 HiiCreateSubTitleOpCode (\r
185 mStartOpCodeHandle,\r
5c08e117 186 NewMenuEntry->DisplayStringToken,\r
187 0,\r
188 0,\r
75bf9d0e 189 0\r
5c08e117 190 );\r
191\r
75bf9d0e 192 HiiUpdateForm (\r
5c08e117 193 CallbackData->FeHiiHandle,\r
194 &mFileExplorerGuid,\r
195 FormId,\r
75bf9d0e
LG
196 mStartOpCodeHandle, // Label FormId\r
197 mEndOpCodeHandle // LABEL_END\r
5c08e117 198 );\r
199 break;\r
200\r
201 default:\r
202 break;\r
203 }\r
204 }\r
205 }\r
206 exit:\r
207 return ExitFileExplorer;\r
208}\r
209\r
210/**\r
211 This function processes the results of changes in configuration.\r
212 When user select a interactive opcode, this callback will be triggered.\r
213 Based on the Question(QuestionId) that triggers the callback, the corresponding\r
214 actions is performed. It handles:\r
215\r
216 1) the addition of boot option.\r
217 2) the addition of driver option.\r
218 3) exit from file browser\r
219 4) update of file content if a dir is selected.\r
220 5) boot the file if a file is selected in "boot from file"\r
221\r
222\r
223 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
224 @param Action Specifies the type of action taken by the browser.\r
225 @param QuestionId A unique value which is sent to the original exporting driver\r
226 so that it can identify the type of data to expect.\r
227 @param Type The type of value for the question.\r
228 @param Value A pointer to the data being sent to the original exporting driver.\r
229 @param ActionRequest On return, points to the action requested by the callback function.\r
230\r
231 @retval EFI_SUCCESS The callback successfully handled the action.\r
232 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
233 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
234 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
235 @retval EFI_INVALID_PARAMETER If paramter Value or ActionRequest is NULL.\r
236**/\r
237EFI_STATUS\r
238EFIAPI\r
239FileExplorerCallback (\r
240 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
241 IN EFI_BROWSER_ACTION Action,\r
242 IN EFI_QUESTION_ID QuestionId,\r
243 IN UINT8 Type,\r
244 IN EFI_IFR_TYPE_VALUE *Value,\r
245 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
246 )\r
247{\r
248 BMM_CALLBACK_DATA *Private;\r
249 FILE_EXPLORER_NV_DATA *NvRamMap;\r
250 EFI_STATUS Status;\r
5c08e117 251\r
252 if ((Value == NULL) || (ActionRequest == NULL)) {\r
253 return EFI_INVALID_PARAMETER;\r
254 }\r
255\r
256 Status = EFI_SUCCESS;\r
257 Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
258 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
259\r
260 //\r
261 // Retrieve uncommitted data from Form Browser\r
262 //\r
75bf9d0e 263 NvRamMap = &Private->FeFakeNvData;\r
1d451ff9 264 HiiGetBrowserData (&mFileExplorerGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap);\r
5c08e117 265\r
266 if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
267 //\r
268 // Apply changes and exit formset\r
269 //\r
270 if (ADD_BOOT_OPTION_STATE == Private->FeCurrentState) {\r
271 Status = Var_UpdateBootOption (Private, NvRamMap);\r
272 if (EFI_ERROR (Status)) {\r
273 return Status;\r
274 }\r
275\r
276 BOpt_GetBootOptions (Private);\r
277 CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
278 } else if (ADD_DRIVER_OPTION_STATE == Private->FeCurrentState) {\r
279 Status = Var_UpdateDriverOption (\r
280 Private,\r
281 Private->FeHiiHandle,\r
282 NvRamMap->DescriptionData,\r
283 NvRamMap->OptionalData,\r
284 NvRamMap->ForceReconnect\r
285 );\r
286 if (EFI_ERROR (Status)) {\r
287 return Status;\r
288 }\r
289\r
290 BOpt_GetDriverOptions (Private);\r
291 CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
292 }\r
293\r
294 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
295 } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
296 //\r
297 // Discard changes and exit formset\r
298 //\r
299 NvRamMap->OptionalData[0] = 0x0000;\r
300 NvRamMap->DescriptionData[0] = 0x0000;\r
301 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
302 } else if (QuestionId < FILE_OPTION_OFFSET) {\r
303 //\r
304 // Exit File Explorer formset\r
305 //\r
306 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
307 } else {\r
308 if (UpdateFileExplorer (Private, QuestionId)) {\r
309 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
310 }\r
311 }\r
312\r
313 return Status;\r
314}\r