Update HiiConfigAccess.ExtractConfig interface to support NULL request string and...
[efi/edk2/.git] / edk2 / MdeModulePkg / Universal / Network / VlanConfigDxe / VlanConfigImpl.c
index b11e7c9..6562916 100644 (file)
@@ -75,14 +75,29 @@ VlanExtractConfig (
        OUT EFI_STRING                            *Results\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  UINTN               BufferSize;\r
-  VLAN_CONFIGURATION  Configuration;\r
+  EFI_STATUS                 Status;\r
+  UINTN                      BufferSize;\r
+  VLAN_CONFIGURATION         Configuration;\r
+  VLAN_CONFIG_PRIVATE_DATA  *PrivateData;\r
+  EFI_STRING                 ConfigRequestHdr;\r
+  EFI_STRING                 ConfigRequest;\r
+  BOOLEAN                    AllocatedRequest;\r
+  UINTN                      Size;\r
 \r
-  if (Request == NULL) {\r
+  if (Progress == NULL || Results == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  *Progress = Request;\r
+  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mVlanFormSetGuid, mVlanStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  ConfigRequestHdr = NULL;\r
+  ConfigRequest    = NULL;\r
+  AllocatedRequest = FALSE;\r
+  Size             = 0;\r
+\r
   //\r
   // Retrieve the pointer to the UEFI HII Config Routing Protocol\r
   //\r
@@ -94,16 +109,49 @@ VlanExtractConfig (
   //\r
   // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
   //\r
+  PrivateData = VLAN_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
   ZeroMem (&Configuration, sizeof (VLAN_CONFIGURATION));\r
   BufferSize = sizeof (VLAN_CONFIG_PRIVATE_DATA);\r
+  ConfigRequest = Request;\r
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+    //\r
+    // Request has no request element, construct full request string.\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&mVlanFormSetGuid, mVlanStorageName, PrivateData->DriverHandle);\r
+    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    ASSERT (ConfigRequest != NULL);\r
+    AllocatedRequest = TRUE;\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  }\r
+\r
   Status = mHiiConfigRouting->BlockToConfig (\r
                                 mHiiConfigRouting,\r
-                                Request,\r
+                                ConfigRequest,\r
                                 (UINT8 *) &Configuration,\r
                                 BufferSize,\r
                                 Results,\r
                                 Progress\r
                                 );\r
+  //\r
+  // Free the allocated config request string.\r
+  //\r
+  if (AllocatedRequest) {\r
+    FreePool (ConfigRequest);\r
+    ConfigRequest = NULL;\r
+  }\r
+  //\r
+  // Set Progress string to the original request string.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    *Progress = Request + StrLen (Request);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r