]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / DecObject.py
CommitLineData
4234283c 1## @file\r
f7496d71 2# This file is used to define class objects for DEC file. It will consumed by\r
4234283c
LG
3#DecParser\r
4#\r
f7496d71 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
8\r
9'''\r
10DecObject\r
11'''\r
12\r
13## Import modules\r
14#\r
15import os.path\r
16\r
17from Library.Misc import Sdict\r
18from Library.DataType import TAB_GUIDS\r
19from Library.DataType import TAB_PPIS\r
20from Library.DataType import TAB_PROTOCOLS\r
21from Library.DataType import TAB_DEC_DEFINES\r
22from Library.DataType import TAB_INCLUDES\r
23from Library.DataType import TAB_LIBRARY_CLASSES\r
24from Library.DataType import TAB_USER_EXTENSIONS\r
25from Library.DataType import TAB_PCDS\r
26from Library.DataType import TAB_ARCH_COMMON\r
27\r
28## _DecComments\r
29#\r
30# Base class for all data objects which have head and tail comments\r
31#\r
32class _DecComments:\r
33\r
34 ##constructor\r
35 #\r
36 def __init__(self):\r
37 self._HeadComment = []\r
38 self._TailComment = []\r
39\r
40 ## GetComments\r
41 #\r
42 def GetComments(self):\r
43 return self._HeadComment, self._TailComment\r
44\r
45 ## GetHeadComment\r
f7496d71 46 #\r
4234283c
LG
47 def GetHeadComment(self):\r
48 return self._HeadComment\r
49\r
50 ## SetHeadComment\r
51 #\r
52 # @param Comment: comment content\r
53 #\r
54 def SetHeadComment(self, Comment):\r
55 self._HeadComment = Comment\r
56\r
57 ## GetTailComment\r
f7496d71 58 #\r
4234283c
LG
59 def GetTailComment(self):\r
60 return self._TailComment\r
61\r
62 ## SetTailComment\r
63 #\r
64 # @param Comment: comment content\r
65 #\r
66 def SetTailComment(self, Comment):\r
67 self._TailComment = Comment\r
68\r
69## _DecBaseObject\r
70#\r
71# Base class that hold common info\r
72#\r
73class _DecBaseObject(_DecComments):\r
74 def __init__(self, PkgFullName):\r
75 _DecComments.__init__(self)\r
76 #\r
77 # Key is combined with (Arch, SectionType)\r
78 # Default is common\r
79 #\r
80 self.ValueDict = Sdict()\r
81 self._PkgFullName = PkgFullName\r
82 self._PackagePath, self._FileName = os.path.split(PkgFullName)\r
83 self._SecName = ''\r
84\r
85 ## GetSectionName\r
f7496d71 86 #\r
4234283c
LG
87 def GetSectionName(self):\r
88 return self._SecName\r
89\r
90 ## GetPackagePath\r
f7496d71 91 #\r
4234283c
LG
92 def GetPackagePath(self):\r
93 return self._PackagePath\r
94\r
95 ## GetPackageFile\r
f7496d71 96 #\r
4234283c
LG
97 def GetPackageFile(self):\r
98 return self._FileName\r
99\r
100 ## GetPackageFullName\r
f7496d71 101 #\r
4234283c
LG
102 def GetPackageFullName(self):\r
103 return self._PkgFullName\r
104\r
105 ## AddItem\r
106 # Add sub-item to current object, sub-class should override it if needed\r
107 #\r
108 # @param Item: Sub-item to be added\r
109 # @param Scope: A list store section name and arch info\r
110 #\r
111 def AddItem(self, Item, Scope):\r
112 if not Scope:\r
113 return\r
114 if not Item:\r
115 return\r
116 ArchModule = []\r
117 for Ele in Scope:\r
118 if Ele[1] in self.ValueDict:\r
119 self.ValueDict[Ele[1]].append(Item)\r
120 else:\r
121 self.ValueDict[Ele[1]] = [Item]\r
122 ArchModule.append(Ele[1])\r
123 Item.ArchAndModuleType = ArchModule\r
124\r
125 ## _GetItemByArch\r
126 # Helper class used by sub-class\r
127 # @param Arch: arch\r
128 #\r
129 def _GetItemByArch(self, Arch):\r
130 Arch = Arch.upper()\r
131 if Arch not in self.ValueDict:\r
132 return []\r
133 return self.ValueDict[Arch]\r
134\r
135 ## _GetAllItems\r
136 # Get all items, union all arches, items in returned list are unique\r
137 #\r
138 def _GetAllItems(self):\r
139 Retlst = []\r
140 for Arch in self.ValueDict:\r
141 for Item in self.ValueDict[Arch]:\r
142 if Item not in Retlst:\r
143 Retlst.append(Item)\r
144 return Retlst\r
145\r
146## _DecItemBaseObject\r
147#\r
f7496d71 148# Module type and arch the item belongs to\r
4234283c
LG
149#\r
150class _DecItemBaseObject(_DecComments):\r
151 def __init__(self):\r
152 _DecComments.__init__(self)\r
153 #\r
154 # Item's arch, if PCD, also include PCD type\r
155 #\r
156 self.ArchAndModuleType = []\r
157\r
158 ## GetArchList\r
f7496d71 159 #\r
4234283c
LG
160 def GetArchList(self):\r
161 ArchSet = set()\r
162 for Arch in self.ArchAndModuleType:\r
163 ArchSet.add(Arch)\r
164 return list(ArchSet)\r
165\r
166## DecDefineObject\r
167#\r
fb0b35e0 168# Class to hold define section information\r
4234283c
LG
169#\r
170class DecDefineObject(_DecBaseObject):\r
171 def __init__(self, PkgFullName):\r
172 _DecBaseObject.__init__(self, PkgFullName)\r
173 self._SecName = TAB_DEC_DEFINES.upper()\r
174 self._DecSpec = ''\r
175 self._PkgName = ''\r
176 self._PkgGuid = ''\r
177 self._PkgVersion = ''\r
178 self._PkgUniFile = ''\r
179\r
180 ## GetPackageSpecification\r
f7496d71 181 #\r
4234283c
LG
182 def GetPackageSpecification(self):\r
183 return self._DecSpec\r
184\r
185 def SetPackageSpecification(self, DecSpec):\r
186 self._DecSpec = DecSpec\r
187\r
188 ## GetPackageName\r
f7496d71 189 #\r
4234283c
LG
190 def GetPackageName(self):\r
191 return self._PkgName\r
192\r
193 def SetPackageName(self, PkgName):\r
194 self._PkgName = PkgName\r
195\r
196 ## GetPackageGuid\r
f7496d71 197 #\r
4234283c
LG
198 def GetPackageGuid(self):\r
199 return self._PkgGuid\r
200\r
201 def SetPackageGuid(self, PkgGuid):\r
202 self._PkgGuid = PkgGuid\r
203\r
204 ## GetPackageVersion\r
f7496d71 205 #\r
4234283c
LG
206 def GetPackageVersion(self):\r
207 return self._PkgVersion\r
208\r
209 def SetPackageVersion(self, PkgVersion):\r
210 self._PkgVersion = PkgVersion\r
211\r
212 ## GetPackageUniFile\r
f7496d71 213 #\r
4234283c
LG
214 def GetPackageUniFile(self):\r
215 return self._PkgUniFile\r
216\r
217 def SetPackageUniFile(self, PkgUniFile):\r
218 self._PkgUniFile = PkgUniFile\r
219\r
220 ## GetDefines\r
f7496d71 221 #\r
4234283c
LG
222 def GetDefines(self):\r
223 return self._GetItemByArch(TAB_ARCH_COMMON)\r
224\r
225 ## GetAllDefines\r
f7496d71 226 #\r
4234283c
LG
227 def GetAllDefines(self):\r
228 return self._GetAllItems()\r
229\r
230## DecDefineItemObject\r
231#\r
232# Each item of define section\r
233#\r
234class DecDefineItemObject(_DecItemBaseObject):\r
235 def __init__(self):\r
236 _DecItemBaseObject.__init__(self)\r
237 self.Key = ''\r
238 self.Value = ''\r
239\r
240 ## __hash__\r
f7496d71 241 #\r
4234283c
LG
242 def __hash__(self):\r
243 return hash(self.Key + self.Value)\r
244\r
245 ## __eq__\r
246 #\r
247 def __eq__(self, Other):\r
248 return id(self) == id(Other)\r
249\r
250 ## __str__\r
f7496d71 251 #\r
4234283c
LG
252 def __str__(self):\r
253 return str(self.ArchAndModuleType) + '\n' + self.Key + \\r
254 ' = ' + self.Value\r
255\r
256## DecIncludeObject\r
257#\r
258# Class to hold include section info\r
259#\r
260class DecIncludeObject(_DecBaseObject):\r
261 def __init__(self, PkgFullName):\r
262 _DecBaseObject.__init__(self, PkgFullName)\r
263 self._SecName = TAB_INCLUDES.upper()\r
264\r
265 ## GetIncludes\r
f7496d71 266 #\r
4234283c
LG
267 def GetIncludes(self, Arch=TAB_ARCH_COMMON):\r
268 return self._GetItemByArch(Arch)\r
269\r
270 ## GetAllIncludes\r
f7496d71 271 #\r
4234283c
LG
272 def GetAllIncludes(self):\r
273 return self._GetAllItems()\r
274\r
275## DecIncludeItemObject\r
276#\r
277# Item of include section\r
278#\r
279class DecIncludeItemObject(_DecItemBaseObject):\r
280 def __init__(self, File, Root):\r
281 self.File = File\r
282 self.Root = Root\r
283 _DecItemBaseObject.__init__(self)\r
284\r
285 ## __hash__\r
f7496d71 286 #\r
4234283c
LG
287 def __hash__(self):\r
288 return hash(self.File)\r
289\r
290 ## __eq__\r
291 #\r
292 def __eq__(self, Other):\r
293 return id(self) == id(Other)\r
294\r
295 ## __str__\r
f7496d71 296 #\r
4234283c
LG
297 def __str__(self):\r
298 return self.File\r
299\r
300## DecLibraryclassObject\r
301#\r
302# Class to hold library class section info\r
303#\r
304class DecLibraryclassObject(_DecBaseObject):\r
305 def __init__(self, PkgFullName):\r
306 _DecBaseObject.__init__(self, PkgFullName)\r
307 self._PackagePath, self._FileName = os.path.split(PkgFullName)\r
308 self._SecName = TAB_LIBRARY_CLASSES.upper()\r
309\r
310 ## GetLibraryclasses\r
f7496d71 311 #\r
4234283c
LG
312 def GetLibraryclasses(self, Arch=TAB_ARCH_COMMON):\r
313 return self._GetItemByArch(Arch)\r
314\r
315 ## GetAllLibraryclasses\r
f7496d71 316 #\r
4234283c
LG
317 def GetAllLibraryclasses(self):\r
318 return self._GetAllItems()\r
319\r
320## DecLibraryclassItemObject\r
321# Item of library class section\r
322#\r
323class DecLibraryclassItemObject(_DecItemBaseObject):\r
324 def __init__(self, Libraryclass, File, Root):\r
325 _DecItemBaseObject.__init__(self)\r
326 self.File = File\r
327 self.Root = Root\r
328 self.Libraryclass = Libraryclass\r
329\r
330 ## __hash__\r
f7496d71 331 #\r
4234283c
LG
332 def __hash__(self):\r
333 return hash(self.Libraryclass + self.File)\r
334\r
335 ## __eq__\r
336 #\r
337 def __eq__(self, Other):\r
338 return id(self) == id(Other)\r
339\r
340 ## __str__\r
f7496d71 341 #\r
4234283c
LG
342 def __str__(self):\r
343 return self.Libraryclass + '|' + self.File\r
344\r
345## DecPcdObject\r
346# Class to hold PCD section\r
347#\r
348class DecPcdObject(_DecBaseObject):\r
349 def __init__(self, PkgFullName):\r
350 _DecBaseObject.__init__(self, PkgFullName)\r
351 self._SecName = TAB_PCDS.upper()\r
352\r
353 ## AddItem\r
354 #\r
355 # Diff from base class\r
356 #\r
357 # @param Item: Item\r
358 # @param Scope: Scope\r
359 #\r
360 def AddItem(self, Item, Scope):\r
361 if not Scope:\r
362 return\r
363 if not Item:\r
364 return\r
365 ArchModule = []\r
366 for Type, Arch in Scope:\r
367 if (Type, Arch) in self.ValueDict:\r
368 self.ValueDict[Type, Arch].append(Item)\r
369 else:\r
370 self.ValueDict[Type, Arch] = [Item]\r
371 ArchModule.append([Type, Arch])\r
372 Item.ArchAndModuleType = ArchModule\r
373\r
374 ## GetPcds\r
375 #\r
376 # @param PcdType: PcdType\r
377 # @param Arch: Arch\r
f7496d71 378 #\r
4234283c
LG
379 def GetPcds(self, PcdType, Arch=TAB_ARCH_COMMON):\r
380 PcdType = PcdType.upper()\r
381 Arch = Arch.upper()\r
382 if (PcdType, Arch) not in self.ValueDict:\r
383 return []\r
384 return self.ValueDict[PcdType, Arch]\r
385\r
386 ## GetPcdsByType\r
387 #\r
388 # @param PcdType: PcdType\r
f7496d71 389 #\r
4234283c
LG
390 def GetPcdsByType(self, PcdType):\r
391 PcdType = PcdType.upper()\r
392 Retlst = []\r
393 for TypeInDict, Arch in self.ValueDict:\r
394 if TypeInDict != PcdType:\r
395 continue\r
396 for Item in self.ValueDict[PcdType, Arch]:\r
397 if Item not in Retlst:\r
398 Retlst.append(Item)\r
399 return Retlst\r
400\r
401## DecPcdItemObject\r
402#\r
403# Item of PCD section\r
404#\r
405# @param _DecItemBaseObject: _DecItemBaseObject object\r
406#\r
407class DecPcdItemObject(_DecItemBaseObject):\r
408 def __init__(self, Guid, Name, Value, DatumType,\r
409 Token, MaxDatumSize=''):\r
410 _DecItemBaseObject.__init__(self)\r
411 self.TokenCName = Name\r
412 self.TokenSpaceGuidCName = Guid\r
413 self.DatumType = DatumType\r
414 self.DefaultValue = Value\r
415 self.TokenValue = Token\r
416 self.MaxDatumSize = MaxDatumSize\r
417\r
418 ## __hash__\r
f7496d71 419 #\r
4234283c
LG
420 def __hash__(self):\r
421 return hash(self.TokenSpaceGuidCName + self.TokenCName)\r
422\r
423 ## __eq__\r
424 #\r
425 def __eq__(self, Other):\r
426 return id(self) == id(Other)\r
427\r
428 ## GetArchListOfType\r
429 #\r
430 # @param PcdType: PcdType\r
f7496d71 431 #\r
4234283c
LG
432 def GetArchListOfType(self, PcdType):\r
433 ItemSet = set()\r
434 PcdType = PcdType.upper()\r
435 for Type, Arch in self.ArchAndModuleType:\r
436 if Type != PcdType:\r
437 continue\r
438 ItemSet.add(Arch)\r
439 return list(ItemSet)\r
440\r
441## DecGuidObjectBase\r
442#\r
443# Base class for PPI, Protocol, and GUID.\r
444# Hold same data but has different method for clarification in sub-class\r
445#\r
446# @param _DecBaseObject: Dec Base Object\r
447#\r
448class DecGuidObjectBase(_DecBaseObject):\r
449 def __init__(self, PkgFullName):\r
450 _DecBaseObject.__init__(self, PkgFullName)\r
451\r
452 ## GetGuidStyleItems\r
453 #\r
454 # @param Arch: Arch\r
f7496d71 455 #\r
4234283c
LG
456 def GetGuidStyleItems(self, Arch=TAB_ARCH_COMMON):\r
457 return self._GetItemByArch(Arch)\r
458\r
459 ## GetGuidStyleAllItems\r
f7496d71 460 #\r
4234283c
LG
461 def GetGuidStyleAllItems(self):\r
462 return self._GetAllItems()\r
463\r
464## DecGuidItemObject\r
465#\r
466# Item of GUID, PPI and Protocol section\r
467#\r
468# @param _DecItemBaseObject: Dec Item Base Object\r
469#\r
470class DecGuidItemObject(_DecItemBaseObject):\r
471 def __init__(self, CName, GuidCValue, GuidString):\r
472 _DecItemBaseObject.__init__(self)\r
473 self.GuidCName = CName\r
474 self.GuidCValue = GuidCValue\r
475 self.GuidString = GuidString\r
476\r
477 ## __hash__\r
f7496d71 478 #\r
4234283c
LG
479 def __hash__(self):\r
480 return hash(self.GuidCName)\r
481\r
482 ## __eq__\r
483 #\r
484 def __eq__(self, Other):\r
485 return id(self) == id(Other)\r
486\r
487 ## __str__\r
f7496d71 488 #\r
4234283c
LG
489 def __str__(self):\r
490 return self.GuidCName + ' = ' + self.GuidCValue\r
491\r
492## DecGuidObject\r
493#\r
494# Class for GUID section\r
495#\r
496# @param DecGuidObjectBase: Dec Guid Object Base\r
497#\r
498class DecGuidObject(DecGuidObjectBase):\r
499 def __init__(self, PkgFullName):\r
500 DecGuidObjectBase.__init__(self, PkgFullName)\r
501 self._SecName = TAB_GUIDS.upper()\r
502\r
503 ## GetGuids\r
f7496d71 504 #\r
4234283c
LG
505 # @param Arch: Arch\r
506 #\r
507 def GetGuids(self, Arch=TAB_ARCH_COMMON):\r
508 return self._GetItemByArch(Arch)\r
509\r
510 ## GetAllGuids\r
f7496d71 511 #\r
4234283c
LG
512 def GetAllGuids(self):\r
513 return self._GetAllItems()\r
514\r
515## DecPpiObject\r
516#\r
fb0b35e0 517# Class for PPI section\r
4234283c
LG
518#\r
519# @param DecGuidObjectBase: Dec Guid Object Base\r
520#\r
521class DecPpiObject(DecGuidObjectBase):\r
522 def __init__(self, PkgFullName):\r
523 DecGuidObjectBase.__init__(self, PkgFullName)\r
524 self._SecName = TAB_PPIS.upper()\r
525\r
526 ## GetPpis\r
f7496d71 527 #\r
4234283c 528 # @param Arch: Arch\r
f7496d71 529 #\r
4234283c
LG
530 def GetPpis(self, Arch=TAB_ARCH_COMMON):\r
531 return self._GetItemByArch(Arch)\r
532\r
533 ## GetAllPpis\r
f7496d71 534 #\r
4234283c
LG
535 def GetAllPpis(self):\r
536 return self._GetAllItems()\r
537\r
538## DecProtocolObject\r
539#\r
540# Class for protocol section\r
541#\r
542# @param DecGuidObjectBase: Dec Guid Object Base\r
543#\r
544class DecProtocolObject(DecGuidObjectBase):\r
545 def __init__(self, PkgFullName):\r
546 DecGuidObjectBase.__init__(self, PkgFullName)\r
547 self._SecName = TAB_PROTOCOLS.upper()\r
548\r
549 ## GetProtocols\r
f7496d71 550 #\r
4234283c 551 # @param Arch: Arch\r
f7496d71 552 #\r
4234283c
LG
553 def GetProtocols(self, Arch=TAB_ARCH_COMMON):\r
554 return self._GetItemByArch(Arch)\r
555\r
556 ## GetAllProtocols\r
f7496d71 557 #\r
4234283c
LG
558 def GetAllProtocols(self):\r
559 return self._GetAllItems()\r
560\r
561## DecUserExtensionObject\r
562#\r
563# Class for user extension section\r
564#\r
565# @param _DecBaseObject: Dec Guid Object Base\r
566#\r
567class DecUserExtensionObject(_DecBaseObject):\r
568 def __init__(self, PkgFullName):\r
569 _DecBaseObject.__init__(self, PkgFullName)\r
570 self._SecName = TAB_USER_EXTENSIONS.upper()\r
571 self.ItemList = []\r
572\r
573 ## GetProtocols\r
f7496d71 574 #\r
4234283c
LG
575 # @param Item: Item\r
576 # @param Scope: Scope\r
f7496d71 577 #\r
4234283c
LG
578 def AddItem(self, Item, Scope):\r
579 if not Scope:\r
580 pass\r
581 if not Item:\r
582 return\r
583 self.ItemList.append(Item)\r
584\r
585 ## GetAllUserExtensions\r
f7496d71 586 #\r
4234283c
LG
587 def GetAllUserExtensions(self):\r
588 return self.ItemList\r
589\r
590\r
591## DecUserExtensionItemObject\r
592# Item for user extension section\r
593#\r
594# @param _DecItemBaseObject: Dec Item Base Object\r
595#\r
596class DecUserExtensionItemObject(_DecItemBaseObject):\r
597 def __init__(self):\r
598 _DecItemBaseObject.__init__(self)\r
599 self.UserString = ''\r
600 self.UserId = ''\r
601 self.IdString = ''\r
602\r
603\r
604\r
605\r