diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py')
-rwxr-xr-x | src/VBox/Devices/EFI/Firmware/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py new file mode 100755 index 00000000..cff2f127 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py @@ -0,0 +1,313 @@ +## @file +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +from plugins.EdkPlugins.basemodel import ini +import re, os +from plugins.EdkPlugins.basemodel.message import * + +class DECFile(ini.BaseINIFile): + + def GetSectionInstance(self, parent, name, isCombined=False): + return DECSection(parent, name, isCombined) + + def GetComponents(self): + return self.GetSectionByName('Components') + + def GetPackageRootPath(self): + return os.path.dirname(self.GetFilename()).strip() + + def GetBaseName(self): + return self.GetDefine("PACKAGE_NAME").strip() + + def GetVersion(self): + return self.GetDefine("PACKAGE_VERSION").strip() + + def GetSectionObjectsByName(self, name, arch=None): + arr = [] + sects = self.GetSectionByName(name) + for sect in sects: + # skip unmatched archtecture content + if not sect.IsArchMatch(arch): + continue + + for obj in sect.GetObjects(): + arr.append(obj) + + return arr + +class DECSection(ini.BaseINISection): + def GetSectionINIObject(self, parent): + type = self.GetType() + + if type.lower().find('defines') != -1: + return DECDefineSectionObject(self) + if type.lower().find('includes') != -1: + return DECIncludeObject(self) + if type.lower().find('pcd') != -1: + return DECPcdObject(self) + if type.lower() == 'libraryclasses': + return DECLibraryClassObject(self) + if type.lower() == 'guids': + return DECGuidObject(self) + if type.lower() == 'ppis': + return DECPpiObject(self) + if type.lower() == 'protocols': + return DECProtocolObject(self) + + return DECSectionObject(self) + + def GetType(self): + arr = self._name.split('.') + return arr[0].strip() + + def GetArch(self): + arr = self._name.split('.') + if len(arr) == 1: + return 'common' + return arr[1] + + def IsArchMatch(self, arch): + if arch is None or self.GetArch() == 'common': + return True + + if self.GetArch().lower() != arch.lower(): + return False + + return True + +class DECSectionObject(ini.BaseINISectionObject): + def GetArch(self): + return self.GetParent().GetArch() + +class DECDefineSectionObject(DECSectionObject): + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self._key = None + self._value = None + + def Parse(self): + assert (self._start == self._end), 'The object in define section must be in single line' + + line = self.GetLineByOffset(self._start).strip() + + line = line.split('#')[0] + arr = line.split('=') + if len(arr) != 2: + ErrorMsg('Invalid define section object', + self.GetFilename(), + self.GetParent().GetName() + ) + return False + + self._key = arr[0].strip() + self._value = arr[1].strip() + + return True + + def GetKey(self): + return self._key + + def GetValue(self): + return self._value + +class DECGuidObject(DECSectionObject): + _objs = {} + + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self._name = None + + def Parse(self): + line = self.GetLineByOffset(self._start).strip().split('#')[0] + self._name = line.split('=')[0].strip() + self._guid = line.split('=')[1].strip() + objdict = DECGuidObject._objs + if self._name not in objdict.keys(): + objdict[self._name] = [self] + else: + objdict[self._name].append(self) + + return True + + def GetName(self): + return self._name + + def GetGuid(self): + return self._guid + + def Destroy(self): + objdict = DECGuidObject._objs + objdict[self._name].remove(self) + if len(objdict[self._name]) == 0: + del objdict[self._name] + + @staticmethod + def GetObjectDict(): + return DECGuidObject._objs + +class DECPpiObject(DECSectionObject): + _objs = {} + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self._name = None + + def Parse(self): + line = self.GetLineByOffset(self._start).strip().split('#')[0] + self._name = line.split('=')[0].strip() + self._guid = line.split('=')[1].strip() + objdict = DECPpiObject._objs + if self._name not in objdict.keys(): + objdict[self._name] = [self] + else: + objdict[self._name].append(self) + + return True + + def GetName(self): + return self._name + + def GetGuid(self): + return self._guid + + def Destroy(self): + objdict = DECPpiObject._objs + objdict[self._name].remove(self) + if len(objdict[self._name]) == 0: + del objdict[self._name] + + @staticmethod + def GetObjectDict(): + return DECPpiObject._objs + +class DECProtocolObject(DECSectionObject): + _objs = {} + + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self._name = None + + def Parse(self): + line = self.GetLineByOffset(self._start).strip().split('#')[0] + self._name = line.split('=')[0].strip() + self._guid = line.split('=')[1].strip() + objdict = DECProtocolObject._objs + if self._name not in objdict.keys(): + objdict[self._name] = [self] + else: + objdict[self._name].append(self) + + return True + + def GetName(self): + return self._name + + def GetGuid(self): + return self._guid + + def Destroy(self): + objdict = DECProtocolObject._objs + objdict[self._name].remove(self) + if len(objdict[self._name]) == 0: + del objdict[self._name] + + + @staticmethod + def GetObjectDict(): + return DECProtocolObject._objs + +class DECLibraryClassObject(DECSectionObject): + _objs = {} + + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self.mClassName = None + self.mHeaderFile = None + + def Parse(self): + line = self.GetLineByOffset(self._start).strip().split('#')[0] + self.mClassName, self.mHeaderFile = line.split('|') + objdict = DECLibraryClassObject._objs + if self.mClassName not in objdict.keys(): + objdict[self.mClassName] = [self] + else: + objdict[self.mClassName].append(self) + return True + + def GetClassName(self): + return self.mClassName + + def GetName(self): + return self.mClassName + + def GetHeaderFile(self): + return self.mHeaderFile + + def Destroy(self): + objdict = DECLibraryClassObject._objs + objdict[self.mClassName].remove(self) + if len(objdict[self.mClassName]) == 0: + del objdict[self.mClassName] + + @staticmethod + def GetObjectDict(): + return DECLibraryClassObject._objs + +class DECIncludeObject(DECSectionObject): + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + + def GetPath(self): + return self.GetLineByOffset(self._start).split('#')[0].strip() + +class DECPcdObject(DECSectionObject): + _objs = {} + + def __init__(self, parent): + DECSectionObject.__init__(self, parent) + self.mPcdName = None + self.mPcdDefaultValue = None + self.mPcdDataType = None + self.mPcdToken = None + + def Parse(self): + line = self.GetLineByOffset(self._start).strip().split('#')[0] + (self.mPcdName, self.mPcdDefaultValue, self.mPcdDataType, self.mPcdToken) = line.split('|') + objdict = DECPcdObject._objs + if self.mPcdName not in objdict.keys(): + objdict[self.mPcdName] = [self] + else: + objdict[self.mPcdName].append(self) + + return True + + def Destroy(self): + objdict = DECPcdObject._objs + objdict[self.mPcdName].remove(self) + if len(objdict[self.mPcdName]) == 0: + del objdict[self.mPcdName] + + def GetPcdType(self): + return self.GetParent().GetType() + + def GetPcdName(self): + return self.mPcdName + + def GetPcdValue(self): + return self.mPcdDefaultValue + + def GetPcdDataType(self): + return self.mPcdDataType + + def GetPcdToken(self): + return self.mPcdToken + + def GetName(self): + return self.GetPcdName().split('.')[1] + + @staticmethod + def GetObjectDict(): + return DECPcdObject._objs |