mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 03:03:46 +01:00 
			
		
		
		
	BaseTool Branch: https://edk2-buildtools.svn.sourceforge.net/svnroot/edk2-buildtools/branches/Releases/BaseTools_r2100 Signed-off-by: lgao4 Reviewed-by: hchen30 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12214 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			612 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			612 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # This file is used to define class objects for DEC file. It will consumed by 
 | |
| #DecParser
 | |
| #
 | |
| # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| # This program and the accompanying materials are licensed and made available 
 | |
| # under the terms and conditions of the BSD License which accompanies this 
 | |
| # distribution. The full text of the license may be found at 
 | |
| # http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| '''
 | |
| 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 infomation
 | |
| #
 | |
| 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 seciont
 | |
| #
 | |
| # @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 = ''
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |