]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c
Check if component name protocol exist, uninstall it when it really exists.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / FileExplorer.c
CommitLineData
5c08e117 1/** @file\r
2 File explorer related functions.\r
3\r
eff07799 4Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 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
13078b3f 50 if ((NewFileContext->IsDir) || (FileExplorerStateBootFromFile == CallbackData->FeCurrentState)) {\r
5c08e117 51 //\r
13078b3f 52 // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile.\r
5c08e117 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
13078b3f 64 // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState.\r
5c08e117 65 //\r
13078b3f 66 if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
5c08e117 67 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
13078b3f 68 } else if (FileExplorerStateAddDriverOptionState == CallbackData->FeCurrentState) {\r
5c08e117 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
e24fc103 85 &gFileExploreFormSetGuid,\r
5c08e117 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
13078b3f 122 if (FileExplorerDisplayUnknown == CallbackData->FeDisplayContext) {\r
5c08e117 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
13078b3f 132 CallbackData->FeDisplayContext = FileExplorerDisplayFileSystem;\r
5c08e117 133 } else {\r
13078b3f 134 if (FileExplorerDisplayFileSystem == CallbackData->FeDisplayContext) {\r
5c08e117 135 NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask);\r
13078b3f 136 } else if (FileExplorerDisplayDirectory == CallbackData->FeDisplayContext) {\r
5c08e117 137 NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask);\r
138 }\r
139\r
a19ad64b 140 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
5c08e117 141\r
5c08e117 142 if (NewFileContext->IsDir ) {\r
5c08e117 143 BOpt_FreeMenu (&DirectoryMenu);\r
144 Status = BOpt_FindFiles (CallbackData, NewMenuEntry);\r
145 if (EFI_ERROR (Status)) {\r
146 ExitFileExplorer = TRUE;\r
147 goto exit;\r
148 }\r
149 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu);\r
5c08e117 150\r
151 UpdateFileExplorePage (CallbackData, &DirectoryMenu);\r
152\r
eff07799 153 CallbackData->FeDisplayContext = FileExplorerDisplayDirectory;\r
5c08e117 154 } else {\r
155 switch (CallbackData->FeCurrentState) {\r
13078b3f 156 case FileExplorerStateBootFromFile:\r
2df686c6 157 //\r
158 // Restore to original mode before launching boot option.\r
159 //\r
160 BdsSetConsoleMode (FALSE);\r
161\r
5c08e117 162 //\r
163 // Here boot from file\r
164 //\r
165 BootThisFile (NewFileContext);\r
72861c22 166 //\r
167 // Set proper video resolution and text mode for setup.\r
168 //\r
2df686c6 169 BdsSetConsoleMode (TRUE);\r
5c08e117 170 ExitFileExplorer = TRUE;\r
171 break;\r
172\r
13078b3f 173 case FileExplorerStateAddBootOption:\r
174 case FileExplorerStateAddDriverOptionState:\r
175 if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
5c08e117 176 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
177 } else {\r
178 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
179 }\r
180\r
181 CallbackData->MenuEntry = NewMenuEntry;\r
182 CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath;\r
183\r
184 //\r
185 // Create Subtitle op-code for the display string of the option.\r
186 //\r
187 RefreshUpdateData ();\r
75bf9d0e 188 mStartLabel->Number = FormId;\r
5c08e117 189\r
75bf9d0e
LG
190 HiiCreateSubTitleOpCode (\r
191 mStartOpCodeHandle,\r
5c08e117 192 NewMenuEntry->DisplayStringToken,\r
193 0,\r
194 0,\r
75bf9d0e 195 0\r
5c08e117 196 );\r
197\r
75bf9d0e 198 HiiUpdateForm (\r
5c08e117 199 CallbackData->FeHiiHandle,\r
e24fc103 200 &gFileExploreFormSetGuid,\r
5c08e117 201 FormId,\r
75bf9d0e
LG
202 mStartOpCodeHandle, // Label FormId\r
203 mEndOpCodeHandle // LABEL_END\r
5c08e117 204 );\r
205 break;\r
206\r
207 default:\r
208 break;\r
209 }\r
210 }\r
211 }\r
212 exit:\r
213 return ExitFileExplorer;\r
214}\r
215\r
216/**\r
217 This function processes the results of changes in configuration.\r
218 When user select a interactive opcode, this callback will be triggered.\r
219 Based on the Question(QuestionId) that triggers the callback, the corresponding\r
220 actions is performed. It handles:\r
221\r
222 1) the addition of boot option.\r
223 2) the addition of driver option.\r
224 3) exit from file browser\r
225 4) update of file content if a dir is selected.\r
226 5) boot the file if a file is selected in "boot from file"\r
227\r
228\r
229 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
230 @param Action Specifies the type of action taken by the browser.\r
231 @param QuestionId A unique value which is sent to the original exporting driver\r
232 so that it can identify the type of data to expect.\r
233 @param Type The type of value for the question.\r
234 @param Value A pointer to the data being sent to the original exporting driver.\r
235 @param ActionRequest On return, points to the action requested by the callback function.\r
236\r
237 @retval EFI_SUCCESS The callback successfully handled the action.\r
238 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
239 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
240 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
241 @retval EFI_INVALID_PARAMETER If paramter Value or ActionRequest is NULL.\r
242**/\r
243EFI_STATUS\r
244EFIAPI\r
245FileExplorerCallback (\r
246 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
247 IN EFI_BROWSER_ACTION Action,\r
248 IN EFI_QUESTION_ID QuestionId,\r
249 IN UINT8 Type,\r
250 IN EFI_IFR_TYPE_VALUE *Value,\r
251 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
252 )\r
253{\r
254 BMM_CALLBACK_DATA *Private;\r
255 FILE_EXPLORER_NV_DATA *NvRamMap;\r
256 EFI_STATUS Status;\r
5c08e117 257\r
84724077 258 if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
4548fc2a 259 //\r
84724077 260 // All other action return unsupported.\r
4548fc2a 261 //\r
84724077
ED
262 return EFI_UNSUPPORTED;\r
263 }\r
264 \r
265 Status = EFI_SUCCESS;\r
266 Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
4548fc2a 267\r
84724077
ED
268 //\r
269 // Retrieve uncommitted data from Form Browser\r
270 //\r
271 NvRamMap = &Private->FeFakeNvData;\r
272 HiiGetBrowserData (&gFileExploreFormSetGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap);\r
273\r
274 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
275 if ((Value == NULL) || (ActionRequest == NULL)) {\r
276 return EFI_INVALID_PARAMETER;\r
277 }\r
278 \r
d88f86f1
ED
279 if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
280 //\r
281 // Apply changes and exit formset\r
282 //\r
283 if (FileExplorerStateAddBootOption == Private->FeCurrentState) {\r
284 Status = Var_UpdateBootOption (Private, NvRamMap);\r
285 if (EFI_ERROR (Status)) {\r
286 return Status;\r
287 }\r
5c08e117 288\r
d88f86f1
ED
289 BOpt_GetBootOptions (Private);\r
290 CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
291 } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) {\r
292 Status = Var_UpdateDriverOption (\r
293 Private,\r
294 Private->FeHiiHandle,\r
295 NvRamMap->DescriptionData,\r
296 NvRamMap->OptionalData,\r
297 NvRamMap->ForceReconnect\r
298 );\r
299 if (EFI_ERROR (Status)) {\r
300 return Status;\r
301 }\r
5c08e117 302\r
d88f86f1
ED
303 BOpt_GetDriverOptions (Private);\r
304 CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
5c08e117 305 }\r
306\r
d88f86f1
ED
307 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
308 } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
309 //\r
310 // Discard changes and exit formset\r
311 //\r
312 NvRamMap->OptionalData[0] = 0x0000;\r
313 NvRamMap->DescriptionData[0] = 0x0000;\r
314 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
315 } else if (QuestionId < FILE_OPTION_OFFSET) {\r
316 //\r
317 // Exit File Explorer formset\r
318 //\r
319 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
5c08e117 320 }\r
84724077
ED
321 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
322 if (Value == NULL) {\r
323 return EFI_INVALID_PARAMETER;\r
324 }\r
325 \r
326 if (QuestionId >= FILE_OPTION_OFFSET) {\r
327 UpdateFileExplorer (Private, QuestionId);\r
328 }\r
5c08e117 329 }\r
84724077
ED
330\r
331 return Status;\r
5c08e117 332}\r