mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-02 13:03:28 +01:00
02287fbb4b
Signed-off-by: SergeySlice <sergey.slice@gmail.com>
606 lines
14 KiB
Python
606 lines
14 KiB
Python
## @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.<BR>
|
|
#
|
|
# 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 = ''
|
|
|
|
|
|
|
|
|