1## @file 2# This file is used to parse a Package file of .PKG file 3# 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> 5# 6# This program and the accompanying materials are licensed and made available 7# under the terms and conditions of the BSD License which accompanies this 8# distribution. The full text of the license may be found at 9# http://opensource.org/licenses/bsd-license.php 10# 11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13# 14 15''' 16PackageSurfaceAreaXml 17''' 18from xml.dom import minidom 19 20from Library.String import GetStringOfList 21from Library.Xml.XmlRoutines import XmlElement 22from Library.Xml.XmlRoutines import XmlNode 23from Library.Xml.XmlRoutines import XmlList 24from Library.Xml.XmlRoutines import CreateXmlElement 25from Object.POM.CommonObject import IncludeObject 26from Object.POM.CommonObject import TextObject 27from Object.POM.PackageObject import PackageObject 28from Xml.CommonXml import ClonedFromXml 29from Xml.CommonXml import PackageHeaderXml 30from Xml.CommonXml import HelpTextXml 31from Xml.CommonXml import CommonDefinesXml 32from Xml.CommonXml import LibraryClassXml 33from Xml.CommonXml import UserExtensionsXml 34from Xml.CommonXml import MiscellaneousFileXml 35from Xml.GuidProtocolPpiXml import GuidXml 36from Xml.GuidProtocolPpiXml import ProtocolXml 37from Xml.GuidProtocolPpiXml import PpiXml 38from Xml.ModuleSurfaceAreaXml import ModuleSurfaceAreaXml 39from Xml.PcdXml import PcdEntryXml 40 41## 42# IndustryStandardHeaderXml 43# 44class IndustryStandardHeaderXml(object): 45 def __init__(self): 46 self.HeaderFile = '' 47 self.HelpText = [] 48 49 def FromXml(self, Item, Key): 50 self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key) 51 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): 52 HelpTextObj = HelpTextXml() 53 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) 54 self.HelpText.append(HelpTextObj) 55 56 Include = IncludeObject() 57 Include.SetFilePath(self.HeaderFile) 58 HelpTxt = TextObject() 59 HelpTxt.SetString(self.HelpText) 60 Include.SetHelpText(HelpTxt) 61 62 return Include 63 64 def ToXml(self, IndustryStandardHeader, Key): 65 if self.HeaderFile: 66 pass 67 AttributeList = [] 68 NodeList = [['HeaderFile', IndustryStandardHeader.GetFilePath()]] 69 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) 70 71 return Root 72 73 def __str__(self): 74 Str = "HeaderFile = %s" % (self.HeaderFile) 75 for Item in self.HelpText: 76 Str = Str + "\n\t" + str(Item) 77 return Str 78## 79# PackageIncludeHeaderXml 80# 81class PackageIncludeHeaderXml(object): 82 def __init__(self): 83 self.HeaderFile = '' 84 self.CommonDefines = CommonDefinesXml() 85 self.HelpText = [] 86 87 def FromXml(self, Item, Key): 88 self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key) 89 self.CommonDefines.FromXml(XmlNode(Item, '%s/HeaderFile' % Key), 'HeaderFile') 90 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): 91 HelpTextObj = HelpTextXml() 92 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) 93 self.HelpText.append(HelpTextObj) 94 95 Include = IncludeObject() 96 Include.SetFilePath(self.HeaderFile) 97 Include.SetSupArchList(self.CommonDefines.SupArchList) 98 HelpTxt = TextObject() 99 HelpTxt.SetString(self.HelpText) 100 Include.SetHelpText(HelpTxt) 101 102 return Include 103 104 def ToXml(self, PackageIncludeHeader, Key): 105 if self.HeaderFile: 106 pass 107 AttributeList = [['SupArchList', GetStringOfList(PackageIncludeHeader.GetSupArchList())], \ 108 ['SupModList', GetStringOfList(PackageIncludeHeader.GetSupModuleList())], ] 109 110 HeaderFileNode = CreateXmlElement('HeaderFile', PackageIncludeHeader.FilePath, [], AttributeList) 111 112 NodeList = [HeaderFileNode] 113 for Item in PackageIncludeHeader.GetHelpTextList(): 114 Tmp = HelpTextXml() 115 NodeList.append(Tmp.ToXml(Item)) 116 117 Root = CreateXmlElement('%s' % Key, '', NodeList, []) 118 119 return Root 120 121 def __str__(self): 122 Str = "HeaderFile = %s\n\t%s" % (self.HeaderFile, self.CommonDefines) 123 for Item in self.HelpText: 124 Str = Str + "\n\t" + str(Item) 125 return Str 126 127## 128# PcdCheckXml 129# 130class PcdCheckXml(object): 131 def __init__(self): 132 self.PcdCheck = '' 133 134 def FromXml(self, Item, Key): 135 if Key: 136 pass 137 self.PcdCheck = XmlElement(Item, 'PcdCheck') 138 139 return self.PcdCheck 140 141 def ToXml(self, PcdCheck, Key): 142 if self.PcdCheck: 143 pass 144 Root = CreateXmlElement('%s' % Key, PcdCheck, [], []) 145 return Root 146 147 def __str__(self): 148 return "PcdCheck = %s" % (self.PcdCheck) 149 150## 151# PackageSurfaceAreaXml 152# 153class PackageSurfaceAreaXml(object): 154 def __init__(self): 155 self.Package = None 156 157 def FromXml(self, Item, Key): 158 if Key: 159 pass 160 # 161 # Create a package object 162 # 163 Package = PackageObject() 164 # 165 # Header 166 # 167 Tmp = PackageHeaderXml() 168 Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/Header'), 'Header', Package) 169 # 170 # ClonedFrom 171 # 172 Tmp = ClonedFromXml() 173 if XmlNode(Item, '/PackageSurfaceArea/ClonedFrom'): 174 ClonedFrom = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/ClonedFrom'), 'ClonedFrom') 175 Package.SetClonedFromList([ClonedFrom]) 176 # 177 # LibraryClass 178 # 179 180 for SubItem in XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'): 181 Tmp = LibraryClassXml() 182 LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass') 183 Package.SetLibraryClassList(Package.GetLibraryClassList() + [LibraryClass]) 184 185 if XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations') and \ 186 not XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'): 187 Package.SetLibraryClassList([None]) 188 189 # 190 # IndustryStandardHeader 191 # 192 for SubItem in XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'): 193 Tmp = IndustryStandardHeaderXml() 194 Include = Tmp.FromXml(SubItem, 'IndustryStandardHeader') 195 Package.SetStandardIncludeFileList(Package.GetStandardIncludeFileList() + [Include]) 196 197 if XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes') and \ 198 not XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'): 199 Package.SetStandardIncludeFileList([None]) 200 201 202 # 203 # PackageHeader 204 # 205 for SubItem in XmlList(Item, '/PackageSurfaceArea/PackageIncludes/PackageHeader'): 206 Tmp = PackageIncludeHeaderXml() 207 Include = Tmp.FromXml(SubItem, 'PackageHeader') 208 Package.SetPackageIncludeFileList(Package.GetPackageIncludeFileList() + [Include]) 209 210 if XmlList(Item, '/PackageSurfaceArea/PackageIncludes') and not \ 211 XmlList(Item, '/PackageSurfaceArea/PackageIncludes/PackageHeader'): 212 Package.SetPackageIncludeFileList([None]) 213 214 # 215 # Guid 216 # 217 for SubItem in XmlList(Item, '/PackageSurfaceArea/GuidDeclarations/Entry'): 218 Tmp = GuidXml('Package') 219 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') 220 Package.SetGuidList(Package.GetGuidList() + [GuidProtocolPpi]) 221 222 if XmlList(Item, '/PackageSurfaceArea/GuidDeclarations') and not \ 223 XmlList(Item, '/PackageSurfaceArea/GuidDeclarations/Entry'): 224 Package.SetGuidList([None]) 225 226 # 227 # Protocol 228 # 229 for SubItem in XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations/Entry'): 230 Tmp = ProtocolXml('Package') 231 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') 232 Package.SetProtocolList(Package.GetProtocolList() + [GuidProtocolPpi]) 233 234 if XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations') and not \ 235 XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations/Entry'): 236 Package.SetProtocolList([None]) 237 238 # 239 # Ppi 240 # 241 for SubItem in XmlList(Item, '/PackageSurfaceArea/PpiDeclarations/Entry'): 242 Tmp = PpiXml('Package') 243 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') 244 Package.SetPpiList(Package.GetPpiList() + [GuidProtocolPpi]) 245 246 if XmlList(Item, '/PackageSurfaceArea/PpiDeclarations') and not \ 247 XmlList(Item, '/PackageSurfaceArea/PpiDeclarations/Entry'): 248 Package.SetPpiList([None]) 249 250 # 251 # PcdEntry 252 # 253 for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'): 254 Tmp = PcdEntryXml() 255 PcdEntry = Tmp.FromXml2(SubItem, 'PcdEntry') 256 Package.SetPcdList(Package.GetPcdList() + [PcdEntry]) 257 258 # 259 # Get PcdErrorCommentDict from PcdError in PcdEntry Node 260 # 261 for PcdErrorObj in PcdEntry.GetPcdErrorsList(): 262 PcdErrorMessageList = PcdErrorObj.GetErrorMessageList() 263 if PcdErrorMessageList: 264 Package.PcdErrorCommentDict[(PcdEntry.GetTokenSpaceGuidCName(), PcdErrorObj.GetErrorNumber())] = \ 265 PcdErrorMessageList 266 267 268 if XmlList(Item, '/PackageSurfaceArea/PcdDeclarations') and not \ 269 XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'): 270 Package.SetPcdList([None]) 271 272 # 273 # PcdCheck 274 # 275 for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdRelationshipChecks/PcdCheck'): 276 Tmp = PcdCheckXml() 277 PcdCheck = Tmp.FromXml(SubItem, 'PcdCheck') 278 Package.PcdChecks.append(PcdCheck) 279 280 # 281 # Modules 282 # 283 for SubItem in XmlList(Item, '/PackageSurfaceArea/Modules/ModuleSurfaceArea'): 284 Tmp = ModuleSurfaceAreaXml() 285 Module = Tmp.FromXml(SubItem, 'ModuleSurfaceArea') 286 ModuleDictKey = (Module.GetGuid(), Module.GetVersion(), Module.GetName(), Module.GetModulePath()) 287 Package.ModuleDict[ModuleDictKey] = Module 288 # 289 # MiscellaneousFile 290 # 291 Tmp = MiscellaneousFileXml() 292 MiscFileList = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles') 293 if MiscFileList: 294 Package.SetMiscFileList([MiscFileList]) 295 else: 296 Package.SetMiscFileList([]) 297 298 # 299 # UserExtensions 300 # 301 for Item in XmlList(Item, '/PackageSurfaceArea/UserExtensions'): 302 Tmp = UserExtensionsXml() 303 UserExtension = Tmp.FromXml(Item, 'UserExtensions') 304 Package.UserExtensionList.append(UserExtension) 305 306 self.Package = Package 307 return self.Package 308 309 def ToXml(self, Package): 310 if self.Package: 311 pass 312 # 313 # Create PackageSurfaceArea node 314 # 315 DomPackage = minidom.Document().createElement('PackageSurfaceArea') 316 # 317 # Header 318 # 319 Tmp = PackageHeaderXml() 320 DomPackage.appendChild(Tmp.ToXml(Package, 'Header')) 321 # 322 # ClonedFrom 323 # 324 Tmp = ClonedFromXml() 325 if Package.GetClonedFromList() != []: 326 DomPackage.appendChild(Tmp.ToXml(Package.GetClonedFromList[0], 'ClonedFrom')) 327 # 328 # LibraryClass 329 # 330 LibraryClassNode = CreateXmlElement('LibraryClassDeclarations', '', [], []) 331 for LibraryClass in Package.GetLibraryClassList(): 332 Tmp = LibraryClassXml() 333 LibraryClassNode.appendChild(Tmp.ToXml(LibraryClass, 'LibraryClass')) 334 DomPackage.appendChild(LibraryClassNode) 335 # 336 # IndustryStandardHeader 337 # 338 IndustryStandardHeaderNode = CreateXmlElement('IndustryStandardIncludes', '', [], []) 339 for Include in Package.GetStandardIncludeFileList(): 340 Tmp = IndustryStandardHeaderXml() 341 IndustryStandardHeaderNode.appendChild(Tmp.ToXml(Include, 'IndustryStandardHeader')) 342 DomPackage.appendChild(IndustryStandardHeaderNode) 343 # 344 # PackageHeader 345 # 346 PackageIncludeHeaderNode = CreateXmlElement('PackageIncludes', '', [], []) 347 for Include in Package.GetPackageIncludeFileList(): 348 Tmp = PackageIncludeHeaderXml() 349 PackageIncludeHeaderNode.appendChild(Tmp.ToXml(Include, 'PackageHeader')) 350 DomPackage.appendChild(PackageIncludeHeaderNode) 351 ModuleNode = CreateXmlElement('Modules', '', [], []) 352 for Module in Package.GetModuleDict().values(): 353 Tmp = ModuleSurfaceAreaXml() 354 ModuleNode.appendChild(Tmp.ToXml(Module)) 355 DomPackage.appendChild(ModuleNode) 356 # 357 # Guid 358 # 359 GuidProtocolPpiNode = CreateXmlElement('GuidDeclarations', '', [], []) 360 for GuidProtocolPpi in Package.GetGuidList(): 361 Tmp = GuidXml('Package') 362 GuidProtocolPpiNode.appendChild(Tmp.ToXml\ 363 (GuidProtocolPpi, 'Entry')) 364 DomPackage.appendChild(GuidProtocolPpiNode) 365 # 366 # Protocol 367 # 368 GuidProtocolPpiNode = \ 369 CreateXmlElement('ProtocolDeclarations', '', [], []) 370 for GuidProtocolPpi in Package.GetProtocolList(): 371 Tmp = ProtocolXml('Package') 372 GuidProtocolPpiNode.appendChild\ 373 (Tmp.ToXml(GuidProtocolPpi, 'Entry')) 374 DomPackage.appendChild(GuidProtocolPpiNode) 375 # 376 # Ppi 377 # 378 GuidProtocolPpiNode = CreateXmlElement('PpiDeclarations', '', [], []) 379 for GuidProtocolPpi in Package.GetPpiList(): 380 Tmp = PpiXml('Package') 381 GuidProtocolPpiNode.appendChild\ 382 (Tmp.ToXml(GuidProtocolPpi, 'Entry')) 383 DomPackage.appendChild(GuidProtocolPpiNode) 384 # 385 # PcdEntry 386 # 387 PcdEntryNode = CreateXmlElement('PcdDeclarations', '', [], []) 388 for PcdEntry in Package.GetPcdList(): 389 Tmp = PcdEntryXml() 390 PcdEntryNode.appendChild(Tmp.ToXml2(PcdEntry, 'PcdEntry')) 391 DomPackage.appendChild(PcdEntryNode) 392 393 # 394 # MiscellaneousFile 395 # 396 Tmp = MiscellaneousFileXml() 397 if Package.GetMiscFileList(): 398 DomPackage.appendChild(Tmp.ToXml(Package.GetMiscFileList()[0], 'MiscellaneousFiles')) 399 400 # 401 # UserExtensions 402 # 403 if Package.GetUserExtensionList(): 404 for UserExtension in Package.GetUserExtensionList(): 405 Tmp = UserExtensionsXml() 406 DomPackage.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions')) 407 408 return DomPackage 409