]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/FileExplorer: Enable functionality of creating new file/folder
authorDandan Bi <dandan.bi@intel.com>
Thu, 12 Jan 2017 12:25:40 +0000 (20:25 +0800)
committerHao Wu <hao.a.wu@intel.com>
Thu, 19 Jan 2017 02:14:37 +0000 (10:14 +0800)
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>
MdeModulePkg/Library/FileExplorerLib/FileExplorer.c
MdeModulePkg/Library/FileExplorerLib/FileExplorer.h
MdeModulePkg/Library/FileExplorerLib/FileExplorerString.uni
MdeModulePkg/Library/FileExplorerLib/FileExplorerVfr.vfr
MdeModulePkg/Library/FileExplorerLib/FormGuid.h

index 315868a8bacdae1de5d0d04013649cbb7e461cbf..5eedad72039d0392f75914b35c511ddbe610c549 100644 (file)
@@ -73,6 +73,24 @@ VOID                *mLibEndOpCodeHandle = NULL;
 EFI_IFR_GUID_LABEL  *mLibStartLabel = NULL;\r
 EFI_IFR_GUID_LABEL  *mLibEndLabel = NULL;\r
 UINT16              mQuestionIdUpdate;\r
+CHAR16  mNewFileName[MAX_FILE_NAME_LEN];\r
+CHAR16  mNewFolderName[MAX_FOLDER_NAME_LEN];\r
+UINTN  mNewFileQuestionId    = NEW_FILE_QUESTION_ID_BASE;\r
+UINTN  mNewFolderQuestionId  = NEW_FOLDER_QUESTION_ID_BASE;\r
+\r
+/**\r
+  Create a new file or folder in current directory.\r
+\r
+  @param FileName              Point to the fileNmae or folder.\r
+  @param CreateFile            CreateFile== TRUE  means create a new file.\r
+                               CreateFile== FALSE means create a new Folder.\r
+\r
+**/\r
+EFI_STATUS\r
+LibCreateNewFile (\r
+  IN CHAR16     *FileName,\r
+  IN BOOLEAN    CreateFile\r
+  );\r
 \r
 /**\r
   This function allows a caller to extract the current configuration for one\r
@@ -175,9 +193,13 @@ LibCallback (
 {\r
   EFI_STATUS    Status;\r
   BOOLEAN       NeedExit;\r
+  CHAR16        *NewFileName;\r
+  CHAR16        *NewFolderName;\r
 \r
   NeedExit = TRUE;\r
-  \r
+  NewFileName   = NULL;\r
+  NewFolderName = NULL;\r
+\r
   if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
     //\r
     // Do nothing for other UEFI Action. Only do call back when data is changed.\r
@@ -189,7 +211,55 @@ LibCallback (
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    \r
+\r
+    if (QuestionId == KEY_VALUE_CREATE_FILE_AND_EXIT) {\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+      if (!IsZeroBuffer (mNewFileName, sizeof (mNewFileName))) {\r
+        Status = LibCreateNewFile (mNewFileName,TRUE);\r
+        ZeroMem (mNewFileName,sizeof (mNewFileName));\r
+      }\r
+    }\r
+\r
+    if (QuestionId == KEY_VALUE_NO_CREATE_FILE_AND_EXIT) {\r
+      ZeroMem (mNewFileName,sizeof (mNewFileName));\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    }\r
+\r
+    if (QuestionId == KEY_VALUE_CREATE_FOLDER_AND_EXIT) {\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+      if (!IsZeroBuffer (mNewFolderName, sizeof (mNewFolderName))) {\r
+        Status = LibCreateNewFile (mNewFolderName, FALSE);\r
+        ZeroMem (mNewFolderName,sizeof (mNewFolderName));\r
+      }\r
+    }\r
+\r
+    if (QuestionId == KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT) {\r
+      ZeroMem (mNewFolderName,sizeof (mNewFolderName));\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    }\r
+\r
+    if (QuestionId == NEW_FILE_NAME_ID) {\r
+      NewFileName = HiiGetString (gFileExplorerPrivate.FeHiiHandle, Value->string, NULL);\r
+      if (NewFileName != NULL) {\r
+        StrCpyS (mNewFileName, MAX_FILE_NAME_LEN, NewFileName);\r
+        FreePool (NewFileName);\r
+        NewFileName = NULL;\r
+      } else {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+    }\r
+\r
+    if (QuestionId == NEW_FOLDER_NAME_ID) {\r
+      NewFolderName = HiiGetString (gFileExplorerPrivate.FeHiiHandle, Value->string, NULL);\r
+      if (NewFolderName != NULL) {\r
+        StrCpyS (mNewFolderName, MAX_FOLDER_NAME_LEN, NewFolderName);\r
+        FreePool (NewFolderName);\r
+        NewFolderName = NULL;\r
+      } else {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+    }\r
+\r
     if (QuestionId >= FILE_OPTION_OFFSET) {\r
       LibGetDevicePath(QuestionId);\r
 \r
@@ -208,8 +278,8 @@ LibCallback (
     if (Value == NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    \r
     if (QuestionId >= FILE_OPTION_OFFSET) {\r
+      LibGetDevicePath(QuestionId);\r
       Status = LibUpdateFileExplorer (QuestionId);\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
@@ -985,6 +1055,72 @@ Done:
   return Status;\r
 }\r
 \r
+/**\r
+  Create a new file or folder in current directory.\r
+\r
+  @param FileName              Point to the fileNmae or folder name.\r
+  @param CreateFile            CreateFile== TRUE  means create a new file.\r
+                               CreateFile== FALSE means create a new Folder.\r
+\r
+**/\r
+EFI_STATUS\r
+LibCreateNewFile (\r
+  IN CHAR16     *FileName,\r
+  IN BOOLEAN    CreateFile\r
+  )\r
+{\r
+  EFI_FILE_HANDLE      FileHandle;\r
+  EFI_FILE_HANDLE      NewHandle;\r
+  EFI_HANDLE           DeviceHandle;\r
+  EFI_STATUS           Status;\r
+  CHAR16               *ParentName;\r
+  CHAR16               *FullFileName;\r
+\r
+  NewHandle = NULL;\r
+  FullFileName = NULL;\r
+\r
+  LibGetFileHandleFromDevicePath(gFileExplorerPrivate.RetDevicePath, &FileHandle, &ParentName, &DeviceHandle);\r
+  FullFileName = LibAppendFileName (ParentName, FileName);\r
+  if (FullFileName == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  if (CreateFile) {\r
+    Status = FileHandle->Open(\r
+                          FileHandle,\r
+                          &NewHandle,\r
+                          FullFileName,\r
+                          EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| EFI_FILE_MODE_CREATE,\r
+                          0\r
+                          );\r
+    if (EFI_ERROR (Status)) {\r
+      FileHandle->Close (FileHandle);\r
+      return Status;\r
+    }\r
+  } else {\r
+    Status = FileHandle->Open(\r
+                          FileHandle,\r
+                          &NewHandle,\r
+                          FullFileName,\r
+                          EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| EFI_FILE_MODE_CREATE,\r
+                          EFI_FILE_DIRECTORY\r
+                          );\r
+    if (EFI_ERROR (Status)) {\r
+      FileHandle->Close (FileHandle);\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  FileHandle->Close (FileHandle);\r
+\r
+  //\r
+  // Return the DevicePath of the new created file or folder.\r
+  //\r
+  gFileExplorerPrivate.RetDevicePath = FileDevicePath (DeviceHandle, FullFileName);\r
+\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
 /**\r
   Find files under current directory.\r
   \r
@@ -1177,9 +1313,11 @@ LibUpdateFileExplorePage (
   MENU_ENTRY      *NewMenuEntry;\r
   FILE_CONTEXT    *NewFileContext;\r
   MENU_OPTION     *MenuOption;\r
+  BOOLEAN         CreateNewFile;\r
 \r
   NewMenuEntry    = NULL;\r
   NewFileContext  = NULL;\r
+  CreateNewFile   = FALSE;\r
 \r
   LibRefreshUpdateData ();\r
   MenuOption = gFileExplorerPrivate.FsOptionMenu;\r
@@ -1190,6 +1328,32 @@ LibUpdateFileExplorePage (
     NewMenuEntry    = LibGetMenuEntry (MenuOption, Index);\r
     NewFileContext  = (FILE_CONTEXT *) NewMenuEntry->VariableContext;\r
 \r
+    if (!NewFileContext->IsRoot && !CreateNewFile) {\r
+      HiiCreateGotoOpCode (\r
+        mLibStartOpCodeHandle,\r
+        FORM_ADD_NEW_FILE_ID,\r
+        STRING_TOKEN (STR_NEW_FILE),\r
+        STRING_TOKEN (STR_NEW_FILE_HELP),\r
+        EFI_IFR_FLAG_CALLBACK,\r
+        (UINT16) (mNewFileQuestionId++)\r
+        );\r
+      HiiCreateGotoOpCode (\r
+        mLibStartOpCodeHandle,\r
+        FORM_ADD_NEW_FOLDER_ID,\r
+        STRING_TOKEN (STR_NEW_FOLDER),\r
+        STRING_TOKEN (STR_NEW_FOLDER_HELP),\r
+        EFI_IFR_FLAG_CALLBACK,\r
+        (UINT16) (mNewFolderQuestionId++)\r
+        );\r
+      HiiCreateTextOpCode(\r
+        mLibStartOpCodeHandle,\r
+        STRING_TOKEN (STR_NULL_STRING),\r
+        STRING_TOKEN (STR_NULL_STRING),\r
+        0\r
+        );\r
+      CreateNewFile = TRUE;\r
+    }\r
+\r
     if (!NewFileContext->IsDir) {\r
       //\r
       // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile.\r
index ea0ad3d8e2871384c32da55d1653619e8508e3f4..b9a84fb667cef8bb36a69d49f92edfa81efecd11 100644 (file)
@@ -114,6 +114,10 @@ extern UINT8    FileExplorerVfrBin[];
 #define FILE_OPTION_OFFSET      0x8000\r
 #define FILE_OPTION_MASK        0x7FFF\r
 #define QUESTION_ID_UPDATE_STEP 200\r
+#define MAX_FILE_NAME_LEN       20\r
+#define MAX_FOLDER_NAME_LEN     20\r
+#define NEW_FILE_QUESTION_ID_BASE   0x5000;\r
+#define NEW_FOLDER_QUESTION_ID_BASE 0x6000;\r
 \r
 /**\r
   This function processes the results of changes in configuration.\r
index 2e28c27a73a85019ab729cad3edf5c76c80d5f1c..e16adb66fc5c8edd67625436ccce7b05ce3c1168 100644 (file)
@@ -1,6 +1,6 @@
 ///** @file\r
 //\r
-// Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+// Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
 // This program and the accompanying materials                          \r
 // are licensed and made available under the terms and conditions of the BSD License         \r
 // which accompanies this distribution.  The full text of the license may be found at        \r
                                        #language fr-FR  " "\r
 #string STR_FILE_EXPLORER_TITLE        #language en-US  "File Explorer"\r
                                        #language fr-FR  "File Explorer"\r
+#string STR_NEW_FILE                   #language en-US  "***NEW FILE***"\r
+                                       #language fr-FR  "***NEW FILE***"\r
+#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"\r
+                                       #language fr-FR  "This menu used to create a new file in current directory, jump to next page to name the new file"\r
+#string STR_ADD_NEW_FILE_TITLE         #language en-US  "Create a new file"\r
+                                       #language fr-FR  "Create a new file"\r
+#string STR_ADD_NEW_FOLDER_TITLE       #language en-US  "Create a new folder"\r
+                                       #language fr-FR  "Create a new folder"\r
+#string STR_NEW_FILE_NAME_PROMPT       #language en-US  "File Name"\r
+                                       #language fr-FR  "File Name"\r
+#string STR_NEW_FILE_NAME_HELP         #language en-US  "Please input a name for the new file"\r
+                                       #language fr-FR  "Please input a name for the new file"\r
+#string STR_CREATE_FILE_AND_EXIT       #language en-US  "Create File and Exit"\r
+                                       #language fr-FR  "Create File and Exit"\r
+#string STR_NO_CREATE_FILE_AND_EXIT    #language en-US  "Discard Create and Exit"\r
+                                       #language fr-FR  "Discard Create and Exit"\r
+#string STR_NEW_FOLDER                 #language en-US  "***NEW FOLDER***"\r
+                                       #language fr-FR  "***NEW FOLDER***"\r
+#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"\r
+                                       #language fr-FR  "This menu used to create a new folder in current directory, jump to next page to name the new folder"\r
+#string STR_ADD_NEW_FOLDER_TITLE       #language en-US  "Create a new folder"\r
+                                       #language fr-FR  "Create a new folder"\r
+#string STR_NEW_FOLDER_NAME_PROMPT     #language en-US  "Folder Name"\r
+                                       #language fr-FR  "Folder Name"\r
+#string STR_NEW_FOLDER_NAME_HELP       #language en-US  "Please input a name for the new folder"\r
+                                       #language fr-FR  "Please input a name for the new folder"\r
+#string STR_CREATE_FOLDER_AND_EXIT     #language en-US  "Create Folder and Exit"\r
+                                       #language fr-FR  "Create Folder and Exit"\r
+#string STR_NO_CREATE_FOLDER_AND_EXIT  #language en-US  "Discard Create and Exit"\r
+                                       #language fr-FR  "Discard Create and Exit"\r
index ef7c99c24fe4642e2522dad5f21dde72305bcabe..b2bf94d5c70a5d5f67ca2cb14765edec06ad6310 100644 (file)
@@ -2,7 +2,7 @@
 //\r
 //    File Explorer Formset\r
 //\r
-//  Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+//  Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
 //  This program and the accompanying materials\r
 //  are licensed and made available under the terms and conditions of the BSD License\r
 //  which accompanies this distribution.  The full text of the license may be found at\r
@@ -28,4 +28,58 @@ formset
        label LABEL_END;\r
   endform;\r
 \r
+  form formid = FORM_ADD_NEW_FILE_ID,\r
+       title = STRING_TOKEN(STR_ADD_NEW_FILE_TITLE);\r
+\r
+      string\r
+          prompt   = STRING_TOKEN(STR_NEW_FILE_NAME_PROMPT),\r
+          help     = STRING_TOKEN(STR_NEW_FILE_NAME_HELP),\r
+          flags    = INTERACTIVE,\r
+          key      = NEW_FILE_NAME_ID,\r
+          minsize  = 2,\r
+          maxsize  = 20,\r
+      endstring;\r
+\r
+      subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_CREATE_FILE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_CREATE_FILE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_CREATE_FILE_AND_EXIT;\r
+\r
+       text\r
+         help   = STRING_TOKEN(STR_NO_CREATE_FILE_AND_EXIT),\r
+         text   = STRING_TOKEN(STR_NO_CREATE_FILE_AND_EXIT),\r
+         flags  = INTERACTIVE,\r
+         key    = KEY_VALUE_NO_CREATE_FILE_AND_EXIT;\r
+  endform;\r
+\r
+  form formid = FORM_ADD_NEW_FOLDER_ID,\r
+      title = STRING_TOKEN(STR_ADD_NEW_FOLDER_TITLE);\r
+\r
+      string\r
+          prompt   = STRING_TOKEN(STR_NEW_FOLDER_NAME_PROMPT),\r
+          help     = STRING_TOKEN(STR_NEW_FOLDER_NAME_HELP),\r
+          flags    = INTERACTIVE,\r
+          key      = NEW_FOLDER_NAME_ID,\r
+          minsize  = 2,\r
+          maxsize  = 20,\r
+      endstring;\r
+\r
+      subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+      text\r
+        help   = STRING_TOKEN(STR_CREATE_FOLDER_AND_EXIT),\r
+        text   = STRING_TOKEN(STR_CREATE_FOLDER_AND_EXIT),\r
+        flags  = INTERACTIVE,\r
+        key    = KEY_VALUE_CREATE_FOLDER_AND_EXIT;\r
+\r
+      text\r
+        help   = STRING_TOKEN(STR_NO_CREATE_FOLDER_AND_EXIT),\r
+        text   = STRING_TOKEN(STR_NO_CREATE_FOLDER_AND_EXIT),\r
+        flags  = INTERACTIVE,\r
+        key    = KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT;\r
+  endform;\r
+\r
 endformset;
\ No newline at end of file
index d0a43a9fd9b18a086bbfb04ca533f3eacc49a2e8..a243e9f6c5f990745303bd64c08d9e6fc0345b97 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Formset guids, form id and VarStore data structure for File explorer library.\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under\r
 the terms and conditions of the BSD License that accompanies this distribution.\r
 The full text of the license may be found at\r
@@ -23,6 +23,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
   }\r
 \r
 #define FORM_FILE_EXPLORER_ID                0x1000\r
+#define FORM_ADD_NEW_FILE_ID                 0x2000\r
+#define NEW_FILE_NAME_ID                     0x2001\r
+#define KEY_VALUE_CREATE_FILE_AND_EXIT       0x2002\r
+#define KEY_VALUE_NO_CREATE_FILE_AND_EXIT    0x2003\r
+#define FORM_ADD_NEW_FOLDER_ID               0x3000\r
+#define NEW_FOLDER_NAME_ID                   0x3001\r
+#define KEY_VALUE_CREATE_FOLDER_AND_EXIT     0x3002\r
+#define KEY_VALUE_NO_CREATE_FOLDER_AND_EXIT  0x3003\r
+\r
 #define LABEL_END                            0xffff\r
 \r
 #endif\r