]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/PlatformBdsDxe/Generic/BootMaint/FileExplorer.c
Make some vfr buidable.
[mirror_edk2.git] / Nt32Pkg / PlatformBdsDxe / Generic / BootMaint / FileExplorer.c
CommitLineData
bc11b829 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 FileExplorer.c\r
15 \r
16AgBStract:\r
17\r
18 File explorer related functions.\r
19\r
20--*/\r
21\r
22//\r
23// Include common header file for this module.\r
24//\r
25#include "CommonHeader.h"\r
26\r
27#include "Generic/Bds.h"\r
28#include "BootMaint.h"\r
29#include "BdsPlatform.h"\r
30\r
31VOID\r
32UpdateFileExplorePage (\r
33 IN BMM_CALLBACK_DATA *CallbackData,\r
34 BM_MENU_OPTION *MenuOption\r
35 )\r
36/*++\r
37Routine Description:\r
38 Update the File Explore page.\r
39\r
40Arguments:\r
41 MenuOption - Pointer to menu options to display.\r
42\r
43Returns:\r
44 None.\r
45\r
46--*/\r
47{\r
48 UINT8 *Location;\r
49 UINTN Index;\r
50 BM_MENU_ENTRY *NewMenuEntry;\r
51 BM_FILE_CONTEXT *NewFileContext;\r
52 FORM_ID FormId;\r
53\r
54 NewMenuEntry = NULL;\r
55 NewFileContext = NULL;\r
56 FormId = 0;\r
57\r
58 //\r
59 // Clean up file explore page.\r
60 //\r
61 RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff);\r
62\r
63 //\r
64 // Remove all op-codes from dynamic page\r
65 //\r
66 CallbackData->Hii->UpdateForm (\r
67 CallbackData->Hii,\r
68 CallbackData->FeHiiHandle,\r
69 FORM_FILE_EXPLORER_ID,\r
70 FALSE,\r
71 UpdateData\r
72 );\r
73\r
74 RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 0);\r
75\r
76 Location = (UINT8 *) &UpdateData->Data;\r
77\r
78 for (Index = 0; Index < MenuOption->MenuNumber; Index++) {\r
79 NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);\r
80 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
81\r
82 if (NewFileContext->IsBootLegacy) {\r
83 continue;\r
84 }\r
85\r
86 if ((NewFileContext->IsDir) || (BOOT_FROM_FILE_STATE == CallbackData->FeCurrentState)) {\r
87 //\r
88 // Create Text opcode for directory, also create Text opcode for file in BOOT_FROM_FILE_STATE.\r
89 //\r
90 CreateTextOpCode (\r
91 NewMenuEntry->DisplayStringToken,\r
92 STR_NULL_STRING,\r
93 STR_NULL_STRING,\r
94 EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
95 (UINT16) (FILE_OPTION_OFFSET + Index),\r
96 Location\r
97 );\r
98 } else {\r
99 //\r
100 // Create Goto opcode for file in ADD_BOOT_OPTION_STATE or ADD_DRIVER_OPTION_STATE.\r
101 //\r
102 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
103 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
104 } else if (ADD_DRIVER_OPTION_STATE == CallbackData->FeCurrentState) {\r
105 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
106 }\r
107\r
108 CreateGotoOpCode (\r
109 FormId,\r
110 NewMenuEntry->DisplayStringToken,\r
111 STRING_TOKEN (STR_NULL_STRING),\r
112 EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,\r
113 (UINT16) (FILE_OPTION_OFFSET + Index),\r
114 Location\r
115 );\r
116 }\r
117\r
118 UpdateData->DataCount++;\r
119 Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;\r
120 }\r
121\r
122 CallbackData->Hii->UpdateForm (\r
123 CallbackData->Hii,\r
124 CallbackData->FeHiiHandle,\r
125 FORM_FILE_EXPLORER_ID,\r
126 TRUE,\r
127 UpdateData\r
128 );\r
129}\r
130\r
131BOOLEAN\r
132UpdateFileExplorer (\r
133 IN BMM_CALLBACK_DATA *CallbackData,\r
134 IN UINT16 KeyValue\r
135 )\r
136/*++\r
137\r
138Routine Description:\r
139 Update the file explower page with the refershed file system.\r
140\r
141Arguments:\r
142 CallbackData - BMM context data\r
143 KeyValue - Key value to identify the type of data to expect.\r
144\r
145Returns:\r
146 TRUE - Inform the caller to create a callback packet to exit file explorer.\r
147 FALSE - Indicate that there is no need to exit file explorer.\r
148\r
149--*/\r
150{\r
151 UINT16 FileOptionMask;\r
152 BM_MENU_ENTRY *NewMenuEntry;\r
153 BM_FILE_CONTEXT *NewFileContext;\r
154 FORM_ID FormId;\r
155 BOOLEAN ExitFileExplorer;\r
156 EFI_STATUS Status;\r
157 \r
158 NewMenuEntry = NULL;\r
159 NewFileContext = NULL;\r
160 ExitFileExplorer = FALSE;\r
161\r
162 FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue);\r
163\r
164 if (UNKNOWN_CONTEXT == CallbackData->FeDisplayContext) {\r
165 //\r
166 // First in, display file system.\r
167 //\r
168 BOpt_FreeMenu (&FsOptionMenu);\r
169 BOpt_FindFileSystem (CallbackData);\r
170 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu);\r
171\r
172 UpdateFileExplorePage (CallbackData, &FsOptionMenu);\r
173\r
174 CallbackData->FeDisplayContext = FILE_SYSTEM;\r
175 } else {\r
176 if (FILE_SYSTEM == CallbackData->FeDisplayContext) {\r
177 NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask);\r
178 } else if (DIRECTORY == CallbackData->FeDisplayContext) {\r
179 NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask);\r
180 }\r
181\r
182 CallbackData->FeDisplayContext = DIRECTORY;\r
183\r
184 NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
185\r
186 if (NewFileContext->IsDir ) {\r
187 RemoveEntryList (&NewMenuEntry->Link);\r
188 BOpt_FreeMenu (&DirectoryMenu);\r
189 Status = BOpt_FindFiles (CallbackData, NewMenuEntry);\r
190 if (EFI_ERROR (Status)) {\r
191 ExitFileExplorer = TRUE;\r
192 goto exit;\r
193 }\r
194 CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu);\r
195 BOpt_DestroyMenuEntry (NewMenuEntry);\r
196\r
197 UpdateFileExplorePage (CallbackData, &DirectoryMenu);\r
198\r
199 } else {\r
200 switch (CallbackData->FeCurrentState) {\r
201 case BOOT_FROM_FILE_STATE:\r
202 //\r
203 // Here boot from file\r
204 //\r
205 BootThisFile (NewFileContext);\r
206 ExitFileExplorer = TRUE;\r
207 break;\r
208\r
209 case ADD_BOOT_OPTION_STATE:\r
210 case ADD_DRIVER_OPTION_STATE:\r
211 if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) {\r
212 FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
213 } else {\r
214 FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
215 }\r
216\r
217 CallbackData->MenuEntry = NewMenuEntry;\r
218 CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath;\r
219\r
220 //\r
221 // Clean up file explore page.\r
222 //\r
223 RefreshUpdateData (FALSE, 0, FALSE, 0, 1);\r
224\r
225 //\r
226 // Remove the Subtitle op-code.\r
227 //\r
228 CallbackData->Hii->UpdateForm (\r
229 CallbackData->Hii,\r
230 CallbackData->FeHiiHandle,\r
231 FormId,\r
232 FALSE,\r
233 UpdateData\r
234 );\r
235\r
236 //\r
237 // Create Subtitle op-code for the display string of the option.\r
238 //\r
239 RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 1);\r
240\r
241 CreateSubTitleOpCode (\r
242 NewMenuEntry->DisplayStringToken,\r
243 &UpdateData->Data\r
244 );\r
245\r
246 CallbackData->Hii->UpdateForm (\r
247 CallbackData->Hii,\r
248 CallbackData->FeHiiHandle,\r
249 FormId,\r
250 TRUE,\r
251 UpdateData\r
252 );\r
253 break;\r
254\r
255 default:\r
256 break;\r
257 }\r
258 }\r
259 }\r
260exit:\r
261 return ExitFileExplorer;\r
262}\r
263\r
264EFI_STATUS\r
265EFIAPI\r
266FileExplorerCallback (\r
267 IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
268 IN UINT16 KeyValue,\r
269 IN EFI_IFR_DATA_ARRAY *Data,\r
270 OUT EFI_HII_CALLBACK_PACKET **Packet\r
271 )\r
272/*++\r
273Routine Description:\r
274 Callback Function for file exploration and file interaction.\r
275\r
276Arguments:\r
277 This - File explorer callback protocol pointer. \r
278 KeyValue - Key value to identify the type of data to expect.\r
279 Data - A pointer to the data being sent to the original exporting driver.\r
280 Packet - A pointer to a packet of information which a driver passes back to the browser.\r
281\r
282Returns:\r
283 EFI_SUCCESS - Callback ended successfully.\r
284 Others - Contain some errors.\r
285 \r
286--*/\r
287{\r
288 BMM_CALLBACK_DATA *Private;\r
289 FILE_EXPLORER_NV_DATA *NvRamMap;\r
290 EFI_STATUS Status;\r
291\r
292 Status = EFI_SUCCESS;\r
293 Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
294 UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->FeCallbackHandle;\r
295 NvRamMap = (FILE_EXPLORER_NV_DATA *) Data->NvRamMap;\r
296\r
297 if (KEY_VALUE_SAVE_AND_EXIT == KeyValue) {\r
298 //\r
299 // Apply changes and exit formset.\r
300 //\r
301 if (ADD_BOOT_OPTION_STATE == Private->FeCurrentState) {\r
302 Status = Var_UpdateBootOption (Private, NvRamMap);\r
303 if (EFI_ERROR (Status)) {\r
304 return Status;\r
305 }\r
306\r
307 BOpt_GetBootOptions (Private);\r
308 CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
309 } else if (ADD_DRIVER_OPTION_STATE == Private->FeCurrentState) {\r
310 Status = Var_UpdateDriverOption (\r
311 Private,\r
312 Private->FeHiiHandle,\r
313 NvRamMap->DescriptionData,\r
314 NvRamMap->OptionalData,\r
315 NvRamMap->ForceReconnect\r
316 );\r
317 if (EFI_ERROR (Status)) {\r
318 return Status;\r
319 }\r
320\r
321 BOpt_GetDriverOptions (Private);\r
322 CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
323 }\r
324\r
325 CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);\r
326 } else if (KEY_VALUE_NO_SAVE_AND_EXIT == KeyValue) {\r
327 //\r
328 // Discard changes and exit formset.\r
329 //\r
330 NvRamMap->OptionalData[0] = 0x0000;\r
331 NvRamMap->DescriptionData[0] = 0x0000;\r
332 CreateCallbackPacket (Packet, EXIT_REQUIRED | NV_NOT_CHANGED);\r
333 } else if (KeyValue < FILE_OPTION_OFFSET) {\r
334 //\r
335 // Exit File Explorer formset.\r
336 //\r
337 CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
338 } else {\r
339 if (UpdateFileExplorer (Private, KeyValue)) {\r
340 CreateCallbackPacket (Packet, EXIT_REQUIRED);\r
341 }\r
342 }\r
343\r
344 return Status;\r
345}\r