## @file # This file is used to define class objects for DEC file. It will consumed by #DecParser # # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent ''' DecObject ''' ## Import modules # import os.path from Library.Misc import Sdict from Library.DataType import TAB_GUIDS from Library.DataType import TAB_PPIS from Library.DataType import TAB_PROTOCOLS from Library.DataType import TAB_DEC_DEFINES from Library.DataType import TAB_INCLUDES from Library.DataType import TAB_LIBRARY_CLASSES from Library.DataType import TAB_USER_EXTENSIONS from Library.DataType import TAB_PCDS from Library.DataType import TAB_ARCH_COMMON ## _DecComments # # Base class for all data objects which have head and tail comments # class _DecComments: ##constructor # def __init__(self): self._HeadComment = [] self._TailComment = [] ## GetComments # def GetComments(self): return self._HeadComment, self._TailComment ## GetHeadComment # def GetHeadComment(self): return self._HeadComment ## SetHeadComment # # @param Comment: comment content # def SetHeadComment(self, Comment): self._HeadComment = Comment ## GetTailComment # def GetTailComment(self): return self._TailComment ## SetTailComment # # @param Comment: comment content # def SetTailComment(self, Comment): self._TailComment = Comment ## _DecBaseObject # # Base class that hold common info # class _DecBaseObject(_DecComments): def __init__(self, PkgFullName): _DecComments.__init__(self) # # Key is combined with (Arch, SectionType) # Default is common # self.ValueDict = Sdict() self._PkgFullName = PkgFullName self._PackagePath, self._FileName = os.path.split(PkgFullName) self._SecName = '' ## GetSectionName # def GetSectionName(self): return self._SecName ## GetPackagePath # def GetPackagePath(self): return self._PackagePath ## GetPackageFile # def GetPackageFile(self): return self._FileName ## GetPackageFullName # def GetPackageFullName(self): return self._PkgFullName ## AddItem # Add sub-item to current object, sub-class should override it if needed # # @param Item: Sub-item to be added # @param Scope: A list store section name and arch info # def AddItem(self, Item, Scope): if not Scope: return if not Item: return ArchModule = [] for Ele in Scope: if Ele[1] in self.ValueDict: self.ValueDict[Ele[1]].append(Item) else: self.ValueDict[Ele[1]] = [Item] ArchModule.append(Ele[1]) Item.ArchAndModuleType = ArchModule ## _GetItemByArch # Helper class used by sub-class # @param Arch: arch # def _GetItemByArch(self, Arch): Arch = Arch.upper() if Arch not in self.ValueDict: return [] return self.ValueDict[Arch] ## _GetAllItems # Get all items, union all arches, items in returned list are unique # def _GetAllItems(self): Retlst = [] for Arch in self.ValueDict: for Item in self.ValueDict[Arch]: if Item not in Retlst: Retlst.append(Item) return Retlst ## _DecItemBaseObject # # Module type and arch the item belongs to # class _DecItemBaseObject(_DecComments): def __init__(self): _DecComments.__init__(self) # # Item's arch, if PCD, also include PCD type # self.ArchAndModuleType = [] ## GetArchList # def GetArchList(self): ArchSet = set() for Arch in self.ArchAndModuleType: ArchSet.add(Arch) return list(ArchSet) ## DecDefineObject # # Class to hold define section information # class DecDefineObject(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) self._SecName = TAB_DEC_DEFINES.upper() self._DecSpec = '' self._PkgName = '' self._PkgGuid = '' self._PkgVersion = '' self._PkgUniFile = '' ## GetPackageSpecification # def GetPackageSpecification(self): return self._DecSpec def SetPackageSpecification(self, DecSpec): self._DecSpec = DecSpec ## GetPackageName # def GetPackageName(self): return self._PkgName def SetPackageName(self, PkgName): self._PkgName = PkgName ## GetPackageGuid # def GetPackageGuid(self): return self._PkgGuid def SetPackageGuid(self, PkgGuid): self._PkgGuid = PkgGuid ## GetPackageVersion # def GetPackageVersion(self): return self._PkgVersion def SetPackageVersion(self, PkgVersion): self._PkgVersion = PkgVersion ## GetPackageUniFile # def GetPackageUniFile(self): return self._PkgUniFile def SetPackageUniFile(self, PkgUniFile): self._PkgUniFile = PkgUniFile ## GetDefines # def GetDefines(self): return self._GetItemByArch(TAB_ARCH_COMMON) ## GetAllDefines # def GetAllDefines(self): return self._GetAllItems() ## DecDefineItemObject # # Each item of define section # class DecDefineItemObject(_DecItemBaseObject): def __init__(self): _DecItemBaseObject.__init__(self) self.Key = '' self.Value = '' ## __hash__ # def __hash__(self): return hash(self.Key + self.Value) ## __eq__ # def __eq__(self, Other): return id(self) == id(Other) ## __str__ # def __str__(self): return str(self.ArchAndModuleType) + '\n' + self.Key + \ ' = ' + self.Value ## DecIncludeObject # # Class to hold include section info # class DecIncludeObject(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) self._SecName = TAB_INCLUDES.upper() ## GetIncludes # def GetIncludes(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetAllIncludes # def GetAllIncludes(self): return self._GetAllItems() ## DecIncludeItemObject # # Item of include section # class DecIncludeItemObject(_DecItemBaseObject): def __init__(self, File, Root): self.File = File self.Root = Root _DecItemBaseObject.__init__(self) ## __hash__ # def __hash__(self): return hash(self.File) ## __eq__ # def __eq__(self, Other): return id(self) == id(Other) ## __str__ # def __str__(self): return self.File ## DecLibraryclassObject # # Class to hold library class section info # class DecLibraryclassObject(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) self._PackagePath, self._FileName = os.path.split(PkgFullName) self._SecName = TAB_LIBRARY_CLASSES.upper() ## GetLibraryclasses # def GetLibraryclasses(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetAllLibraryclasses # def GetAllLibraryclasses(self): return self._GetAllItems() ## DecLibraryclassItemObject # Item of library class section # class DecLibraryclassItemObject(_DecItemBaseObject): def __init__(self, Libraryclass, File, Root): _DecItemBaseObject.__init__(self) self.File = File self.Root = Root self.Libraryclass = Libraryclass ## __hash__ # def __hash__(self): return hash(self.Libraryclass + self.File) ## __eq__ # def __eq__(self, Other): return id(self) == id(Other) ## __str__ # def __str__(self): return self.Libraryclass + '|' + self.File ## DecPcdObject # Class to hold PCD section # class DecPcdObject(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) self._SecName = TAB_PCDS.upper() ## AddItem # # Diff from base class # # @param Item: Item # @param Scope: Scope # def AddItem(self, Item, Scope): if not Scope: return if not Item: return ArchModule = [] for Type, Arch in Scope: if (Type, Arch) in self.ValueDict: self.ValueDict[Type, Arch].append(Item) else: self.ValueDict[Type, Arch] = [Item] ArchModule.append([Type, Arch]) Item.ArchAndModuleType = ArchModule ## GetPcds # # @param PcdType: PcdType # @param Arch: Arch # def GetPcds(self, PcdType, Arch=TAB_ARCH_COMMON): PcdType = PcdType.upper() Arch = Arch.upper() if (PcdType, Arch) not in self.ValueDict: return [] return self.ValueDict[PcdType, Arch] ## GetPcdsByType # # @param PcdType: PcdType # def GetPcdsByType(self, PcdType): PcdType = PcdType.upper() Retlst = [] for TypeInDict, Arch in self.ValueDict: if TypeInDict != PcdType: continue for Item in self.ValueDict[PcdType, Arch]: if Item not in Retlst: Retlst.append(Item) return Retlst ## DecPcdItemObject # # Item of PCD section # # @param _DecItemBaseObject: _DecItemBaseObject object # class DecPcdItemObject(_DecItemBaseObject): def __init__(self, Guid, Name, Value, DatumType, Token, MaxDatumSize=''): _DecItemBaseObject.__init__(self) self.TokenCName = Name self.TokenSpaceGuidCName = Guid self.DatumType = DatumType self.DefaultValue = Value self.TokenValue = Token self.MaxDatumSize = MaxDatumSize ## __hash__ # def __hash__(self): return hash(self.TokenSpaceGuidCName + self.TokenCName) ## __eq__ # def __eq__(self, Other): return id(self) == id(Other) ## GetArchListOfType # # @param PcdType: PcdType # def GetArchListOfType(self, PcdType): ItemSet = set() PcdType = PcdType.upper() for Type, Arch in self.ArchAndModuleType: if Type != PcdType: continue ItemSet.add(Arch) return list(ItemSet) ## DecGuidObjectBase # # Base class for PPI, Protocol, and GUID. # Hold same data but has different method for clarification in sub-class # # @param _DecBaseObject: Dec Base Object # class DecGuidObjectBase(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) ## GetGuidStyleItems # # @param Arch: Arch # def GetGuidStyleItems(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetGuidStyleAllItems # def GetGuidStyleAllItems(self): return self._GetAllItems() ## DecGuidItemObject # # Item of GUID, PPI and Protocol section # # @param _DecItemBaseObject: Dec Item Base Object # class DecGuidItemObject(_DecItemBaseObject): def __init__(self, CName, GuidCValue, GuidString): _DecItemBaseObject.__init__(self) self.GuidCName = CName self.GuidCValue = GuidCValue self.GuidString = GuidString ## __hash__ # def __hash__(self): return hash(self.GuidCName) ## __eq__ # def __eq__(self, Other): return id(self) == id(Other) ## __str__ # def __str__(self): return self.GuidCName + ' = ' + self.GuidCValue ## DecGuidObject # # Class for GUID section # # @param DecGuidObjectBase: Dec Guid Object Base # class DecGuidObject(DecGuidObjectBase): def __init__(self, PkgFullName): DecGuidObjectBase.__init__(self, PkgFullName) self._SecName = TAB_GUIDS.upper() ## GetGuids # # @param Arch: Arch # def GetGuids(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetAllGuids # def GetAllGuids(self): return self._GetAllItems() ## DecPpiObject # # Class for PPI section # # @param DecGuidObjectBase: Dec Guid Object Base # class DecPpiObject(DecGuidObjectBase): def __init__(self, PkgFullName): DecGuidObjectBase.__init__(self, PkgFullName) self._SecName = TAB_PPIS.upper() ## GetPpis # # @param Arch: Arch # def GetPpis(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetAllPpis # def GetAllPpis(self): return self._GetAllItems() ## DecProtocolObject # # Class for protocol section # # @param DecGuidObjectBase: Dec Guid Object Base # class DecProtocolObject(DecGuidObjectBase): def __init__(self, PkgFullName): DecGuidObjectBase.__init__(self, PkgFullName) self._SecName = TAB_PROTOCOLS.upper() ## GetProtocols # # @param Arch: Arch # def GetProtocols(self, Arch=TAB_ARCH_COMMON): return self._GetItemByArch(Arch) ## GetAllProtocols # def GetAllProtocols(self): return self._GetAllItems() ## DecUserExtensionObject # # Class for user extension section # # @param _DecBaseObject: Dec Guid Object Base # class DecUserExtensionObject(_DecBaseObject): def __init__(self, PkgFullName): _DecBaseObject.__init__(self, PkgFullName) self._SecName = TAB_USER_EXTENSIONS.upper() self.ItemList = [] ## GetProtocols # # @param Item: Item # @param Scope: Scope # def AddItem(self, Item, Scope): if not Scope: pass if not Item: return self.ItemList.append(Item) ## GetAllUserExtensions # def GetAllUserExtensions(self): return self.ItemList ## DecUserExtensionItemObject # Item for user extension section # # @param _DecItemBaseObject: Dec Item Base Object # class DecUserExtensionItemObject(_DecItemBaseObject): def __init__(self): _DecItemBaseObject.__init__(self) self.UserString = '' self.UserId = '' self.IdString = ''