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