]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Add a stringent check to make sure the package list for UpdateForm call must have...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Sep 2008 10:15:50 +0000 (10:15 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Sep 2008 10:15:50 +0000 (10:15 +0000)
2) Fix a bug for Numeric Opcode creation.
3) Add AssignQuestionId to assign QuestionId to be a non-zero value always.
4) Add in Check in UefiRegisterPackageList to same package list to be registered for more than once. (Framework BDS has this behavior).
5) Fix a bug in HiiNewString

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

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Strings.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

index 3679f6dfb452016cab51bc34c05c75193221da67..02beec331f391a56e5667f73c54605564e62fc08 100644 (file)
@@ -519,13 +519,10 @@ HiiUpdateForm (
     }\r
   }\r
 \r
-  if ((ThunkContext->IfrPackageCount == 0) && (ThunkContext->StringPackageCount != 0)) {\r
-    UefiHiiHandle = TagGuidToUefiHiiHandle (Private, &ThunkContext->TagGuid);\r
-  \r
-    if (UefiHiiHandle == NULL) {\r
-      Status = EFI_INVALID_PARAMETER;\r
-      goto Done;\r
-    }\r
+  if (ThunkContext->IfrPackageCount == 0) {\r
+    ASSERT (FALSE);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   } else {\r
     UefiHiiHandle = ThunkContext->UefiHiiHandle;\r
   }\r
index 6359c8e6802c9bb12822df03e4accb9e1513e77d..0fbe943165f5a8579a94225834e3db217eeac3b8 100644 (file)
@@ -44,6 +44,21 @@ AppendToUpdateBuffer (
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_QUESTION_ID\r
+AssignQuestionId (\r
+  IN  UINT16    FwQuestionId\r
+  )\r
+{\r
+  if (FwQuestionId == 0) {\r
+    //\r
+    // In UEFI IFR, the Question ID can't be zero. Zero means no storage.\r
+    // So use 0xABBA as a Question ID.\r
+    //\r
+    return 0xABBA;\r
+  } else {\r
+    return FwQuestionId;\r
+  }\r
+}\r
 \r
 \r
 EFI_STATUS\r
@@ -368,7 +383,7 @@ F2UCreateOneOfOpCode (
       if (UOpcode.Question.QuestionId == 0) {\r
         Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
         if (EFI_ERROR (Status)) {\r
-          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+          UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key);\r
         }\r
 \r
         OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
@@ -382,6 +397,7 @@ F2UCreateOneOfOpCode (
           break;\r
         case 2:\r
           OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+          break;\r
         default:\r
           ASSERT (FALSE);\r
           break;\r
@@ -416,7 +432,7 @@ F2UCreateOneOfOpCode (
     //\r
     Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
     if (EFI_ERROR (Status)) {\r
-      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+      UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
     }\r
   }\r
   \r
@@ -519,7 +535,7 @@ F2UCreateOrderedListOpCode (
       if (UOpcode.Question.QuestionId == 0) {\r
         Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
         if (EFI_ERROR (Status)) {\r
-          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+          UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key);\r
         }\r
 \r
       }\r
@@ -535,7 +551,7 @@ F2UCreateOrderedListOpCode (
   if (UOpcode.Question.QuestionId == 0) {\r
     Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
     if (EFI_ERROR (Status)) {\r
-      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+      UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
     }\r
   }\r
  \r
@@ -626,7 +642,7 @@ F2UCreateCheckBoxOpCode (
       //\r
       // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
       //\r
-      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+      UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
     }\r
   } else {\r
     UOpcode.Question.QuestionId    = FwOpcode->Key;\r
@@ -735,7 +751,7 @@ F2UCreateNumericOpCode (
       //\r
       // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
       //\r
-      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+      UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
     }\r
   } else {\r
     UOpcode.Question.QuestionId    = FwOpcode->Key;\r
@@ -747,14 +763,11 @@ F2UCreateNumericOpCode (
   // We need to create a nested default value for the UEFI Numeric Opcode.\r
   // So turn on the scope.\r
   //\r
-  if (FwOpcode->Default != 0) {\r
-    UOpcode.Header.Scope = 1;\r
-  }\r
+  UOpcode.Header.Scope = 1;\r
 \r
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
-  UOpcode.Question.QuestionId    = FwOpcode->Key;\r
   UOpcode.Question.VarStoreId    = VarStoreId;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
@@ -770,12 +783,12 @@ F2UCreateNumericOpCode (
   switch (FwOpcode->Width) {\r
     case 1: \r
     {\r
-      UOpcode.Flags           =  EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
+      UOpcode.Flags           =  EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
       break;\r
     } \r
     case 2: \r
     {\r
-      UOpcode.Flags           =  EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
+      UOpcode.Flags           =  EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
       break;\r
     }\r
     default: \r
@@ -793,34 +806,32 @@ F2UCreateNumericOpCode (
   //\r
   // We need to create a default value.\r
   //\r
-  if (FwOpcode->Default != 0) {\r
-    ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
-    UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
-    UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
+  ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
+  UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
+  UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
 \r
-    UOpcodeDefault.DefaultId = 0;\r
+  UOpcodeDefault.DefaultId = 0;\r
 \r
-    switch (FwOpcode->Width) {\r
-      case 1: \r
-      {\r
-        UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-        break;\r
-      } \r
-      case 2: \r
-      {\r
-        UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
-        break;\r
-      }\r
+  switch (FwOpcode->Width) {\r
+    case 1: \r
+    {\r
+      UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+      break;\r
+    } \r
+    case 2: \r
+    {\r
+      UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+      break;\r
     }\r
+  }\r
 \r
-    CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
+  CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
 \r
-    Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    Status = UCreateEndOfOpcode (UefiData);\r
+  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
   }\r
+  Status = UCreateEndOfOpcode (UefiData);\r
 \r
   return Status;\r
 }\r
@@ -1037,6 +1048,11 @@ FwUpdateDataToUefiUpdateData (
         DataCount = 1;\r
         break;\r
 \r
+      case FRAMEWORK_EFI_IFR_NUMERIC_OP:\r
+        Status = F2UCreateNumericOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode);\r
+        DataCount = 1;\r
+        break;\r
+\r
       default:\r
         ASSERT (FALSE);\r
         return EFI_UNSUPPORTED;\r
index 6e2c9dfd34ca8625fd24fea853bec8e08fadf2d6..a5bf876e25c8abf0e623c34a110fe06efac8a229 100644 (file)
@@ -248,6 +248,7 @@ FindStringPackAndUpdatePackListWithOnlyIfrPack (
 //\r
 EFI_STATUS\r
 UefiRegisterPackageList(\r
+  IN  EFI_HII_PROTOCOL               *This,\r
   IN  HII_THUNK_PRIVATE_DATA      *Private,\r
   IN  EFI_HII_PACKAGES            *Packages,\r
   OUT FRAMEWORK_EFI_HII_HANDLE    *Handle\r
@@ -273,12 +274,6 @@ UefiRegisterPackageList(
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
-  if (ThunkContext == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
-  \r
   if (Packages->GuidId == NULL) {\r
     //\r
     // UEFI HII Database require Package List GUID must be unique.\r
@@ -291,9 +286,24 @@ UefiRegisterPackageList(
     ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
     GenerateRandomGuid (&GuidId);\r
   } else {\r
+    ThunkContext = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
+    \r
+    if (IfrPackageCount > 0 && \r
+        StringPackageCount > 0 && \r
+        (ThunkContext!= NULL)) {\r
+        DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
+        DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
+        HiiRemovePack (This, ThunkContext->FwHiiHandle);\r
+    }\r
     CopyGuid (&GuidId, Packages->GuidId);\r
   }\r
 \r
+  ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+  if (ThunkContext == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+  \r
   //\r
   // Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
   //\r
@@ -426,6 +436,7 @@ Returns:
   Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   Status = UefiRegisterPackageList (\r
+              This,\r
               Private,\r
               Packages,\r
               Handle\r
@@ -479,7 +490,6 @@ Returns:
       UninstallDefaultConfigAccessProtocol (ThunkContext);\r
     }\r
 \r
-    RemoveEntryList (&ThunkContext->Link);\r
     DestroyThunkContext (ThunkContext);\r
   }else {\r
     Status = EFI_NOT_FOUND;\r
index 9e2df6fc62cbbb0020f5226480f02fbf4e29455c..14e27dda1891e50fb6f1cae0a43650ad25ae22e9 100644 (file)
@@ -129,6 +129,7 @@ Returns:
   EFI_STRING_ID                             StringId;\r
   EFI_STRING_ID                             LastStringId;\r
   CHAR8                                     AsciiLanguage[ISO_639_2_ENTRY_SIZE + 1];\r
+  CHAR16                                    LanguageCopy[ISO_639_2_ENTRY_SIZE + 1];\r
   BOOLEAN                                   Found;\r
   CHAR8                                     *Rfc3066AsciiLanguage;\r
 \r
@@ -144,8 +145,9 @@ Returns:
 \r
   if (Language != NULL) {\r
     ZeroMem (AsciiLanguage, sizeof (AsciiLanguage));;\r
-    \r
-    UnicodeStrToAsciiStr (Language, AsciiLanguage);\r
+    ZeroMem (LanguageCopy, sizeof (LanguageCopy));\r
+    CopyMem (LanguageCopy, Language, ISO_639_2_ENTRY_SIZE * sizeof (CHAR16));\r
+    UnicodeStrToAsciiStr (LanguageCopy, AsciiLanguage);\r
     Rfc3066AsciiLanguage = ConvertIso639ToRfc3066 (AsciiLanguage);\r
     ASSERT (Rfc3066AsciiLanguage != NULL);\r
   }\r
index 638d8352863cb02d9a56596cc11c82a1aade645e..67e0877dd9d4726cdc63d6140ace6a050dd8c612 100644 (file)
@@ -90,8 +90,8 @@ UefiHiiHandleToThunkContext (
   return NULL;\r
 }\r
 \r
-EFI_HII_HANDLE *\r
-TagGuidToUefiHiiHandle (\r
+HII_THUNK_CONTEXT *\r
+TagGuidToIfrPackThunkContext (\r
   IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   )\r
@@ -104,8 +104,8 @@ TagGuidToUefiHiiHandle (
   while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
     ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
-    if (CompareMem (Guid, &ThunkContext->TagGuid, sizeof (EFI_GUID) == 0) && (ThunkContext->IfrPackageCount != 0)) {\r
-      return ThunkContext->UefiHiiHandle;\r
+    if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
+      return ThunkContext;\r
     }\r
 \r
     Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
index 0a45144cf8b4e01b59c9a1d30f16ce6d43517da5..5d93c706279854a90bbc45bf708790b75500bd29 100644 (file)
@@ -45,8 +45,8 @@ UefiHiiHandleToThunkContext (
   IN EFI_HII_HANDLE                   UefiHiiHandle\r
   );\r
 \r
-EFI_HII_HANDLE *\r
-TagGuidToUefiHiiHandle (\r
+HII_THUNK_CONTEXT *\r
+TagGuidToIfrPackThunkContext (\r
   IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   );\r