]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py
BaseTools/Scripts: Porting PackageDocumentTools code to use Python3
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / edk2 / model / dec.py
CommitLineData
7ccc9c95
YZ
1## @file\r
2#\r
3# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4#\r
5# This program and the accompanying materials are licensed and made available\r
6# under the terms and conditions of the BSD License which accompanies this\r
7# distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
7cc7e054 14from ...basemodel import ini\r
7ccc9c95 15import re, os\r
7cc7e054 16from ...basemodel.message import *\r
7ccc9c95
YZ
17\r
18class DECFile(ini.BaseINIFile):\r
19\r
20 def GetSectionInstance(self, parent, name, isCombined=False):\r
21 return DECSection(parent, name, isCombined)\r
22\r
23 def GetComponents(self):\r
24 return self.GetSectionByName('Components')\r
25\r
26 def GetPackageRootPath(self):\r
27 return os.path.dirname(self.GetFilename()).strip()\r
28\r
29 def GetBaseName(self):\r
30 return self.GetDefine("PACKAGE_NAME").strip()\r
31\r
32 def GetVersion(self):\r
33 return self.GetDefine("PACKAGE_VERSION").strip()\r
34\r
35 def GetSectionObjectsByName(self, name, arch=None):\r
36 arr = []\r
37 sects = self.GetSectionByName(name)\r
38 for sect in sects:\r
39 # skip unmatched archtecture content\r
40 if not sect.IsArchMatch(arch):\r
41 continue\r
42\r
43 for obj in sect.GetObjects():\r
44 arr.append(obj)\r
45\r
46 return arr\r
47\r
48class DECSection(ini.BaseINISection):\r
49 def GetSectionINIObject(self, parent):\r
50 type = self.GetType()\r
51\r
52 if type.lower().find('defines') != -1:\r
53 return DECDefineSectionObject(self)\r
54 if type.lower().find('includes') != -1:\r
55 return DECIncludeObject(self)\r
56 if type.lower().find('pcd') != -1:\r
57 return DECPcdObject(self)\r
58 if type.lower() == 'libraryclasses':\r
59 return DECLibraryClassObject(self)\r
60 if type.lower() == 'guids':\r
61 return DECGuidObject(self)\r
62 if type.lower() == 'ppis':\r
63 return DECPpiObject(self)\r
64 if type.lower() == 'protocols':\r
65 return DECProtocolObject(self)\r
66\r
67 return DECSectionObject(self)\r
68\r
69 def GetType(self):\r
70 arr = self._name.split('.')\r
71 return arr[0].strip()\r
72\r
73 def GetArch(self):\r
74 arr = self._name.split('.')\r
75 if len(arr) == 1:\r
76 return 'common'\r
77 return arr[1]\r
78\r
79 def IsArchMatch(self, arch):\r
4231a819 80 if arch is None or self.GetArch() == 'common':\r
7ccc9c95
YZ
81 return True\r
82\r
83 if self.GetArch().lower() != arch.lower():\r
84 return False\r
85\r
86 return True\r
87\r
88class DECSectionObject(ini.BaseINISectionObject):\r
89 def GetArch(self):\r
90 return self.GetParent().GetArch()\r
91\r
92class DECDefineSectionObject(DECSectionObject):\r
93 def __init__(self, parent):\r
94 DECSectionObject.__init__(self, parent)\r
95 self._key = None\r
96 self._value = None\r
97\r
98 def Parse(self):\r
99 assert (self._start == self._end), 'The object in define section must be in single line'\r
100\r
101 line = self.GetLineByOffset(self._start).strip()\r
102\r
103 line = line.split('#')[0]\r
104 arr = line.split('=')\r
105 if len(arr) != 2:\r
106 ErrorMsg('Invalid define section object',\r
107 self.GetFilename(),\r
108 self.GetParent().GetName()\r
109 )\r
110 return False\r
111\r
112 self._key = arr[0].strip()\r
113 self._value = arr[1].strip()\r
114\r
115 return True\r
116\r
117 def GetKey(self):\r
118 return self._key\r
119\r
120 def GetValue(self):\r
121 return self._value\r
122\r
123class DECGuidObject(DECSectionObject):\r
124 _objs = {}\r
125\r
126 def __init__(self, parent):\r
127 DECSectionObject.__init__(self, parent)\r
128 self._name = None\r
129\r
130 def Parse(self):\r
131 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
132 self._name = line.split('=')[0].strip()\r
133 self._guid = line.split('=')[1].strip()\r
134 objdict = DECGuidObject._objs\r
135 if self._name not in objdict.keys():\r
136 objdict[self._name] = [self]\r
137 else:\r
138 objdict[self._name].append(self)\r
139\r
140 return True\r
141\r
142 def GetName(self):\r
143 return self._name\r
144\r
145 def GetGuid(self):\r
146 return self._guid\r
147\r
148 def Destroy(self):\r
149 objdict = DECGuidObject._objs\r
150 objdict[self._name].remove(self)\r
151 if len(objdict[self._name]) == 0:\r
152 del objdict[self._name]\r
153\r
154 @staticmethod\r
155 def GetObjectDict():\r
156 return DECGuidObject._objs\r
157\r
158class DECPpiObject(DECSectionObject):\r
159 _objs = {}\r
160 def __init__(self, parent):\r
161 DECSectionObject.__init__(self, parent)\r
162 self._name = None\r
163\r
164 def Parse(self):\r
165 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
166 self._name = line.split('=')[0].strip()\r
167 self._guid = line.split('=')[1].strip()\r
168 objdict = DECPpiObject._objs\r
169 if self._name not in objdict.keys():\r
170 objdict[self._name] = [self]\r
171 else:\r
172 objdict[self._name].append(self)\r
173\r
174 return True\r
175\r
176 def GetName(self):\r
177 return self._name\r
178\r
179 def GetGuid(self):\r
180 return self._guid\r
181\r
182 def Destroy(self):\r
183 objdict = DECPpiObject._objs\r
184 objdict[self._name].remove(self)\r
185 if len(objdict[self._name]) == 0:\r
186 del objdict[self._name]\r
187\r
188 @staticmethod\r
189 def GetObjectDict():\r
190 return DECPpiObject._objs\r
191\r
192class DECProtocolObject(DECSectionObject):\r
193 _objs = {}\r
194\r
195 def __init__(self, parent):\r
196 DECSectionObject.__init__(self, parent)\r
197 self._name = None\r
198\r
199 def Parse(self):\r
200 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
201 self._name = line.split('=')[0].strip()\r
202 self._guid = line.split('=')[1].strip()\r
203 objdict = DECProtocolObject._objs\r
204 if self._name not in objdict.keys():\r
205 objdict[self._name] = [self]\r
206 else:\r
207 objdict[self._name].append(self)\r
208\r
209 return True\r
210\r
211 def GetName(self):\r
212 return self._name\r
213\r
214 def GetGuid(self):\r
215 return self._guid\r
216\r
217 def Destroy(self):\r
218 objdict = DECProtocolObject._objs\r
219 objdict[self._name].remove(self)\r
220 if len(objdict[self._name]) == 0:\r
221 del objdict[self._name]\r
222\r
223\r
224 @staticmethod\r
225 def GetObjectDict():\r
226 return DECProtocolObject._objs\r
227\r
228class DECLibraryClassObject(DECSectionObject):\r
229 _objs = {}\r
230\r
231 def __init__(self, parent):\r
232 DECSectionObject.__init__(self, parent)\r
233 self.mClassName = None\r
234 self.mHeaderFile = None\r
235\r
236 def Parse(self):\r
237 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
238 self.mClassName, self.mHeaderFile = line.split('|')\r
239 objdict = DECLibraryClassObject._objs\r
240 if self.mClassName not in objdict.keys():\r
241 objdict[self.mClassName] = [self]\r
242 else:\r
243 objdict[self.mClassName].append(self)\r
244 return True\r
245\r
246 def GetClassName(self):\r
247 return self.mClassName\r
248\r
249 def GetName(self):\r
250 return self.mClassName\r
251\r
252 def GetHeaderFile(self):\r
253 return self.mHeaderFile\r
254\r
255 def Destroy(self):\r
256 objdict = DECLibraryClassObject._objs\r
257 objdict[self.mClassName].remove(self)\r
258 if len(objdict[self.mClassName]) == 0:\r
259 del objdict[self.mClassName]\r
260\r
261 @staticmethod\r
262 def GetObjectDict():\r
263 return DECLibraryClassObject._objs\r
264\r
265class DECIncludeObject(DECSectionObject):\r
266 def __init__(self, parent):\r
267 DECSectionObject.__init__(self, parent)\r
268\r
269 def GetPath(self):\r
270 return self.GetLineByOffset(self._start).split('#')[0].strip()\r
271\r
272class DECPcdObject(DECSectionObject):\r
273 _objs = {}\r
274\r
275 def __init__(self, parent):\r
276 DECSectionObject.__init__(self, parent)\r
277 self.mPcdName = None\r
278 self.mPcdDefaultValue = None\r
279 self.mPcdDataType = None\r
280 self.mPcdToken = None\r
281\r
282 def Parse(self):\r
283 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
284 (self.mPcdName, self.mPcdDefaultValue, self.mPcdDataType, self.mPcdToken) = line.split('|')\r
285 objdict = DECPcdObject._objs\r
286 if self.mPcdName not in objdict.keys():\r
287 objdict[self.mPcdName] = [self]\r
288 else:\r
289 objdict[self.mPcdName].append(self)\r
290\r
291 return True\r
292\r
293 def Destroy(self):\r
294 objdict = DECPcdObject._objs\r
295 objdict[self.mPcdName].remove(self)\r
296 if len(objdict[self.mPcdName]) == 0:\r
297 del objdict[self.mPcdName]\r
298\r
299 def GetPcdType(self):\r
300 return self.GetParent().GetType()\r
301\r
302 def GetPcdName(self):\r
303 return self.mPcdName\r
304\r
305 def GetPcdValue(self):\r
306 return self.mPcdDefaultValue\r
307\r
308 def GetPcdDataType(self):\r
309 return self.mPcdDataType\r
310\r
311 def GetPcdToken(self):\r
312 return self.mPcdToken\r
313\r
314 def GetName(self):\r
315 return self.GetPcdName().split('.')[1]\r
316\r
317 @staticmethod\r
318 def GetObjectDict():\r
319 return DECPcdObject._objs\r