def SaveFileOnChange(File, Content, IsBinaryFile=True): if os.path.exists(File): if IsBinaryFile: try: if Content == __FileHookOpen__(File, "rb").read(): return False except BaseException: Logger.Error(None, ToolError.FILE_OPEN_FAILURE, ExtraData=File) else: try: if Content == __FileHookOpen__(File, "r").read(): return False except BaseException: Logger.Error(None, ToolError.FILE_OPEN_FAILURE, ExtraData=File) CreateDirectory(os.path.dirname(File)) if IsBinaryFile: try: FileFd = __FileHookOpen__(File, "wb") FileFd.write(Content) FileFd.close() except BaseException: Logger.Error(None, ToolError.FILE_CREATE_FAILURE, ExtraData=File) else: try: FileFd = __FileHookOpen__(File, "w") FileFd.write(Content) FileFd.close() except BaseException: Logger.Error(None, ToolError.FILE_CREATE_FAILURE, ExtraData=File) return True
def UnZipDp(WorkspaceDir, DpPkgFileName): ContentZipFile = None Logger.Quiet(ST.MSG_UZIP_PARSE_XML) DistFile = PackageFile(DpPkgFileName) DpDescFileName, ContentFileName = GetDPFile(DistFile.GetZipFile()) GlobalData.gUNPACK_DIR = os.path.normpath(os.path.join(WorkspaceDir, ".tmp")) DistPkgFile = DistFile.UnpackFile(DpDescFileName, os.path.normpath(os.path.join(GlobalData.gUNPACK_DIR, DpDescFileName))) if not DistPkgFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN %DpDescFileName) # # Generate distpkg # DistPkgObj = DistributionPackageXml() DistPkg = DistPkgObj.FromXml(DistPkgFile) if DistPkg.Header.RePackage == '': DistPkg.Header.RePackage = False if DistPkg.Header.ReadOnly == '': DistPkg.Header.ReadOnly = False # # unzip contents.zip file # ContentFile = DistFile.UnpackFile(ContentFileName, os.path.normpath(os.path.join(GlobalData.gUNPACK_DIR, ContentFileName))) if not ContentFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN % ContentFileName) FilePointer = __FileHookOpen__(ContentFile, "rb") # # Assume no archive comment. # FilePointer.seek(0, SEEK_SET) FilePointer.seek(0, SEEK_END) # # Get file size # FileSize = FilePointer.tell() FilePointer.close() if FileSize != 0: ContentZipFile = PackageFile(ContentFile) # # verify MD5 signature when existed # if DistPkg.Header.Signature != '': Md5Sigature = md5.new(__FileHookOpen__(ContentFile, 'rb').read()) if DistPkg.Header.Signature != Md5Sigature.hexdigest(): ContentZipFile.Close() Logger.Error("InstallPkg", FILE_CHECKSUM_FAILURE, ExtraData=ContentFile) return DistPkg, ContentZipFile, DpPkgFileName, DistFile
def GetPackageList(DistPkg, Dep, WorkspaceDir, Options, ContentZipFile, ModuleList, PackageList): NewDict = Sdict() for Guid, Version, Path in DistPkg.PackageSurfaceArea: PackagePath = Path Package = DistPkg.PackageSurfaceArea[Guid, Version, Path] Logger.Info(ST.MSG_INSTALL_PACKAGE % Package.GetName()) # if Dep.CheckPackageExists(Guid, Version): # Logger.Info(ST.WRN_PACKAGE_EXISTED %(Guid, Version)) if Options.UseGuidedPkgPath: GuidedPkgPath = "%s_%s_%s" % (Package.GetName(), Guid, Version) NewPackagePath = InstallNewPackage(WorkspaceDir, GuidedPkgPath, Options.CustomPath) else: NewPackagePath = InstallNewPackage(WorkspaceDir, PackagePath, Options.CustomPath) InstallPackageContent(PackagePath, NewPackagePath, Package, ContentZipFile, Dep, WorkspaceDir, ModuleList, DistPkg.Header.ReadOnly) PackageList.append(Package) NewDict[Guid, Version, Package.GetPackagePath()] = Package # # Now generate meta-data files, first generate all dec for package # dec should be generated before inf, and inf should be generated after # all packages installed, else hard to resolve modules' package # dependency (Hard to get the location of the newly installed package) # for Package in PackageList: FilePath = PackageToDec(Package, DistPkg.Header) Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if (FilePath, Md5Sum) not in Package.FileList: Package.FileList.append((FilePath, Md5Sum)) return NewDict
def Extract(self, Which, ToDest): Which = os.path.normpath(Which) if Which not in self._Files: Logger.Error("PackagingTool", FILE_NOT_FOUND, ExtraData="[%s] in %s" % (Which, self._FileName)) try: FileContent = self._ZipFile.read(self._Files[Which]) except BaseException as Xstr: Logger.Error("PackagingTool", FILE_DECOMPRESS_FAILURE, ExtraData="[%s] in %s (%s)" % (Which, \ self._FileName, \ str(Xstr))) try: CreateDirectory(os.path.dirname(ToDest)) if os.path.exists(ToDest) and not os.access(ToDest, os.W_OK): Logger.Warn("PackagingTool", \ ST.WRN_FILE_NOT_OVERWRITTEN % ToDest) return else: ToFile = __FileHookOpen__(ToDest, 'wb') except BaseException as Xstr: Logger.Error("PackagingTool", FILE_OPEN_FAILURE, ExtraData="%s (%s)" % (ToDest, str(Xstr))) try: ToFile.write(FileContent) ToFile.close() except BaseException as Xstr: Logger.Error("PackagingTool", FILE_WRITE_FAILURE, ExtraData="%s (%s)" % (ToDest, str(Xstr)))
def InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable=False): if os.path.exists(os.path.normpath(ToFile)): pass else: if not ContentZipFile or not ContentZipFile.UnpackFile( FromFile, ToFile): Logger.Error("UPT", FILE_NOT_FOUND, ST.ERR_INSTALL_FILE_FROM_EMPTY_CONTENT % FromFile) if ReadOnly: if not Executable: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) else: chmod( ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) elif Executable: chmod( ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) else: chmod( ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH) Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() return Md5Sum
def UnZipDp(WorkspaceDir, DpPkgFileName, Index=1): ContentZipFile = None Logger.Quiet(ST.MSG_UZIP_PARSE_XML) DistFile = PackageFile(DpPkgFileName) DpDescFileName, ContentFileName = GetDPFile(DistFile.GetZipFile()) TempDir = os.path.normpath( os.path.join(WorkspaceDir, "Conf/.tmp%s" % str(Index))) GlobalData.gUNPACK_DIR.append(TempDir) DistPkgFile = DistFile.UnpackFile( DpDescFileName, os.path.normpath(os.path.join(TempDir, DpDescFileName))) if not DistPkgFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN % DpDescFileName) # # Generate distpkg # DistPkgObj = DistributionPackageXml() DistPkg = DistPkgObj.FromXml(DistPkgFile) if DistPkg.Header.RePackage == '': DistPkg.Header.RePackage = False if DistPkg.Header.ReadOnly == '': DistPkg.Header.ReadOnly = False # # unzip contents.zip file # ContentFile = DistFile.UnpackFile( ContentFileName, os.path.normpath(os.path.join(TempDir, ContentFileName))) if not ContentFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN % ContentFileName) # # Get file size # FileSize = os.path.getsize(ContentFile) if FileSize != 0: ContentZipFile = PackageFile(ContentFile) # # verify MD5 signature when existed # if DistPkg.Header.Signature != '': Md5Sigature = md5.new(__FileHookOpen__(ContentFile, 'rb').read()) if DistPkg.Header.Signature != Md5Sigature.hexdigest(): ContentZipFile.Close() Logger.Error("InstallPkg", FILE_CHECKSUM_FAILURE, ExtraData=ContentFile) return DistPkg, ContentZipFile, DpPkgFileName, DistFile
def UnZipDp(WorkspaceDir, DpPkgFileName, Index=1): ContentZipFile = None Logger.Quiet(ST.MSG_UZIP_PARSE_XML) DistFile = PackageFile(DpPkgFileName) DpDescFileName, ContentFileName = GetDPFile(DistFile.GetZipFile()) TempDir = os.path.normpath(os.path.join(WorkspaceDir, "Conf/.tmp%s" % str(Index))) GlobalData.gUNPACK_DIR.append(TempDir) DistPkgFile = DistFile.UnpackFile(DpDescFileName, os.path.normpath(os.path.join(TempDir, DpDescFileName))) if not DistPkgFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN %DpDescFileName) # # Generate distpkg # DistPkgObj = DistributionPackageXml() DistPkg = DistPkgObj.FromXml(DistPkgFile) if DistPkg.Header.RePackage == '': DistPkg.Header.RePackage = False if DistPkg.Header.ReadOnly == '': DistPkg.Header.ReadOnly = False # # unzip contents.zip file # ContentFile = DistFile.UnpackFile(ContentFileName, os.path.normpath(os.path.join(TempDir, ContentFileName))) if not ContentFile: Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN % ContentFileName) # # Get file size # FileSize = os.path.getsize(ContentFile) if FileSize != 0: ContentZipFile = PackageFile(ContentFile) # # verify MD5 signature when existed # if DistPkg.Header.Signature != '': Md5Sigature = md5.new(__FileHookOpen__(ContentFile, 'rb').read()) if DistPkg.Header.Signature != Md5Sigature.hexdigest(): ContentZipFile.Close() Logger.Error("InstallPkg", FILE_CHECKSUM_FAILURE, ExtraData=ContentFile) return DistPkg, ContentZipFile, DpPkgFileName, DistFile
def InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable=False): if os.path.exists(os.path.normpath(ToFile)): pass else: if not ContentZipFile or not ContentZipFile.UnpackFile(FromFile, ToFile): Logger.Error("UPT", FILE_NOT_FOUND, ST.ERR_INSTALL_FILE_FROM_EMPTY_CONTENT % FromFile) if ReadOnly: if not Executable: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) else: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) elif Executable: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) else: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH) Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() return Md5Sum
def InstallPackageContent(FromPath, ToPath, Package, ContentZipFile, Dep, WorkspaceDir, ModuleList, ReadOnly = False): if Dep: pass Package.FileList = [] if ToPath.startswith("\\") or ToPath.startswith("/"): ToPath = ToPath[1:] if not IsValidInstallPath(ToPath): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%ToPath) if FromPath.startswith("\\") or FromPath.startswith("/"): FromPath = FromPath[1:] if not IsValidInstallPath(FromPath): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FromPath) PackageFullPath = os.path.normpath(os.path.join(WorkspaceDir, ToPath)) for MiscFile in Package.GetMiscFileList(): for Item in MiscFile.GetFileList(): FileName = Item.GetURI() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName) FromFile = os.path.join(FromPath, FileName) Executable = Item.GetExecutable() ToFile = (os.path.join(PackageFullPath, ConvertPath(FileName))) Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable) if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) PackageIncludeArchList = [] for Item in Package.GetPackageIncludeFileList(): FileName = Item.GetFilePath() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName) FromFile = os.path.join(FromPath, FileName) ToFile = os.path.normpath(os.path.join(PackageFullPath, ConvertPath(FileName))) RetFile = ContentZipFile.UnpackFile(FromFile, ToFile) if RetFile == '': # # a non-exist path in Zipfile will return '', which means an include directory in our case # save the information for later DEC creation usage and also create the directory # PackageIncludeArchList.append([Item.GetFilePath(), Item.GetSupArchList()]) CreateDirectory(ToFile) continue if ReadOnly: chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH) else: chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH) Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) Package.SetIncludeArchList(PackageIncludeArchList) for Item in Package.GetStandardIncludeFileList(): FileName = Item.GetFilePath() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName) FromFile = os.path.join(FromPath, FileName) ToFile = os.path.normpath(os.path.join(PackageFullPath, ConvertPath(FileName))) Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly) if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) # # Update package # Package.SetPackagePath(Package.GetPackagePath().replace(FromPath, ToPath, 1)) Package.SetFullPath(os.path.normpath(os.path.join(PackageFullPath, ConvertPath(Package.GetName()) + '.dec'))) # # Install files in module # Module = None ModuleDict = Package.GetModuleDict() for ModuleGuid, ModuleVersion, ModuleName, ModulePath in ModuleDict: Module = ModuleDict[ModuleGuid, ModuleVersion, ModuleName, ModulePath] InstallModuleContent(FromPath, ToPath, ModulePath, Module, ContentZipFile, WorkspaceDir, ModuleList, Package, ReadOnly)
def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList): # # ModulePathList will keep track of the standalone module path that # we just installed. If a new module's path in that list # (only multiple INF in one directory will be so), we will # install them directly. If not, we will try to create a new directory # for it. # ModulePathList = [] # # Check module exist and install # Module = None NewDict = Sdict() for Guid, Version, Name, Path in DistPkg.ModuleSurfaceArea: ModulePath = Path Module = DistPkg.ModuleSurfaceArea[Guid, Version, Name, Path] Logger.Info(ST.MSG_INSTALL_MODULE % Module.GetName()) if Dep.CheckModuleExists(Guid, Version, Name, Path): Logger.Quiet(ST.WRN_MODULE_EXISTED %Path) # # here check for the multiple inf share the same module path cases: # they should be installed into the same directory # ModuleFullPath = \ os.path.normpath(os.path.join(WorkspaceDir, ModulePath)) if ModuleFullPath not in ModulePathList: NewModulePath = InstallNewModule(WorkspaceDir, ModulePath, ModulePathList) NewModuleFullPath = os.path.normpath(os.path.join(WorkspaceDir, NewModulePath)) ModulePathList.append(NewModuleFullPath) else: NewModulePath = ModulePath InstallModuleContent(ModulePath, NewModulePath, '', Module, ContentZipFile, WorkspaceDir, ModuleList, None, DistPkg.Header.ReadOnly) # # Update module # Module.SetModulePath(Module.GetModulePath().replace(Path, NewModulePath, 1)) NewDict[Guid, Version, Name, Module.GetModulePath()] = Module # # generate all inf for modules # for (Module, Package) in ModuleList: CheckCNameInModuleRedefined(Module, DistPkg) FilePath = ModuleToInf(Module, Package, DistPkg.Header) Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if Package: if (FilePath, Md5Sum) not in Package.FileList: Package.FileList.append((FilePath, Md5Sum)) else: if (FilePath, Md5Sum) not in Module.FileList: Module.FileList.append((FilePath, Md5Sum)) # # append the module unicode files to Package FileList # for (FilePath, Md5Sum) in Module.FileList: if str(FilePath).endswith('.uni') and Package and (FilePath, Md5Sum) not in Package.FileList: Package.FileList.append((FilePath, Md5Sum)) return NewDict
ExtraData="[%s] in %s" % (Which, self._FileName)) try: FileContent = self._ZipFile.read(self._Files[Which]) except BaseException, Xstr: Logger.Error("PackagingTool", FILE_DECOMPRESS_FAILURE, ExtraData="[%s] in %s (%s)" % (Which, \ self._FileName, \ str(Xstr))) try: CreateDirectory(os.path.dirname(ToDest)) if os.path.exists(ToDest) and not os.access(ToDest, os.W_OK): Logger.Warn("PackagingTool", \ ST.WRN_FILE_NOT_OVERWRITTEN % ToDest) return else: ToFile = __FileHookOpen__(ToDest, 'wb') except BaseException, Xstr: Logger.Error("PackagingTool", FILE_OPEN_FAILURE, ExtraData="%s (%s)" % (ToDest, str(Xstr))) try: ToFile.write(FileContent) ToFile.close() except BaseException, Xstr: Logger.Error("PackagingTool", FILE_WRITE_FAILURE, ExtraData="%s (%s)" % (ToDest, str(Xstr))) ## Remove the file # # @param Files: the removed files #
def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE): GenUNIFlag = False OnlyLANGUAGE_EN_X = True BinaryAbstract = [] BinaryDescription = [] # # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, # then the PACKAGE_UNI_FILE must be created. # for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for UserExtension in PackageObject.GetUserExtensionList(): if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \ and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER: for (Key, Value) in UserExtension.GetBinaryAbstract(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryAbstract.append((Key, Value)) for (Key, Value) in UserExtension.GetBinaryDescription(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryDescription.append((Key, Value)) for Pcd in PackageObject.GetPcdList(): for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList(): if TxtObj.GetLang() == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for PcdError in Pcd.GetPcdErrorsList(): if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'): for (Key, Value) in PcdError.GetErrorMessageList(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False if not GenUNIFlag: return elif OnlyLANGUAGE_EN_X: return else: PackageObject.UNIFlag = True if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())): os.makedirs(os.path.dirname(PackageObject.GetFullPath())) ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName()) Content = UniFileHeader + '\r\n' Content += '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \ + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n' PromptGenList = [] HelpTextGenList = [] for Pcd in PackageObject.GetPcdList(): # Generate Prompt for each Pcd PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT ' TokenValueList = [] for TxtObj in Pcd.GetPromptList(): Lang = TxtObj.GetLang() PromptStr = TxtObj.GetString() # # Avoid generating the same PROMPT entry more than one time. # if (PcdPromptStrName, Lang) not in PromptGenList: TokenValueList.append((Lang, PromptStr)) PromptGenList.append((PcdPromptStrName, Lang)) PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n' if PromptString not in Content: Content += PromptString # Generate Help String for each Pcd PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP ' TokenValueList = [] for TxtObj in Pcd.GetHelpTextList(): Lang = TxtObj.GetLang() HelpStr = TxtObj.GetString() # # Avoid generating the same HELP entry more than one time. # if (PcdHelpStrName, Lang) not in HelpTextGenList: TokenValueList.append((Lang, HelpStr)) HelpTextGenList.append((PcdHelpStrName, Lang)) HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n' if HelpTextString not in Content: Content += HelpTextString # Generate PcdError for each Pcd if ErrorNo exist. for PcdError in Pcd.GetPcdErrorsList(): ErrorNo = PcdError.GetErrorNumber() if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START): PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \ + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \ + TAB_UNDERLINE_SPLIT + ErrorNo[2:] PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n' if PcdErrString not in Content: Content += PcdErrString File = codecs.open(ContainerFile, 'w', Encoding) File.write(u'\uFEFF' + Content) File.stream.close() Md5Signature = md5(__FileHookOpen__(str(ContainerFile), 'rb').read()) Md5Sum = Md5Signature.hexdigest() if (ContainerFile, Md5Sum) not in PackageObject.FileList: PackageObject.FileList.append((ContainerFile, Md5Sum)) return ContainerFile
def GenModuleUNIEncodeFile(ModuleObject, UniFileHeader='', Encoding=DT.TAB_ENCODING_UTF16LE): GenUNIFlag = False OnlyLANGUAGE_EN_X = True BinaryAbstract = [] BinaryDescription = [] # # If more than one language code is used for any element that would be present in the MODULE_UNI_FILE, # then the MODULE_UNI_FILE must be created. # for (Key, Value) in ModuleObject.GetAbstract() + ModuleObject.GetDescription(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for UserExtension in ModuleObject.GetUserExtensionList(): if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \ and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER: for (Key, Value) in UserExtension.GetBinaryAbstract(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryAbstract.append((Key, Value)) for (Key, Value) in UserExtension.GetBinaryDescription(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryDescription.append((Key, Value)) if not GenUNIFlag: return elif OnlyLANGUAGE_EN_X: return else: ModuleObject.UNIFlag = True ContainerFile = GetUniFileName(os.path.dirname(ModuleObject.GetFullPath()), ModuleObject.GetBaseName()) if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())): os.makedirs(os.path.dirname(ModuleObject.GetFullPath())) Content = UniFileHeader + '\r\n' Content += '\r\n' Content += FormatUniEntry('#string ' + DT.TAB_INF_ABSTRACT, ModuleObject.GetAbstract(), ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + DT.TAB_INF_DESCRIPTION, ModuleObject.GetDescription(), ContainerFile) \ + '\r\n' BinaryAbstractString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) if BinaryAbstractString: Content += BinaryAbstractString + '\r\n' BinaryDescriptionString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_DESCRIPTION, BinaryDescription, \ ContainerFile) if BinaryDescriptionString: Content += BinaryDescriptionString + '\r\n' if not os.path.exists(ContainerFile): File = codecs.open(ContainerFile, 'wb', Encoding) File.write(u'\uFEFF' + Content) File.stream.close() Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if (ContainerFile, Md5Sum) not in ModuleObject.FileList: ModuleObject.FileList.append((ContainerFile, Md5Sum)) return ContainerFile
def GenModuleUNIEncodeFile(ModuleObject, UniFileHeader='', Encoding=DT.TAB_ENCODING_UTF16LE): GenUNIFlag = False OnlyLANGUAGE_EN_X = True BinaryAbstract = [] BinaryDescription = [] # # If more than one language code is used for any element that would be present in the MODULE_UNI_FILE, # then the MODULE_UNI_FILE must be created. # for (Key, Value) in ModuleObject.GetAbstract() + ModuleObject.GetDescription(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for UserExtension in ModuleObject.GetUserExtensionList(): if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \ and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER: for (Key, Value) in UserExtension.GetBinaryAbstract(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryAbstract.append((Key, Value)) for (Key, Value) in UserExtension.GetBinaryDescription(): if Key == DT.TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryDescription.append((Key, Value)) if not GenUNIFlag: return elif OnlyLANGUAGE_EN_X: return else: ModuleObject.UNIFlag = True ContainerFile = GetUniFileName(os.path.dirname(ModuleObject.GetFullPath()), ModuleObject.GetBaseName()) if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())): os.makedirs(os.path.dirname(ModuleObject.GetFullPath())) Content = UniFileHeader + '\r\n' Content += '\r\n' Content += FormatUniEntry('#string ' + DT.TAB_INF_ABSTRACT, ModuleObject.GetAbstract(), ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + DT.TAB_INF_DESCRIPTION, ModuleObject.GetDescription(), ContainerFile) \ + '\r\n' BinaryAbstractString = FormatUniEntry( '#string ' + DT.TAB_INF_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) if BinaryAbstractString: Content += BinaryAbstractString + '\r\n' BinaryDescriptionString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_DESCRIPTION, BinaryDescription, \ ContainerFile) if BinaryDescriptionString: Content += BinaryDescriptionString + '\r\n' if not os.path.exists(ContainerFile): File = codecs.open(ContainerFile, 'wb', Encoding) File.write(u'\uFEFF' + Content) File.stream.close() Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if (ContainerFile, Md5Sum) not in ModuleObject.FileList: ModuleObject.FileList.append((ContainerFile, Md5Sum)) return ContainerFile
def InstallPackageContent(FromPath, ToPath, Package, ContentZipFile, Dep, WorkspaceDir, ModuleList, ReadOnly=False): if Dep: pass Package.FileList = [] if ToPath.startswith("\\") or ToPath.startswith("/"): ToPath = ToPath[1:] if not IsValidInstallPath(ToPath): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE % ToPath) if FromPath.startswith("\\") or FromPath.startswith("/"): FromPath = FromPath[1:] if not IsValidInstallPath(FromPath): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE % FromPath) PackageFullPath = os.path.normpath(os.path.join(WorkspaceDir, ToPath)) for MiscFile in Package.GetMiscFileList(): for Item in MiscFile.GetFileList(): FileName = Item.GetURI() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE % FileName) FromFile = os.path.join(FromPath, FileName) Executable = Item.GetExecutable() ToFile = (os.path.join(PackageFullPath, ConvertPath(FileName))) Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable) if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) PackageIncludeArchList = [] for Item in Package.GetPackageIncludeFileList(): FileName = Item.GetFilePath() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE % FileName) FromFile = os.path.join(FromPath, FileName) ToFile = os.path.normpath( os.path.join(PackageFullPath, ConvertPath(FileName))) RetFile = ContentZipFile.UnpackFile(FromFile, ToFile) if RetFile == '': # # a non-exist path in Zipfile will return '', which means an include directory in our case # save the information for later DEC creation usage and also create the directory # PackageIncludeArchList.append( [Item.GetFilePath(), Item.GetSupArchList()]) CreateDirectory(ToFile) continue if ReadOnly: chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) else: chmod( ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH) Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) Package.SetIncludeArchList(PackageIncludeArchList) for Item in Package.GetStandardIncludeFileList(): FileName = Item.GetFilePath() if FileName.startswith("\\") or FileName.startswith("/"): FileName = FileName[1:] if not IsValidInstallPath(FileName): Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE % FileName) FromFile = os.path.join(FromPath, FileName) ToFile = os.path.normpath( os.path.join(PackageFullPath, ConvertPath(FileName))) Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly) if (ToFile, Md5Sum) not in Package.FileList: Package.FileList.append((ToFile, Md5Sum)) # # Update package # Package.SetPackagePath(Package.GetPackagePath().replace( FromPath, ToPath, 1)) Package.SetFullPath( os.path.normpath( os.path.join(PackageFullPath, ConvertPath(Package.GetName()) + '.dec'))) # # Install files in module # Module = None ModuleDict = Package.GetModuleDict() for ModuleGuid, ModuleVersion, ModuleName, ModulePath in ModuleDict: Module = ModuleDict[ModuleGuid, ModuleVersion, ModuleName, ModulePath] InstallModuleContent(FromPath, ToPath, ModulePath, Module, ContentZipFile, WorkspaceDir, ModuleList, Package, ReadOnly)
def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList): # # ModulePathList will keep track of the standalone module path that # we just installed. If a new module's path in that list # (only multiple INF in one directory will be so), we will # install them directly. If not, we will try to create a new directory # for it. # ModulePathList = [] # # Check module exist and install # Module = None NewDict = Sdict() for Guid, Version, Name, Path in DistPkg.ModuleSurfaceArea: ModulePath = Path Module = DistPkg.ModuleSurfaceArea[Guid, Version, Name, Path] Logger.Info(ST.MSG_INSTALL_MODULE % Module.GetName()) if Dep.CheckModuleExists(Guid, Version, Name, Path): Logger.Quiet(ST.WRN_MODULE_EXISTED % Path) # # here check for the multiple inf share the same module path cases: # they should be installed into the same directory # ModuleFullPath = \ os.path.normpath(os.path.join(WorkspaceDir, ModulePath)) if ModuleFullPath not in ModulePathList: NewModulePath = InstallNewModule(WorkspaceDir, ModulePath, ModulePathList) NewModuleFullPath = os.path.normpath( os.path.join(WorkspaceDir, NewModulePath)) ModulePathList.append(NewModuleFullPath) else: NewModulePath = ModulePath InstallModuleContent(ModulePath, NewModulePath, '', Module, ContentZipFile, WorkspaceDir, ModuleList, None, DistPkg.Header.ReadOnly) # # Update module # Module.SetModulePath(Module.GetModulePath().replace( Path, NewModulePath, 1)) NewDict[Guid, Version, Name, Module.GetModulePath()] = Module # # generate all inf for modules # for (Module, Package) in ModuleList: CheckCNameInModuleRedefined(Module, DistPkg) FilePath = ModuleToInf(Module, Package, DistPkg.Header) Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read()) Md5Sum = Md5Sigature.hexdigest() if Package: if (FilePath, Md5Sum) not in Package.FileList: Package.FileList.append((FilePath, Md5Sum)) else: if (FilePath, Md5Sum) not in Module.FileList: Module.FileList.append((FilePath, Md5Sum)) # # append the module unicode files to Package FileList # for (FilePath, Md5Sum) in Module.FileList: if str(FilePath).endswith('.uni') and Package and ( FilePath, Md5Sum) not in Package.FileList: Package.FileList.append((FilePath, Md5Sum)) return NewDict
def GenPackageUNIEncodeFile(PackageObject, UniFileHeader='', Encoding=TAB_ENCODING_UTF16LE): GenUNIFlag = False OnlyLANGUAGE_EN_X = True BinaryAbstract = [] BinaryDescription = [] # # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, # then the PACKAGE_UNI_FILE must be created. # for (Key, Value ) in PackageObject.GetAbstract() + PackageObject.GetDescription(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for UserExtension in PackageObject.GetUserExtensionList(): if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \ and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER: for (Key, Value) in UserExtension.GetBinaryAbstract(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryAbstract.append((Key, Value)) for (Key, Value) in UserExtension.GetBinaryDescription(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False BinaryDescription.append((Key, Value)) for Pcd in PackageObject.GetPcdList(): for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList(): if TxtObj.GetLang() == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False for PcdError in Pcd.GetPcdErrorsList(): if PcdError.GetErrorNumber().startswith( '0x') or PcdError.GetErrorNumber().startswith('0X'): for (Key, Value) in PcdError.GetErrorMessageList(): if Key == TAB_LANGUAGE_EN_X: GenUNIFlag = True else: OnlyLANGUAGE_EN_X = False if not GenUNIFlag: return elif OnlyLANGUAGE_EN_X: return else: PackageObject.UNIFlag = True if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())): os.makedirs(os.path.dirname(PackageObject.GetFullPath())) ContainerFile = GetUniFileName( os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName()) Content = UniFileHeader + '\r\n' Content += '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \ + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n' Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n' PromptGenList = [] HelpTextGenList = [] for Pcd in PackageObject.GetPcdList(): # Generate Prompt for each Pcd PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName( ) + '_' + Pcd.GetCName() + '_PROMPT ' TokenValueList = [] for TxtObj in Pcd.GetPromptList(): Lang = TxtObj.GetLang() PromptStr = TxtObj.GetString() # # Avoid generating the same PROMPT entry more than one time. # if (PcdPromptStrName, Lang) not in PromptGenList: TokenValueList.append((Lang, PromptStr)) PromptGenList.append((PcdPromptStrName, Lang)) PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n' if PromptString not in Content: Content += PromptString # Generate Help String for each Pcd PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName( ) + '_' + Pcd.GetCName() + '_HELP ' TokenValueList = [] for TxtObj in Pcd.GetHelpTextList(): Lang = TxtObj.GetLang() HelpStr = TxtObj.GetString() # # Avoid generating the same HELP entry more than one time. # if (PcdHelpStrName, Lang) not in HelpTextGenList: TokenValueList.append((Lang, HelpStr)) HelpTextGenList.append((PcdHelpStrName, Lang)) HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n' if HelpTextString not in Content: Content += HelpTextString # Generate PcdError for each Pcd if ErrorNo exist. for PcdError in Pcd.GetPcdErrorsList(): ErrorNo = PcdError.GetErrorNumber() if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith( TAB_CAPHEX_START): PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \ + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \ + TAB_UNDERLINE_SPLIT + ErrorNo[2:] PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n' if PcdErrString not in Content: Content += PcdErrString File = codecs.open(ContainerFile, 'w', Encoding) File.write(u'\uFEFF' + Content) File.stream.close() Md5Signature = md5(__FileHookOpen__(str(ContainerFile), 'rb').read()) Md5Sum = Md5Signature.hexdigest() if (ContainerFile, Md5Sum) not in PackageObject.FileList: PackageObject.FileList.append((ContainerFile, Md5Sum)) return ContainerFile