Home | History | Annotate | Download | only in FileExplorerLib
      1 /** @file
      2    File explorer lib.
      3 
      4 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 **/
     13 
     14 #ifndef _FILE_EXPLORER_H_
     15 #define _FILE_EXPLORER_H_
     16 
     17 #include <PiDxe.h>
     18 #include <Guid/FileSystemVolumeLabelInfo.h>
     19 #include <Guid/FileInfo.h>
     20 #include <Guid/MdeModuleHii.h>
     21 
     22 #include <Protocol/HiiConfigAccess.h>
     23 #include <Protocol/DevicePath.h>
     24 #include <Protocol/SimpleFileSystem.h>
     25 #include <Protocol/DevicePathToText.h>
     26 #include <Protocol/LoadFile.h>
     27 #include <Protocol/FormBrowser2.h>
     28 
     29 #include <Library/DebugLib.h>
     30 #include <Library/BaseMemoryLib.h>
     31 #include <Library/UefiBootServicesTableLib.h>
     32 #include <Library/MemoryAllocationLib.h>
     33 #include <Library/BaseLib.h>
     34 #include <Library/UefiLib.h>
     35 #include <Library/DevicePathLib.h>
     36 #include <Library/FileExplorerLib.h>
     37 #include <Library/HiiLib.h>
     38 #include <Library/PrintLib.h>
     39 
     40 #include "FormGuid.h"
     41 
     42 #define FILE_EXPLORER_CALLBACK_DATA_SIGNATURE     SIGNATURE_32 ('f', 'e', 'c', 'k')
     43 
     44 
     45 #pragma pack(1)
     46 
     47 ///
     48 /// HII specific Vendor Device Path definition.
     49 ///
     50 typedef struct {
     51   VENDOR_DEVICE_PATH             VendorDevicePath;
     52   EFI_DEVICE_PATH_PROTOCOL       End;
     53 } HII_VENDOR_DEVICE_PATH;
     54 
     55 typedef struct {
     56   EFI_HANDLE                        DeviceHandle;
     57   EFI_DEVICE_PATH_PROTOCOL          *DevicePath;
     58   EFI_FILE_HANDLE                   FileHandle;
     59   UINT16                            *FileName;
     60 
     61   BOOLEAN                           IsRoot;
     62   BOOLEAN                           IsDir;
     63 } FILE_CONTEXT;
     64 
     65 typedef struct {
     66   UINTN           Signature;
     67   LIST_ENTRY      Link;
     68   UINT16          *DisplayString;
     69   UINT16          *HelpString;
     70   EFI_STRING_ID   DisplayStringToken;
     71   EFI_STRING_ID   HelpStringToken;
     72   VOID            *VariableContext;
     73 } MENU_ENTRY;
     74 
     75 typedef struct {
     76   UINTN           Signature;
     77   LIST_ENTRY      Head;
     78   UINTN           MenuNumber;
     79   BOOLEAN         Used;
     80 } MENU_OPTION;
     81 
     82 typedef struct {
     83   //
     84   // Shared callback data.
     85   //
     86   UINTN                          Signature;
     87 
     88   //
     89   // File explorer formset callback data.
     90   //
     91   EFI_HII_HANDLE                 FeHiiHandle;
     92   EFI_HANDLE                     FeDriverHandle;
     93   EFI_HII_CONFIG_ACCESS_PROTOCOL FeConfigAccess;
     94   EFI_FORM_BROWSER2_PROTOCOL     *FormBrowser2;
     95   MENU_OPTION                    *FsOptionMenu;
     96   CHAR16                         *FileType;
     97   CHOOSE_HANDLER                 ChooseHandler;
     98   EFI_DEVICE_PATH_PROTOCOL       *RetDevicePath;
     99 
    100 } FILE_EXPLORER_CALLBACK_DATA;
    101 
    102 #define FILE_EXPLORER_PRIVATE_FROM_THIS(a)  CR (a, FILE_EXPLORER_CALLBACK_DATA, FeConfigAccess, FILE_EXPLORER_CALLBACK_DATA_SIGNATURE)
    103 
    104 #pragma pack()
    105 
    106 extern UINT8    FileExplorerVfrBin[];
    107 
    108 #define MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')
    109 #define MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')
    110 
    111 ///
    112 /// Define the maximum characters that will be accepted.
    113 ///
    114 #define MAX_CHAR                480
    115 #define FILE_OPTION_OFFSET      0x8000
    116 #define FILE_OPTION_MASK        0x7FFF
    117 
    118 
    119 /**
    120   This function processes the results of changes in configuration.
    121   When user select a interactive opcode, this callback will be triggered.
    122   Based on the Question(QuestionId) that triggers the callback, the corresponding
    123   actions is performed. It handles:
    124 
    125   1) the addition of boot option.
    126   2) the addition of driver option.
    127   3) exit from file browser
    128   4) update of file content if a dir is selected.
    129   5) boot the file if a file is selected in "boot from file"
    130 
    131 
    132   @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
    133   @param Action          Specifies the type of action taken by the browser.
    134   @param QuestionId      A unique value which is sent to the original exporting driver
    135                          so that it can identify the type of data to expect.
    136   @param Type            The type of value for the question.
    137   @param Value           A pointer to the data being sent to the original exporting driver.
    138   @param ActionRequest   On return, points to the action requested by the callback function.
    139 
    140   @retval  EFI_SUCCESS           The callback successfully handled the action.
    141   @retval  EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.
    142   @retval  EFI_DEVICE_ERROR      The variable could not be saved.
    143   @retval  EFI_UNSUPPORTED       The specified Action is not supported by the callback.
    144 
    145 **/
    146 EFI_STATUS
    147 EFIAPI
    148 LibCallback (
    149   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
    150   IN  EFI_BROWSER_ACTION                     Action,
    151   IN  EFI_QUESTION_ID                        QuestionId,
    152   IN  UINT8                                  Type,
    153   IN  EFI_IFR_TYPE_VALUE                     *Value,
    154   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
    155   );
    156 
    157 
    158 /**
    159   This function allows a caller to extract the current configuration for one
    160   or more named elements from the target driver.
    161 
    162 
    163   @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
    164   @param Request         - A null-terminated Unicode string in <ConfigRequest> format.
    165   @param Progress        - On return, points to a character in the Request string.
    166                          Points to the string's null terminator if request was successful.
    167                          Points to the most recent '&' before the first failing name/value
    168                          pair (or the beginning of the string if the failure is in the
    169                          first name/value pair) if the request was not successful.
    170   @param Results         - A null-terminated Unicode string in <ConfigAltResp> format which
    171                          has all values filled in for the names in the Request string.
    172                          String to be allocated by the called function.
    173 
    174   @retval  EFI_SUCCESS            The Results is filled with the requested values.
    175   @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
    176   @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown name.
    177   @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
    178 
    179 **/
    180 EFI_STATUS
    181 EFIAPI
    182 LibExtractConfig (
    183   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
    184   IN  CONST EFI_STRING                       Request,
    185   OUT EFI_STRING                             *Progress,
    186   OUT EFI_STRING                             *Results
    187   );
    188 
    189 /**
    190   This function processes the results of changes in configuration.
    191 
    192 
    193   @param This            - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
    194   @param Configuration   - A null-terminated Unicode string in <ConfigResp> format.
    195   @param Progress        - A pointer to a string filled in with the offset of the most
    196                          recent '&' before the first failing name/value pair (or the
    197                          beginning of the string if the failure is in the first
    198                          name/value pair) or the terminating NULL if all was successful.
    199 
    200   @retval  EFI_SUCCESS            The Results is processed successfully.
    201   @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
    202   @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
    203 
    204 **/
    205 EFI_STATUS
    206 EFIAPI
    207 LibRouteConfig (
    208   IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
    209   IN  CONST EFI_STRING                       Configuration,
    210   OUT EFI_STRING                             *Progress
    211   );
    212 
    213 /**
    214   Update the file explower page with the refershed file system.
    215 
    216   @param KeyValue        Key value to identify the type of data to expect.
    217 
    218   @retval  EFI_SUCCESS   Update the file explorer form success.
    219   @retval  other errors  Error occur when parse one directory.
    220 
    221 **/
    222 EFI_STATUS
    223 LibUpdateFileExplorer (
    224   IN UINT16                       KeyValue
    225   );
    226 
    227 
    228 /**
    229   Get the device path info saved in the menu structure.
    230 
    231   @param KeyValue        Key value to identify the type of data to expect.
    232 
    233 **/
    234 VOID
    235 LibGetDevicePath (
    236   IN UINT16                       KeyValue
    237   );
    238 
    239 #endif
    240