mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/FileExplorer: Enable functionality of creating new file/folder
https://bugzilla.tianocore.org/show_bug.cgi?id=324 Enhance the FileExplorerlib so that user can create a new file/folder through the UI page. Cc: Eric Dong <eric.dong@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
This commit is contained in:
parent
9cf1aa29cf
commit
a409875592
|
@ -73,6 +73,24 @@ VOID *mLibEndOpCodeHandle = NULL;
|
|||
EFI_IFR_GUID_LABEL *mLibStartLabel = NULL;
|
||||
EFI_IFR_GUID_LABEL *mLibEndLabel = NULL;
|
||||
UINT16 mQuestionIdUpdate;
|
||||
CHAR16 mNewFileName[MAX_FILE_NAME_LEN];
|
||||
CHAR16 mNewFolderName[MAX_FOLDER_NAME_LEN];
|
||||
UINTN mNewFileQuestionId = NEW_FILE_QUESTION_ID_BASE;
|
||||
UINTN mNewFolderQuestionId = NEW_FOLDER_QUESTION_ID_BASE;
|
||||
|
||||
/**
|
||||
Create a new file or folder in current directory.
|
||||
|
||||
@param FileName Point to the fileNmae or folder.
|
||||
@param CreateFile CreateFile== TRUE means create a new file.
|
||||
CreateFile== FALSE means create a new Folder.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LibCreateNewFile (
|
||||
IN CHAR16 *FileName,
|
||||
IN BOOLEAN CreateFile
|
||||
);
|
||||
|
||||
/**
|
||||
This function allows a caller to extract the current configuration for one
|
||||
|
@ -175,9 +193,13 @@ LibCallback (
|
|||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN NeedExit;
|
||||
CHAR16 *NewFileName;
|
||||
CHAR16 *NewFolderName;
|
||||
|
||||
NeedExit = TRUE;
|
||||
|
||||
NewFileName = NULL;
|
||||
NewFolderName = NULL;
|
||||
|
||||
if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {
|
||||
//
|
||||
// Do nothing for other UEFI Action. Only do call back when data is changed.
|
||||
|
@ -189,7 +211,55 @@ LibCallback (
|
|||
if ((Value == NULL) || (ActionRequest == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
if (QuestionId == KEY_VALUE_CREATE_FILE_AND_EXIT) {
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
if (!IsZeroBuffer (mNewFileName, sizeof (mNewFileName))) {
|
||||
Status = LibCreateNewFile (mNewFileName,TRUE);
|
||||
ZeroMem (mNewFileName,sizeof (mNewFileName));
|
||||
}
|
||||
}
|
||||
|
||||
if (QuestionId == KEY_VALUE_NO_CREATE_FILE_AND_EXIT) {
|
||||
ZeroMem (mNewFileName,sizeof (mNewFileName));
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
}
|
||||
|
||||
if (QuestionId == KEY_VALUE_CREATE_FOLDER_AND_EXIT) {
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
if (!IsZeroBuffer (mNewFolderName, sizeof (mNewFolderName))) {
|
||||
Status = LibCreateNewFile (mNewFolderName, FALSE);
|
||||
ZeroMem (mNewFolderName,sizeof (mNewFolderName));
|
||||
}
|
||||
}
|
||||
|
||||
if (QuestionId == KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT) {
|
||||
ZeroMem (mNewFolderName,sizeof (mNewFolderName));
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
}
|
||||
|
||||
if (QuestionId == NEW_FILE_NAME_ID) {
|
||||
NewFileName = HiiGetString (gFileExplorerPrivate.FeHiiHandle, Value->string, NULL);
|
||||
if (NewFileName != NULL) {
|
||||
StrCpyS (mNewFileName, MAX_FILE_NAME_LEN, NewFileName);
|
||||
FreePool (NewFileName);
|
||||
NewFileName = NULL;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
if (QuestionId == NEW_FOLDER_NAME_ID) {
|
||||
NewFolderName = HiiGetString (gFileExplorerPrivate.FeHiiHandle, Value->string, NULL);
|
||||
if (NewFolderName != NULL) {
|
||||
StrCpyS (mNewFolderName, MAX_FOLDER_NAME_LEN, NewFolderName);
|
||||
FreePool (NewFolderName);
|
||||
NewFolderName = NULL;
|
||||
} else {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
if (QuestionId >= FILE_OPTION_OFFSET) {
|
||||
LibGetDevicePath(QuestionId);
|
||||
|
||||
|
@ -208,8 +278,8 @@ LibCallback (
|
|||
if (Value == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (QuestionId >= FILE_OPTION_OFFSET) {
|
||||
LibGetDevicePath(QuestionId);
|
||||
Status = LibUpdateFileExplorer (QuestionId);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
|
@ -985,6 +1055,72 @@ Done:
|
|||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Create a new file or folder in current directory.
|
||||
|
||||
@param FileName Point to the fileNmae or folder name.
|
||||
@param CreateFile CreateFile== TRUE means create a new file.
|
||||
CreateFile== FALSE means create a new Folder.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LibCreateNewFile (
|
||||
IN CHAR16 *FileName,
|
||||
IN BOOLEAN CreateFile
|
||||
)
|
||||
{
|
||||
EFI_FILE_HANDLE FileHandle;
|
||||
EFI_FILE_HANDLE NewHandle;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *ParentName;
|
||||
CHAR16 *FullFileName;
|
||||
|
||||
NewHandle = NULL;
|
||||
FullFileName = NULL;
|
||||
|
||||
LibGetFileHandleFromDevicePath(gFileExplorerPrivate.RetDevicePath, &FileHandle, &ParentName, &DeviceHandle);
|
||||
FullFileName = LibAppendFileName (ParentName, FileName);
|
||||
if (FullFileName == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
if (CreateFile) {
|
||||
Status = FileHandle->Open(
|
||||
FileHandle,
|
||||
&NewHandle,
|
||||
FullFileName,
|
||||
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| EFI_FILE_MODE_CREATE,
|
||||
0
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FileHandle->Close (FileHandle);
|
||||
return Status;
|
||||
}
|
||||
} else {
|
||||
Status = FileHandle->Open(
|
||||
FileHandle,
|
||||
&NewHandle,
|
||||
FullFileName,
|
||||
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| EFI_FILE_MODE_CREATE,
|
||||
EFI_FILE_DIRECTORY
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FileHandle->Close (FileHandle);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
FileHandle->Close (FileHandle);
|
||||
|
||||
//
|
||||
// Return the DevicePath of the new created file or folder.
|
||||
//
|
||||
gFileExplorerPrivate.RetDevicePath = FileDevicePath (DeviceHandle, FullFileName);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Find files under current directory.
|
||||
|
||||
|
@ -1177,9 +1313,11 @@ LibUpdateFileExplorePage (
|
|||
MENU_ENTRY *NewMenuEntry;
|
||||
FILE_CONTEXT *NewFileContext;
|
||||
MENU_OPTION *MenuOption;
|
||||
BOOLEAN CreateNewFile;
|
||||
|
||||
NewMenuEntry = NULL;
|
||||
NewFileContext = NULL;
|
||||
CreateNewFile = FALSE;
|
||||
|
||||
LibRefreshUpdateData ();
|
||||
MenuOption = gFileExplorerPrivate.FsOptionMenu;
|
||||
|
@ -1190,6 +1328,32 @@ LibUpdateFileExplorePage (
|
|||
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.
|
||||
|
|
|
@ -114,6 +114,10 @@ extern UINT8 FileExplorerVfrBin[];
|
|||
#define FILE_OPTION_OFFSET 0x8000
|
||||
#define FILE_OPTION_MASK 0x7FFF
|
||||
#define QUESTION_ID_UPDATE_STEP 200
|
||||
#define MAX_FILE_NAME_LEN 20
|
||||
#define MAX_FOLDER_NAME_LEN 20
|
||||
#define NEW_FILE_QUESTION_ID_BASE 0x5000;
|
||||
#define NEW_FOLDER_QUESTION_ID_BASE 0x6000;
|
||||
|
||||
/**
|
||||
This function processes the results of changes in configuration.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
///** @file
|
||||
//
|
||||
// Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
// Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
// which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -29,3 +29,33 @@
|
|||
#language fr-FR " "
|
||||
#string STR_FILE_EXPLORER_TITLE #language en-US "File Explorer"
|
||||
#language fr-FR "File Explorer"
|
||||
#string STR_NEW_FILE #language en-US "***NEW FILE***"
|
||||
#language fr-FR "***NEW FILE***"
|
||||
#string STR_NEW_FILE_HELP #language en-US "This menu used to create a new file in current directory, jump to next page to name the new file"
|
||||
#language fr-FR "This menu used to create a new file in current directory, jump to next page to name the new file"
|
||||
#string STR_ADD_NEW_FILE_TITLE #language en-US "Create a new file"
|
||||
#language fr-FR "Create a new file"
|
||||
#string STR_ADD_NEW_FOLDER_TITLE #language en-US "Create a new folder"
|
||||
#language fr-FR "Create a new folder"
|
||||
#string STR_NEW_FILE_NAME_PROMPT #language en-US "File Name"
|
||||
#language fr-FR "File Name"
|
||||
#string STR_NEW_FILE_NAME_HELP #language en-US "Please input a name for the new file"
|
||||
#language fr-FR "Please input a name for the new file"
|
||||
#string STR_CREATE_FILE_AND_EXIT #language en-US "Create File and Exit"
|
||||
#language fr-FR "Create File and Exit"
|
||||
#string STR_NO_CREATE_FILE_AND_EXIT #language en-US "Discard Create and Exit"
|
||||
#language fr-FR "Discard Create and Exit"
|
||||
#string STR_NEW_FOLDER #language en-US "***NEW FOLDER***"
|
||||
#language fr-FR "***NEW FOLDER***"
|
||||
#string STR_NEW_FOLDER_HELP #language en-US "This menu used to create a new folder in current directory, jump to next page to name the new folder"
|
||||
#language fr-FR "This menu used to create a new folder in current directory, jump to next page to name the new folder"
|
||||
#string STR_ADD_NEW_FOLDER_TITLE #language en-US "Create a new folder"
|
||||
#language fr-FR "Create a new folder"
|
||||
#string STR_NEW_FOLDER_NAME_PROMPT #language en-US "Folder Name"
|
||||
#language fr-FR "Folder Name"
|
||||
#string STR_NEW_FOLDER_NAME_HELP #language en-US "Please input a name for the new folder"
|
||||
#language fr-FR "Please input a name for the new folder"
|
||||
#string STR_CREATE_FOLDER_AND_EXIT #language en-US "Create Folder and Exit"
|
||||
#language fr-FR "Create Folder and Exit"
|
||||
#string STR_NO_CREATE_FOLDER_AND_EXIT #language en-US "Discard Create and Exit"
|
||||
#language fr-FR "Discard Create and Exit"
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// File Explorer Formset
|
||||
//
|
||||
// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
// Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
// which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -28,4 +28,58 @@ formset
|
|||
label LABEL_END;
|
||||
endform;
|
||||
|
||||
form formid = FORM_ADD_NEW_FILE_ID,
|
||||
title = STRING_TOKEN(STR_ADD_NEW_FILE_TITLE);
|
||||
|
||||
string
|
||||
prompt = STRING_TOKEN(STR_NEW_FILE_NAME_PROMPT),
|
||||
help = STRING_TOKEN(STR_NEW_FILE_NAME_HELP),
|
||||
flags = INTERACTIVE,
|
||||
key = NEW_FILE_NAME_ID,
|
||||
minsize = 2,
|
||||
maxsize = 20,
|
||||
endstring;
|
||||
|
||||
subtitle text = STRING_TOKEN(STR_NULL_STRING);
|
||||
|
||||
text
|
||||
help = STRING_TOKEN(STR_CREATE_FILE_AND_EXIT),
|
||||
text = STRING_TOKEN(STR_CREATE_FILE_AND_EXIT),
|
||||
flags = INTERACTIVE,
|
||||
key = KEY_VALUE_CREATE_FILE_AND_EXIT;
|
||||
|
||||
text
|
||||
help = STRING_TOKEN(STR_NO_CREATE_FILE_AND_EXIT),
|
||||
text = STRING_TOKEN(STR_NO_CREATE_FILE_AND_EXIT),
|
||||
flags = INTERACTIVE,
|
||||
key = KEY_VALUE_NO_CREATE_FILE_AND_EXIT;
|
||||
endform;
|
||||
|
||||
form formid = FORM_ADD_NEW_FOLDER_ID,
|
||||
title = STRING_TOKEN(STR_ADD_NEW_FOLDER_TITLE);
|
||||
|
||||
string
|
||||
prompt = STRING_TOKEN(STR_NEW_FOLDER_NAME_PROMPT),
|
||||
help = STRING_TOKEN(STR_NEW_FOLDER_NAME_HELP),
|
||||
flags = INTERACTIVE,
|
||||
key = NEW_FOLDER_NAME_ID,
|
||||
minsize = 2,
|
||||
maxsize = 20,
|
||||
endstring;
|
||||
|
||||
subtitle text = STRING_TOKEN(STR_NULL_STRING);
|
||||
|
||||
text
|
||||
help = STRING_TOKEN(STR_CREATE_FOLDER_AND_EXIT),
|
||||
text = STRING_TOKEN(STR_CREATE_FOLDER_AND_EXIT),
|
||||
flags = INTERACTIVE,
|
||||
key = KEY_VALUE_CREATE_FOLDER_AND_EXIT;
|
||||
|
||||
text
|
||||
help = STRING_TOKEN(STR_NO_CREATE_FOLDER_AND_EXIT),
|
||||
text = STRING_TOKEN(STR_NO_CREATE_FOLDER_AND_EXIT),
|
||||
flags = INTERACTIVE,
|
||||
key = KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT;
|
||||
endform;
|
||||
|
||||
endformset;
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Formset guids, form id and VarStore data structure for File explorer library.
|
||||
|
||||
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials are licensed and made available under
|
||||
the terms and conditions of the BSD License that accompanies this distribution.
|
||||
The full text of the license may be found at
|
||||
|
@ -23,6 +23,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
}
|
||||
|
||||
#define FORM_FILE_EXPLORER_ID 0x1000
|
||||
#define FORM_ADD_NEW_FILE_ID 0x2000
|
||||
#define NEW_FILE_NAME_ID 0x2001
|
||||
#define KEY_VALUE_CREATE_FILE_AND_EXIT 0x2002
|
||||
#define KEY_VALUE_NO_CREATE_FILE_AND_EXIT 0x2003
|
||||
#define FORM_ADD_NEW_FOLDER_ID 0x3000
|
||||
#define NEW_FOLDER_NAME_ID 0x3001
|
||||
#define KEY_VALUE_CREATE_FOLDER_AND_EXIT 0x3002
|
||||
#define KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT 0x3003
|
||||
|
||||
#define LABEL_END 0xffff
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue