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