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