]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enable new "ref5" opcode in browser.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 28 Jun 2011 06:41:28 +0000 (06:41 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 28 Jun 2011 06:41:28 +0000 (06:41 +0000)
Signed-off-by:ydong10
Reviewed-by:lgao4

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11913 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h

index 121a80f643b89c3d49f09782110078885861f117..ba805560ef7fac0963d406ec97ed579aa1cef5f3 100644 (file)
@@ -1143,6 +1143,10 @@ ParseOpCodes (
           ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_TIME);\r
           break;\r
 \r
+        case EFI_IFR_TYPE_REF:\r
+          ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_REF);\r
+          break;\r
+\r
         case EFI_IFR_TYPE_OTHER:\r
         case EFI_IFR_TYPE_UNDEFINED:\r
         case EFI_IFR_TYPE_ACTION:\r
@@ -1548,19 +1552,25 @@ ParseOpCodes (
     case EFI_IFR_REF_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT (CurrentStatement != NULL);\r
-      CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
-      CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
-      if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
-        CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+      Value = &CurrentStatement->HiiValue;\r
+      Value->Type = EFI_IFR_TYPE_REF;\r
+      if (OpCodeLength >= sizeof (EFI_IFR_REF)) {\r
+        CopyMem (&Value->Value.ref.FormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
 \r
-        if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
-          CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+        if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
+          CopyMem (&Value->Value.ref.QuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
 \r
-          if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
-            CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+          if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
+            CopyMem (&Value->Value.ref.FormSetGuid, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+\r
+            if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
+              CopyMem (&Value->Value.ref.DevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+            }\r
           }\r
         }\r
       }\r
+      CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF);        \r
+      InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
       break;\r
 \r
     case EFI_IFR_ONE_OF_OP:\r
index 2c9fa9761ab8c267194ba193707da30c9cc459d1..2fdc0bfbcb720c27f98b9448f199c359ce61758d 100644 (file)
@@ -1162,6 +1162,14 @@ ProcessCallBackFunction (
       default:\r
         break;\r
       }\r
+\r
+      //\r
+      // According the spec, return value from call back of "changing" and \r
+      // "retrieve" should update to the question's temp buffer.\r
+      //\r
+      if (Action == EFI_BROWSER_ACTION_CHANGING || Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
+        SetQuestionValue(Selection->FormSet,Selection->Form, Question,TRUE);\r
+      }\r
     } else if (Status == EFI_UNSUPPORTED) {\r
       //\r
       // If return EFI_UNSUPPORTED, also consider Hii driver suceess deal with it.\r
@@ -1384,11 +1392,18 @@ SetupBrowser (
           (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
 \r
         Status = ProcessCallBackFunction(Selection, Statement, EFI_BROWSER_ACTION_CHANGING, FALSE);         \r
-        if ((EFI_ERROR (Status)) && (Status != EFI_UNSUPPORTED)) {\r
+        if (Statement->Operand == EFI_IFR_REF_OP && Selection->Action != UI_ACTION_EXIT) {\r
+          //\r
+          // Process dynamic update ref opcode.\r
+          //\r
+          if (!EFI_ERROR (Status)) {\r
+            Status = ProcessGotoOpCode(Statement, Selection, NULL, NULL);\r
+          }\r
+          \r
           //\r
-          // Callback return error status other than EFI_UNSUPPORTED\r
+          // Callback return error status or status return from process goto opcode.\r
           //\r
-          if (Statement->Operand == EFI_IFR_REF_OP) {\r
+          if (EFI_ERROR (Status)) {\r
             //\r
             // Cross reference will not be taken\r
             //\r
index c65fd03a0ed89847c6825cd825b7da0b1cb23ab9..f4081679c633c123a910dd4c337687dd49ecb0b1 100644 (file)
@@ -2643,6 +2643,16 @@ LoadFormConfig (
       HiiSetString (FormSet->HiiHandle, Question->HiiValue.Value.string, (CHAR16*)Question->BufferValue, NULL);\r
     }\r
 \r
+    //\r
+    // According the spec, ref opcode try to get value from call back with "retrieve" type.\r
+    //\r
+    if ((Question->Operand == EFI_IFR_REF_OP) && (FormSet->ConfigAccess != NULL)) {\r
+      Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+    }\r
+\r
     //\r
     // Check whether EfiVarstore with CallBack can be got.\r
     //\r
index d83940e9795f94113b10641ef072b169e7224be2..4740731edf9b5b234dac6a102b694ba0030e4607 100644 (file)
@@ -372,10 +372,6 @@ typedef struct {
   UINT64                Step;\r
 \r
   EFI_DEFAULT_ID        DefaultId;        // for EFI_IFR_RESET_BUTTON\r
-  EFI_FORM_ID           RefFormId;        // for EFI_IFR_REF\r
-  EFI_QUESTION_ID       RefQuestionId;    // for EFI_IFR_REF2\r
-  EFI_GUID              RefFormSetId;     // for EFI_IFR_REF3\r
-  EFI_STRING_ID         RefDevicePath;    // for EFI_IFR_REF4\r
   EFI_GUID              RefreshGuid;      // for EFI_IFR_REFRESH_ID\r
 \r
   //\r
index 755fb3b2bccb3e4ee9ff80e0363ba283edb382fd..4f814990bb0f585034883c38fced8f59e6eaaff3 100644 (file)
@@ -1649,6 +1649,175 @@ DevicePathToHiiHandle (
   return HiiHandle;\r
 }\r
 \r
+/**\r
+  Process the goto op code, update the info in the selection structure.\r
+\r
+  @param Statement    The statement belong to goto op code.\r
+  @param Selection    The selection info.\r
+  @param Repaint      Whether need to repaint the menu.\r
+  @param NewLine      Whether need to create new line.\r
+\r
+  @retval EFI_SUCCESS    The menu process successfully.\r
+  @return Other value if the process failed.\r
+**/\r
+EFI_STATUS\r
+ProcessGotoOpCode (\r
+  IN OUT   FORM_BROWSER_STATEMENT      *Statement,\r
+  IN OUT   UI_MENU_SELECTION           *Selection,\r
+  OUT      BOOLEAN                     *Repaint,\r
+  OUT      BOOLEAN                     *NewLine\r
+  )\r
+{\r
+  CHAR16                          *StringPtr;\r
+  UINTN                           BufferSize;\r
+  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
+  CHAR16                          TemStr[2];\r
+  UINT8                           *DevicePathBuffer;\r
+  UINTN                           Index;\r
+  UINT8                           DigitUint8;\r
+  FORM_BROWSER_FORM               *RefForm;\r
+  EFI_INPUT_KEY                   Key;\r
+  EFI_STATUS                      Status;\r
+  UI_MENU_LIST                    *MenuList;\r
+  \r
+  Status = EFI_SUCCESS;\r
+\r
+  if (Statement->HiiValue.Value.ref.DevicePath != 0) {\r
+    if (Selection->Form->ModalForm) {\r
+      return Status;\r
+    }\r
+    //\r
+    // Goto another Hii Package list\r
+    //\r
+    Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+    StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
+    if (StringPtr == NULL) {\r
+      //\r
+      // No device path string not found, exit\r
+      //\r
+      Selection->Action = UI_ACTION_EXIT;\r
+      Selection->Statement = NULL;\r
+      return Status;\r
+    }\r
+    BufferSize = StrLen (StringPtr) / 2;\r
+    DevicePath = AllocatePool (BufferSize);\r
+    ASSERT (DevicePath != NULL);\r
+\r
+    //\r
+    // Convert from Device Path String to DevicePath Buffer in the reverse order.\r
+    //\r
+    DevicePathBuffer = (UINT8 *) DevicePath;\r
+    for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {\r
+      TemStr[0] = StringPtr[Index];\r
+      DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+      if (DigitUint8 == 0 && TemStr[0] != L'0') {\r
+        //\r
+        // Invalid Hex Char as the tail.\r
+        //\r
+        break;\r
+      }\r
+      if ((Index & 1) == 0) {\r
+        DevicePathBuffer [Index/2] = DigitUint8;\r
+      } else {\r
+        DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
+      }\r
+    }\r
+\r
+    Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
+    if (Selection->Handle == NULL) {\r
+      //\r
+      // If target Hii Handle not found, exit\r
+      //\r
+      Selection->Action = UI_ACTION_EXIT;\r
+      Selection->Statement = NULL;\r
+      return Status;\r
+    }\r
+\r
+    FreePool (StringPtr);\r
+    FreePool (DevicePath);\r
+\r
+    CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
+    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+  } else if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &gZeroGuid)) {\r
+    if (Selection->Form->ModalForm) {\r
+      return Status;\r
+    }  \r
+    //\r
+    // Goto another Formset, check for uncommitted data\r
+    //\r
+    Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+    CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
+    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+  } else if (Statement->HiiValue.Value.ref.FormId != 0) {\r
+    //\r
+    // Check whether target From is suppressed.\r
+    //\r
+    RefForm = IdToForm (Selection->FormSet, Statement->HiiValue.Value.ref.FormId);\r
+\r
+    if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
+      Status = EvaluateExpression (Selection->FormSet, RefForm, RefForm->SuppressExpression);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+\r
+      if (RefForm->SuppressExpression->Result.Value.b) {\r
+        //\r
+        // Form is suppressed. \r
+        //\r
+        do {\r
+          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
+        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+        if (Repaint != NULL) {\r
+          *Repaint = TRUE;\r
+        }\r
+        return Status;\r
+      }\r
+    }\r
+\r
+    //\r
+    // Goto another form inside this formset,\r
+    //\r
+    Selection->Action = UI_ACTION_REFRESH_FORM;\r
+\r
+    //\r
+    // Link current form so that we can always go back when someone hits the ESC\r
+    //\r
+    MenuList = UiFindMenuList (&Selection->FormSetGuid, Statement->HiiValue.Value.ref.FormId);\r
+    if (MenuList == NULL && Selection->CurrentMenu != NULL) {\r
+      MenuList = UiAddMenuList (Selection->CurrentMenu, &Selection->FormSetGuid, Statement->HiiValue.Value.ref.FormId);\r
+    }\r
+\r
+    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+  } else if (Statement->HiiValue.Value.ref.QuestionId != 0) {\r
+    //\r
+    // Goto another Question\r
+    //\r
+    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+\r
+    if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+      Selection->Action = UI_ACTION_REFRESH_FORM;\r
+    } else {\r
+      if (Repaint != NULL) {\r
+        *Repaint = TRUE;\r
+      }\r
+      if (NewLine != NULL) {\r
+        *NewLine = TRUE;\r
+      }\r
+    }\r
+  } else {\r
+    if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+      Selection->Action = UI_ACTION_REFRESH_FORM;\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
 /**\r
   Display menu and wait for user to select one menu option, then return it.\r
   If AutoBoot is enabled, then if user doesn't select any option,\r
@@ -1704,16 +1873,9 @@ UiDisplayMenu (
   MENU_REFRESH_ENTRY              *MenuUpdateEntry;  \r
   UI_SCREEN_OPERATION             ScreenOperation;\r
   UINT8                           MinRefreshInterval;\r
-  UINTN                           BufferSize;\r
   UINT16                          DefaultId;\r
-  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
   FORM_BROWSER_STATEMENT          *Statement;\r
-  CHAR16                          TemStr[2];\r
-  UINT8                           *DevicePathBuffer;\r
-  UINT8                           DigitUint8;\r
   UI_MENU_LIST                    *CurrentMenu;\r
-  UI_MENU_LIST                    *MenuList;\r
-  FORM_BROWSER_FORM               *RefForm;\r
   UINTN                           ModalSkipColumn;\r
 \r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
@@ -1736,7 +1898,6 @@ UiDisplayMenu (
   NextMenuOption      = NULL;\r
   PreviousMenuOption  = NULL;\r
   SavedMenuOption     = NULL;\r
-  RefForm             = NULL;\r
   ModalSkipColumn     = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 6;\r
 \r
   ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
@@ -2613,130 +2774,7 @@ UiDisplayMenu (
 \r
       switch (Statement->Operand) {\r
       case EFI_IFR_REF_OP:\r
-        if (Statement->RefDevicePath != 0) {\r
-          if (Selection->Form->ModalForm) {\r
-            break;\r
-          }\r
-          //\r
-          // Goto another Hii Package list\r
-          //\r
-          Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
-          StringPtr = GetToken (Statement->RefDevicePath, Selection->FormSet->HiiHandle);\r
-          if (StringPtr == NULL) {\r
-            //\r
-            // No device path string not found, exit\r
-            //\r
-            Selection->Action = UI_ACTION_EXIT;\r
-            Selection->Statement = NULL;\r
-            break;\r
-          }\r
-          BufferSize = StrLen (StringPtr) / 2;\r
-          DevicePath = AllocatePool (BufferSize);\r
-          ASSERT (DevicePath != NULL);\r
-\r
-          //\r
-          // Convert from Device Path String to DevicePath Buffer in the reverse order.\r
-          //\r
-          DevicePathBuffer = (UINT8 *) DevicePath;\r
-          for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {\r
-            TemStr[0] = StringPtr[Index];\r
-            DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
-            if (DigitUint8 == 0 && TemStr[0] != L'0') {\r
-              //\r
-              // Invalid Hex Char as the tail.\r
-              //\r
-              break;\r
-            }\r
-            if ((Index & 1) == 0) {\r
-              DevicePathBuffer [Index/2] = DigitUint8;\r
-            } else {\r
-              DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
-            }\r
-          }\r
-\r
-          Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
-          if (Selection->Handle == NULL) {\r
-            //\r
-            // If target Hii Handle not found, exit\r
-            //\r
-            Selection->Action = UI_ACTION_EXIT;\r
-            Selection->Statement = NULL;\r
-            break;\r
-          }\r
-\r
-          FreePool (StringPtr);\r
-          FreePool (DevicePath);\r
-\r
-          CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));\r
-          Selection->FormId = Statement->RefFormId;\r
-          Selection->QuestionId = Statement->RefQuestionId;\r
-        } else if (!CompareGuid (&Statement->RefFormSetId, &gZeroGuid)) {\r
-          if (Selection->Form->ModalForm) {\r
-            break;\r
-          }\r
-          //\r
-          // Goto another Formset, check for uncommitted data\r
-          //\r
-          Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
-          CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));\r
-          Selection->FormId = Statement->RefFormId;\r
-          Selection->QuestionId = Statement->RefQuestionId;\r
-        } else if (Statement->RefFormId != 0) {\r
-          //\r
-          // Check whether target From is suppressed.\r
-          //\r
-          RefForm = IdToForm (Selection->FormSet, Statement->RefFormId);\r
-\r
-          if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
-            Status = EvaluateExpression (Selection->FormSet, RefForm, RefForm->SuppressExpression);\r
-            if (EFI_ERROR (Status)) {\r
-              return Status;\r
-            }\r
-\r
-            if (RefForm->SuppressExpression->Result.Value.b) {\r
-              //\r
-              // Form is suppressed. \r
-              //\r
-              do {\r
-                CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
-              } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-              Repaint = TRUE;\r
-              break;\r
-            }\r
-          }\r
-\r
-          //\r
-          // Goto another form inside this formset,\r
-          //\r
-          Selection->Action = UI_ACTION_REFRESH_FORM;\r
-\r
-          //\r
-          // Link current form so that we can always go back when someone hits the ESC\r
-          //\r
-          MenuList = UiFindMenuList (&Selection->FormSetGuid, Statement->RefFormId);\r
-          if (MenuList == NULL) {\r
-            MenuList = UiAddMenuList (CurrentMenu, &Selection->FormSetGuid, Statement->RefFormId);\r
-          }\r
-\r
-          Selection->FormId = Statement->RefFormId;\r
-          Selection->QuestionId = Statement->RefQuestionId;\r
-        } else if (Statement->RefQuestionId != 0) {\r
-          //\r
-          // Goto another Question\r
-          //\r
-          Selection->QuestionId = Statement->RefQuestionId;\r
-\r
-          if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-            Selection->Action = UI_ACTION_REFRESH_FORM;\r
-          } else {\r
-            Repaint = TRUE;\r
-            NewLine = TRUE;\r
-            break;\r
-          }\r
-        }\r
+        ProcessGotoOpCode(Statement, Selection, &Repaint, &NewLine);\r
         break;\r
 \r
       case EFI_IFR_ACTION_OP:\r
index 321bdaceab287b5c550f17f13dacf70dbf0de41d..181b9a43dcbb2bdc30896b04b2eba6dfbd58754d 100644 (file)
@@ -331,6 +331,26 @@ FreeBrowserStrings (
   VOID\r
   );\r
 \r
+/**\r
+  Process the goto op code, update the info in the selection structure.\r
+\r
+  @param Statement    The statement belong to goto op code.\r
+  @param Selection    The selection info.\r
+  @param Repaint      Whether need to repaint the menu.\r
+  @param NewLine      Whether need to create new line.\r
+\r
+  @retval EFI_SUCCESS    The menu process successfully.\r
+  @return Other value if the process failed.\r
+**/\r
+EFI_STATUS\r
+ProcessGotoOpCode (\r
+  IN OUT   FORM_BROWSER_STATEMENT      *Statement,\r
+  IN OUT   UI_MENU_SELECTION           *Selection,\r
+  OUT      BOOLEAN                     *Repaint,\r
+  OUT      BOOLEAN                     *NewLine\r
+  );\r
+\r
+\r
 /**\r
   The worker function that send the displays to the screen. On output,\r
   the selection made by user is returned.\r