+## GenPackageUNIEncodeFile\r
+# GenPackageUNIEncodeFile, default is a UCS-2LE encode file\r
+#\r
+def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):\r
+ GenUNIFlag = False\r
+ OnlyLANGUAGE_EN_X = True\r
+ BinaryAbstract = []\r
+ BinaryDescription = []\r
+ #\r
+ # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, \r
+ # then the PACKAGE_UNI_FILE must be created.\r
+ #\r
+ for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ \r
+ for UserExtension in PackageObject.GetUserExtensionList():\r
+ if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
+ and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+ for (Key, Value) in UserExtension.GetBinaryAbstract():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ BinaryAbstract.append((Key, Value))\r
+\r
+ for (Key, Value) in UserExtension.GetBinaryDescription():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ BinaryDescription.append((Key, Value))\r
+\r
+ for Pcd in PackageObject.GetPcdList():\r
+ for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():\r
+ if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ \r
+ for PcdError in Pcd.GetPcdErrorsList():\r
+ if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):\r
+ for (Key, Value) in PcdError.GetErrorMessageList():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ if not GenUNIFlag:\r
+ return\r
+ elif OnlyLANGUAGE_EN_X:\r
+ return\r
+ else:\r
+ PackageObject.UNIFlag = True\r
+ \r
+ if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):\r
+ os.makedirs(os.path.dirname(PackageObject.GetFullPath()))\r
+ \r
+ ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName())\r
+\r
+ Content = UniFileHeader + '\r\n'\r
+ Content += '\r\n'\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n'\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \\r
+ + '\r\n'\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n'\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n'\r
+ \r
+ PromptGenList = []\r
+ HelpTextGenList = [] \r
+ for Pcd in PackageObject.GetPcdList():\r
+ # Generate Prompt for each Pcd\r
+ PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '\r
+ TokenValueList = []\r
+ for TxtObj in Pcd.GetPromptList():\r
+ Lang = TxtObj.GetLang()\r
+ PromptStr = TxtObj.GetString()\r
+ #\r
+ # Avoid generating the same PROMPT entry more than one time. \r
+ #\r
+ if (PcdPromptStrName, Lang) not in PromptGenList:\r
+ TokenValueList.append((Lang, PromptStr))\r
+ PromptGenList.append((PcdPromptStrName, Lang))\r
+ PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n'\r
+ if PromptString not in Content:\r
+ Content += PromptString\r
+ \r
+ # Generate Help String for each Pcd\r
+ PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '\r
+ TokenValueList = []\r
+ for TxtObj in Pcd.GetHelpTextList():\r
+ Lang = TxtObj.GetLang()\r
+ HelpStr = TxtObj.GetString()\r
+ #\r
+ # Avoid generating the same HELP entry more than one time. \r
+ #\r
+ if (PcdHelpStrName, Lang) not in HelpTextGenList:\r
+ TokenValueList.append((Lang, HelpStr))\r
+ HelpTextGenList.append((PcdHelpStrName, Lang))\r
+ HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n'\r
+ if HelpTextString not in Content:\r
+ Content += HelpTextString\r
+ \r
+ # Generate PcdError for each Pcd if ErrorNo exist.\r
+ for PcdError in Pcd.GetPcdErrorsList():\r
+ ErrorNo = PcdError.GetErrorNumber()\r
+ if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):\r
+ PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \\r
+ + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \\r
+ + TAB_UNDERLINE_SPLIT + ErrorNo[2:]\r
+ PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n'\r
+ if PcdErrString not in Content:\r
+ Content += PcdErrString\r
+ \r
+ File = codecs.open(ContainerFile, 'w', Encoding)\r
+ File.write(u'\uFEFF' + Content)\r
+ File.stream.close()\r
+ Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
+ Md5Sum = Md5Sigature.hexdigest()\r
+ if (ContainerFile, Md5Sum) not in PackageObject.FileList:\r
+ PackageObject.FileList.append((ContainerFile, Md5Sum))\r
+\r
+ return ContainerFile\r
+ \r