/** Update the file explower page with the refershed file system. @param KeyValue Key value to identify the type of data to expect. @retval EFI_SUCCESS Update the file explorer form success. @retval other errors Error occur when parse one directory. **/ EFI_STATUS LibUpdateFileExplorer ( IN UINT16 KeyValue ) { UINT16 FileOptionMask; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; EFI_STATUS Status; EFI_FILE_HANDLE FileHandle; Status = EFI_SUCCESS; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue) - mQuestionIdUpdate; NewMenuEntry = LibGetMenuEntry (gFileExplorerPrivate.FsOptionMenu, FileOptionMask); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (NewFileContext->IsDir) { RemoveEntryList (&NewMenuEntry->Link); LibFreeMenu (gFileExplorerPrivate.FsOptionMenu); LibGetFileHandleFromMenu (NewMenuEntry, &FileHandle); Status = LibFindFiles (FileHandle, NewFileContext->FileName, NewFileContext->DeviceHandle); if (!EFI_ERROR (Status)) { LibUpdateFileExplorePage (); } else { LibFreeMenu (gFileExplorerPrivate.FsOptionMenu); } LibDestroyMenuEntry (NewMenuEntry); } return Status; }
/** Update the File Explore page. **/ VOID LibUpdateFileExplorePage ( VOID ) { UINTN Index; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; MENU_OPTION *MenuOption; NewMenuEntry = NULL; NewFileContext = NULL; LibRefreshUpdateData (); MenuOption = gFileExplorerPrivate.FsOptionMenu; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = LibGetMenuEntry (MenuOption, Index); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (!NewFileContext->IsDir) { // // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile. // HiiCreateActionOpCode ( mLibStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState. // HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_FILE_EXPLORER_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_OFFSET + Index) ); } } HiiUpdateForm ( gFileExplorerPrivate.FeHiiHandle, &FileExplorerGuid, FORM_FILE_EXPLORER_ID, mLibStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mLibEndOpCodeHandle // LABEL_END ); }
/** Get the device path info saved in the menu structure. @param KeyValue Key value to identify the type of data to expect. **/ VOID LibGetDevicePath ( IN UINT16 KeyValue ) { UINT16 FileOptionMask; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue) - mQuestionIdUpdate; NewMenuEntry = LibGetMenuEntry (gFileExplorerPrivate.FsOptionMenu, FileOptionMask); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (gFileExplorerPrivate.RetDevicePath != NULL) { FreePool (gFileExplorerPrivate.RetDevicePath); } gFileExplorerPrivate.RetDevicePath = DuplicateDevicePath (NewFileContext->DevicePath); }
/** Update the File Explore page. **/ VOID LibUpdateFileExplorePage ( VOID ) { UINTN Index; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; MENU_OPTION *MenuOption; BOOLEAN CreateNewFile; NewMenuEntry = NULL; NewFileContext = NULL; CreateNewFile = FALSE; LibRefreshUpdateData (); MenuOption = gFileExplorerPrivate.FsOptionMenu; mQuestionIdUpdate += QUESTION_ID_UPDATE_STEP; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = LibGetMenuEntry (MenuOption, Index); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (!NewFileContext->IsRoot && !CreateNewFile) { HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_ADD_NEW_FILE_ID, STRING_TOKEN (STR_NEW_FILE), STRING_TOKEN (STR_NEW_FILE_HELP), EFI_IFR_FLAG_CALLBACK, (UINT16) (mNewFileQuestionId++) ); HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_ADD_NEW_FOLDER_ID, STRING_TOKEN (STR_NEW_FOLDER), STRING_TOKEN (STR_NEW_FOLDER_HELP), EFI_IFR_FLAG_CALLBACK, (UINT16) (mNewFolderQuestionId++) ); HiiCreateTextOpCode( mLibStartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), STRING_TOKEN (STR_NULL_STRING), 0 ); CreateNewFile = TRUE; } if (!NewFileContext->IsDir) { // // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile. // HiiCreateActionOpCode ( mLibStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index + mQuestionIdUpdate), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState. // HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_FILE_EXPLORER_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_OFFSET + Index + mQuestionIdUpdate) ); } } HiiUpdateForm ( gFileExplorerPrivate.FeHiiHandle, &FileExplorerGuid, FORM_FILE_EXPLORER_ID, mLibStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mLibEndOpCodeHandle // LABEL_END ); }