+ //\r
+ // Combine multi binary HII package files to a single text package list RC file.\r
+ //\r
+ if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {\r
+ //\r
+ // Get hii package list lenght\r
+ //\r
+ HiiPackageListHeader.PackageLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+ for (Index = 0; Index < InputFileNum; Index ++) {\r
+ fpIn = fopen (InputFileName [Index], "rb");\r
+ if (!fpIn) {\r
+ Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
+ goto Finish;\r
+ }\r
+ FileLength = _filelength (fileno (fpIn));\r
+ fread (&HiiPackageHeader, 1, sizeof (HiiPackageHeader), fpIn);\r
+ if (HiiPackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
+ if (HiiPackageHeader.Length != FileLength) {\r
+ Error (NULL, 0, 3000, "Invalid", "The wrong package size is in HII package file %s", InputFileName [Index]);\r
+ fclose (fpIn);\r
+ goto Finish;\r
+ }\r
+ if (memcmp (&HiiPackageListGuid, &mZeroGuid, sizeof (EFI_GUID)) == 0) {\r
+ fread (&IfrFormSet, 1, sizeof (IfrFormSet), fpIn);\r
+ memcpy (&HiiPackageListGuid, &IfrFormSet.Guid, sizeof (EFI_GUID));\r
+ }\r
+ NumberOfFormPacakge ++;\r
+ }\r
+ HiiPackageListHeader.PackageLength += FileLength;\r
+ fclose (fpIn);\r
+ }\r
+ HiiPackageListHeader.PackageLength += sizeof (EndPackage);\r
+ //\r
+ // Check whether hii packages are valid\r
+ //\r
+ if (NumberOfFormPacakge > 1) {\r
+ Error (NULL, 0, 3000, "Invalid", "The input hii packages contains more than one hii form package");\r
+ goto Finish;\r
+ }\r
+ if (memcmp (&HiiPackageListGuid, &mZeroGuid, sizeof (EFI_GUID)) == 0) {\r
+ Error (NULL, 0, 3000, "Invalid", "HII pacakge list guid is not specified!");\r
+ goto Finish;\r
+ }\r
+ memcpy (&HiiPackageListHeader.PackageListGuid, &HiiPackageListGuid, sizeof (EFI_GUID));\r
+ //\r
+ // read hii packages\r
+ //\r
+ HiiPackageListBuffer = malloc (HiiPackageListHeader.PackageLength);\r
+ if (HiiPackageListBuffer == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ goto Finish;\r
+ }\r
+ memcpy (HiiPackageListBuffer, &HiiPackageListHeader, sizeof (HiiPackageListHeader));\r
+ HiiPackageDataPointer = HiiPackageListBuffer + sizeof (HiiPackageListHeader);\r
+ for (Index = 0; Index < InputFileNum; Index ++) {\r
+ fpIn = fopen (InputFileName [Index], "rb");\r
+ if (!fpIn) {\r
+ Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
+ free (HiiPackageListBuffer);\r
+ goto Finish;\r
+ }\r
+\r
+ FileLength = _filelength (fileno (fpIn));\r
+ fread (HiiPackageDataPointer, 1, FileLength, fpIn);\r
+ fclose (fpIn);\r
+ HiiPackageDataPointer = HiiPackageDataPointer + FileLength;\r
+ }\r
+ memcpy (HiiPackageDataPointer, &EndPackage, sizeof (EndPackage));\r
+ //\r
+ // write the hii package into the text package list rc file.\r
+ //\r
+ for (Index = 0; gHiiPackageRCFileHeader[Index] != NULL; Index++) {\r
+ fprintf (fpOut, "%s\n", gHiiPackageRCFileHeader[Index]);\r
+ }\r
+ fprintf (fpOut, "\n%d %s\n{", HII_RESOURCE_SECTION_INDEX, HII_RESOURCE_SECTION_NAME);\r
+\r
+ HiiPackageDataPointer = HiiPackageListBuffer;\r
+ for (Index = 0; Index + 2 < HiiPackageListHeader.PackageLength; Index += 2) {\r
+ if (Index % 16 == 0) {\r
+ fprintf (fpOut, "\n ");\r
+ }\r
+ fprintf (fpOut, " 0x%04X,", *(UINT16 *) HiiPackageDataPointer);\r
+ HiiPackageDataPointer += 2;\r
+ }\r
+ \r
+ if (Index % 16 == 0) {\r
+ fprintf (fpOut, "\n ");\r
+ }\r
+ if ((Index + 2) == HiiPackageListHeader.PackageLength) {\r
+ fprintf (fpOut, " 0x%04X\n}\n", *(UINT16 *) HiiPackageDataPointer);\r
+ }\r
+ if ((Index + 1) == HiiPackageListHeader.PackageLength) {\r
+ fprintf (fpOut, " 0x%04X\n}\n", *(UINT8 *) HiiPackageDataPointer);\r
+ }\r
+ free (HiiPackageListBuffer);\r
+ //\r
+ // Done successfully\r
+ //\r
+ goto Finish;\r
+ }\r
+\r