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