2 Java class FpdFileContents is used to parse fpd xml file.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 package org
.tianocore
.frameworkwizard
.platform
.ui
;
16 import java
.io
.IOException
;
17 import java
.math
.BigInteger
;
18 import java
.util
.ArrayList
;
19 import java
.util
.HashMap
;
20 import java
.util
.Iterator
;
21 import java
.util
.LinkedHashMap
;
22 import java
.util
.List
;
23 import java
.util
.ListIterator
;
26 import java
.util
.Vector
;
28 import javax
.xml
.namespace
.QName
;
30 import org
.apache
.xmlbeans
.XmlCursor
;
31 import org
.apache
.xmlbeans
.XmlObject
;
32 import org
.apache
.xmlbeans
.XmlOptions
;
33 import org
.tianocore
.AntTaskDocument
;
34 import org
.tianocore
.BuildOptionsDocument
;
35 import org
.tianocore
.DynamicPcdBuildDefinitionsDocument
;
36 import org
.tianocore
.EfiSectionType
;
37 import org
.tianocore
.FlashDefinitionFileDocument
;
38 import org
.tianocore
.FlashDocument
;
39 import org
.tianocore
.FrameworkModulesDocument
;
40 import org
.tianocore
.IntermediateOutputType
;
41 import org
.tianocore
.LibrariesDocument
;
42 import org
.tianocore
.ModuleSADocument
;
43 import org
.tianocore
.ModuleSaBuildOptionsDocument
;
44 import org
.tianocore
.ModuleSurfaceAreaDocument
;
45 import org
.tianocore
.OptionDocument
;
46 import org
.tianocore
.OptionsDocument
;
47 import org
.tianocore
.PcdBuildDefinitionDocument
;
48 import org
.tianocore
.PcdCodedDocument
;
49 import org
.tianocore
.PcdDataTypes
;
50 import org
.tianocore
.PcdDeclarationsDocument
;
51 import org
.tianocore
.PcdItemTypes
;
52 import org
.tianocore
.PlatformDefinitionsDocument
;
53 import org
.tianocore
.PlatformSurfaceAreaDocument
;
54 import org
.tianocore
.FvImageTypes
;
55 import org
.tianocore
.FvImagesDocument
;
56 import org
.tianocore
.LicenseDocument
;
57 import org
.tianocore
.PlatformHeaderDocument
;
58 import org
.tianocore
.SkuInfoDocument
;
59 import org
.tianocore
.UserDefinedAntTasksDocument
;
60 import org
.tianocore
.frameworkwizard
.platform
.ui
.global
.GlobalData
;
61 import org
.tianocore
.frameworkwizard
.platform
.ui
.global
.SurfaceAreaQuery
;
62 import org
.tianocore
.frameworkwizard
.platform
.ui
.id
.ModuleIdentification
;
63 import org
.tianocore
.frameworkwizard
.platform
.ui
.id
.PackageIdentification
;
66 This class processes fpd file contents such as add remove xml elements.
67 @since PackageEditor 1.0
69 public class FpdFileContents
{
71 static final String xmlNs
= "http://www.TianoCore.org/2006/Edk2.0";
73 private PlatformSurfaceAreaDocument fpdd
= null;
75 private PlatformSurfaceAreaDocument
.PlatformSurfaceArea fpdRoot
= null;
77 private PlatformHeaderDocument
.PlatformHeader fpdHdr
= null;
79 private PlatformDefinitionsDocument
.PlatformDefinitions fpdPlatformDefs
= null;
81 private FlashDocument
.Flash fpdFlash
= null;
83 private BuildOptionsDocument
.BuildOptions fpdBuildOpts
= null;
85 private FrameworkModulesDocument
.FrameworkModules fpdFrameworkModules
= null;
87 private DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs
= null;
89 private HashMap
<String
, ArrayList
<String
>> dynPcdMap
= null;
92 * look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings.
94 public void initDynPcdMap() {
95 if (dynPcdMap
== null) {
96 dynPcdMap
= new HashMap
<String
, ArrayList
<String
>>();
97 List
<ModuleSADocument
.ModuleSA
> l
= getfpdFrameworkModules().getModuleSAList();
99 removeElement(getfpdFrameworkModules());
100 fpdFrameworkModules
= null;
103 ListIterator
<ModuleSADocument
.ModuleSA
> li
= l
.listIterator();
104 while (li
.hasNext()) {
105 ModuleSADocument
.ModuleSA msa
= li
.next();
106 if (msa
.getPcdBuildDefinition() == null || msa
.getPcdBuildDefinition().getPcdDataList() == null) {
109 String ModuleInfo
= msa
.getModuleGuid() + " " + msa
.getModuleVersion() +
110 " " + msa
.getPackageGuid() + " " + msa
.getPackageVersion() + " " + listToString(msa
.getSupArchList());
111 List
<PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
> lp
= msa
.getPcdBuildDefinition().getPcdDataList();
112 ListIterator
<PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
> lpi
= lp
.listIterator();
113 while (lpi
.hasNext()) {
114 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData pcdData
= lpi
.next();
115 String pcdKey
= pcdData
.getCName() + " " + pcdData
.getTokenSpaceGuidCName();
116 if (dynPcdMap
.get(pcdKey
) == null) {
117 ArrayList
<String
> al
= new ArrayList
<String
>();
118 al
.add(ModuleInfo
+ " " + pcdData
.getItemType().toString());
119 dynPcdMap
.put(pcdKey
, al
);
122 dynPcdMap
.get(pcdKey
).add(ModuleInfo
+ " " + pcdData
.getItemType().toString());
129 public ArrayList
<String
> getDynPcdMapValue(String key
) {
130 return dynPcdMap
.get(key
);
133 Constructor to create a new spd file
135 public FpdFileContents() {
137 fpdd
= PlatformSurfaceAreaDocument
.Factory
.newInstance();
138 fpdRoot
= fpdd
.addNewPlatformSurfaceArea();
143 Constructor for existing document object
146 public FpdFileContents(PlatformSurfaceAreaDocument
.PlatformSurfaceArea fpd
) {
148 fpdHdr
= fpdRoot
.getPlatformHeader();
149 fpdPlatformDefs
= fpdRoot
.getPlatformDefinitions();
150 fpdBuildOpts
= fpdRoot
.getBuildOptions();
151 fpdFrameworkModules
= fpdRoot
.getFrameworkModules();
152 fpdDynPcdBuildDefs
= fpdRoot
.getDynamicPcdBuildDefinitions();
153 fpdFlash
= fpdRoot
.getFlash();
157 Constructor based on an existing spd file
159 @param f Existing spd file
161 public FpdFileContents(File f
) {
163 fpdd
= PlatformSurfaceAreaDocument
.Factory
.parse(f
);
164 fpdRoot
= fpdd
.getPlatformSurfaceArea();
165 } catch (Exception e
) {
166 System
.out
.println(e
.toString());
170 public DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
getfpdDynPcdBuildDefs() {
171 if (fpdDynPcdBuildDefs
== null){
172 fpdDynPcdBuildDefs
= fpdRoot
.addNewDynamicPcdBuildDefinitions();
174 return fpdDynPcdBuildDefs
;
177 public FrameworkModulesDocument
.FrameworkModules
getfpdFrameworkModules() {
178 if (fpdFrameworkModules
== null){
179 fpdFrameworkModules
= fpdRoot
.addNewFrameworkModules();
181 return fpdFrameworkModules
;
184 public int getFrameworkModulesCount() {
185 if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){
186 removeElement(getfpdFrameworkModules());
187 fpdFrameworkModules
= null;
190 return getfpdFrameworkModules().getModuleSAList().size();
193 public void getFrameworkModulesInfo(String
[][] saa
) {
194 if (getFrameworkModulesCount() == 0){
198 ListIterator li
= getfpdFrameworkModules().getModuleSAList().listIterator();
200 while(li
.hasNext()) {
201 ModuleSADocument
.ModuleSA msa
= (ModuleSADocument
.ModuleSA
)li
.next();
202 saa
[i
][0] = msa
.getModuleGuid();
203 saa
[i
][1] = msa
.getModuleVersion();
205 saa
[i
][2] = msa
.getPackageGuid();
206 saa
[i
][3] = msa
.getPackageVersion();
207 saa
[i
][4] = listToString(msa
.getSupArchList());
212 public void getFrameworkModuleInfo(int i
, String
[] sa
) {
213 ModuleSADocument
.ModuleSA msa
= getModuleSA(i
);
217 sa
[0] = msa
.getModuleGuid();
218 sa
[1] = msa
.getModuleVersion();
219 sa
[2] = msa
.getPackageGuid();
220 sa
[3] = msa
.getPackageVersion();
221 sa
[4] = listToString(msa
.getSupArchList());
224 public ModuleSADocument
.ModuleSA
getModuleSA(String key
) {
225 String
[] s
= key
.split(" ");
226 if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0) {
227 removeElement(getfpdFrameworkModules());
228 fpdFrameworkModules
= null;
231 ListIterator li
= getfpdFrameworkModules().getModuleSAList().listIterator();
232 while(li
.hasNext()) {
233 ModuleSADocument
.ModuleSA msa
= (ModuleSADocument
.ModuleSA
)li
.next();
234 if (msa
.getModuleGuid().equalsIgnoreCase(s
[0]) && msa
.getPackageGuid().equalsIgnoreCase(s
[2])) {
235 if (msa
.getModuleVersion() != null) {
236 if (!msa
.getModuleVersion().equals(s
[1])) {
240 if (msa
.getPackageVersion() != null) {
241 if (!msa
.getPackageVersion().equals(s
[3])) {
245 //ToDo add arch check for s[4]
246 if (msa
.getSupArchList() != null) {
247 if (!listToString(msa
.getSupArchList()).equals(s
[4])) {
257 private ModuleSADocument
.ModuleSA
getModuleSA(int i
) {
258 ModuleSADocument
.ModuleSA msa
= null;
259 if (fpdRoot
.getFrameworkModules() == null) {
262 XmlCursor cursor
= fpdRoot
.getFrameworkModules().newCursor();
263 if (cursor
.toFirstChild()) {
264 for (int j
= 0; j
< i
; ++j
) {
265 cursor
.toNextSibling();
267 msa
= (ModuleSADocument
.ModuleSA
)cursor
.getObject();
273 public void removeModuleSA(int i
) {
274 XmlObject o
= fpdRoot
.getFrameworkModules();
279 XmlCursor cursor
= o
.newCursor();
280 if (cursor
.toFirstChild()) {
281 for (int j
= 0; j
< i
; ++j
) {
282 cursor
.toNextSibling();
285 // remove pcd from dynPcdMap, if DynamicPcdBuildData exists, remove them too.
287 ModuleSADocument
.ModuleSA moduleSa
= (ModuleSADocument
.ModuleSA
)cursor
.getObject();
288 String moduleInfo
= moduleSa
.getModuleGuid() + " " + moduleSa
.getModuleVersion() + " " +
289 moduleSa
.getPackageGuid()+ " " + moduleSa
.getPackageVersion() + " " + listToString(moduleSa
.getSupArchList());
290 PcdBuildDefinitionDocument
.PcdBuildDefinition pcdBuildDef
= moduleSa
.getPcdBuildDefinition();
291 if (pcdBuildDef
!= null && pcdBuildDef
.getPcdDataList() != null) {
292 ListIterator
<PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
> li
= pcdBuildDef
.getPcdDataList().listIterator();
293 while(li
.hasNext()) {
294 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData pcdData
= li
.next();
295 maintainDynPcdMap(pcdData
.getCName() + " " + pcdData
.getTokenSpaceGuidCName(), moduleInfo
);
300 cursor
.toPrevToken();
301 if (cursor
.isComment()) {
306 if (getFrameworkModulesCount() == 0) {
314 private void maintainDynPcdMap(String pcdKey
, String moduleInfo
) {
316 ArrayList
<String
> al
= dynPcdMap
.get(pcdKey
);
320 String
[] s
= moduleInfo
.split(" ");
321 for(int i
= 0; i
< al
.size(); ++i
){
322 String consumer
= al
.get(i
);
323 if (consumer
.contains(s
[0]) && consumer
.contains(s
[2])){
324 String
[] consumerPart
= consumer
.split(" ");
325 if (!consumerPart
[4].equals(s
[4])) {
333 if (al
.size() == 0) {
334 dynPcdMap
.remove(pcdKey
);
335 String
[] s1
= pcdKey
.split(" ");
336 removeDynamicPcdBuildData(s1
[0], s1
[1]);
341 // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch"
343 public int getPcdDataCount(int i
){
344 ModuleSADocument
.ModuleSA msa
= getModuleSA(i
);
346 if (msa
== null || msa
.getPcdBuildDefinition() == null || msa
.getPcdBuildDefinition().getPcdDataList() == null){
349 return msa
.getPcdBuildDefinition().getPcdDataList().size();
353 public void getPcdData(int i
, String
[][] saa
) {
354 ModuleSADocument
.ModuleSA msa
= getModuleSA(i
);
356 if (msa
== null || msa
.getPcdBuildDefinition() == null || msa
.getPcdBuildDefinition().getPcdDataList() == null){
359 ListIterator
<PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
>li
= msa
.getPcdBuildDefinition().getPcdDataList().listIterator();
360 for (int k
= 0; k
< saa
.length
; ++k
) {
361 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData pcdData
= li
.next();
362 saa
[k
][0] = pcdData
.getCName();
363 saa
[k
][1] = pcdData
.getTokenSpaceGuidCName();
364 saa
[k
][2] = pcdData
.getItemType()+"";
365 saa
[k
][3] = pcdData
.getToken().toString();
366 saa
[k
][4] = pcdData
.getMaxDatumSize()+"";
367 saa
[k
][5] = pcdData
.getDatumType()+"";
368 saa
[k
][6] = pcdData
.getValue();
373 public void updatePcdData(String key
, String cName
, String tsGuid
, String itemType
, String maxSize
, String value
){
374 ModuleSADocument
.ModuleSA msa
= getModuleSA(key
);
375 if (msa
== null || msa
.getPcdBuildDefinition() == null){
379 XmlCursor cursor
= msa
.getPcdBuildDefinition().newCursor();
380 if (cursor
.toFirstChild()){
382 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData pcdData
= (PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
)cursor
.getObject();
383 if (pcdData
.getCName().equals(cName
) && pcdData
.getTokenSpaceGuidCName().equals(tsGuid
)) {
384 pcdData
.setItemType(PcdItemTypes
.Enum
.forString(itemType
));
385 if(pcdData
.getDatumType().equals("VOID*")) {
386 pcdData
.setMaxDatumSize(new Integer(maxSize
));
388 pcdData
.setValue(value
);
392 while(cursor
.toNextSibling());
397 /**Get original Pcd info from MSA & SPD files.
398 * @param mi ModuleIdentification from which MSA & SPD come
399 * @param cName PCD cName
400 * @param sa Results: HelpText, Original item type.
403 public boolean getPcdBuildDataInfo(ModuleIdentification mi
, String cName
, String
[] sa
) throws Exception
{
406 ModuleSurfaceAreaDocument
.ModuleSurfaceArea msa
= (ModuleSurfaceAreaDocument
.ModuleSurfaceArea
)GlobalData
.getModuleXmlObject(mi
);
407 if (msa
.getPcdCoded() == null) {
411 Map
<String
, XmlObject
> m
= new HashMap
<String
, XmlObject
>();
412 m
.put("ModuleSurfaceArea", msa
);
413 SurfaceAreaQuery
.setDoc(m
);
414 PackageIdentification
[] depPkgs
= SurfaceAreaQuery
.getDependencePkg(null);
416 // First look through MSA pcd entries.
418 List
<PcdCodedDocument
.PcdCoded
.PcdEntry
> l
= msa
.getPcdCoded().getPcdEntryList();
419 ListIterator li
= l
.listIterator();
420 while(li
.hasNext()) {
421 PcdCodedDocument
.PcdCoded
.PcdEntry msaPcd
= (PcdCodedDocument
.PcdCoded
.PcdEntry
)li
.next();
422 if (!msaPcd
.getCName().equals(cName
)) {
425 PcdDeclarationsDocument
.PcdDeclarations
.PcdEntry spdPcd
= LookupPcdDeclaration(msaPcd
, depPkgs
);
426 if (spdPcd
== null) {
430 throw new PcdDeclNotFound(mi
.getName() + " " + msaPcd
.getCName());
433 // Get Pcd help text and original item type.
435 sa
[0] = spdPcd
.getHelpText() + msaPcd
.getHelpText();
436 sa
[1] = msaPcd
.getPcdItemType()+"";
450 /**Remove PCDBuildDefinition entries from ModuleSA
451 * @param moduleKey identifier of ModuleSA.
452 * @param consumer where these entries come from.
454 public void removePcdData(String moduleKey
, ModuleIdentification consumer
) {
456 ModuleSurfaceAreaDocument
.ModuleSurfaceArea msa
= (ModuleSurfaceAreaDocument
.ModuleSurfaceArea
)GlobalData
.getModuleXmlObject(consumer
);
457 if (msa
.getPcdCoded() == null) {
461 List
<PcdCodedDocument
.PcdCoded
.PcdEntry
> l
= msa
.getPcdCoded().getPcdEntryList();
462 ListIterator li
= l
.listIterator();
464 while(li
.hasNext()) {
465 PcdCodedDocument
.PcdCoded
.PcdEntry msaPcd
= (PcdCodedDocument
.PcdCoded
.PcdEntry
)li
.next();
466 ModuleSADocument
.ModuleSA moduleSA
= getModuleSA(moduleKey
);
467 if (moduleSA
.getPcdBuildDefinition() != null) {
468 XmlCursor cursor
= moduleSA
.getPcdBuildDefinition().newCursor();
469 if (cursor
.toFirstChild()) {
470 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData pcdData
= (PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
) cursor
472 if (msaPcd
.getCName().equals(pcdData
.getCName())
473 && msaPcd
.getTokenSpaceGuidCName().equals(pcdData
.getTokenSpaceGuidCName())) {
475 maintainDynPcdMap(pcdData
.getCName() + " " + pcdData
.getTokenSpaceGuidCName(), moduleKey
);
479 while (cursor
.toNextSibling()) {
480 pcdData
= (PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData
) cursor
.getObject();
481 if (msaPcd
.getCName().equals(pcdData
.getCName())
482 && msaPcd
.getTokenSpaceGuidCName().equals(pcdData
.getTokenSpaceGuidCName())) {
483 maintainDynPcdMap(pcdData
.getCName() + " " + pcdData
.getTokenSpaceGuidCName(),
501 // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch"
503 public int getLibraryInstancesCount(String key
) {
504 ModuleSADocument
.ModuleSA msa
= getModuleSA(key
);
505 if (msa
== null || msa
.getLibraries() == null || msa
.getLibraries().getInstanceList() == null){
508 return msa
.getLibraries().getInstanceList().size();
511 public void getLibraryInstances(String key
, String
[][] saa
){
512 ModuleSADocument
.ModuleSA msa
= getModuleSA(key
);
513 if (msa
== null || msa
.getLibraries() == null || msa
.getLibraries().getInstanceList() == null){
517 ListIterator
<LibrariesDocument
.Libraries
.Instance
> li
= msa
.getLibraries().getInstanceList().listIterator();
518 for (int i
= 0; i
< saa
.length
; ++i
) {
519 LibrariesDocument
.Libraries
.Instance instance
= li
.next();
520 saa
[i
][1] = instance
.getModuleGuid();
521 saa
[i
][2] = instance
.getModuleVersion();
522 saa
[i
][3] = instance
.getPackageGuid();
523 saa
[i
][4] = instance
.getPackageVersion();
527 public void removeLibraryInstance(String key
, int i
) {
528 ModuleSADocument
.ModuleSA msa
= getModuleSA(key
);
529 if (msa
== null || msa
.getLibraries() == null){
533 XmlCursor cursor
= msa
.getLibraries().newCursor();
534 if (cursor
.toFirstChild()) {
535 for (int j
= 0; j
< i
; ++j
) {
536 cursor
.toNextSibling();
539 cursor
.toPrevToken();
540 if (cursor
.isComment()) {
545 if (getLibraryInstancesCount(key
) == 0) {
554 public void genLibraryInstance(ModuleIdentification libMi
, String key
) {
555 ModuleSADocument
.ModuleSA msa
= getModuleSA(key
);
557 msa
= getfpdFrameworkModules().addNewModuleSA();
559 LibrariesDocument
.Libraries libs
= msa
.getLibraries();
561 libs
= msa
.addNewLibraries();
564 String mn
= libMi
.getName();
565 String mg
= libMi
.getGuid();
566 String mv
= libMi
.getVersion();
567 String pn
= libMi
.getPackage().getName();
568 String pg
= libMi
.getPackage().getGuid();
569 String pv
= libMi
.getPackage().getVersion();
570 LibrariesDocument
.Libraries
.Instance instance
= libs
.addNewInstance();
571 XmlCursor cursor
= instance
.newCursor();
573 String comment
= "Pkg: " + pn
+ " Mod: " + mn
574 + " Path: " + GlobalData
.getMsaFile(libMi
).getPath();
575 cursor
.insertComment(comment
);
584 instance
.setModuleGuid(mg
);
585 instance
.setModuleVersion(mv
);
586 instance
.setPackageGuid(pg
);
587 instance
.setPackageVersion(pv
);
591 public String
getFvBinding(String moduleKey
){
592 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
593 if (msa
== null || msa
.getModuleSaBuildOptions() == null) {
596 return msa
.getModuleSaBuildOptions().getFvBinding();
599 public void setFvBinding(String moduleKey
, String fvBinding
){
600 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
604 if(msa
.getModuleSaBuildOptions() == null){
605 msa
.addNewModuleSaBuildOptions().setFvBinding(fvBinding
);
608 msa
.getModuleSaBuildOptions().setFvBinding(fvBinding
);
611 public String
getFfsFileNameGuid(String moduleKey
){
612 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
613 if (msa
== null || msa
.getModuleSaBuildOptions() == null) {
616 return msa
.getModuleSaBuildOptions().getFfsFileNameGuid();
619 public void setFfsFileNameGuid(String moduleKey
, String fileGuid
){
620 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
624 if(msa
.getModuleSaBuildOptions() == null){
625 msa
.addNewModuleSaBuildOptions();
628 ModuleSaBuildOptionsDocument
.ModuleSaBuildOptions msaBuildOpts
= msa
.getModuleSaBuildOptions();
629 if (fileGuid
!= null) {
630 msaBuildOpts
.setFfsFileNameGuid(fileGuid
);
633 XmlCursor cursor
= msaBuildOpts
.newCursor();
634 if (cursor
.toChild(xmlNs
, "FfsFileNameGuid")) {
642 public String
getFfsFormatKey(String moduleKey
){
643 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
644 if (msa
== null || msa
.getModuleSaBuildOptions() == null) {
647 return msa
.getModuleSaBuildOptions().getFfsFormatKey();
650 public void setFfsFormatKey(String moduleKey
, String ffsKey
){
651 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
655 if(msa
.getModuleSaBuildOptions() == null){
656 msa
.addNewModuleSaBuildOptions().setFfsFormatKey(ffsKey
);
659 msa
.getModuleSaBuildOptions().setFfsFormatKey(ffsKey
);
662 public void getModuleSAOptions(String moduleKey
, String
[][] saa
) {
663 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
664 if (msa
== null || msa
.getModuleSaBuildOptions() == null || msa
.getModuleSaBuildOptions().getOptions() == null
665 || msa
.getModuleSaBuildOptions().getOptions().getOptionList() == null) {
669 List
<OptionDocument
.Option
> lOpt
= msa
.getModuleSaBuildOptions().getOptions().getOptionList();
670 ListIterator li
= lOpt
.listIterator();
672 while(li
.hasNext()) {
673 OptionDocument
.Option opt
= (OptionDocument
.Option
)li
.next();
674 if (opt
.getBuildTargets() != null) {
675 saa
[i
][0] = listToString(opt
.getBuildTargets());
677 saa
[i
][1] = opt
.getToolChainFamily();
678 saa
[i
][2] = opt
.getTagName();
679 saa
[i
][3] = opt
.getToolCode();
681 if (opt
.getSupArchList() != null){
682 saa
[i
][4] = listToString(opt
.getSupArchList());
686 saa
[i
][5] = opt
.getStringValue();
692 public int getModuleSAOptionsCount(String moduleKey
){
693 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
694 if (msa
== null || msa
.getModuleSaBuildOptions() == null || msa
.getModuleSaBuildOptions().getOptions() == null
695 || msa
.getModuleSaBuildOptions().getOptions().getOptionList() == null) {
698 return msa
.getModuleSaBuildOptions().getOptions().getOptionList().size();
701 public void genModuleSAOptionsOpt(String moduleKey
, Vector
<Object
> buildTargets
, String toolChain
, String tagName
, String toolCmd
, Vector
<Object
> archList
, String contents
) {
702 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
703 if (msa
.getModuleSaBuildOptions() == null) {
704 msa
.addNewModuleSaBuildOptions();
706 if (msa
.getModuleSaBuildOptions().getOptions() == null){
707 msa
.getModuleSaBuildOptions().addNewOptions();
709 OptionDocument
.Option opt
= msa
.getModuleSaBuildOptions().getOptions().addNewOption();
710 setBuildOptionsOpt(buildTargets
, toolChain
, tagName
, toolCmd
, archList
, contents
, opt
);
713 public void removeModuleSAOptionsOpt(String moduleKey
, int i
) {
714 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
715 if (msa
.getModuleSaBuildOptions() == null || msa
.getModuleSaBuildOptions().getOptions() == null) {
718 OptionsDocument
.Options opts
= msa
.getModuleSaBuildOptions().getOptions();
719 XmlCursor cursor
= opts
.newCursor();
720 if (cursor
.toFirstChild()) {
721 for (int j
= 0; j
< i
; ++j
){
722 cursor
.toNextSibling();
729 public void updateModuleSAOptionsOpt(String moduleKey
, int i
, Vector
<Object
> buildTargets
, String toolChain
, String tagName
, String toolCmd
, Vector
<Object
> archList
, String contents
) {
730 ModuleSADocument
.ModuleSA msa
= getModuleSA(moduleKey
);
731 if (msa
.getModuleSaBuildOptions() == null || msa
.getModuleSaBuildOptions().getOptions() == null) {
734 OptionsDocument
.Options opts
= msa
.getModuleSaBuildOptions().getOptions();
735 XmlCursor cursor
= opts
.newCursor();
736 if (cursor
.toFirstChild()) {
737 for (int j
= 0; j
< i
; ++j
){
738 cursor
.toNextSibling();
740 OptionDocument
.Option opt
= (OptionDocument
.Option
)cursor
.getObject();
741 setBuildOptionsOpt(buildTargets
, toolChain
, tagName
, toolCmd
, archList
, contents
, opt
);
746 /**add pcd information of module mi to a ModuleSA.
748 * @param moduleSa if null, generate a new ModuleSA.
750 public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi
, String arch
, ModuleSADocument
.ModuleSA moduleSa
) throws Exception
{
751 //ToDo add Arch filter
754 if (moduleSa
== null) {
755 moduleSa
= genModuleSA(mi
, arch
);
758 ModuleSurfaceAreaDocument
.ModuleSurfaceArea msa
= (ModuleSurfaceAreaDocument
.ModuleSurfaceArea
)GlobalData
.getModuleXmlObject(mi
);
759 if (msa
.getPcdCoded() == null) {
763 Map
<String
, XmlObject
> m
= new HashMap
<String
, XmlObject
>();
764 m
.put("ModuleSurfaceArea", msa
);
765 SurfaceAreaQuery
.setDoc(m
);
766 PackageIdentification
[] depPkgs
= SurfaceAreaQuery
.getDependencePkg(null);
768 // Implementing InitializePlatformPcdBuildDefinitions
770 List
<PcdCodedDocument
.PcdCoded
.PcdEntry
> l
= msa
.getPcdCoded().getPcdEntryList();
771 ListIterator li
= l
.listIterator();
772 while(li
.hasNext()) {
773 PcdCodedDocument
.PcdCoded
.PcdEntry msaPcd
= (PcdCodedDocument
.PcdCoded
.PcdEntry
)li
.next();
774 PcdDeclarationsDocument
.PcdDeclarations
.PcdEntry spdPcd
= LookupPcdDeclaration(msaPcd
, depPkgs
);
775 if (spdPcd
== null) {
779 throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd
.getCName() + " in Module " + mi
.getName());
782 // AddItem to ModuleSA PcdBuildDefinitions
784 String defaultVal
= msaPcd
.getDefaultValue() == null ? spdPcd
.getDefaultValue() : msaPcd
.getDefaultValue();
786 genPcdData(msaPcd
.getCName(), spdPcd
.getToken(), msaPcd
.getTokenSpaceGuidCName(), msaPcd
.getPcdItemType().toString(), spdPcd
.getDatumType()+"", defaultVal
, moduleSa
);
797 private PcdDeclarationsDocument
.PcdDeclarations
.PcdEntry
LookupPcdDeclaration (PcdCodedDocument
.PcdCoded
.PcdEntry msaPcd
, PackageIdentification
[] depPkgs
) {
799 Map
<String
, XmlObject
> m
= new HashMap
<String
, XmlObject
>();
800 PcdDeclarationsDocument
.PcdDeclarations
.PcdEntry spdPcd
= null;
801 for (int i
= 0; i
< depPkgs
.length
; ++i
) {
802 m
.put("PackageSurfaceArea", GlobalData
.getPackageXmlObject(depPkgs
[i
]));
803 SurfaceAreaQuery
.setDoc(m
);
804 XmlObject
[] xo
= SurfaceAreaQuery
.getSpdPcdDeclarations();
808 for (int j
= 0; j
< xo
.length
; ++j
) {
809 spdPcd
= (PcdDeclarationsDocument
.PcdDeclarations
.PcdEntry
)xo
[j
];
810 if (msaPcd
.getTokenSpaceGuidCName() == null) {
811 if (spdPcd
.getCName().equals(msaPcd
.getCName())) {
816 if (spdPcd
.getCName().equals(msaPcd
.getCName()) && spdPcd
.getTokenSpaceGuidCName().equals(msaPcd
.getTokenSpaceGuidCName())) {
827 private ModuleSADocument
.ModuleSA
genModuleSA (ModuleIdentification mi
, String arch
) {
828 PackageIdentification pi
= GlobalData
.getPackageForModule(mi
);
829 ModuleSADocument
.ModuleSA msa
= getfpdFrameworkModules().addNewModuleSA();
830 XmlCursor cursor
= msa
.newCursor();
832 String comment
= "Mod: " + mi
.getName() + " Type: " + mi
.getModuleType() + " Path: "
833 + GlobalData
.getMsaFile(mi
).getPath();
834 cursor
.insertComment(comment
);
842 msa
.setModuleGuid(mi
.getGuid());
843 msa
.setModuleVersion(mi
.getVersion());
844 msa
.setPackageGuid(pi
.getGuid());
845 msa
.setPackageVersion(pi
.getVersion());
847 Vector
<String
> v
= new Vector
<String
>();
849 msa
.setSupArchList(v
);
855 private void genPcdData (String cName
, Object token
, String tsGuid
, String itemType
, String dataType
, String defaultVal
, ModuleSADocument
.ModuleSA moduleSa
)
856 throws PcdItemTypeConflictException
, PcdValueMalFormed
{
857 if (moduleSa
.getPcdBuildDefinition() == null){
858 moduleSa
.addNewPcdBuildDefinition();
861 // constructe pcd to modulesa mapping first.
862 // Attention : for any error condition, remove from map this pcd.
864 ArrayList
<String
> pcdConsumer
= LookupPlatformPcdData(cName
+ " " + tsGuid
);
865 if (pcdConsumer
== null) {
866 pcdConsumer
= new ArrayList
<String
>();
868 String listValue
= moduleSa
.getModuleGuid() + " " + moduleSa
.getModuleVersion()
869 + " " + moduleSa
.getPackageGuid() + " " + moduleSa
.getPackageVersion() + " " + listToString(moduleSa
.getSupArchList())
871 pcdConsumer
.add(listValue
);
872 dynPcdMap
.put(cName
+ " " + tsGuid
, pcdConsumer
);
874 // Special dynamic type, if this pcd already exists in other ModuleSA
876 /* Comment out Item type checking temporarily.
877 if (itemType.equals("DYNAMIC")) {
879 ListIterator li = pcdConsumer.listIterator();
880 while(li.hasNext()) {
881 String value = li.next().toString();
882 String[] valuePart= value.split(" ");
883 if (!valuePart[5].equals("DYNAMIC")) {
884 //ToDo error for same pcd, other type than dynamic
885 pcdConsumer.remove(listValue);
886 throw new PcdItemTypeConflictException(cName, value);
891 ListIterator li = pcdConsumer.listIterator();
892 while(li.hasNext()) {
893 String value = li.next().toString();
894 String[] valuePart= value.split(" ");
895 if (valuePart[5].equals("DYNAMIC")) {
896 //ToDo error for same pcd, other type than non-dynamic
897 pcdConsumer.remove(listValue);
898 throw new PcdItemTypeConflictException(cName, value);
903 PcdBuildDefinitionDocument
.PcdBuildDefinition
.PcdData fpdPcd
= moduleSa
.getPcdBuildDefinition().addNewPcdData();
904 fpdPcd
.setCName(cName
);
905 fpdPcd
.setToken(token
);
906 fpdPcd
.setTokenSpaceGuidCName(tsGuid
);
907 fpdPcd
.setDatumType(PcdDataTypes
.Enum
.forString(dataType
));
908 fpdPcd
.setItemType(PcdItemTypes
.Enum
.forString(itemType
));
909 if (dataType
.equals("UINT8")){
910 fpdPcd
.setMaxDatumSize(1);
912 if (dataType
.equals("UINT16")) {
913 fpdPcd
.setMaxDatumSize(2);
915 if (dataType
.equals("UINT32")) {
916 fpdPcd
.setMaxDatumSize(4);
918 if (dataType
.equals("UINT64")){
919 fpdPcd
.setMaxDatumSize(8);
921 if (dataType
.equals("BOOLEAN")){
922 fpdPcd
.setMaxDatumSize(1);
924 if (dataType
.equals("VOID*")) {
925 int maxSize
= setMaxSizeForPointer(fpdPcd
.getValue());
926 fpdPcd
.setMaxDatumSize(maxSize
);
929 if (itemType
.equals("DYNAMIC") || itemType
.equals("DYNAMIC_EX")) {
930 ArrayList
<String
> al
= LookupDynamicPcdBuildDefinition(cName
+ " " + tsGuid
);
932 // if only one module mapped to this pcd, then the one is myself. so no other module mapped.
933 // so need to add one dyn pcd.
935 if (al
.size() == 1) {
936 addDynamicPcdBuildData(cName
, token
, tsGuid
, itemType
, dataType
, defaultVal
);
940 if (defaultVal
!= null){
941 fpdPcd
.setValue(defaultVal
);
944 if (dataType
.equals("UINT8") || dataType
.equals("UINT16") || dataType
.equals("UINT32") || dataType
.equals("UINT64")) {
945 fpdPcd
.setValue("0");
947 if (dataType
.equals("BOOLEAN")){
948 fpdPcd
.setValue("false");
950 if (dataType
.equals("VOID*")) {
955 if (dataType.equals("UINT8")){
956 fpdPcd.setMaxDatumSize(1);
958 if (dataType.equals("UINT16")) {
959 fpdPcd.setMaxDatumSize(2);
961 if (dataType.equals("UINT32")) {
962 fpdPcd.setMaxDatumSize(4);
964 if (dataType.equals("UINT64")){
965 fpdPcd.setMaxDatumSize(8);
967 if (dataType.equals("BOOLEAN")){
968 fpdPcd.setMaxDatumSize(1);
970 if (dataType.equals("VOID*")) {
971 int maxSize = setMaxSizeForPointer(fpdPcd.getValue());
972 fpdPcd.setMaxDatumSize(maxSize);
978 public int setMaxSizeForPointer(String datum
) throws PcdValueMalFormed
{
982 char ch
= datum
.charAt(0);
986 // For void* type PCD, only three datum is support:
987 // 1) Unicode: string with start char is "L"
988 // 2) Ansci: String is ""
989 // 3) byte array: String start char "{"
992 start
= datum
.indexOf('\"');
993 end
= datum
.lastIndexOf('\"');
995 (end
> datum
.length())||
996 ((start
== end
) && (datum
.length() > 0))) {
997 //ToDo Error handling here
998 throw new PcdValueMalFormed (datum
);
1001 strValue
= datum
.substring(start
+ 1, end
);
1002 return strValue
.length() * 2;
1003 } else if (ch
== '\"'){
1004 start
= datum
.indexOf('\"');
1005 end
= datum
.lastIndexOf('\"');
1006 if ((start
> end
) ||
1007 (end
> datum
.length())||
1008 ((start
== end
) && (datum
.length() > 0))) {
1009 throw new PcdValueMalFormed (datum
);
1011 strValue
= datum
.substring(start
+ 1, end
);
1012 return strValue
.length();
1013 } else if (ch
=='{') {
1014 String
[] strValueArray
;
1016 start
= datum
.indexOf('{');
1017 end
= datum
.lastIndexOf('}');
1018 strValue
= datum
.substring(start
+ 1, end
);
1019 strValue
= strValue
.trim();
1020 if (strValue
.length() == 0) {
1023 strValueArray
= strValue
.split(",");
1024 for (int index
= 0; index
< strValueArray
.length
; index
++) {
1025 Integer value
= Integer
.decode(strValueArray
[index
].trim());
1028 // "[FPD file error] The datum type of PCD %s in %s is VOID*, "+
1029 // "it is byte array in fact. But the element of %s exceed the byte range",
1030 throw new PcdValueMalFormed (datum
);
1033 return strValueArray
.length
;
1037 // "[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+
1038 // "1) UNICODE string: like L\"xxxx\";\r\n"+
1039 // "2) ANSIC string: like \"xxx\";\r\n"+
1040 // "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+
1041 // "but the datum in seems does not following above format!",
1042 throw new PcdValueMalFormed (datum
);
1047 private ArrayList
<String
> LookupDynamicPcdBuildDefinition(String dynPcdKey
) {
1048 ArrayList
<String
> al
= dynPcdMap
.get(dynPcdKey
);
1053 private ArrayList
<String
> LookupPlatformPcdData(String pcdKey
) {
1055 return dynPcdMap
.get(pcdKey
);
1058 public int getDynamicPcdBuildDataCount() {
1059 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1060 removeElement(getfpdDynPcdBuildDefs());
1061 fpdDynPcdBuildDefs
= null;
1064 return getfpdDynPcdBuildDefs().getPcdBuildDataList().size();
1067 public void getDynamicPcdBuildData(String
[][] saa
) {
1068 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1069 removeElement(getfpdDynPcdBuildDefs());
1070 fpdDynPcdBuildDefs
= null;
1073 List
<DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
> l
= getfpdDynPcdBuildDefs().getPcdBuildDataList();
1074 ListIterator
<DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
> li
= l
.listIterator();
1076 while(li
.hasNext()) {
1077 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData dynPcd
= li
.next();
1078 saa
[i
][0] = dynPcd
.getCName();
1079 saa
[i
][1] = dynPcd
.getToken().toString();
1080 saa
[i
][2] = dynPcd
.getTokenSpaceGuidCName();
1081 saa
[i
][3] = dynPcd
.getMaxDatumSize()+"";
1082 saa
[i
][4] = dynPcd
.getDatumType().toString();
1088 public void addDynamicPcdBuildData(String cName
, Object token
, String tsGuid
, String itemType
, String dataType
, String defaultVal
)
1089 throws PcdValueMalFormed
{
1090 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData dynPcdData
= getfpdDynPcdBuildDefs().addNewPcdBuildData();
1091 dynPcdData
.setItemType(PcdItemTypes
.Enum
.forString(itemType
));
1092 dynPcdData
.setCName(cName
);
1093 dynPcdData
.setToken(token
);
1094 dynPcdData
.setTokenSpaceGuidCName(tsGuid
);
1095 dynPcdData
.setDatumType(PcdDataTypes
.Enum
.forString(dataType
));
1097 BigInteger bigInt
= new BigInteger("0");
1098 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo skuInfo
= dynPcdData
.addNewSkuInfo();
1099 skuInfo
.setSkuId(bigInt
);
1100 if (defaultVal
!= null){
1101 skuInfo
.setValue(defaultVal
);
1104 if (dataType
.equals("UINT8")){
1105 skuInfo
.setValue("0");
1107 if (dataType
.equals("UINT16")) {
1108 skuInfo
.setValue("0");
1110 if (dataType
.equals("UINT32")) {
1111 skuInfo
.setValue("0");
1113 if (dataType
.equals("UINT64")){
1114 skuInfo
.setValue("0");
1116 if (dataType
.equals("BOOLEAN")){
1117 skuInfo
.setValue("false");
1119 if (dataType
.equals("VOID*")) {
1120 skuInfo
.setValue("");
1123 if (dataType
.equals("UINT8")){
1124 dynPcdData
.setMaxDatumSize(1);
1126 if (dataType
.equals("UINT16")) {
1127 dynPcdData
.setMaxDatumSize(2);
1129 if (dataType
.equals("UINT32")) {
1130 dynPcdData
.setMaxDatumSize(4);
1132 if (dataType
.equals("UINT64")){
1133 dynPcdData
.setMaxDatumSize(8);
1135 if (dataType
.equals("BOOLEAN")){
1136 dynPcdData
.setMaxDatumSize(1);
1138 if (dataType
.equals("VOID*")) {
1139 int maxSize
= setMaxSizeForPointer(defaultVal
);
1140 dynPcdData
.setMaxDatumSize(maxSize
);
1144 public void removeDynamicPcdBuildData(String cName
, String tsGuid
) {
1145 XmlObject o
= fpdRoot
.getDynamicPcdBuildDefinitions();
1150 XmlCursor cursor
= o
.newCursor();
1151 if (cursor
.toFirstChild()) {
1153 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdBuildData
=
1154 (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1155 if (pcdBuildData
.getCName().equals(cName
) && pcdBuildData
.getTokenSpaceGuidCName().equals(tsGuid
)) {
1157 if (getDynamicPcdBuildDataCount() == 0) {
1165 while (cursor
.toNextSibling());
1170 // Get the Sku Info count of ith dyn pcd element.
1172 public int getDynamicPcdSkuInfoCount(int i
){
1173 if (fpdRoot
.getDynamicPcdBuildDefinitions() == null || fpdRoot
.getDynamicPcdBuildDefinitions().getPcdBuildDataList() == null
1174 || fpdRoot
.getDynamicPcdBuildDefinitions().getPcdBuildDataList().size() == 0) {
1178 int skuInfoCount
= 0;
1179 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1180 if (cursor
.toFirstChild()) {
1181 for (int j
= 0; j
< i
; ++j
) {
1182 cursor
.toNextSibling();
1184 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1185 if (pcdData
.getSkuInfoList() == null) {
1189 skuInfoCount
= pcdData
.getSkuInfoList().size();
1193 return skuInfoCount
;
1196 public void getDynamicPcdSkuInfos(int i
, String
[][] saa
){
1197 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1198 removeElement(getfpdDynPcdBuildDefs());
1199 fpdDynPcdBuildDefs
= null;
1203 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1204 if (cursor
.toFirstChild()) {
1205 for (int j
= 0; j
< i
; ++j
) {
1206 cursor
.toNextSibling();
1208 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1209 if (pcdData
.getSkuInfoList() == null) {
1214 ListIterator
<DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo
> li
= pcdData
.getSkuInfoList().listIterator();
1216 while (li
.hasNext()) {
1217 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo skuInfo
= li
.next();
1218 saa
[k
][0] = skuInfo
.getSkuId()+"";
1219 saa
[k
][1] = skuInfo
.getVariableName();
1220 saa
[k
][2] = skuInfo
.getVariableGuid();
1221 saa
[k
][3] = skuInfo
.getVariableOffset();
1222 saa
[k
][4] = skuInfo
.getHiiDefaultValue();
1223 saa
[k
][5] = skuInfo
.getVpdOffset();
1224 saa
[k
][6] = skuInfo
.getValue();
1234 public String
getDynamicPcdBuildDataValue(int i
){
1235 String value
= null;
1236 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1237 removeElement(getfpdDynPcdBuildDefs());
1238 fpdDynPcdBuildDefs
= null;
1242 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1243 if (cursor
.toFirstChild()) {
1244 for (int j
= 0; j
< i
; ++j
) {
1245 cursor
.toNextSibling();
1247 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1248 if (pcdData
.getSkuInfoList() == null) {
1252 value
= pcdData
.getSkuInfoArray(0).getValue();
1259 public String
getDynamicPcdBuildDataVpdOffset(int i
){
1260 String vpdOffset
= null;
1261 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1262 removeElement(getfpdDynPcdBuildDefs());
1263 fpdDynPcdBuildDefs
= null;
1267 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1268 if (cursor
.toFirstChild()) {
1269 for (int j
= 0; j
< i
; ++j
) {
1270 cursor
.toNextSibling();
1272 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1273 if (pcdData
.getSkuInfoList() == null) {
1277 vpdOffset
= pcdData
.getSkuInfoArray(0).getVpdOffset();
1284 public void removeDynamicPcdBuildDataSkuInfo(int i
) {
1285 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1286 removeElement(getfpdDynPcdBuildDefs());
1287 fpdDynPcdBuildDefs
= null;
1291 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1292 if (cursor
.toFirstChild()) {
1293 for (int j
= 0; j
< i
; ++j
) {
1294 cursor
.toNextSibling();
1296 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1297 if (pcdData
.getSkuInfoList() == null) {
1302 QName qSkuInfo
= new QName(xmlNs
, "SkuInfo");
1303 cursor
.toChild(qSkuInfo
);
1310 // generate sku info for ith dyn pcd build data.
1312 public void genDynamicPcdBuildDataSkuInfo(String id
, String varName
, String varGuid
, String varOffset
,
1313 String hiiDefault
, String vpdOffset
, String value
, int i
) {
1314 // if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1318 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1319 if (cursor
.toFirstChild()) {
1320 for (int j
= 0; j
< i
; ++j
) {
1321 cursor
.toNextSibling();
1323 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1324 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo skuInfo
= pcdData
.addNewSkuInfo();
1325 skuInfo
.setSkuId(new BigInteger(id
));
1326 if (varName
!= null){
1327 skuInfo
.setVariableName(varName
);
1328 skuInfo
.setVariableGuid(varGuid
);
1329 skuInfo
.setVariableOffset(varOffset
);
1330 skuInfo
.setHiiDefaultValue(hiiDefault
);
1332 else if (vpdOffset
!= null){
1333 skuInfo
.setVpdOffset(vpdOffset
);
1336 skuInfo
.setValue(value
);
1341 public void updateDynamicPcdBuildDataSkuInfo(String id
, String varName
, String varGuid
, String varOffset
,
1342 String hiiDefault
, String vpdOffset
, String value
, int i
){
1343 // if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {
1347 XmlCursor cursor
= getfpdDynPcdBuildDefs().newCursor();
1348 if (cursor
.toFirstChild()) {
1349 for (int j
= 0; j
< i
; ++j
) {
1350 cursor
.toNextSibling();
1352 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData pcdData
= (DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
)cursor
.getObject();
1353 ListIterator
<DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo
> li
= pcdData
.getSkuInfoList().listIterator();
1354 while (li
.hasNext()) {
1355 DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo skuInfo
= li
.next();
1356 if (skuInfo
.getSkuId().toString().equals(id
)){
1357 if (varName
!= null){
1358 skuInfo
.setVariableName(varName
);
1359 skuInfo
.setVariableGuid(varGuid
);
1360 skuInfo
.setVariableOffset(varOffset
);
1361 skuInfo
.setHiiDefaultValue(hiiDefault
);
1363 else if (vpdOffset
!= null){
1364 skuInfo
.setVpdOffset(vpdOffset
);
1367 skuInfo
.setValue(value
);
1375 public BuildOptionsDocument
.BuildOptions
getfpdBuildOpts() {
1376 if (fpdBuildOpts
== null) {
1377 fpdBuildOpts
= fpdRoot
.addNewBuildOptions();
1379 return fpdBuildOpts
;
1382 public void genBuildOptionsUserDefAntTask (String id
, String fileName
, String execOrder
) {
1383 UserDefinedAntTasksDocument
.UserDefinedAntTasks udats
= getfpdBuildOpts().getUserDefinedAntTasks();
1384 if (udats
== null) {
1385 udats
= getfpdBuildOpts().addNewUserDefinedAntTasks();
1388 AntTaskDocument
.AntTask at
= udats
.addNewAntTask();
1389 setBuildOptionsUserDefAntTask(id
, fileName
, execOrder
, at
);
1392 private void setBuildOptionsUserDefAntTask(String id
, String fileName
, String execOrder
, AntTaskDocument
.AntTask at
) {
1393 at
.setId(new Integer(id
));
1394 XmlCursor cursor
= at
.newCursor();
1395 if (fileName
!= null){
1396 at
.setFilename(fileName
);
1398 else if (cursor
.toChild(xmlNs
, "Filename")) {
1401 if (execOrder
!= null) {
1402 at
.setAntCmdOptions(execOrder
);
1404 else if (cursor
.toChild(xmlNs
, "AntCmdOptions")) {
1410 public void removeBuildOptionsUserDefAntTask(int i
) {
1411 XmlObject o
= getfpdBuildOpts().getUserDefinedAntTasks();
1415 XmlCursor cursor
= o
.newCursor();
1416 if (cursor
.toFirstChild()) {
1417 for (int j
= 0; j
< i
; ++j
) {
1418 cursor
.toNextSibling();
1421 if (getBuildOptionsUserDefAntTaskCount() == 0) {
1429 public void updateBuildOptionsUserDefAntTask(int i
, String id
, String fileName
, String execOrder
){
1430 XmlObject o
= getfpdBuildOpts().getUserDefinedAntTasks();
1434 XmlCursor cursor
= o
.newCursor();
1435 if (cursor
.toFirstChild()) {
1436 for (int j
= 0; j
< i
; ++j
) {
1437 cursor
.toNextSibling();
1439 AntTaskDocument
.AntTask at
= (AntTaskDocument
.AntTask
)cursor
.getObject();
1440 setBuildOptionsUserDefAntTask(id
, fileName
, execOrder
, at
);
1445 public int getBuildOptionsUserDefAntTaskCount() {
1446 UserDefinedAntTasksDocument
.UserDefinedAntTasks udats
= getfpdBuildOpts().getUserDefinedAntTasks();
1447 if (udats
== null || udats
.getAntTaskList() == null) {
1451 return udats
.getAntTaskList().size();
1454 public void getBuildOptionsUserDefAntTasks(String
[][] saa
) {
1455 UserDefinedAntTasksDocument
.UserDefinedAntTasks udats
= getfpdBuildOpts().getUserDefinedAntTasks();
1456 if (udats
== null || udats
.getAntTaskList() == null) {
1460 List
<AntTaskDocument
.AntTask
> l
= udats
.getAntTaskList();
1461 ListIterator li
= l
.listIterator();
1463 while (li
.hasNext()) {
1464 AntTaskDocument
.AntTask at
= (AntTaskDocument
.AntTask
)li
.next();
1465 saa
[i
][0] = at
.getId() + "";
1466 saa
[i
][1] = saa
[i
][2] = "";
1467 if (at
.getFilename() != null){
1468 saa
[i
][1] = at
.getFilename();
1470 if (at
.getAntCmdOptions() != null) {
1471 saa
[i
][2] = at
.getAntCmdOptions();
1476 public void genBuildOptionsOpt(Vector
<Object
> buildTargets
, String toolChain
, String tagName
, String toolCmd
, Vector
<Object
> archList
, String contents
) {
1477 OptionsDocument
.Options opts
= getfpdBuildOpts().getOptions();
1479 opts
= getfpdBuildOpts().addNewOptions();
1481 OptionDocument
.Option opt
= opts
.addNewOption();
1482 setBuildOptionsOpt(buildTargets
, toolChain
, tagName
, toolCmd
, archList
, contents
, opt
);
1485 private void setBuildOptionsOpt(Vector
<Object
> buildTargets
, String toolChain
, String tagName
, String toolCmd
, Vector
<Object
> archList
, String contents
, OptionDocument
.Option opt
){
1486 opt
.setStringValue(contents
);
1488 opt
.setBuildTargets(buildTargets
);
1489 opt
.setToolChainFamily(toolChain
);
1490 opt
.setTagName(tagName
);
1491 opt
.setToolCode(toolCmd
);
1493 if (archList
!= null) {
1494 opt
.setSupArchList(archList
);
1497 if (opt
.isSetSupArchList()) {
1498 opt
.unsetSupArchList();
1503 public void removeBuildOptionsOpt(int i
){
1505 XmlObject o
= getfpdBuildOpts().getOptions();
1510 XmlCursor cursor
= o
.newCursor();
1511 if (cursor
.toFirstChild()) {
1512 for (int j
= 0; j
< i
; ++j
) {
1513 cursor
.toNextSibling();
1516 if (getBuildOptionsOptCount() == 0) {
1524 public void updateBuildOptionsOpt(int i
, Vector
<Object
> buildTargets
, String toolChain
, String tagName
, String toolCmd
, Vector
<Object
> archList
, String contents
) {
1525 XmlObject o
= getfpdBuildOpts().getOptions();
1530 XmlCursor cursor
= o
.newCursor();
1531 if (cursor
.toFirstChild()) {
1532 for (int j
= 0; j
< i
; ++j
) {
1533 cursor
.toNextSibling();
1535 OptionDocument
.Option opt
= (OptionDocument
.Option
)cursor
.getObject();
1536 setBuildOptionsOpt(buildTargets
, toolChain
, tagName
, toolCmd
, archList
, contents
, opt
);
1541 public int getBuildOptionsOptCount(){
1542 if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {
1545 return getfpdBuildOpts().getOptions().getOptionList().size();
1548 public void getBuildOptionsOpts(String
[][] saa
) {
1549 if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {
1553 List
<OptionDocument
.Option
> lOpt
= getfpdBuildOpts().getOptions().getOptionList();
1554 ListIterator li
= lOpt
.listIterator();
1556 while(li
.hasNext()) {
1557 OptionDocument
.Option opt
= (OptionDocument
.Option
)li
.next();
1558 if (opt
.getBuildTargets() != null) {
1559 saa
[i
][0] = listToString(opt
.getBuildTargets());
1561 saa
[i
][1] = opt
.getToolChainFamily();
1562 if (opt
.getSupArchList() != null){
1563 saa
[i
][2] = listToString(opt
.getSupArchList());
1566 saa
[i
][3] = opt
.getToolCode();
1567 saa
[i
][4] = opt
.getTagName();
1568 saa
[i
][5] = opt
.getStringValue();
1574 public void genBuildOptionsFfs(String ffsKey
, String type
) {
1575 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getfpdBuildOpts().addNewFfs();
1576 ffs
.setFfsKey(ffsKey
);
1578 ffs
.addNewSections().setEncapsulationType(type
);
1582 public void updateBuildOptionsFfsSectionsType(int i
, String type
) {
1583 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getfpdBuildOpts().addNewFfs();
1585 ffs
.addNewSections().setEncapsulationType(type
);
1589 public void genBuildOptionsFfsAttribute(int i
, String name
, String value
) {
1590 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1591 BuildOptionsDocument
.BuildOptions
.Ffs
.Attribute attrib
= ffs
.addNewAttribute();
1592 attrib
.setName(name
);
1593 attrib
.setValue(value
);
1596 /**update jth attribute of ith ffs.
1600 public void updateBuildOptionsFfsAttribute(int i
, int j
, String name
, String value
){
1601 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1602 XmlCursor cursor
= ffs
.newCursor();
1603 QName qAttrib
= new QName(xmlNs
, "Attribute");
1604 if (cursor
.toChild(qAttrib
)) {
1605 for (int k
= 0; k
< j
; ++k
) {
1606 cursor
.toNextSibling(qAttrib
);
1608 BuildOptionsDocument
.BuildOptions
.Ffs
.Attribute attrib
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Attribute
)cursor
.getObject();
1609 attrib
.setName(name
);
1610 attrib
.setValue(value
);
1615 public void removeBuildOptionsFfsAttribute(int i
, int j
){
1616 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1617 XmlCursor cursor
= ffs
.newCursor();
1618 QName qAttrib
= new QName(xmlNs
, "Attribute");
1619 if (cursor
.toChild(qAttrib
)) {
1620 for (int k
= 0; k
< j
; ++k
) {
1621 cursor
.toNextSibling(qAttrib
);
1628 public void genBuildOptionsFfsSectionsSection(int i
, String sectionType
) {
1629 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1633 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1635 if (sections
== null){
1636 sections
= ffs
.addNewSections();
1638 sections
.addNewSection().setSectionType(EfiSectionType
.Enum
.forString(sectionType
));
1641 public void removeBuildOptionsFfsSectionsSection(int i
, int j
) {
1642 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1643 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1644 if (sections
== null) {
1647 XmlCursor cursor
= sections
.newCursor();
1648 QName qSection
= new QName(xmlNs
, "Section");
1649 if (cursor
.toChild(qSection
)) {
1650 for (int k
= 0; k
< j
; ++k
) {
1651 cursor
.toNextSibling(qSection
);
1658 public void updateBuildOptionsFfsSectionsSection(int i
, int j
, String type
){
1659 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1660 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1661 if (sections
== null) {
1664 XmlCursor cursor
= sections
.newCursor();
1665 QName qSection
= new QName(xmlNs
, "Section");
1666 if (cursor
.toChild(qSection
)) {
1667 for (int k
= 0; k
< j
; ++k
) {
1668 cursor
.toNextSibling(qSection
);
1670 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Section section
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Section
)cursor
.getObject();
1671 section
.setSectionType(EfiSectionType
.Enum
.forString(type
));
1676 public void genBuildOptionsFfsSectionsSections(int i
, String encapType
) {
1677 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1681 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1683 if (sections
== null){
1684 sections
= ffs
.addNewSections();
1686 sections
.addNewSections().setEncapsulationType(encapType
);
1689 public void removeBuildOptionsFfsSectionsSections(int i
, int j
) {
1690 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1691 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1692 if (sections
== null) {
1695 XmlCursor cursor
= sections
.newCursor();
1696 QName qSections
= new QName(xmlNs
, "Sections");
1697 if (cursor
.toChild(qSections
)) {
1698 for (int k
= 0; k
< j
; ++k
) {
1699 cursor
.toNextSibling(qSections
);
1706 public void updateBuildOptionsFfsSectionsSections(int i
, int j
, String type
) {
1707 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1708 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1709 if (sections
== null) {
1712 XmlCursor cursor
= sections
.newCursor();
1713 QName qSections
= new QName(xmlNs
, "Sections");
1714 if (cursor
.toChild(qSections
)) {
1715 for (int k
= 0; k
< j
; ++k
) {
1716 cursor
.toNextSibling(qSections
);
1718 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2 sections2
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
)cursor
.getObject();
1719 sections2
.setEncapsulationType(type
);
1724 public void genBuildOptionsFfsSectionsSectionsSection(int i
, int j
, String type
) {
1725 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1729 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1730 XmlCursor cursor
= sections
.newCursor();
1731 QName qSections
= new QName(xmlNs
, "Sections");
1732 if (cursor
.toChild(qSections
)){
1733 for (int k
= 0; k
< j
; ++k
) {
1734 cursor
.toNextSibling(qSections
);
1736 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2 sections2
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
)cursor
.getObject();
1737 sections2
.addNewSection().setSectionType(EfiSectionType
.Enum
.forString(type
));
1742 public void removeBuildOptionsFfsSectionsSectionsSection(int i
, int j
, int k
) {
1743 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1744 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1745 if (sections
== null) {
1748 XmlCursor cursor
= sections
.newCursor();
1749 QName qSections
= new QName(xmlNs
, "Sections");
1750 if (cursor
.toChild(qSections
)) {
1751 for (int l
= 0; l
< j
; ++l
) {
1752 cursor
.toNextSibling(qSections
);
1754 if (cursor
.toFirstChild()) {
1756 for (; m
< k
; ++m
) {
1757 cursor
.toNextSibling();
1769 public void updateBuildOptionsFfsSectionsSectionsSection(int i
, int j
, int k
, String type
) {
1770 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1771 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1772 if (sections
== null) {
1775 XmlCursor cursor
= sections
.newCursor();
1776 QName qSections
= new QName(xmlNs
, "Sections");
1777 if (cursor
.toChild(qSections
)) {
1778 for (int l
= 0; l
< j
; ++l
) {
1779 cursor
.toNextSibling(qSections
);
1781 if (cursor
.toFirstChild()) {
1782 for (int m
= 0; m
< k
; ++m
) {
1783 cursor
.toNextSibling();
1785 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
.Section section
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
.Section
)cursor
.getObject();
1786 section
.setSectionType(EfiSectionType
.Enum
.forString(type
));
1792 public void getBuildOptionsFfsSectionsSectionsSection(int i
, int j
, ArrayList
<String
> al
) {
1793 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1797 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections sections
= ffs
.getSections();
1798 XmlCursor cursor
= sections
.newCursor();
1799 QName qSections
= new QName(xmlNs
, "Sections");
1800 if (cursor
.toChild(qSections
)){
1801 for (int k
= 0; k
< j
; ++k
) {
1802 cursor
.toNextSibling(qSections
);
1804 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2 sections2
= (BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
)cursor
.getObject();
1805 if (sections2
.getSectionList() == null){
1809 ListIterator
<BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
.Section
> li
= sections2
.getSectionList().listIterator();
1810 while(li
.hasNext()) {
1811 BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
.Section section
= li
.next();
1812 if (section
.isSetSectionType()) {
1813 al
.add(section
.getSectionType().toString());
1822 public int getBuildOptionsFfsCount(){
1823 if (getfpdBuildOpts().getFfsList() == null) {
1826 return getfpdBuildOpts().getFfsList().size();
1829 public void getBuildOptionsFfsKey(String
[][] saa
) {
1830 if (getfpdBuildOpts().getFfsList() == null) {
1833 ListIterator
<BuildOptionsDocument
.BuildOptions
.Ffs
> li
= getfpdBuildOpts().getFfsList().listIterator();
1835 while(li
.hasNext()){
1836 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= li
.next();
1837 saa
[i
][0] = ffs
.getFfsKey();
1842 public void updateBuildOptionsFfsKey(int i
, String key
) {
1843 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1847 /**Get ith FFS key and contents.
1850 public void getBuildOptionsFfs(int i
, String
[] sa
, LinkedHashMap
<String
, String
> ffsAttribMap
, ArrayList
<String
> firstLevelSections
, ArrayList
<String
> firstLevelSection
) {
1851 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1855 sa
[0] = ffs
.getFfsKey();
1856 if (ffs
.getSections() != null) {
1857 if(ffs
.getSections().getEncapsulationType() != null){
1858 sa
[1] = ffs
.getSections().getEncapsulationType();
1860 if (ffs
.getSections().getSectionList() != null){
1861 ListIterator
<BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Section
> li
= ffs
.getSections().getSectionList().listIterator();
1862 while (li
.hasNext()) {
1863 firstLevelSection
.add(li
.next().getSectionType().toString());
1866 if (ffs
.getSections().getSectionsList() != null) {
1867 ListIterator
<BuildOptionsDocument
.BuildOptions
.Ffs
.Sections
.Sections2
> li
= ffs
.getSections().getSectionsList().listIterator();
1868 while(li
.hasNext()) {
1869 firstLevelSections
.add(li
.next().getEncapsulationType());
1873 if (ffs
.getAttributeList() != null) {
1874 ListIterator
<BuildOptionsDocument
.BuildOptions
.Ffs
.Attribute
> li
= ffs
.getAttributeList().listIterator();
1875 while(li
.hasNext()) {
1876 BuildOptionsDocument
.BuildOptions
.Ffs
.Attribute attrib
= li
.next();
1877 ffsAttribMap
.put(attrib
.getName(), attrib
.getValue());
1886 private BuildOptionsDocument
.BuildOptions
.Ffs
getFfs(int i
) {
1887 XmlObject o
= getfpdBuildOpts();
1888 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= null;
1890 XmlCursor cursor
= o
.newCursor();
1891 QName qFfs
= new QName(xmlNs
, "Ffs");
1892 if (cursor
.toChild(qFfs
)) {
1893 for (int j
= 0; j
< i
; ++j
) {
1894 cursor
.toNextSibling(qFfs
);
1896 ffs
= (BuildOptionsDocument
.BuildOptions
.Ffs
)cursor
.getObject();
1902 public void removeBuildOptionsFfs(int i
) {
1903 BuildOptionsDocument
.BuildOptions
.Ffs ffs
= getFfs(i
);
1908 XmlCursor cursor
= ffs
.newCursor();
1915 public PlatformDefinitionsDocument
.PlatformDefinitions
getfpdPlatformDefs(){
1916 if (fpdPlatformDefs
== null){
1917 fpdPlatformDefs
= fpdRoot
.addNewPlatformDefinitions();
1919 return fpdPlatformDefs
;
1922 public void getPlatformDefsSupportedArchs(Vector
<Object
> archs
){
1923 if (getfpdPlatformDefs().getSupportedArchitectures() == null) {
1926 ListIterator li
= getfpdPlatformDefs().getSupportedArchitectures().listIterator();
1927 while(li
.hasNext()) {
1928 archs
.add(li
.next());
1932 public void setPlatformDefsSupportedArchs(Vector
<Object
> archs
) {
1933 if (archs
!= null) {
1934 getfpdPlatformDefs().setSupportedArchitectures(archs
);
1937 // XmlCursor cursor = getfpdPlatformDefs().newCursor();
1938 // if (cursor.toChild(xmlNs, "SupportedArchitectures")) {
1939 // cursor.removeXml();
1941 // cursor.dispose();
1945 public void getPlatformDefsBuildTargets(Vector
<Object
> targets
) {
1946 if (getfpdPlatformDefs().getBuildTargets() == null) {
1949 ListIterator li
= getfpdPlatformDefs().getBuildTargets().listIterator();
1950 while(li
.hasNext()) {
1951 targets
.add(li
.next());
1955 public void setPlatformDefsBuildTargets(Vector
<Object
> targets
) {
1956 getfpdPlatformDefs().setBuildTargets(targets
);
1959 public void genPlatformDefsSkuInfo(String id
, String name
) {
1960 SkuInfoDocument
.SkuInfo skuInfo
= null;
1961 if (getfpdPlatformDefs().getSkuInfo() == null) {
1962 skuInfo
= getfpdPlatformDefs().addNewSkuInfo();
1964 skuInfo
= getfpdPlatformDefs().getSkuInfo();
1965 if (skuInfo
.getUiSkuNameList() == null || skuInfo
.getUiSkuNameList().size() == 0) {
1966 SkuInfoDocument
.SkuInfo
.UiSkuName skuName
= skuInfo
.addNewUiSkuName();
1967 skuName
.setSkuID(new BigInteger("0"));
1968 skuName
.setStringValue("DEFAULT");
1970 if (id
.equals("0")) {
1973 SkuInfoDocument
.SkuInfo
.UiSkuName skuName
= skuInfo
.addNewUiSkuName();
1974 skuName
.setSkuID(new BigInteger(id
));
1975 skuName
.setStringValue(name
);
1978 public int getPlatformDefsSkuInfoCount(){
1979 if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {
1982 return getfpdPlatformDefs().getSkuInfo().getUiSkuNameList().size();
1985 public void getPlatformDefsSkuInfos(String
[][] saa
){
1986 if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {
1987 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) {
1988 removeElement(getfpdDynPcdBuildDefs());
1989 fpdDynPcdBuildDefs
= null;
1994 List
<SkuInfoDocument
.SkuInfo
.UiSkuName
> l
= getfpdPlatformDefs().getSkuInfo().getUiSkuNameList();
1995 ListIterator
<SkuInfoDocument
.SkuInfo
.UiSkuName
> li
= l
.listIterator();
1997 while(li
.hasNext()) {
1998 SkuInfoDocument
.SkuInfo
.UiSkuName sku
= li
.next();
1999 saa
[i
][0] = sku
.getSkuID()+"";
2000 saa
[i
][1] = sku
.getStringValue();
2005 public void removePlatformDefsSkuInfo(int i
) {
2006 SkuInfoDocument
.SkuInfo skuInfo
= getfpdPlatformDefs().getSkuInfo();
2007 if (skuInfo
== null || i
== 0) {
2011 XmlCursor cursor
= skuInfo
.newCursor();
2012 if (cursor
.toFirstChild()) {
2013 for (int j
= 0; j
< i
; ++j
) {
2014 cursor
.toNextSibling();
2021 public void updatePlatformDefsSkuInfo(int i
, String id
, String name
) {
2022 SkuInfoDocument
.SkuInfo skuInfo
= getfpdPlatformDefs().getSkuInfo();
2023 if (skuInfo
== null || i
== 0) {
2027 XmlCursor cursor
= skuInfo
.newCursor();
2028 if (cursor
.toFirstChild()) {
2029 for (int j
= 0; j
< i
; ++j
) {
2030 cursor
.toNextSibling();
2032 SkuInfoDocument
.SkuInfo
.UiSkuName sku
= (SkuInfoDocument
.SkuInfo
.UiSkuName
)cursor
.getObject();
2033 sku
.setSkuID(new BigInteger(id
));
2034 sku
.setStringValue(name
);
2039 public String
getPlatformDefsInterDir(){
2040 if (getfpdPlatformDefs().getIntermediateDirectories() == null) {
2043 return getfpdPlatformDefs().getIntermediateDirectories().toString();
2046 public void setPlatformDefsInterDir(String interDir
){
2047 getfpdPlatformDefs().setIntermediateDirectories(IntermediateOutputType
.Enum
.forString(interDir
));
2050 public String
getPlatformDefsOutputDir() {
2051 return getfpdPlatformDefs().getOutputDirectory();
2054 public void setPlatformDefsOutputDir(String outputDir
) {
2055 if (outputDir
!= null && outputDir
.length() > 0) {
2056 getfpdPlatformDefs().setOutputDirectory(outputDir
);
2059 XmlCursor cursor
= getfpdPlatformDefs().newCursor();
2060 if (cursor
.toChild(new QName(xmlNs
, "OutputDirectory"))) {
2067 public FlashDocument
.Flash
getfpdFlash() {
2068 if (fpdFlash
== null) {
2069 fpdFlash
= fpdRoot
.addNewFlash();
2074 public void genFlashDefinitionFile(String file
) {
2075 FlashDefinitionFileDocument
.FlashDefinitionFile fdf
= getfpdFlash().getFlashDefinitionFile();
2077 fdf
= getfpdFlash().addNewFlashDefinitionFile();
2080 fdf
.setStringValue(file
);
2083 public String
getFlashDefinitionFile() {
2084 FlashDefinitionFileDocument
.FlashDefinitionFile fdf
= getfpdFlash().getFlashDefinitionFile();
2089 return fdf
.getStringValue();
2092 public void genFvImagesNameValue(String name
, String value
) {
2094 FvImagesDocument
.FvImages fi
= getfpdFlash().getFvImages();
2096 fi
= getfpdFlash().addNewFvImages();
2099 FvImagesDocument
.FvImages
.NameValue nv
= fi
.addNewNameValue();
2104 public void removeFvImagesNameValue(int i
){
2106 XmlObject o
= getfpdFlash().getFvImages();
2111 QName qNameValue
= new QName(xmlNs
, "NameValue");
2112 XmlCursor cursor
= o
.newCursor();
2113 if (cursor
.toChild(qNameValue
)) {
2114 for (int j
= 0; j
< i
; ++j
) {
2115 cursor
.toNextSibling(qNameValue
);
2122 public void updateFvImagesNameValue(int i
, String name
, String value
){
2124 XmlObject o
= getfpdFlash().getFvImages();
2129 QName qNameValue
= new QName(xmlNs
, "NameValue");
2130 XmlCursor cursor
= o
.newCursor();
2131 if (cursor
.toChild(qNameValue
)) {
2132 for (int j
= 0; j
< i
; ++j
) {
2133 cursor
.toNextSibling(qNameValue
);
2135 FvImagesDocument
.FvImages
.NameValue nv
= (FvImagesDocument
.FvImages
.NameValue
)cursor
.getObject();
2142 public int getFvImagesNameValueCount() {
2144 FvImagesDocument
.FvImages fi
= null;
2145 if ((fi
= getfpdFlash().getFvImages()) == null || fi
.getNameValueList() == null) {
2148 return fi
.getNameValueList().size();
2151 public void getFvImagesNameValues(String
[][] nv
) {
2153 FvImagesDocument
.FvImages fi
= getfpdFlash().getFvImages();
2157 List
<FvImagesDocument
.FvImages
.NameValue
> l
= fi
.getNameValueList();
2159 ListIterator li
= l
.listIterator();
2160 while (li
.hasNext()) {
2161 FvImagesDocument
.FvImages
.NameValue e
= (FvImagesDocument
.FvImages
.NameValue
) li
2163 nv
[i
][0] = e
.getName();
2164 nv
[i
][1] = e
.getValue();
2170 public void genFvImagesFvImage(String
[] names
, String types
, Map
<String
, String
> options
) {
2172 FvImagesDocument
.FvImages fis
= null;
2173 if ((fis
= getfpdFlash().getFvImages()) == null) {
2174 fis
= getfpdFlash().addNewFvImages();
2178 //gen FvImage with FvImageNames array
2180 FvImagesDocument
.FvImages
.FvImage fi
= fis
.addNewFvImage();
2181 for (int i
= 0; i
< names
.length
; ++i
) {
2182 fi
.addFvImageNames(names
[i
]);
2184 fi
.setType(FvImageTypes
.Enum
.forString(types
));
2185 if (options
!= null){
2186 setFvImagesFvImageFvImageOptions(options
, fi
);
2190 private void setFvImagesFvImageFvImageOptions(Map
<String
, String
> options
, FvImagesDocument
.FvImages
.FvImage fi
){
2191 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions fio
= fi
.getFvImageOptions();
2193 fio
= fi
.addNewFvImageOptions();
2196 Set
<String
> key
= options
.keySet();
2197 Iterator
<String
> i
= key
.iterator();
2198 while (i
.hasNext()) {
2200 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nv
= fio
.addNewNameValue();
2201 String k
= (String
)i
.next();
2204 nv
.setValue((String
)options
.get(k
));
2211 public void removeFvImagesFvImage(int i
) {
2213 XmlObject o
= getfpdFlash().getFvImages();
2218 QName qFvImage
= new QName(xmlNs
, "FvImage");
2219 XmlCursor cursor
= o
.newCursor();
2220 if (cursor
.toChild(qFvImage
)) {
2221 for (int j
= 0; j
< i
; ++j
) {
2222 cursor
.toNextSibling(qFvImage
);
2229 public void updateFvImagesFvImage(int i
, String
[] names
, String types
, Map
<String
, String
> options
){
2231 XmlObject o
= getfpdFlash().getFvImages();
2235 XmlCursor cursor
= o
.newCursor();
2236 QName qFvImage
= new QName(xmlNs
, "FvImage");
2237 if (cursor
.toChild(qFvImage
)) {
2238 for (int j
= 0; j
< i
; ++j
) {
2239 cursor
.toNextSibling(qFvImage
);
2241 FvImagesDocument
.FvImages
.FvImage fi
= (FvImagesDocument
.FvImages
.FvImage
)cursor
.getObject();
2242 fi
.setType(FvImageTypes
.Enum
.forString(types
));
2245 // remove old FvImageNames before adding new ones
2247 QName qFvImageNames
= new QName(xmlNs
, "FvImageNames");
2248 cursor
.toChild(qFvImageNames
);
2250 while (cursor
.toNextSibling(qFvImageNames
)) {
2254 for (int k
= 0; k
< names
.length
; ++k
) {
2255 fi
.addFvImageNames(names
[k
]);
2258 // remove old FvImageOptions before adding new options
2260 QName qFvImageOptions
= new QName(xmlNs
, "FvImageOptions");
2261 cursor
.toNextSibling(qFvImageOptions
);
2264 setFvImagesFvImageFvImageOptions(options
, fi
);
2269 public int getFvImagesFvImageCount() {
2271 if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) {
2274 return getfpdFlash().getFvImages().getFvImageList().size();
2277 /**Only Get Fv image setting - name and type.
2280 public void getFvImagesFvImages(String
[][] saa
) {
2282 if (getfpdFlash().getFvImages() == null) {
2285 List
<FvImagesDocument
.FvImages
.FvImage
> l
= getfpdFlash().getFvImages().getFvImageList();
2289 ListIterator li
= l
.listIterator();
2291 while(li
.hasNext()) {
2292 FvImagesDocument
.FvImages
.FvImage fi
= (FvImagesDocument
.FvImages
.FvImage
)li
.next();
2294 // get FvImageNames array, space separated
2296 List
<String
> lfn
= fi
.getFvImageNamesList();
2297 ListIterator lfni
= lfn
.listIterator();
2299 while (lfni
.hasNext()) {
2300 saa
[i
][0] += (String
)lfni
.next();
2303 saa
[i
][0] = saa
[i
][0].trim();
2305 saa
[i
][1] = fi
.getType()+"";
2311 /**Get FvImage Options for FvImage i
2312 * @param i the ith FvImage
2314 public void getFvImagesFvImageOptions(int i
, Map
<String
, String
> m
) {
2315 XmlObject o
= getfpdFlash().getFvImages();
2319 XmlCursor cursor
= o
.newCursor();
2320 QName qFvImage
= new QName(xmlNs
, "FvImage");
2321 if (cursor
.toChild(qFvImage
)) {
2322 for (int j
= 0; j
< i
; ++j
) {
2323 cursor
.toNextSibling(qFvImage
);
2325 FvImagesDocument
.FvImages
.FvImage fi
= (FvImagesDocument
.FvImages
.FvImage
)cursor
.getObject();
2326 if (fi
.getFvImageOptions() == null || fi
.getFvImageOptions().getNameValueList() == null){
2329 ListIterator
<FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue
> li
= fi
.getFvImageOptions().getNameValueList().listIterator();
2330 while(li
.hasNext()){
2331 FvImagesDocument
.FvImages
.FvImage
.FvImageOptions
.NameValue nv
= li
.next();
2332 m
.put(nv
.getName(), nv
.getValue());
2338 Get platform header element
2339 @return PlatformHeaderDocument.PlatformHeader
2341 public PlatformHeaderDocument
.PlatformHeader
getFpdHdr() {
2342 if (fpdHdr
== null) {
2343 fpdHdr
= fpdRoot
.addNewPlatformHeader();
2349 public String
getFpdHdrPlatformName() {
2350 return getFpdHdr().getPlatformName();
2353 public String
getFpdHdrGuidValue() {
2354 return getFpdHdr().getGuidValue();
2357 public String
getFpdHdrVer() {
2358 return getFpdHdr().getVersion();
2361 public String
getFpdHdrAbs() {
2362 return getFpdHdr().getAbstract();
2365 public String
getFpdHdrDescription() {
2366 return getFpdHdr().getDescription();
2369 public String
getFpdHdrCopyright() {
2370 return getFpdHdr().getCopyright();
2373 public String
getFpdHdrLicense() {
2374 LicenseDocument
.License l
= getFpdHdr().getLicense();
2378 return l
.getStringValue();
2381 public String
getFpdHdrUrl() {
2382 LicenseDocument
.License l
= getFpdHdr().getLicense();
2389 public String
getFpdHdrSpec() {
2391 return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";
2392 // return getFpdHdr().getSpecification();
2395 public void setFpdHdrPlatformName(String name
){
2396 getFpdHdr().setPlatformName(name
);
2399 public void setFpdHdrGuidValue(String guid
){
2400 getFpdHdr().setGuidValue(guid
);
2403 public void setFpdHdrVer(String v
){
2404 getFpdHdr().setVersion(v
);
2407 public void setFpdHdrAbs(String abs
) {
2408 getFpdHdr().setAbstract(abs
);
2411 public void setFpdHdrDescription(String desc
){
2412 getFpdHdr().setDescription(desc
);
2415 public void setFpdHdrCopyright(String cr
) {
2416 getFpdHdr().setCopyright(cr
);
2419 public void setFpdHdrLicense(String license
){
2420 LicenseDocument
.License l
= getFpdHdr().getLicense();
2422 getFpdHdr().addNewLicense().setStringValue(license
);
2425 l
.setStringValue(license
);
2429 public void setFpdHdrUrl(String url
){
2430 LicenseDocument
.License l
= getFpdHdr().getLicense();
2436 public void setFpdHdrSpec(String s
){
2437 s
= "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";
2438 getFpdHdr().setSpecification(s
);
2441 Save the processed xml contents to file
2443 @param fpdFile The file to save xml contents
2444 @throws IOException Exceptions during file operation
2446 public void saveAs(File fpdFile
) throws IOException
{
2448 XmlOptions options
= new XmlOptions();
2450 options
.setCharacterEncoding("UTF-8");
2451 options
.setSavePrettyPrint();
2452 options
.setSavePrettyPrintIndent(2);
2454 fpdd
.save(fpdFile
, options
);
2455 } catch (IOException e
) {
2456 e
.printStackTrace();
2461 private String
listToString(List l
) {
2466 ListIterator li
= l
.listIterator();
2467 while(li
.hasNext()) {
2474 private void removeElement(XmlObject o
) {
2475 XmlCursor cursor
= o
.newCursor();
2481 class PcdItemTypeConflictException
extends Exception
{
2486 private static final long serialVersionUID
= 1L;
2487 private String details
= null;
2489 PcdItemTypeConflictException(String pcdName
, String info
){
2490 ModuleIdentification mi
= GlobalData
.getModuleId(info
);
2491 details
= pcdName
+ " ItemType Conflicts with " + mi
.getName() + " in Pkg " + mi
.getPackage().getName();
2494 public String
getMessage() {
2499 class PcdDeclNotFound
extends Exception
{
2504 private static final long serialVersionUID
= 1L;
2505 private String details
= null;
2507 PcdDeclNotFound(String info
) {
2508 details
= "PcdDeclNotFound: " + info
;
2511 public String
getMessage() {
2516 class PcdValueMalFormed
extends Exception
{
2521 private static final long serialVersionUID
= 1L;
2522 private String details
= null;
2524 PcdValueMalFormed(String info
) {
2525 details
= "PcdValueMalFormed: " + info
;
2528 public String
getMessage() {