]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
Refine the save action for the browser.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.h
index 77a0ad1baccd3a4913417278714bc60194d07888..34b6d944d01f1e3d4631e346441ab0884dd5717c 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Private MACRO, structure and function definitions for Setup Browser module.\r
 \r
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2014, 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
@@ -136,6 +136,9 @@ typedef struct {
 \r
   UINT8            Type;           // Storage type\r
 \r
+  BOOLEAN          Initialized;    // Whether this varstore is initialized, efi varstore not used.\r
+\r
+  EFI_HII_HANDLE   HiiHandle;      // HiiHandle for this varstore, efi varstore not used.\r
   EFI_GUID         Guid;\r
 \r
   CHAR16           *Name;          // For EFI_IFR_VARSTORE\r
@@ -161,17 +164,19 @@ typedef struct {
   UINTN            Signature;\r
   LIST_ENTRY       Link;\r
 \r
+  LIST_ENTRY       SaveFailLink;\r
+\r
   UINT16           VarStoreId;\r
 \r
   BROWSER_STORAGE  *BrowserStorage;\r
 \r
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
-  CHAR16           *ConfigElements;// Elements need to load initial data.\r
   UINTN            ElementCount;   // Number of <RequestElement> in the <ConfigRequest>\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
 } FORMSET_STORAGE;\r
 \r
 #define FORMSET_STORAGE_FROM_LINK(a)  CR (a, FORMSET_STORAGE, Link, FORMSET_STORAGE_SIGNATURE)\r
+#define FORMSET_STORAGE_FROM_SAVE_FAIL_LINK(a)  CR (a, FORMSET_STORAGE, SaveFailLink, FORMSET_STORAGE_SIGNATURE)\r
 \r
 typedef union {\r
   EFI_STRING_ID         VarName;\r
@@ -225,6 +230,7 @@ typedef struct {
   EFI_HII_VALUE     Result;          // Expression evaluation result\r
 \r
   UINT8             TimeOut;         // For EFI_IFR_WARNING_IF\r
+  EFI_IFR_OP_HEADER *OpCode;         // Save the opcode buffer.\r
 \r
   LIST_ENTRY        OpCodeListHead;  // OpCodes consist of this expression (EXPRESSION_OPCODE)\r
 } FORM_EXPRESSION;\r
@@ -285,9 +291,11 @@ typedef enum {
   ExpressOption\r
 } EXPRESS_LEVEL;\r
 \r
+typedef struct _FORM_BROWSER_STATEMENT FORM_BROWSER_STATEMENT;\r
+\r
 #define FORM_BROWSER_STATEMENT_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'A')\r
 \r
-typedef struct {\r
+struct _FORM_BROWSER_STATEMENT{\r
   UINTN                 Signature;\r
   LIST_ENTRY            Link;\r
 \r
@@ -349,7 +357,8 @@ typedef struct {
 \r
   EFI_IMAGE_ID          ImageId;             // nested EFI_IFR_IMAGE\r
   UINT8                 RefreshInterval;     // nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh\r
-  BOOLEAN               InSubtitle;          // nesting inside of EFI_IFR_SUBTITLE\r
+\r
+  FORM_BROWSER_STATEMENT *ParentStatement;\r
 \r
   LIST_ENTRY            InconsistentListHead;// nested inconsistent expression list (FORM_EXPRESSION)\r
   LIST_ENTRY            NoSubmitListHead;    // nested nosubmit expression list (FORM_EXPRESSION)\r
@@ -358,7 +367,7 @@ typedef struct {
 \r
   FORM_EXPRESSION       *ReadExpression;     // nested EFI_IFR_READ, provide this question value by read expression.\r
   FORM_EXPRESSION       *WriteExpression;    // nested EFI_IFR_WRITE, evaluate write expression after this question value is set.\r
-} FORM_BROWSER_STATEMENT;\r
+};\r
 \r
 #define FORM_BROWSER_STATEMENT_FROM_LINK(a)  CR (a, FORM_BROWSER_STATEMENT, Link, FORM_BROWSER_STATEMENT_SIGNATURE)\r
 \r
@@ -367,6 +376,8 @@ typedef struct {
   UINTN                 Signature;\r
   LIST_ENTRY            Link;\r
 \r
+  LIST_ENTRY            SaveFailLink;\r
+\r
   CHAR16                *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
   UINTN                 ElementCount;   // Number of <RequestElement> in the <ConfigRequest>  \r
   UINTN                 SpareStrLen;\r
@@ -374,6 +385,7 @@ typedef struct {
   BROWSER_STORAGE       *Storage;\r
 } FORM_BROWSER_CONFIG_REQUEST;\r
 #define FORM_BROWSER_CONFIG_REQUEST_FROM_LINK(a)  CR (a, FORM_BROWSER_CONFIG_REQUEST, Link, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)\r
+#define FORM_BROWSER_CONFIG_REQUEST_FROM_SAVE_FAIL_LINK(a)  CR (a, FORM_BROWSER_CONFIG_REQUEST, SaveFailLink, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)\r
 \r
 #define FORM_BROWSER_FORM_SIGNATURE  SIGNATURE_32 ('F', 'F', 'R', 'M')\r
 #define STANDARD_MAP_FORM_TYPE 0x01\r
@@ -391,6 +403,7 @@ typedef struct {
   BOOLEAN              ModalForm;            // Whether this is a modal form.\r
   BOOLEAN              Locked;               // Whether this form is locked.\r
 \r
+  LIST_ENTRY           FormViewListHead;     // List of type FORMID_INFO is Browser View Form History List.\r
   LIST_ENTRY           ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
   LIST_ENTRY           StatementListHead;    // List of Statements and Questions (FORM_BROWSER_STATEMENT)\r
   LIST_ENTRY           ConfigRequestHead;    // List of configreques for all storage.\r
@@ -416,6 +429,8 @@ typedef struct {
 typedef struct {\r
   UINTN                           Signature;\r
   LIST_ENTRY                      Link;\r
+  LIST_ENTRY                      SaveFailLink;\r
+\r
   EFI_HII_HANDLE                  HiiHandle;      // unique id for formset.\r
   EFI_HANDLE                      DriverHandle;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
@@ -436,15 +451,20 @@ typedef struct {
 \r
   FORM_BROWSER_STATEMENT          *StatementBuffer;     // Buffer for all Statements and Questions\r
   EXPRESSION_OPCODE               *ExpressionBuffer;    // Buffer for all Expression OpCode\r
+  FORM_BROWSER_FORM               *SaveFailForm;        // The form which failed to save.\r
+  FORM_BROWSER_STATEMENT          *SaveFailStatement;   // The Statement which failed to save.\r
 \r
   LIST_ENTRY                      StatementListOSF;     // Statement list out side of the form.\r
   LIST_ENTRY                      StorageListHead;      // Storage list (FORMSET_STORAGE)\r
+  LIST_ENTRY                      SaveFailStorageListHead; // Storage list for the save fail storage.\r
   LIST_ENTRY                      DefaultStoreListHead; // DefaultStore list (FORMSET_DEFAULTSTORE)\r
   LIST_ENTRY                      FormListHead;         // Form list (FORM_BROWSER_FORM)\r
   LIST_ENTRY                      ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
 } FORM_BROWSER_FORMSET;\r
 #define FORM_BROWSER_FORMSET_FROM_LINK(a)  CR (a, FORM_BROWSER_FORMSET, Link, FORM_BROWSER_FORMSET_SIGNATURE)\r
 \r
+#define FORM_BROWSER_FORMSET_FROM_SAVE_FAIL_LINK(a)  CR (a, FORM_BROWSER_FORMSET, SaveFailLink, FORM_BROWSER_FORMSET_SIGNATURE)\r
+\r
 typedef struct {\r
   LIST_ENTRY   Link;\r
   EFI_EVENT    RefreshEvent;\r
@@ -528,9 +548,10 @@ typedef enum {
 // Get/set question value from/to.\r
 //\r
 typedef enum {\r
-  GetSetValueWithEditBuffer,       // Get/Set question value from/to editbuffer in the storage.\r
+  GetSetValueWithEditBuffer = 0,   // Get/Set question value from/to editbuffer in the storage.\r
   GetSetValueWithBuffer,           // Get/Set question value from/to buffer in the storage.\r
   GetSetValueWithHiiDriver,        // Get/Set question value from/to hii driver.\r
+  GetSetValueWithBothBuffer,       // Compare the editbuffer with buffer for this question, not use the question value.\r
   GetSetValueWithMax               // Invalid value.\r
 } GET_SET_QUESTION_VALUE_WITH;\r
 \r
@@ -541,7 +562,6 @@ extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;
 \r
 extern BOOLEAN               gResetRequired;\r
 extern BOOLEAN               gExitRequired;\r
-extern BOOLEAN               gFinishRetrieveCall;\r
 extern LIST_ENTRY            gBrowserFormSetList;\r
 extern LIST_ENTRY            gBrowserHotKeyList;\r
 extern BROWSER_SETTING_SCOPE gBrowserSettingScope;\r
@@ -706,6 +726,35 @@ IsQuestionValueChanged (
   IN GET_SET_QUESTION_VALUE_WITH      GetValueFrom\r
   );\r
 \r
+/**\r
+  Validate the FormSet. If the formset is not validate, remove it from the list.\r
+\r
+  @param  FormSet                The input FormSet which need to validate.\r
+\r
+  @retval TRUE                   The handle is validate.\r
+  @retval FALSE                  The handle is invalidate.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateFormSet (\r
+  FORM_BROWSER_FORMSET    *FormSet\r
+  );\r
+\r
+/**\r
+  Update the ValueChanged status for questions.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Default action.\r
+\r
+**/\r
+VOID \r
+UpdateStatementStatus (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form, \r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  );\r
+\r
 /**\r
   Get Question's current Value.\r
 \r
@@ -1137,19 +1186,6 @@ IsNvUpdateRequiredForFormSet (
   IN FORM_BROWSER_FORMSET  *FormSet\r
   );\r
 \r
-/**\r
-  Check whether the storage data for current form set is changed.\r
-\r
-  @param  FormSet           FormSet data structure.\r
-\r
-  @retval TRUE              Data is changed.\r
-  @retval FALSE             Data is not changed.\r
-**/\r
-BOOLEAN \r
-IsStorageDataChangedForFormSet (\r
-  IN FORM_BROWSER_FORMSET             *FormSet\r
-  );\r
-\r
 /**\r
   Call the call back function for the question and process the return action.\r
 \r
@@ -1184,6 +1220,7 @@ ProcessCallBackFunction (
 \r
   @param ConfigAccess          The config access protocol produced by the hii driver.\r
   @param Statement             The Question which need to call.\r
+  @param FormSet               The formset this question belong to.\r
 \r
   @retval EFI_SUCCESS          The call back function excutes successfully.\r
   @return Other value if the call back function failed to excute.  \r
@@ -1191,7 +1228,8 @@ ProcessCallBackFunction (
 EFI_STATUS \r
 ProcessRetrieveForQuestion (\r
   IN     EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess,\r
-  IN     FORM_BROWSER_STATEMENT          *Statement\r
+  IN     FORM_BROWSER_STATEMENT          *Statement,\r
+  IN     FORM_BROWSER_FORMSET            *FormSet\r
   );\r
 \r
 /**\r
@@ -1321,6 +1359,7 @@ ExecuteAction (
   @retval BROWSER_NO_CHANGES       No browser data is changed.\r
   @retval BROWSER_SAVE_CHANGES     The changed browser data is saved.\r
   @retval BROWSER_DISCARD_CHANGES  The changed browser data is discard.\r
+  @retval BROWSER_KEEP_CURRENT     Browser keep current changes.\r
 \r
 **/\r
 UINT32\r
@@ -1329,6 +1368,19 @@ SaveReminder (
   VOID\r
   );\r
 \r
+/**\r
+  Check whether the Reset Required for the browser\r
+\r
+  @retval TRUE      Browser required to reset after exit.\r
+  @retval FALSE     Browser not need to reset after exit.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsResetRequired (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Find the registered HotKey based on KeyData.\r
   \r
@@ -1486,6 +1538,19 @@ UiFindParentMenu (
   IN FORM_ENTRY_INFO  *CurrentMenu\r
   );\r
 \r
+/**\r
+  Copy current Menu list to the new menu list.\r
+  \r
+  @param  NewMenuListHead        New create Menu list.\r
+  @param  CurrentMenuListHead    Current Menu list.\r
+\r
+**/\r
+VOID\r
+UiCopyMenuList (\r
+  OUT LIST_ENTRY   *NewMenuListHead,\r
+  IN  LIST_ENTRY   *CurrentMenuListHead\r
+  );\r
+\r
 /**\r
   Search an Option of a Question by its value.\r
 \r
@@ -1613,5 +1678,97 @@ VOID
 CleanBrowserStorage (\r
   IN OUT FORM_BROWSER_FORMSET  *FormSet\r
   );\r
+\r
+/**\r
+  Find HII Handle in the HII database associated with given Device Path.\r
+\r
+  If DevicePath is NULL, then ASSERT.\r
+\r
+  @param  DevicePath             Device Path associated with the HII package list\r
+                                 handle.\r
+  @param  FormsetGuid            The formset guid for this formset.\r
+\r
+  @retval Handle                 HII package list Handle associated with the Device\r
+                                        Path.\r
+  @retval NULL                   Hii Package list handle is not found.\r
+\r
+**/\r
+EFI_HII_HANDLE\r
+DevicePathToHiiHandle (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath,\r
+  IN EFI_GUID                   *FormsetGuid\r
+  );\r
+\r
+/**\r
+  Adjust the config request info, remove the request elements which already in AllConfigRequest string.\r
+\r
+  @param  Storage                Form set Storage.\r
+  @param  Request                The input request string.\r
+  @param  RespString             Whether the input is ConfigRequest or ConfigResp format.\r
+\r
+  @retval TRUE                   Has element not covered by current used elements, need to continue to call ExtractConfig\r
+  @retval FALSE                  All elements covered by current used elements.\r
+\r
+**/\r
+BOOLEAN \r
+ConfigRequestAdjust (\r
+  IN  BROWSER_STORAGE         *Storage,\r
+  IN  CHAR16                  *Request,\r
+  IN  BOOLEAN                 RespString\r
+  );\r
+\r
+/**\r
+  Perform question check. \r
   \r
+  If one question has more than one check, process form high priority to low.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  Question               The Question to be validated.\r
+\r
+  @retval EFI_SUCCESS            Form validation pass.\r
+  @retval other                  Form validation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+ValueChangedValidation (\r
+  IN  FORM_BROWSER_FORMSET            *FormSet,\r
+  IN  FORM_BROWSER_FORM               *Form,\r
+  IN  FORM_BROWSER_STATEMENT          *Question\r
+  );\r
+\r
+/**\r
+  Pop up the error info.\r
+\r
+  @param      BrowserStatus    The input browser status.\r
+  @param      HiiHandle        The HiiHandle for this error opcode.\r
+  @param      OpCode           The opcode use to get the erro info and timeout value.\r
+  @param      ErrorString      Error string used by BROWSER_NO_SUBMIT_IF.\r
+\r
+**/\r
+UINT32\r
+PopupErrorMessage (\r
+  IN UINT32                BrowserStatus,\r
+  IN EFI_HII_HANDLE        HiiHandle,\r
+  IN EFI_IFR_OP_HEADER     *OpCode, OPTIONAL\r
+  IN CHAR16                *ErrorString\r
+  );\r
+\r
+/**\r
+  Check whether the result is TRUE or FALSE.\r
+\r
+  For the EFI_HII_VALUE value type is numeric, return TRUE if the\r
+  value is not 0.\r
+\r
+  @param  Result             Input the result data.\r
+\r
+  @retval TRUE               The result is TRUE.\r
+  @retval FALSE              The result is FALSE.\r
+\r
+**/\r
+BOOLEAN\r
+IsTrue (\r
+  IN EFI_HII_VALUE     *Result\r
+  );\r
+\r
 #endif\r