https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			314 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @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
 |