1fcece4a37628302d866e4606f46e02225c11bc2
[people/mcb30/edk2.git] / edk2 / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdFileContents.java
1 /** @file\r
2   Java class FpdFileContents is used to parse fpd xml file.\r
3  \r
4 Copyright (c) 2006, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 **/\r
13 package org.tianocore.frameworkwizard.platform.ui;\r
14 \r
15 import java.io.File;\r
16 import java.io.IOException;\r
17 import java.math.BigInteger;\r
18 import java.util.ArrayList;\r
19 import java.util.HashMap;\r
20 import java.util.Iterator;\r
21 import java.util.LinkedHashMap;\r
22 import java.util.List;\r
23 import java.util.ListIterator;\r
24 import java.util.Map;\r
25 import java.util.Set;\r
26 import java.util.Vector;\r
27 \r
28 import javax.xml.namespace.QName;\r
29 \r
30 import org.apache.xmlbeans.XmlCursor;\r
31 import org.apache.xmlbeans.XmlObject;\r
32 import org.apache.xmlbeans.XmlOptions;\r
33 import org.tianocore.AntTaskDocument;\r
34 import org.tianocore.BuildOptionsDocument;\r
35 import org.tianocore.DynamicPcdBuildDefinitionsDocument;\r
36 import org.tianocore.EfiSectionType;\r
37 import org.tianocore.FlashDefinitionFileDocument;\r
38 import org.tianocore.FlashDocument;\r
39 import org.tianocore.FrameworkModulesDocument;\r
40 import org.tianocore.IntermediateOutputType;\r
41 import org.tianocore.LibrariesDocument;\r
42 import org.tianocore.ModuleSADocument;\r
43 import org.tianocore.ModuleSurfaceAreaDocument;\r
44 import org.tianocore.OptionDocument;\r
45 import org.tianocore.OptionsDocument;\r
46 import org.tianocore.PcdBuildDefinitionDocument;\r
47 import org.tianocore.PcdCodedDocument;\r
48 import org.tianocore.PcdDataTypes;\r
49 import org.tianocore.PcdDeclarationsDocument;\r
50 import org.tianocore.PcdItemTypes;\r
51 import org.tianocore.PlatformDefinitionsDocument;\r
52 import org.tianocore.PlatformSurfaceAreaDocument;\r
53 import org.tianocore.FvImageTypes;\r
54 import org.tianocore.FvImagesDocument;\r
55 import org.tianocore.LicenseDocument;\r
56 import org.tianocore.PlatformHeaderDocument;\r
57 import org.tianocore.SkuInfoDocument;\r
58 import org.tianocore.UserDefinedAntTasksDocument;\r
59 import org.tianocore.frameworkwizard.platform.ui.global.GlobalData;\r
60 import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
61 import org.tianocore.frameworkwizard.platform.ui.id.ModuleIdentification;\r
62 import org.tianocore.frameworkwizard.platform.ui.id.PackageIdentification;\r
63 \r
64 /**\r
65  This class processes fpd file contents such as add remove xml elements. \r
66  @since PackageEditor 1.0\r
67 **/\r
68 public class FpdFileContents {\r
69 \r
70     static final String xmlNs = "http://www.TianoCore.org/2006/Edk2.0";\r
71     \r
72     private PlatformSurfaceAreaDocument fpdd = null;\r
73     \r
74     private PlatformSurfaceAreaDocument.PlatformSurfaceArea fpdRoot = null;\r
75     \r
76     private PlatformHeaderDocument.PlatformHeader fpdHdr = null;\r
77     \r
78     private PlatformDefinitionsDocument.PlatformDefinitions fpdPlatformDefs = null;\r
79     \r
80     private FlashDocument.Flash fpdFlash = null;\r
81     \r
82     private BuildOptionsDocument.BuildOptions fpdBuildOpts = null;\r
83     \r
84     private FrameworkModulesDocument.FrameworkModules fpdFrameworkModules = null;\r
85     \r
86     private DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs = null;\r
87     \r
88     private HashMap<String, ArrayList<String>> dynPcdMap = null;\r
89     \r
90     /**\r
91      * look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings.\r
92      */\r
93     public void initDynPcdMap() {\r
94       if (dynPcdMap == null) {\r
95           dynPcdMap = new HashMap<String, ArrayList<String>>();\r
96           List<ModuleSADocument.ModuleSA> l = getfpdFrameworkModules().getModuleSAList();\r
97           if (l == null) {\r
98               return;\r
99           }\r
100           ListIterator<ModuleSADocument.ModuleSA> li = l.listIterator();\r
101           while (li.hasNext()) {\r
102               ModuleSADocument.ModuleSA msa = li.next();\r
103               if (msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null) {\r
104                   continue;\r
105               }\r
106               String ModuleInfo = msa.getModuleGuid() + " " + msa.getModuleVersion() +\r
107                " " + msa.getPackageGuid() + " " + msa.getPackageVersion();\r
108               List<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> lp = msa.getPcdBuildDefinition().getPcdDataList();\r
109               ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> lpi = lp.listIterator();\r
110               while (lpi.hasNext()) {\r
111                   PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = lpi.next();\r
112                   String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
113                   if (dynPcdMap.get(pcdKey) == null) {\r
114                       ArrayList<String> al = new ArrayList<String>();\r
115                       al.add(ModuleInfo + " " + pcdData.getItemType().toString());\r
116                       dynPcdMap.put(pcdKey, al);\r
117                   }\r
118                   else{\r
119                       dynPcdMap.get(pcdKey).add(ModuleInfo + " " + pcdData.getItemType().toString());\r
120                   }\r
121               }\r
122           }\r
123       }\r
124     }\r
125     \r
126     public ArrayList<String> getDynPcdMapValue(String key) {\r
127         return dynPcdMap.get(key);\r
128     }\r
129     /**\r
130      Constructor to create a new spd file\r
131      **/\r
132     public FpdFileContents() {\r
133 \r
134         fpdd = PlatformSurfaceAreaDocument.Factory.newInstance();\r
135         fpdRoot = fpdd.addNewPlatformSurfaceArea();\r
136 \r
137     }\r
138 \r
139     /**\r
140      Constructor for existing document object\r
141      @param psa\r
142      **/\r
143     public FpdFileContents(PlatformSurfaceAreaDocument.PlatformSurfaceArea fpd) {\r
144         fpdRoot = fpd;\r
145         fpdHdr = fpdRoot.getPlatformHeader();\r
146         fpdPlatformDefs = fpdRoot.getPlatformDefinitions();\r
147         fpdBuildOpts = fpdRoot.getBuildOptions();\r
148         fpdFrameworkModules = fpdRoot.getFrameworkModules();\r
149         fpdDynPcdBuildDefs = fpdRoot.getDynamicPcdBuildDefinitions();\r
150         fpdFlash = fpdRoot.getFlash();\r
151     }\r
152 \r
153     /**\r
154      Constructor based on an existing spd file\r
155      \r
156      @param f Existing spd file\r
157      **/\r
158     public FpdFileContents(File f) {\r
159         try {\r
160             fpdd = PlatformSurfaceAreaDocument.Factory.parse(f);\r
161             fpdRoot = fpdd.getPlatformSurfaceArea();\r
162         } catch (Exception e) {\r
163             System.out.println(e.toString());\r
164         }\r
165     }\r
166     \r
167     public DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions getfpdDynPcdBuildDefs() {\r
168         if (fpdDynPcdBuildDefs == null){\r
169             fpdDynPcdBuildDefs = fpdRoot.addNewDynamicPcdBuildDefinitions();\r
170         }\r
171         return fpdDynPcdBuildDefs;\r
172     }\r
173    \r
174     public FrameworkModulesDocument.FrameworkModules getfpdFrameworkModules() {\r
175         if (fpdFrameworkModules == null){\r
176             fpdFrameworkModules = fpdRoot.addNewFrameworkModules();\r
177         }\r
178         return fpdFrameworkModules;\r
179     }\r
180     \r
181     public int getFrameworkModulesCount() {\r
182         if (getfpdFrameworkModules().getModuleSAList() == null){\r
183             return 0;\r
184         }\r
185         return getfpdFrameworkModules().getModuleSAList().size();\r
186     }\r
187     \r
188     public void getFrameworkModulesInfo(String[][] saa) {\r
189         if (getFrameworkModulesCount() == 0){\r
190             return;\r
191         }\r
192         \r
193         ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator();\r
194         int i = 0;\r
195         while(li.hasNext()) {\r
196             ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next();\r
197             saa[i][1] = msa.getModuleGuid();\r
198             saa[i][2] = msa.getModuleVersion();\r
199             \r
200             saa[i][3] = msa.getPackageGuid();\r
201             saa[i][4] = msa.getPackageVersion();\r
202 //            saa[i][4] = listToString(msa.getSupArchList());\r
203             ++i;\r
204         }\r
205     }\r
206     \r
207     public ModuleSADocument.ModuleSA getModuleSA(String key) {\r
208         String[] s = key.split(" ");\r
209         if (getfpdFrameworkModules().getModuleSAList() == null) {\r
210             return null;\r
211         }\r
212         ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator();\r
213         while(li.hasNext()) {\r
214             ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next();\r
215             if (msa.getModuleGuid().equals(s[0]) && msa.getPackageGuid().equals(s[2])) {\r
216                 if (msa.getModuleVersion() != null) {\r
217                     if (!msa.getModuleVersion().equals(s[1])) {\r
218                         continue;\r
219                     }\r
220                 }\r
221                 if (msa.getPackageVersion() != null) {\r
222                     if (!msa.getPackageVersion().equals(s[3])) {\r
223                         continue;\r
224                     }\r
225                 }\r
226                 return msa;\r
227             }\r
228         }\r
229         return null;\r
230     }\r
231     public void removeModuleSA(int i) {\r
232         XmlObject o = getfpdFrameworkModules();\r
233         if (o == null) {\r
234             return;\r
235         }\r
236         \r
237         XmlCursor cursor = o.newCursor();\r
238         if (cursor.toFirstChild()) {\r
239             for (int j = 0; j < i; ++j) {\r
240                 cursor.toNextSibling();\r
241             }\r
242             //\r
243             // remove pcd from dynPcdMap, if DynamicPcdBuildData exists, remove them too.\r
244             //\r
245             ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)cursor.getObject();\r
246             String moduleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " +\r
247             moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion();\r
248             PcdBuildDefinitionDocument.PcdBuildDefinition pcdBuildDef = moduleSa.getPcdBuildDefinition();\r
249             if (pcdBuildDef != null && pcdBuildDef.getPcdDataList() != null) {\r
250                 ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> li = pcdBuildDef.getPcdDataList().listIterator();\r
251                 while(li.hasNext()) {\r
252                     PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next();\r
253                     maintainDynPcdMap(pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(), moduleInfo);\r
254                 }\r
255             }\r
256             cursor.removeXml();\r
257             if (getFrameworkModulesCount() == 0) {\r
258                 cursor.toParent();\r
259                 cursor.removeXml();\r
260             }\r
261         }\r
262         cursor.dispose();\r
263     }\r
264     \r
265     private void maintainDynPcdMap(String pcdKey, String moduleInfo) {\r
266         \r
267         ArrayList<String> al = dynPcdMap.get(pcdKey);\r
268         if (al == null) {\r
269             return;\r
270         }\r
271         String[] s = moduleInfo.split(" ");\r
272         for(int i = 0; i < al.size(); ++i){\r
273             String consumer = al.get(i);\r
274             if (consumer.contains(s[0]) && consumer.contains(s[2])){\r
275                 al.remove(consumer);\r
276                 break;\r
277             }\r
278         }\r
279 \r
280         if (al.size() == 0) {\r
281             dynPcdMap.remove(pcdKey);\r
282             String[] s1 = pcdKey.split(" ");\r
283             removeDynamicPcdBuildData(s1[0], s1[1]);\r
284         }\r
285         \r
286     }\r
287     //\r
288     // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
289     //\r
290     public int getPcdDataCount(String key){\r
291         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
292         if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
293             return 0;\r
294         }\r
295         return msa.getPcdBuildDefinition().getPcdDataList().size();\r
296     }\r
297     \r
298     public void getPcdData(String key, String[][] saa) {\r
299         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
300         if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
301             return;\r
302         }\r
303         ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData>li = msa.getPcdBuildDefinition().getPcdDataList().listIterator();\r
304         for (int i = 0; i < saa.length; ++i) {\r
305             PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next();\r
306             saa[i][0] = pcdData.getCName();\r
307             saa[i][1] = pcdData.getTokenSpaceGuidCName();\r
308             saa[i][2] = pcdData.getItemType()+"";\r
309             saa[i][3] = pcdData.getToken().toString();\r
310             saa[i][4] = pcdData.getMaxDatumSize()+"";\r
311             saa[i][5] = pcdData.getDatumType()+"";\r
312             saa[i][6] = pcdData.getValue();\r
313             \r
314         }\r
315     }\r
316     \r
317     public void updatePcdData(String key, String cName, String tsGuid, String itemType, String maxSize, String value){\r
318         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
319         if (msa == null || msa.getPcdBuildDefinition() == null){\r
320             return;\r
321         }\r
322         \r
323         XmlCursor cursor = msa.getPcdBuildDefinition().newCursor();\r
324         if (cursor.toFirstChild()){\r
325             do {\r
326                 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
327                 if (pcdData.getCName().equals(cName) && pcdData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
328                     pcdData.setItemType(PcdItemTypes.Enum.forString(itemType));\r
329                     if(pcdData.getDatumType().equals("VOID*")) {\r
330                         pcdData.setMaxDatumSize(new Integer(maxSize));\r
331                     }\r
332                     pcdData.setValue(value);\r
333                     break;\r
334                 }\r
335             }\r
336             while(cursor.toNextSibling());\r
337         }\r
338         cursor.dispose();\r
339     }\r
340     \r
341     /**Get original Pcd info from MSA & SPD files.\r
342      * @param mi ModuleIdentification from which MSA & SPD come\r
343      * @param cName PCD cName\r
344      * @param sa Results: HelpText, Original item type.\r
345      * @return\r
346      */\r
347     public boolean getPcdBuildDataInfo(ModuleIdentification mi, String cName, String[] sa) throws Exception{\r
348         try {\r
349            \r
350             ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(mi);\r
351             if (msa.getPcdCoded() == null) {\r
352                 return false;\r
353             }\r
354             \r
355             Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
356             m.put("ModuleSurfaceArea", msa);\r
357             SurfaceAreaQuery.setDoc(m);\r
358             PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null);\r
359             //\r
360             // First look through MSA pcd entries.\r
361             //\r
362             List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
363             ListIterator li = l.listIterator();\r
364             while(li.hasNext()) {\r
365                 PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
366                 if (!msaPcd.getCName().equals(cName)) {\r
367                     continue;\r
368                 }\r
369                 PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
370                 if (spdPcd == null) {\r
371                     //\r
372                     // ToDo Error \r
373                     //\r
374                     throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName());\r
375                 }\r
376                 //\r
377                 // Get Pcd help text and original item type.\r
378                 //\r
379                 sa[0] = spdPcd.getHelpText() + msaPcd.getHelpText();\r
380                 sa[1] = msaPcd.getPcdItemType()+"";\r
381                 return true;\r
382             }\r
383             \r
384             \r
385         }\r
386         catch (Exception e){\r
387 //            e.printStackTrace();\r
388             throw e;\r
389         }\r
390         \r
391         return false;\r
392     }\r
393     \r
394     /**Remove PCDBuildDefinition entries from ModuleSA\r
395      * @param moduleKey identifier of ModuleSA.\r
396      * @param consumer where these entries come from.\r
397      */\r
398     public void removePcdData(String moduleKey, ModuleIdentification consumer) {\r
399         try {\r
400             ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(consumer);\r
401             if (msa.getPcdCoded() == null) {\r
402                 return;\r
403             }\r
404             \r
405             List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
406             ListIterator li = l.listIterator();\r
407             \r
408             while(li.hasNext()) {\r
409                 PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
410                 ModuleSADocument.ModuleSA moduleSA = getModuleSA(moduleKey);\r
411                 XmlCursor cursor = moduleSA.getPcdBuildDefinition().newCursor();\r
412                 if (cursor.toFirstChild()) {\r
413                     PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
414                     if (msaPcd.getCName().equals(pcdData.getCName()) && msaPcd.getTokenSpaceGuidCName().equals(pcdData.getTokenSpaceGuidCName())) {\r
415                         \r
416                         maintainDynPcdMap(pcdData.getCName()+" "+pcdData.getTokenSpaceGuidCName(), moduleKey);\r
417                         cursor.removeXml();\r
418                         break;\r
419                     }\r
420                     while (cursor.toNextSibling()) {\r
421                         pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
422                         if (msaPcd.getCName().equals(pcdData.getCName()) && msaPcd.getTokenSpaceGuidCName().equals(pcdData.getTokenSpaceGuidCName())) {\r
423                             maintainDynPcdMap(pcdData.getCName()+" "+pcdData.getTokenSpaceGuidCName(), moduleKey);\r
424                             cursor.removeXml();\r
425                             break;\r
426                         }\r
427                     }\r
428                 }\r
429                 cursor.dispose();\r
430             }\r
431             \r
432         }\r
433         catch (Exception e){\r
434             e.printStackTrace();\r
435             \r
436         }\r
437     }\r
438     //\r
439     // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
440     //\r
441     public int getLibraryInstancesCount(String key) {\r
442         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
443         if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){\r
444             return 0;\r
445         }\r
446         return msa.getLibraries().getInstanceList().size();\r
447     }\r
448     \r
449     public void getLibraryInstances(String key, String[][] saa){\r
450         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
451         if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){\r
452             return ;\r
453         }\r
454         \r
455         ListIterator<LibrariesDocument.Libraries.Instance> li = msa.getLibraries().getInstanceList().listIterator();\r
456         for (int i = 0; i < saa.length; ++i) {\r
457             LibrariesDocument.Libraries.Instance instance = li.next();\r
458             saa[i][1] = instance.getModuleGuid();\r
459             saa[i][2] = instance.getModuleVersion();\r
460             saa[i][3] = instance.getPackageGuid();\r
461             saa[i][4] = instance.getPackageVersion();\r
462         }\r
463     }\r
464     \r
465     public void removeLibraryInstance(String key, int i) {\r
466         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
467         if (msa == null || msa.getLibraries() == null){\r
468             return ;\r
469         }\r
470         \r
471         XmlCursor cursor = msa.getLibraries().newCursor();\r
472         if (cursor.toFirstChild()) {\r
473             for (int j = 0; j < i; ++j) {\r
474                 cursor.toNextSibling();\r
475             }\r
476             cursor.removeXml();\r
477         }\r
478         \r
479         cursor.dispose();\r
480     }\r
481     \r
482     public void genLibraryInstance(String mg, String mv, String pg, String pv, String key) {\r
483         ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
484         if (msa == null){\r
485             msa = getfpdFrameworkModules().addNewModuleSA();\r
486         }\r
487         LibrariesDocument.Libraries libs = msa.getLibraries();\r
488         if(libs == null){\r
489             libs = msa.addNewLibraries();\r
490         }\r
491         \r
492         LibrariesDocument.Libraries.Instance instance = libs.addNewInstance();\r
493         instance.setModuleGuid(mg);\r
494         instance.setModuleVersion(mv);\r
495         instance.setPackageGuid(pg);\r
496         instance.setPackageVersion(pv);\r
497         \r
498     }\r
499     \r
500     public String getFvBinding(String moduleKey){\r
501         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
502         if (msa == null || msa.getModuleSaBuildOptions() == null) {\r
503             return null;\r
504         }\r
505         return msa.getModuleSaBuildOptions().getFvBinding();\r
506     }\r
507     \r
508     public void setFvBinding(String moduleKey, String fvBinding){\r
509         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
510         if (msa == null ) {\r
511             return;\r
512         }\r
513         if(msa.getModuleSaBuildOptions() == null){\r
514             msa.addNewModuleSaBuildOptions().setFvBinding(fvBinding);\r
515             return;\r
516         }\r
517         msa.getModuleSaBuildOptions().setFvBinding(fvBinding);\r
518     }\r
519     \r
520     public String getFfsFileNameGuid(String moduleKey){\r
521         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
522         if (msa == null || msa.getModuleSaBuildOptions() == null) {\r
523             return null;\r
524         }\r
525         return msa.getModuleSaBuildOptions().getFfsFileNameGuid();\r
526     }\r
527     \r
528     public void setFfsFileNameGuid(String moduleKey, String fileGuid){\r
529         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
530         if (msa == null ) {\r
531             return;\r
532         }\r
533         if(msa.getModuleSaBuildOptions() == null){\r
534             msa.addNewModuleSaBuildOptions().setFfsFileNameGuid(fileGuid);\r
535             return;\r
536         }\r
537         msa.getModuleSaBuildOptions().setFfsFileNameGuid(fileGuid);\r
538     }\r
539     \r
540     public String getFfsFormatKey(String moduleKey){\r
541         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
542         if (msa == null || msa.getModuleSaBuildOptions() == null) {\r
543             return null;\r
544         }\r
545         return msa.getModuleSaBuildOptions().getFfsFormatKey();\r
546     }\r
547     \r
548     public void setFfsFormatKey(String moduleKey, String ffsKey){\r
549         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
550         if (msa == null ) {\r
551             return;\r
552         }\r
553         if(msa.getModuleSaBuildOptions() == null){\r
554             msa.addNewModuleSaBuildOptions().setFfsFormatKey(ffsKey);\r
555             return;\r
556         }\r
557         msa.getModuleSaBuildOptions().setFvBinding(ffsKey);\r
558     }\r
559     \r
560     public void getModuleSAOptions(String moduleKey, String[][] saa) {\r
561         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
562         if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null\r
563                         || msa.getModuleSaBuildOptions().getOptions().getOptionList() == null) {\r
564             return ;\r
565         }\r
566         \r
567         List<OptionDocument.Option> lOpt = msa.getModuleSaBuildOptions().getOptions().getOptionList();\r
568         ListIterator li = lOpt.listIterator();\r
569         int i = 0;\r
570         while(li.hasNext()) {\r
571             OptionDocument.Option opt = (OptionDocument.Option)li.next();\r
572             if (opt.getBuildTargets() != null) {\r
573                 saa[i][0] = listToString(opt.getBuildTargets());\r
574             }\r
575             saa[i][1] = opt.getToolChainFamily();\r
576             if (opt.getSupArchList() != null){\r
577                 saa[i][2] = listToString(opt.getSupArchList());\r
578 \r
579             }\r
580             saa[i][3] = opt.getToolCode();\r
581             saa[i][4] = opt.getTagName();\r
582             saa[i][5] = opt.getStringValue();\r
583              \r
584             ++i;\r
585         }\r
586     }\r
587     \r
588     public int getModuleSAOptionsCount(String moduleKey){\r
589         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
590         if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null\r
591                         || msa.getModuleSaBuildOptions().getOptions().getOptionList() == null) {\r
592             return 0;\r
593         }\r
594         return msa.getModuleSaBuildOptions().getOptions().getOptionList().size();\r
595     }\r
596     \r
597     public void genModuleSAOptionsOpt(String moduleKey, Vector<Object> buildTargets, String toolChain, String tagName, String toolCmd, Vector<Object> archList, String contents) {\r
598         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
599         if (msa.getModuleSaBuildOptions() == null) {\r
600             msa.addNewModuleSaBuildOptions();\r
601         }\r
602         if (msa.getModuleSaBuildOptions().getOptions() == null){\r
603             msa.getModuleSaBuildOptions().addNewOptions();\r
604         }\r
605         OptionDocument.Option opt = msa.getModuleSaBuildOptions().getOptions().addNewOption();\r
606         setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
607     }\r
608     \r
609     public void removeModuleSAOptionsOpt(String moduleKey, int i) {\r
610         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
611         if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null) {\r
612             return ;\r
613         }\r
614         OptionsDocument.Options opts = msa.getModuleSaBuildOptions().getOptions();\r
615         XmlCursor cursor = opts.newCursor();\r
616         if (cursor.toFirstChild()) {\r
617             for (int j = 0; j < i; ++j){\r
618                 cursor.toNextSibling();\r
619             }\r
620             cursor.removeXml();\r
621         }\r
622         cursor.dispose();\r
623     }\r
624     \r
625     public void updateModuleSAOptionsOpt(String moduleKey, int i, Vector<Object> buildTargets, String toolChain, String tagName, String toolCmd, Vector<Object> archList, String contents) {\r
626         ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey);\r
627         if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null) {\r
628             return ;\r
629         }\r
630         OptionsDocument.Options opts = msa.getModuleSaBuildOptions().getOptions();\r
631         XmlCursor cursor = opts.newCursor();\r
632         if (cursor.toFirstChild()) {\r
633             for (int j = 0; j < i; ++j){\r
634                 cursor.toNextSibling();\r
635             }\r
636             OptionDocument.Option opt = (OptionDocument.Option)cursor.getObject();\r
637             setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
638         }\r
639         cursor.dispose();\r
640     }\r
641     \r
642     /**add pcd information of module mi to a ModuleSA. \r
643      * @param mi\r
644      * @param moduleSa if null, generate a new ModuleSA.\r
645      */\r
646     public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi, ModuleSADocument.ModuleSA moduleSa) throws Exception {\r
647         //ToDo add Arch filter\r
648         \r
649         try {\r
650             if (moduleSa == null) {\r
651                 moduleSa = genModuleSA(mi);\r
652             }\r
653             \r
654             ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(mi);\r
655             if (msa.getPcdCoded() == null) {\r
656                 return;\r
657             }\r
658             \r
659             Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
660             m.put("ModuleSurfaceArea", msa);\r
661             SurfaceAreaQuery.setDoc(m);\r
662             PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null);\r
663             //\r
664             // Implementing InitializePlatformPcdBuildDefinitions\r
665             //\r
666             List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
667             ListIterator li = l.listIterator();\r
668             while(li.hasNext()) {\r
669                 PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
670                 PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
671                 if (spdPcd == null) {\r
672                     //\r
673                     // ToDo Error \r
674                     //\r
675                     throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName());\r
676                 }\r
677                 //\r
678                 // AddItem to ModuleSA PcdBuildDefinitions\r
679                 //\r
680                 String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue();\r
681                 \r
682                 genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType()+"", defaultVal, moduleSa);\r
683             }\r
684             \r
685         }\r
686         catch (Exception e){\r
687 //            e.printStackTrace();\r
688             throw e; \r
689         }\r
690         \r
691     }\r
692     \r
693     private PcdDeclarationsDocument.PcdDeclarations.PcdEntry LookupPcdDeclaration (PcdCodedDocument.PcdCoded.PcdEntry msaPcd, PackageIdentification[] depPkgs) {\r
694         \r
695         Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
696         PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = null;\r
697         for (int i = 0; i < depPkgs.length; ++i) {\r
698             m.put("PackageSurfaceArea", GlobalData.getPackageXmlObject(depPkgs[i]));\r
699             SurfaceAreaQuery.setDoc(m);\r
700             XmlObject[] xo = SurfaceAreaQuery.getSpdPcdDeclarations();\r
701             if (xo == null) {\r
702                 continue;\r
703             }\r
704             for (int j = 0; j < xo.length; ++j) {\r
705                 spdPcd = (PcdDeclarationsDocument.PcdDeclarations.PcdEntry)xo[j];\r
706                 if (msaPcd.getTokenSpaceGuidCName() == null) {\r
707                     if (spdPcd.getCName().equals(msaPcd.getCName())) {\r
708                         return spdPcd;\r
709                     }\r
710                 }\r
711                 else{\r
712                     if (spdPcd.getCName().equals(msaPcd.getCName()) && spdPcd.getTokenSpaceGuidCName().equals(msaPcd.getTokenSpaceGuidCName())) {\r
713                         return spdPcd;\r
714                     }\r
715                 }\r
716                 \r
717             }\r
718       \r
719         }\r
720         return null;\r
721     }\r
722     \r
723     private ModuleSADocument.ModuleSA genModuleSA (ModuleIdentification mi) {\r
724         PackageIdentification pi = GlobalData.getPackageForModule(mi);\r
725         ModuleSADocument.ModuleSA msa = getfpdFrameworkModules().addNewModuleSA();\r
726         msa.setModuleGuid(mi.getGuid());\r
727         msa.setModuleVersion(mi.getVersion());\r
728         msa.setPackageGuid(pi.getGuid());\r
729         msa.setPackageVersion(pi.getVersion());\r
730         \r
731         return msa;\r
732     }\r
733     \r
734     private void genPcdData (String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal, ModuleSADocument.ModuleSA moduleSa) \r
735     throws PcdItemTypeConflictException, PcdValueMalFormed{\r
736         if (moduleSa.getPcdBuildDefinition() == null){\r
737             moduleSa.addNewPcdBuildDefinition();\r
738         }\r
739         //\r
740         // constructe pcd to modulesa mapping first.\r
741         // Attention : for any error condition, remove from map this pcd.\r
742         //\r
743         ArrayList<String> pcdConsumer = LookupPlatformPcdData(cName + " " + tsGuid);\r
744         if (pcdConsumer == null) {\r
745             pcdConsumer = new ArrayList<String>();\r
746         }\r
747         String listValue = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() \r
748         + " " + moduleSa.getPackageGuid() + " " + moduleSa.getPackageVersion() \r
749         + " " + itemType;\r
750         pcdConsumer.add(listValue);\r
751         dynPcdMap.put(cName + " " + tsGuid, pcdConsumer);\r
752         //\r
753         // Special dynamic type, if this pcd already exists in other ModuleSA\r
754         //\r
755         if (itemType.equals("DYNAMIC")) {\r
756             \r
757             ListIterator li = pcdConsumer.listIterator();\r
758             while(li.hasNext()) {\r
759                 String value = li.next().toString();\r
760                 String[] valuePart= value.split(" ");\r
761                 if (!valuePart[4].equals("DYNAMIC")) {\r
762                     //ToDo error for same pcd, other type than dynamic\r
763                     pcdConsumer.remove(listValue);\r
764                     throw new PcdItemTypeConflictException(value);\r
765                 }\r
766             }\r
767         }\r
768         else {\r
769             ListIterator li = pcdConsumer.listIterator();\r
770             while(li.hasNext()) {\r
771                 String value = li.next().toString();\r
772                 String[] valuePart= value.split(" ");\r
773                 if (valuePart[4].equals("DYNAMIC")) {\r
774                     //ToDo error for same pcd, other type than non-dynamic\r
775                     pcdConsumer.remove(listValue);\r
776                     throw new PcdItemTypeConflictException(value);\r
777                 }\r
778             }\r
779         }\r
780         \r
781         PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData fpdPcd = moduleSa.getPcdBuildDefinition().addNewPcdData();\r
782         fpdPcd.setCName(cName);\r
783         fpdPcd.setToken(token);\r
784         fpdPcd.setTokenSpaceGuidCName(tsGuid);\r
785         fpdPcd.setDatumType(PcdDataTypes.Enum.forString(dataType));\r
786         fpdPcd.setItemType(PcdItemTypes.Enum.forString(itemType));\r
787         \r
788         if (itemType.equals("DYNAMIC") || itemType.equals("DYNAMIC_EX")) {\r
789             ArrayList<String> al = LookupDynamicPcdBuildDefinition(cName + " " + tsGuid);\r
790             //\r
791             // if only one module mapped to this pcd, then the one is myself. so no other module mapped.\r
792             // so need to add one dyn pcd.\r
793             //\r
794             if (al.size() == 1) {\r
795                 addDynamicPcdBuildData(cName, token, tsGuid, itemType, dataType, defaultVal);\r
796             }\r
797         }\r
798         else {\r
799             if (defaultVal != null){\r
800                 fpdPcd.setValue(defaultVal);\r
801             }\r
802             else {\r
803                 if (dataType.equals("UINT8") || dataType.equals("UINT16") || dataType.equals("UINT32") || dataType.equals("UINT64")) {\r
804                     fpdPcd.setValue("0");\r
805                 }\r
806                 if (dataType.equals("BOOLEAN")){\r
807                     fpdPcd.setValue("false");\r
808                 }\r
809                 if (dataType.equals("VOID*")) {\r
810                     fpdPcd.setValue("");\r
811                 }\r
812             }\r
813             if (dataType.equals("UINT8")){\r
814                 fpdPcd.setMaxDatumSize(1);\r
815             }\r
816             if (dataType.equals("UINT16")) {\r
817                 fpdPcd.setMaxDatumSize(2);\r
818             }\r
819             if (dataType.equals("UINT32")) {\r
820                 fpdPcd.setMaxDatumSize(4);\r
821             }\r
822             if (dataType.equals("UINT64")){\r
823                 fpdPcd.setMaxDatumSize(8);\r
824             }\r
825             if (dataType.equals("BOOLEAN")){\r
826                 fpdPcd.setMaxDatumSize(1);\r
827             }\r
828             if (dataType.equals("VOID*")) {\r
829                 int maxSize = setMaxSizeForPointer(fpdPcd.getValue());\r
830                 fpdPcd.setMaxDatumSize(maxSize);\r
831             }\r
832         }\r
833     }\r
834     \r
835     public int setMaxSizeForPointer(String datum) throws PcdValueMalFormed{\r
836         if (datum == null) {\r
837             return 0;\r
838         }\r
839         char    ch     = datum.charAt(0);\r
840         int     start, end;\r
841         String  strValue;\r
842         //\r
843         // For void* type PCD, only three datum is support:\r
844         // 1) Unicode: string with start char is "L"\r
845         // 2) Ansci: String  is ""\r
846         // 3) byte array: String start char "{"\r
847         // \r
848         if (ch == 'L') {\r
849             start       = datum.indexOf('\"');\r
850             end         = datum.lastIndexOf('\"');\r
851             if ((start > end)           || \r
852                 (end   > datum.length())||\r
853                 ((start == end) && (datum.length() > 0))) {\r
854                 //ToDo Error handling here\r
855                 throw new PcdValueMalFormed (datum);\r
856             }\r
857 \r
858             strValue    = datum.substring(start + 1, end);\r
859             return strValue.length() * 2;\r
860         } else if (ch == '\"'){\r
861             start       = datum.indexOf('\"');\r
862             end         = datum.lastIndexOf('\"');\r
863             if ((start > end)           || \r
864                 (end   > datum.length())||\r
865                 ((start == end) && (datum.length() > 0))) {\r
866                 throw new PcdValueMalFormed (datum);\r
867             }\r
868             strValue    = datum.substring(start + 1, end);\r
869             return strValue.length();\r
870         } else if (ch =='{') {\r
871             String[]  strValueArray;\r
872 \r
873             start           = datum.indexOf('{');\r
874             end             = datum.lastIndexOf('}');\r
875             strValue        = datum.substring(start + 1, end);\r
876             strValue        = strValue.trim();\r
877             if (strValue.length() == 0) {\r
878                 return 0;\r
879             }\r
880             strValueArray   = strValue.split(",");\r
881             for (int index = 0; index < strValueArray.length; index ++) {\r
882                     Integer value = Integer.decode(strValueArray[index].trim());\r
883                 \r
884                 if (value > 0xFF) {\r
885 //                   "[FPD file error] The datum type of PCD %s in %s is VOID*, "+\r
886 //                   "it is byte array in fact. But the element of %s exceed the byte range",\r
887                     throw new PcdValueMalFormed (datum);                               \r
888                 }\r
889             }\r
890             return strValueArray.length;\r
891 \r
892 \r
893         } else {\r
894 //            "[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+\r
895 //            "1) UNICODE string: like L\"xxxx\";\r\n"+\r
896 //            "2) ANSIC string: like \"xxx\";\r\n"+\r
897 //            "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+\r
898 //            "but the datum in seems does not following above format!",\r
899             throw new PcdValueMalFormed (datum);\r
900             \r
901         }\r
902     }\r
903     \r
904     private ArrayList<String> LookupDynamicPcdBuildDefinition(String dynPcdKey) {\r
905         ArrayList<String> al = dynPcdMap.get(dynPcdKey);\r
906         \r
907         return al;\r
908     }\r
909     \r
910     private ArrayList<String> LookupPlatformPcdData(String pcdKey) {\r
911         \r
912         return dynPcdMap.get("pcdKey");\r
913     }\r
914     \r
915     public int getDynamicPcdBuildDataCount() {\r
916         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) {\r
917             return 0;\r
918         }\r
919         return getfpdDynPcdBuildDefs().getPcdBuildDataList().size();\r
920     }\r
921     \r
922     public void getDynamicPcdBuildData(String[][] saa) {\r
923         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) {\r
924             return ;\r
925         }\r
926         List<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData> l = getfpdDynPcdBuildDefs().getPcdBuildDataList();\r
927         ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData> li = l.listIterator();\r
928         int i = 0;\r
929         while(li.hasNext()) {\r
930             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcd = li.next();\r
931             saa[i][0] = dynPcd.getCName();\r
932             saa[i][1] = dynPcd.getToken().toString();\r
933             saa[i][2] = dynPcd.getTokenSpaceGuidCName();\r
934             saa[i][3] = dynPcd.getMaxDatumSize()+"";\r
935             saa[i][4] = dynPcd.getDatumType().toString();\r
936             \r
937             ++i;\r
938         }\r
939     }\r
940     \r
941     public void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) \r
942     throws PcdValueMalFormed{\r
943         DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcdData = getfpdDynPcdBuildDefs().addNewPcdBuildData();\r
944         dynPcdData.setItemType(PcdItemTypes.Enum.forString(itemType));\r
945         dynPcdData.setCName(cName);\r
946         dynPcdData.setToken(token);\r
947         dynPcdData.setTokenSpaceGuidCName(tsGuid);\r
948         dynPcdData.setDatumType(PcdDataTypes.Enum.forString(dataType));\r
949         \r
950         BigInteger bigInt = new BigInteger("0");\r
951         DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = dynPcdData.addNewSkuInfo();\r
952         skuInfo.setSkuId(bigInt);\r
953         if (defaultVal != null){\r
954             skuInfo.setValue(defaultVal);\r
955         }\r
956         else {\r
957             if (dataType.equals("UINT8")){\r
958                 skuInfo.setValue("0");\r
959             }\r
960             if (dataType.equals("UINT16")) {\r
961                 skuInfo.setValue("0");\r
962             }\r
963             if (dataType.equals("UINT32")) {\r
964                 skuInfo.setValue("0");\r
965             }\r
966             if (dataType.equals("UINT64")){\r
967                 skuInfo.setValue("0");\r
968             }\r
969             if (dataType.equals("BOOLEAN")){\r
970                 skuInfo.setValue("false");\r
971             }\r
972             if (dataType.equals("VOID*")) {\r
973                 skuInfo.setValue("");\r
974             }\r
975         }\r
976         if (dataType.equals("UINT8")){\r
977             dynPcdData.setMaxDatumSize(1);\r
978         }\r
979         if (dataType.equals("UINT16")) {\r
980             dynPcdData.setMaxDatumSize(2);\r
981         }\r
982         if (dataType.equals("UINT32")) {\r
983             dynPcdData.setMaxDatumSize(4);\r
984         }\r
985         if (dataType.equals("UINT64")){\r
986             dynPcdData.setMaxDatumSize(8);\r
987         }\r
988         if (dataType.equals("BOOLEAN")){\r
989             dynPcdData.setMaxDatumSize(1);\r
990         }\r
991         if (dataType.equals("VOID*")) {\r
992             int maxSize = setMaxSizeForPointer(defaultVal);\r
993             dynPcdData.setMaxDatumSize(maxSize);\r
994         }\r
995     }\r
996     \r
997     public void removeDynamicPcdBuildData(String cName, String tsGuid) {\r
998         XmlObject o = getfpdDynPcdBuildDefs();\r
999         \r
1000         XmlCursor cursor = o.newCursor();\r
1001         if (cursor.toFirstChild()) {\r
1002             do {\r
1003                 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdBuildData = \r
1004                     (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1005                 if (pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
1006                     cursor.removeXml();\r
1007                     if (getDynamicPcdBuildDataCount() == 0) {\r
1008                         cursor.toParent();\r
1009                         cursor.removeXml();\r
1010                     }\r
1011                     cursor.dispose();\r
1012                     return;\r
1013                 }\r
1014             }\r
1015             while (cursor.toNextSibling());\r
1016         }\r
1017         cursor.dispose();\r
1018     }\r
1019     //\r
1020     // Get the Sku Info count of ith dyn pcd element.\r
1021     //\r
1022     public int getDynamicPcdSkuInfoCount(int i){\r
1023         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1024             return 0;\r
1025         }\r
1026         \r
1027         int skuInfoCount = 0;\r
1028         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1029         if (cursor.toFirstChild()) {\r
1030             for (int j = 0; j < i; ++j) {\r
1031                 cursor.toNextSibling();\r
1032             }\r
1033             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1034             if (pcdData.getSkuInfoList() == null) {\r
1035                 skuInfoCount = 0;\r
1036             }\r
1037             else {\r
1038                 skuInfoCount = pcdData.getSkuInfoList().size();\r
1039             }\r
1040         }\r
1041         cursor.dispose();\r
1042         return skuInfoCount;\r
1043     }\r
1044     \r
1045     public void getDynamicPcdSkuInfos(int i, String[][] saa){\r
1046         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1047             return;\r
1048         }\r
1049         \r
1050         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1051         if (cursor.toFirstChild()) {\r
1052             for (int j = 0; j < i; ++j) {\r
1053                 cursor.toNextSibling();\r
1054             }\r
1055             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1056             if (pcdData.getSkuInfoList() == null) {\r
1057                 cursor.dispose();\r
1058                 return;\r
1059             }\r
1060             else {\r
1061                 ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo> li = pcdData.getSkuInfoList().listIterator();\r
1062                 int k = 0;\r
1063                 while (li.hasNext()) {\r
1064                     DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next();\r
1065                     saa[k][0] = skuInfo.getSkuId()+"";\r
1066                     saa[k][1] = skuInfo.getVariableName();\r
1067                     saa[k][2] = skuInfo.getVariableGuid();\r
1068                     saa[k][3] = skuInfo.getVariableOffset();\r
1069                     saa[k][4] = skuInfo.getHiiDefaultValue();\r
1070                     saa[k][5] = skuInfo.getVpdOffset();\r
1071                     saa[k][6] = skuInfo.getValue();\r
1072                     ++k;\r
1073                 }\r
1074                 \r
1075             }\r
1076         }\r
1077         cursor.dispose();\r
1078        \r
1079     }\r
1080     \r
1081     public String getDynamicPcdBuildDataValue(int i){\r
1082         String value = null;\r
1083         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1084             return value;\r
1085         }\r
1086         \r
1087         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1088         if (cursor.toFirstChild()) {\r
1089             for (int j = 0; j < i; ++j) {\r
1090                 cursor.toNextSibling();\r
1091             }\r
1092             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1093             if (pcdData.getSkuInfoList() == null) {\r
1094                 value = null;\r
1095             }\r
1096             else {\r
1097                 value = pcdData.getSkuInfoArray(0).getValue();\r
1098             }\r
1099         }\r
1100         cursor.dispose();\r
1101         return value;\r
1102     }\r
1103     \r
1104     public String getDynamicPcdBuildDataVpdOffset(int i){\r
1105         String vpdOffset = null;\r
1106         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1107             return vpdOffset;\r
1108         }\r
1109         \r
1110         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1111         if (cursor.toFirstChild()) {\r
1112             for (int j = 0; j < i; ++j) {\r
1113                 cursor.toNextSibling();\r
1114             }\r
1115             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1116             if (pcdData.getSkuInfoList() == null) {\r
1117                 vpdOffset = null;\r
1118             }\r
1119             else {\r
1120                 vpdOffset = pcdData.getSkuInfoArray(0).getVpdOffset();\r
1121             }\r
1122         }\r
1123         cursor.dispose();\r
1124         return vpdOffset;\r
1125     }\r
1126     \r
1127     public void removeDynamicPcdBuildDataSkuInfo(int i) {\r
1128         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1129             return;\r
1130         }\r
1131         \r
1132         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1133         if (cursor.toFirstChild()) {\r
1134             for (int j = 0; j < i; ++j) {\r
1135                 cursor.toNextSibling();\r
1136             }\r
1137             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1138             if (pcdData.getSkuInfoList() == null) {\r
1139                 cursor.dispose();\r
1140                 return;\r
1141             }\r
1142             else {\r
1143                 QName qSkuInfo = new QName(xmlNs, "SkuInfo");\r
1144                 cursor.toChild(qSkuInfo);\r
1145                 cursor.removeXml();\r
1146             }\r
1147         }\r
1148         cursor.dispose();\r
1149     }\r
1150     //\r
1151     // generate sku info for ith dyn pcd build data.\r
1152     //\r
1153     public void genDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, \r
1154                                               String hiiDefault, String vpdOffset, String value, int i) {\r
1155         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1156             return;\r
1157         }\r
1158         \r
1159         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1160         if (cursor.toFirstChild()) {\r
1161             for (int j = 0; j < i; ++j) {\r
1162                 cursor.toNextSibling();\r
1163             }\r
1164             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1165             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = pcdData.addNewSkuInfo();\r
1166             skuInfo.setSkuId(new BigInteger(id));\r
1167             if (varName != null){\r
1168                 skuInfo.setVariableName(varName);\r
1169                 skuInfo.setVariableGuid(varGuid);\r
1170                 skuInfo.setVariableOffset(varOffset);\r
1171                 skuInfo.setHiiDefaultValue(hiiDefault);\r
1172             }\r
1173             else if (vpdOffset != null){\r
1174                 skuInfo.setVpdOffset(vpdOffset);\r
1175             }\r
1176             else{\r
1177                 skuInfo.setValue(value);\r
1178             }\r
1179         }\r
1180     }\r
1181     \r
1182     public void updateDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, \r
1183                                                  String hiiDefault, String vpdOffset, String value, int i){\r
1184         if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
1185             return;\r
1186         }\r
1187         \r
1188         XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
1189         if (cursor.toFirstChild()) {\r
1190             for (int j = 0; j < i; ++j) {\r
1191                 cursor.toNextSibling();\r
1192             }\r
1193             DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
1194             ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo> li = pcdData.getSkuInfoList().listIterator();\r
1195             while (li.hasNext()) {\r
1196                 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next();\r
1197                 if (skuInfo.getSkuId().toString().equals(id)){\r
1198                     if (varName != null){\r
1199                         skuInfo.setVariableName(varName);\r
1200                         skuInfo.setVariableGuid(varGuid);\r
1201                         skuInfo.setVariableOffset(varOffset);\r
1202                         skuInfo.setHiiDefaultValue(hiiDefault);\r
1203                     }\r
1204                     else if (vpdOffset != null){\r
1205                         skuInfo.setVpdOffset(vpdOffset);\r
1206                     }\r
1207                     else{\r
1208                         skuInfo.setValue(value);\r
1209                     }\r
1210                     break;\r
1211                 }\r
1212             }\r
1213         }\r
1214     }\r
1215     \r
1216     public BuildOptionsDocument.BuildOptions getfpdBuildOpts() {\r
1217         if (fpdBuildOpts == null) {\r
1218             fpdBuildOpts = fpdRoot.addNewBuildOptions();\r
1219         }\r
1220         return fpdBuildOpts;\r
1221     }\r
1222     \r
1223     public void genBuildOptionsUserDefAntTask (String id, String fileName, String execOrder) {\r
1224         UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
1225         if (udats == null) {\r
1226             udats = getfpdBuildOpts().addNewUserDefinedAntTasks();\r
1227         }\r
1228         \r
1229         AntTaskDocument.AntTask at = udats.addNewAntTask();\r
1230         setBuildOptionsUserDefAntTask(id, fileName, execOrder, at);\r
1231     }\r
1232     \r
1233     private void setBuildOptionsUserDefAntTask(String id, String fileName, String execOrder, AntTaskDocument.AntTask at) {\r
1234         at.setId(new Integer(id));\r
1235         if (fileName != null){\r
1236             at.setFilename(fileName);\r
1237         }\r
1238         if (execOrder != null) {\r
1239             at.setAntCmdOptions(execOrder);\r
1240         }\r
1241     }\r
1242     \r
1243     public void removeBuildOptionsUserDefAntTask(int i) {\r
1244         XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks();\r
1245         if (o == null) {\r
1246             return;\r
1247         }\r
1248         XmlCursor cursor = o.newCursor();\r
1249         if (cursor.toFirstChild()) {\r
1250             for (int j = 0; j < i; ++j) {\r
1251                 cursor.toNextSibling();\r
1252             }\r
1253             cursor.removeXml();\r
1254             if (getBuildOptionsUserDefAntTaskCount() == 0) {\r
1255                 cursor.toParent();\r
1256                 cursor.removeXml();\r
1257             }\r
1258         }\r
1259         cursor.dispose();\r
1260     }\r
1261     \r
1262     public void updateBuildOptionsUserDefAntTask(int i, String id, String fileName, String execOrder){\r
1263         XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks();\r
1264         if (o == null) {\r
1265             return;\r
1266         }\r
1267         XmlCursor cursor = o.newCursor();\r
1268         if (cursor.toFirstChild()) {\r
1269             for (int j = 0; j < i; ++j) {\r
1270                 cursor.toNextSibling();\r
1271             }\r
1272             AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)cursor.getObject();\r
1273             setBuildOptionsUserDefAntTask(id, fileName, execOrder, at);\r
1274         }\r
1275         cursor.dispose();\r
1276     }\r
1277     \r
1278     public int getBuildOptionsUserDefAntTaskCount() {\r
1279         UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
1280         if (udats == null || udats.getAntTaskList() == null) {\r
1281             return 0;\r
1282         }\r
1283         \r
1284         return udats.getAntTaskList().size();\r
1285     }\r
1286     \r
1287     public void getBuildOptionsUserDefAntTasks(String[][] saa) {\r
1288         UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
1289         if (udats == null || udats.getAntTaskList() == null) {\r
1290             return ;\r
1291         }\r
1292         \r
1293         List<AntTaskDocument.AntTask> l = udats.getAntTaskList();\r
1294         ListIterator li = l.listIterator();\r
1295         int i = 0;\r
1296         while (li.hasNext()) {\r
1297             AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)li.next();\r
1298             saa[i][0] = at.getId() + "";\r
1299             saa[i][1] = saa[i][2] = "";\r
1300             if (at.getFilename() != null){\r
1301                 saa[i][1] = at.getFilename();\r
1302             }\r
1303             if (at.getAntCmdOptions() != null) {\r
1304                 saa[i][2] = at.getAntCmdOptions();\r
1305             }\r
1306             ++i;\r
1307         }\r
1308     }\r
1309     public void genBuildOptionsOpt(Vector<Object> buildTargets, String toolChain, String tagName, String toolCmd, Vector<Object> archList, String contents) {\r
1310         OptionsDocument.Options opts = getfpdBuildOpts().getOptions();\r
1311         if (opts == null) {\r
1312             opts = getfpdBuildOpts().addNewOptions();\r
1313         }\r
1314         OptionDocument.Option opt = opts.addNewOption();\r
1315         setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
1316     }\r
1317     \r
1318     private void setBuildOptionsOpt(Vector<Object> buildTargets, String toolChain, String tagName, String toolCmd, Vector<Object> archList, String contents, OptionDocument.Option opt){\r
1319         opt.setStringValue(contents);\r
1320         \r
1321         opt.setBuildTargets(buildTargets);\r
1322         opt.setToolChainFamily(toolChain);\r
1323         opt.setTagName(tagName);\r
1324         opt.setToolCode(toolCmd);\r
1325         \r
1326         opt.setSupArchList(archList);\r
1327     }\r
1328     \r
1329     public void removeBuildOptionsOpt(int i){\r
1330     \r
1331         XmlObject o = getfpdBuildOpts().getOptions();\r
1332         if (o == null) {\r
1333             return;\r
1334         }\r
1335         \r
1336         XmlCursor cursor = o.newCursor();\r
1337         if (cursor.toFirstChild()) {\r
1338             for (int j = 0; j < i; ++j) {\r
1339                 cursor.toNextSibling();\r
1340             }\r
1341             cursor.removeXml();\r
1342             if (getBuildOptionsOptCount() == 0) {\r
1343                 cursor.toParent();\r
1344                 cursor.removeXml();\r
1345             }\r
1346         }\r
1347         cursor.dispose();\r
1348     }\r
1349     \r
1350     public void updateBuildOptionsOpt(int i, Vector<Object> buildTargets, String toolChain, String tagName, String toolCmd, Vector<Object> archList, String contents) {\r
1351         XmlObject o = getfpdBuildOpts().getOptions();\r
1352         if (o == null) {\r
1353             return;\r
1354         }\r
1355         \r
1356         XmlCursor cursor = o.newCursor();\r
1357         if (cursor.toFirstChild()) {\r
1358             for (int j = 0; j < i; ++j) {\r
1359                 cursor.toNextSibling();\r
1360             }\r
1361             OptionDocument.Option opt = (OptionDocument.Option)cursor.getObject();\r
1362             setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
1363         }\r
1364         cursor.dispose();\r
1365     }\r
1366     \r
1367     public int getBuildOptionsOptCount(){\r
1368         if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {\r
1369             return 0;\r
1370         }\r
1371         return getfpdBuildOpts().getOptions().getOptionList().size();\r
1372     }\r
1373     \r
1374     public void getBuildOptionsOpts(String[][] saa) {\r
1375         if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {\r
1376             return ;\r
1377         }\r
1378         \r
1379         List<OptionDocument.Option> lOpt = getfpdBuildOpts().getOptions().getOptionList();\r
1380         ListIterator li = lOpt.listIterator();\r
1381         int i = 0;\r
1382         while(li.hasNext()) {\r
1383             OptionDocument.Option opt = (OptionDocument.Option)li.next();\r
1384             if (opt.getBuildTargets() != null) {\r
1385                 saa[i][0] = listToString(opt.getBuildTargets());\r
1386             }\r
1387             saa[i][1] = opt.getToolChainFamily();\r
1388             if (opt.getSupArchList() != null){\r
1389                 saa[i][2] = listToString(opt.getSupArchList());\r
1390 \r
1391             }\r
1392             saa[i][3] = opt.getToolCode();\r
1393             saa[i][4] = opt.getTagName();\r
1394             saa[i][5] = opt.getStringValue();\r
1395              \r
1396             ++i;\r
1397         }\r
1398     }\r
1399     \r
1400     public void genBuildOptionsFfs(String ffsKey, String type) {\r
1401         BuildOptionsDocument.BuildOptions.Ffs ffs = getfpdBuildOpts().addNewFfs();\r
1402         ffs.setFfsKey(ffsKey);\r
1403         if (type != null) {\r
1404             ffs.addNewSections().setEncapsulationType(type);\r
1405         }\r
1406     }\r
1407     \r
1408     public void updateBuildOptionsFfsSectionsType(int i, String type) {\r
1409         BuildOptionsDocument.BuildOptions.Ffs ffs = getfpdBuildOpts().addNewFfs();\r
1410         if (type != null) {\r
1411             ffs.addNewSections().setEncapsulationType(type);\r
1412         }\r
1413     }\r
1414     \r
1415     public void genBuildOptionsFfsAttribute(int i, String name, String value) {\r
1416         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1417         BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = ffs.addNewAttribute();\r
1418         attrib.setName(name);\r
1419         attrib.setValue(value);\r
1420     }\r
1421     \r
1422     /**update jth attribute of ith ffs.\r
1423      * @param i\r
1424      * @param j\r
1425      */\r
1426     public void updateBuildOptionsFfsAttribute(int i, int j, String name, String value){\r
1427         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1428         XmlCursor cursor = ffs.newCursor();\r
1429         QName qAttrib = new QName(xmlNs, "Attribute");\r
1430         if (cursor.toChild(qAttrib)) {\r
1431             for (int k = 0; k < j; ++k) {\r
1432                 cursor.toNextSibling(qAttrib);\r
1433             }\r
1434             BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = (BuildOptionsDocument.BuildOptions.Ffs.Attribute)cursor.getObject();\r
1435             attrib.setName(name);\r
1436             attrib.setValue(value);\r
1437         }\r
1438         cursor.dispose();\r
1439     }\r
1440     \r
1441     public void removeBuildOptionsFfsAttribute(int i, int j){\r
1442         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1443         XmlCursor cursor = ffs.newCursor();\r
1444         QName qAttrib = new QName(xmlNs, "Attribute");\r
1445         if (cursor.toChild(qAttrib)) {\r
1446             for (int k = 0; k < j; ++k) {\r
1447                 cursor.toNextSibling(qAttrib);\r
1448             }\r
1449             cursor.removeXml();\r
1450         }\r
1451         cursor.dispose();\r
1452     }\r
1453     \r
1454     public void genBuildOptionsFfsSectionsSection(int i, String sectionType) {\r
1455         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1456         if (ffs == null) {\r
1457             return;\r
1458         }\r
1459         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1460         \r
1461         if (sections == null){\r
1462             sections = ffs.addNewSections();\r
1463         }\r
1464         sections.addNewSection().setSectionType(EfiSectionType.Enum.forString(sectionType));\r
1465     }\r
1466     \r
1467     public void removeBuildOptionsFfsSectionsSection(int i, int j) {\r
1468         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1469         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1470         if (sections == null) {\r
1471             return;\r
1472         }\r
1473         XmlCursor cursor = sections.newCursor();\r
1474         QName qSection = new QName(xmlNs, "Section");\r
1475         if (cursor.toChild(qSection)) {\r
1476             for (int k = 0; k < j; ++k) {\r
1477                 cursor.toNextSibling(qSection);\r
1478             }\r
1479             cursor.removeXml();\r
1480         }\r
1481         cursor.dispose();\r
1482     }\r
1483     \r
1484     public void updateBuildOptionsFfsSectionsSection(int i, int j, String type){\r
1485         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1486         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1487         if (sections == null) {\r
1488             return;\r
1489         }\r
1490         XmlCursor cursor = sections.newCursor();\r
1491         QName qSection = new QName(xmlNs, "Section");\r
1492         if (cursor.toChild(qSection)) {\r
1493             for (int k = 0; k < j; ++k) {\r
1494                 cursor.toNextSibling(qSection);\r
1495             }\r
1496             BuildOptionsDocument.BuildOptions.Ffs.Sections.Section section = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Section)cursor.getObject();\r
1497             section.setSectionType(EfiSectionType.Enum.forString(type));\r
1498         }\r
1499         cursor.dispose();\r
1500     } \r
1501     \r
1502     public void genBuildOptionsFfsSectionsSections(int i, String encapType) {\r
1503         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1504         if (ffs == null) {\r
1505             return;\r
1506         }\r
1507         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1508         \r
1509         if (sections == null){\r
1510             sections = ffs.addNewSections();\r
1511         }\r
1512         sections.addNewSections().setEncapsulationType(encapType);\r
1513     }\r
1514     \r
1515     public void removeBuildOptionsFfsSectionsSections(int i, int j) {\r
1516         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1517         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1518         if (sections == null) {\r
1519             return;\r
1520         }\r
1521         XmlCursor cursor = sections.newCursor();\r
1522         QName qSections = new QName(xmlNs, "Sections");\r
1523         if (cursor.toChild(qSections)) {\r
1524             for (int k = 0; k < j; ++k) {\r
1525                 cursor.toNextSibling(qSections);\r
1526             }\r
1527             cursor.removeXml();\r
1528         }\r
1529         cursor.dispose();\r
1530     }\r
1531     \r
1532     public void updateBuildOptionsFfsSectionsSections(int i, int j, String type) {\r
1533         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1534         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1535         if (sections == null) {\r
1536             return;\r
1537         }\r
1538         XmlCursor cursor = sections.newCursor();\r
1539         QName qSections = new QName(xmlNs, "Sections");\r
1540         if (cursor.toChild(qSections)) {\r
1541             for (int k = 0; k < j; ++k) {\r
1542                 cursor.toNextSibling(qSections);\r
1543             }\r
1544             BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject();\r
1545             sections2.setEncapsulationType(type);\r
1546         }\r
1547         cursor.dispose();\r
1548     }\r
1549     \r
1550     public void genBuildOptionsFfsSectionsSectionsSection(int i, int j, String type) {\r
1551         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1552         if (ffs == null) {\r
1553             return;\r
1554         }\r
1555         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1556         XmlCursor cursor = sections.newCursor();\r
1557         QName qSections = new QName(xmlNs, "Sections");\r
1558         if (cursor.toChild(qSections)){\r
1559             for (int k = 0; k < j; ++k) {\r
1560                 cursor.toNextSibling(qSections);\r
1561             }\r
1562             BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject();\r
1563             sections2.addNewSection().setSectionType(EfiSectionType.Enum.forString(type));\r
1564         }\r
1565         cursor.dispose();\r
1566     }\r
1567     \r
1568     public void removeBuildOptionsFfsSectionsSectionsSection(int i, int j, int k) {\r
1569         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1570         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1571         if (sections == null) {\r
1572             return;\r
1573         }\r
1574         XmlCursor cursor = sections.newCursor();\r
1575         QName qSections = new QName(xmlNs, "Sections");\r
1576         if (cursor.toChild(qSections)) {\r
1577             for (int l = 0; l < j; ++l) {\r
1578                 cursor.toNextSibling(qSections);\r
1579             }\r
1580             if (cursor.toFirstChild()) {\r
1581                 int m = 0;\r
1582                 for (; m < k; ++m) {\r
1583                     cursor.toNextSibling();\r
1584                 }\r
1585                 cursor.removeXml();\r
1586                 if (m == 0) {\r
1587                     cursor.toParent();\r
1588                     cursor.removeXml();\r
1589                 }\r
1590             }\r
1591         }\r
1592         cursor.dispose();\r
1593     }\r
1594     \r
1595     public void updateBuildOptionsFfsSectionsSectionsSection(int i, int j, int k, String type) {\r
1596         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1597         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1598         if (sections == null) {\r
1599             return;\r
1600         }\r
1601         XmlCursor cursor = sections.newCursor();\r
1602         QName qSections = new QName(xmlNs, "Sections");\r
1603         if (cursor.toChild(qSections)) {\r
1604             for (int l = 0; l < j; ++l) {\r
1605                 cursor.toNextSibling(qSections);\r
1606             }\r
1607             if (cursor.toFirstChild()) {\r
1608                 for (int m = 0; m < k; ++m) {\r
1609                     cursor.toNextSibling();\r
1610                 }\r
1611                 BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section section = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section)cursor.getObject();\r
1612                 section.setSectionType(EfiSectionType.Enum.forString(type));\r
1613             }\r
1614         }\r
1615         cursor.dispose();\r
1616     }\r
1617     \r
1618     public void getBuildOptionsFfsSectionsSectionsSection(int i, int j, ArrayList<String> al) {\r
1619         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1620         if (ffs == null) {\r
1621             return;\r
1622         }\r
1623         BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections();\r
1624         XmlCursor cursor = sections.newCursor();\r
1625         QName qSections = new QName(xmlNs, "Sections");\r
1626         if (cursor.toChild(qSections)){\r
1627             for (int k = 0; k < j; ++k) {\r
1628                 cursor.toNextSibling(qSections);\r
1629             }\r
1630             BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject();\r
1631             if (sections2.getSectionList() == null){\r
1632                 cursor.dispose();\r
1633                 return;\r
1634             }\r
1635             ListIterator<BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section> li = sections2.getSectionList().listIterator();\r
1636             while(li.hasNext()) {\r
1637                 BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section section = li.next();\r
1638                 if (section.isSetSectionType()) {\r
1639                     al.add(section.getSectionType().toString());\r
1640                 }\r
1641                 \r
1642             }\r
1643         }\r
1644         cursor.dispose();\r
1645         \r
1646     }\r
1647     \r
1648     public int getBuildOptionsFfsCount(){\r
1649         if (getfpdBuildOpts().getFfsList() == null) {\r
1650             return 0;\r
1651         }\r
1652         return getfpdBuildOpts().getFfsList().size();\r
1653     }\r
1654     \r
1655     public void getBuildOptionsFfsKey(String[][] saa) {\r
1656         if (getfpdBuildOpts().getFfsList() == null) {\r
1657             return;\r
1658         }\r
1659         ListIterator<BuildOptionsDocument.BuildOptions.Ffs> li = getfpdBuildOpts().getFfsList().listIterator();\r
1660         int i = 0;\r
1661         while(li.hasNext()){\r
1662             BuildOptionsDocument.BuildOptions.Ffs ffs = li.next();\r
1663             saa[i][0] = ffs.getFfsKey();\r
1664             ++i;\r
1665         }\r
1666     }\r
1667     \r
1668     public void updateBuildOptionsFfsKey(int i, String key) {\r
1669         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1670         ffs.setFfsKey(key);\r
1671     }\r
1672     \r
1673     /**Get ith FFS key and contents.\r
1674      * @param saa\r
1675      */\r
1676     public void getBuildOptionsFfs(int i, String[] sa, LinkedHashMap<String, String> ffsAttribMap, ArrayList<String> firstLevelSections, ArrayList<String> firstLevelSection) {\r
1677         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1678      \r
1679         if (ffs != null) {\r
1680          \r
1681             sa[0] = ffs.getFfsKey();\r
1682             if (ffs.getSections() != null) {\r
1683                 if(ffs.getSections().getEncapsulationType() != null){\r
1684                     sa[1] = ffs.getSections().getEncapsulationType();\r
1685                 }\r
1686                 if (ffs.getSections().getSectionList() != null){\r
1687                     ListIterator<BuildOptionsDocument.BuildOptions.Ffs.Sections.Section> li = ffs.getSections().getSectionList().listIterator();\r
1688                     while (li.hasNext()) {\r
1689                         firstLevelSection.add(li.next().getSectionType().toString());\r
1690                     }\r
1691                 }\r
1692                 if (ffs.getSections().getSectionsList() != null) {\r
1693                     ListIterator<BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2> li = ffs.getSections().getSectionsList().listIterator();\r
1694                     while(li.hasNext()) {\r
1695                         firstLevelSections.add(li.next().getEncapsulationType());\r
1696                     }\r
1697                 }\r
1698             }\r
1699             if (ffs.getAttributeList() != null) {\r
1700                 ListIterator<BuildOptionsDocument.BuildOptions.Ffs.Attribute> li = ffs.getAttributeList().listIterator();\r
1701                 while(li.hasNext()) {\r
1702                     BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = li.next();\r
1703                     ffsAttribMap.put(attrib.getName(), attrib.getValue());\r
1704                 }\r
1705                 \r
1706             }\r
1707         }\r
1708 \r
1709         \r
1710     }\r
1711     \r
1712     private BuildOptionsDocument.BuildOptions.Ffs getFfs(int i) {\r
1713         XmlObject o = getfpdBuildOpts();\r
1714         BuildOptionsDocument.BuildOptions.Ffs ffs = null;\r
1715         \r
1716         XmlCursor cursor = o.newCursor();\r
1717         QName qFfs = new QName(xmlNs, "Ffs");\r
1718         if (cursor.toChild(qFfs)) {\r
1719             for (int j = 0; j < i; ++j) {\r
1720                 cursor.toNextSibling(qFfs);\r
1721             }\r
1722             ffs = (BuildOptionsDocument.BuildOptions.Ffs)cursor.getObject();\r
1723         }\r
1724         cursor.dispose();\r
1725         return ffs;\r
1726     }\r
1727     \r
1728     public void removeBuildOptionsFfs(int i) {\r
1729         BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i);\r
1730         if (ffs == null){\r
1731             return;\r
1732         }\r
1733         \r
1734         XmlCursor cursor = ffs.newCursor();\r
1735         cursor.removeXml();\r
1736         cursor.dispose();\r
1737     }\r
1738     \r
1739     \r
1740     \r
1741     public PlatformDefinitionsDocument.PlatformDefinitions getfpdPlatformDefs(){\r
1742         if (fpdPlatformDefs == null){\r
1743             fpdPlatformDefs = fpdRoot.addNewPlatformDefinitions();\r
1744         }\r
1745         return fpdPlatformDefs;\r
1746     }\r
1747     \r
1748     public void getPlatformDefsSupportedArchs(Vector<Object> archs){\r
1749         if (getfpdPlatformDefs().getSupportedArchitectures() == null) {\r
1750             return;\r
1751         }\r
1752         ListIterator li = getfpdPlatformDefs().getSupportedArchitectures().listIterator();\r
1753         while(li.hasNext()) {\r
1754             archs.add(li.next());\r
1755         }\r
1756     }\r
1757     \r
1758     public void setPlatformDefsSupportedArchs(Vector<Object> archs) {\r
1759         getfpdPlatformDefs().setSupportedArchitectures(archs);\r
1760     }\r
1761     \r
1762     public void getPlatformDefsBuildTargets(Vector<Object> targets) {\r
1763         if (getfpdPlatformDefs().getBuildTargets() == null) {\r
1764             return;\r
1765         }\r
1766         ListIterator li = getfpdPlatformDefs().getBuildTargets().listIterator();\r
1767         while(li.hasNext()) {\r
1768             targets.add(li.next());\r
1769         }\r
1770     }\r
1771     \r
1772     public void setPlatformDefsBuildTargets(Vector<Object> targets) {\r
1773         getfpdPlatformDefs().setBuildTargets(targets);\r
1774     }\r
1775     \r
1776     public void genPlatformDefsSkuInfo(String id, String name) {\r
1777         SkuInfoDocument.SkuInfo skuInfo = null;\r
1778         if (getfpdPlatformDefs().getSkuInfo() == null) {\r
1779             skuInfo = getfpdPlatformDefs().addNewSkuInfo();\r
1780         }\r
1781         skuInfo = getfpdPlatformDefs().getSkuInfo();\r
1782         if (skuInfo.getUiSkuNameList() == null || skuInfo.getUiSkuNameList().size() == 0) {\r
1783             SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName();\r
1784             skuName.setSkuID(new BigInteger("0"));\r
1785             skuName.setStringValue("DEFAULT");\r
1786         }\r
1787         if (id.equals("0")) {\r
1788             return;\r
1789         }\r
1790         SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName();\r
1791         skuName.setSkuID(new BigInteger(id));\r
1792         skuName.setStringValue(name);\r
1793     }\r
1794     \r
1795     public int getPlatformDefsSkuInfoCount(){\r
1796         if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {\r
1797             return 0;\r
1798         }\r
1799         return getfpdPlatformDefs().getSkuInfo().getUiSkuNameList().size();\r
1800     }\r
1801     \r
1802     public void getPlatformDefsSkuInfos(String[][] saa){\r
1803         if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {\r
1804             return ;\r
1805         }\r
1806         \r
1807         List<SkuInfoDocument.SkuInfo.UiSkuName> l = getfpdPlatformDefs().getSkuInfo().getUiSkuNameList();\r
1808         ListIterator<SkuInfoDocument.SkuInfo.UiSkuName> li = l.listIterator();\r
1809         int i = 0;\r
1810         while(li.hasNext()) {\r
1811             SkuInfoDocument.SkuInfo.UiSkuName sku = li.next();\r
1812             saa[i][0] = sku.getSkuID()+"";\r
1813             saa[i][1] = sku.getStringValue();\r
1814             ++i;\r
1815         }\r
1816     }\r
1817     \r
1818     public void removePlatformDefsSkuInfo(int i) {\r
1819         SkuInfoDocument.SkuInfo skuInfo = getfpdPlatformDefs().getSkuInfo();\r
1820         if (skuInfo == null || i == 0) {\r
1821             return ;\r
1822         }\r
1823         \r
1824         XmlCursor cursor = skuInfo.newCursor();\r
1825         if (cursor.toFirstChild()) {\r
1826             for (int j = 0; j < i; ++j) {\r
1827                 cursor.toNextSibling();\r
1828             }\r
1829             cursor.removeXml();\r
1830         }\r
1831         cursor.dispose();\r
1832     }\r
1833     \r
1834     public void updatePlatformDefsSkuInfo(int i, String id, String name) {\r
1835         SkuInfoDocument.SkuInfo skuInfo = getfpdPlatformDefs().getSkuInfo();\r
1836         if (skuInfo == null || i == 0) {\r
1837             return ;\r
1838         }\r
1839         \r
1840         XmlCursor cursor = skuInfo.newCursor();\r
1841         if (cursor.toFirstChild()) {\r
1842             for (int j = 0; j < i; ++j) {\r
1843                 cursor.toNextSibling();\r
1844             }\r
1845             SkuInfoDocument.SkuInfo.UiSkuName sku = (SkuInfoDocument.SkuInfo.UiSkuName)cursor.getObject();\r
1846             sku.setSkuID(new BigInteger(id));\r
1847             sku.setStringValue(name);\r
1848         }\r
1849         cursor.dispose();\r
1850     }\r
1851     \r
1852     public String getPlatformDefsInterDir(){\r
1853         if (getfpdPlatformDefs().getIntermediateDirectories() == null) {\r
1854             return null;\r
1855         }\r
1856         return getfpdPlatformDefs().getIntermediateDirectories().toString();\r
1857     }\r
1858     \r
1859     public void setPlatformDefsInterDir(String interDir){\r
1860         getfpdPlatformDefs().setIntermediateDirectories(IntermediateOutputType.Enum.forString(interDir));\r
1861     }\r
1862     \r
1863     public String getPlatformDefsOutputDir() {\r
1864         return getfpdPlatformDefs().getOutputDirectory();\r
1865     }\r
1866     \r
1867     public void setPlatformDefsOutputDir(String outputDir) {\r
1868         if (outputDir != null && outputDir.length() > 0) {\r
1869             getfpdPlatformDefs().setOutputDirectory(outputDir);\r
1870         }\r
1871         else{\r
1872             XmlCursor cursor = getfpdPlatformDefs().newCursor();\r
1873             if (cursor.toChild(new QName(xmlNs, "OutputDirectory"))) {\r
1874                 cursor.removeXml();\r
1875             }\r
1876             cursor.dispose();\r
1877         }\r
1878     }\r
1879     \r
1880     public FlashDocument.Flash getfpdFlash() {\r
1881         if (fpdFlash == null) {\r
1882             fpdFlash = fpdRoot.addNewFlash();\r
1883         }\r
1884         return fpdFlash;\r
1885     }\r
1886     \r
1887     public void genFlashDefinitionFile(String file) {\r
1888         FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile();\r
1889         if (fdf == null) {\r
1890             fdf = getfpdFlash().addNewFlashDefinitionFile();\r
1891         }\r
1892         \r
1893         fdf.setStringValue(file);\r
1894     }\r
1895     \r
1896     public String getFlashDefinitionFile() {\r
1897         FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile();\r
1898         if (fdf == null) {\r
1899             return "";\r
1900         }\r
1901         \r
1902         return fdf.getStringValue();\r
1903     }\r
1904     \r
1905     public void genFvImagesNameValue(String name, String value) {\r
1906       \r
1907         FvImagesDocument.FvImages fi = getfpdFlash().getFvImages();\r
1908         if (fi == null) {\r
1909             fi = getfpdFlash().addNewFvImages();\r
1910         }\r
1911         \r
1912         FvImagesDocument.FvImages.NameValue nv = fi.addNewNameValue();\r
1913         nv.setName(name);\r
1914         nv.setValue(value);\r
1915     }\r
1916     \r
1917     public void removeFvImagesNameValue(int i){\r
1918      \r
1919         XmlObject o = getfpdFlash().getFvImages();\r
1920         if (o == null) {\r
1921             return;\r
1922         }\r
1923         \r
1924         QName qNameValue = new QName(xmlNs, "NameValue");\r
1925         XmlCursor cursor = o.newCursor();\r
1926         if (cursor.toChild(qNameValue)) {\r
1927             for (int j = 0; j < i; ++j) {\r
1928                 cursor.toNextSibling(qNameValue);\r
1929             }\r
1930             cursor.removeXml();\r
1931         }\r
1932         cursor.dispose();\r
1933     }\r
1934     \r
1935     public void updateFvImagesNameValue(int i, String name, String value){\r
1936         \r
1937         XmlObject o = getfpdFlash().getFvImages();\r
1938         if (o == null) {\r
1939             return;\r
1940         }\r
1941         \r
1942         QName qNameValue = new QName(xmlNs, "NameValue");\r
1943         XmlCursor cursor = o.newCursor();\r
1944         if (cursor.toChild(qNameValue)) {\r
1945             for (int j = 0; j < i; ++j) {\r
1946                 cursor.toNextSibling(qNameValue);\r
1947             }\r
1948             FvImagesDocument.FvImages.NameValue nv = (FvImagesDocument.FvImages.NameValue)cursor.getObject();\r
1949             nv.setName(name);\r
1950             nv.setValue(value);\r
1951         }\r
1952         cursor.dispose();\r
1953     }\r
1954     \r
1955     public int getFvImagesNameValueCount() {\r
1956            \r
1957         FvImagesDocument.FvImages fi = null;\r
1958         if ((fi = getfpdFlash().getFvImages()) == null || fi.getNameValueList() == null) {\r
1959             return 0;\r
1960         }\r
1961         return fi.getNameValueList().size();\r
1962     }\r
1963     \r
1964     public void getFvImagesNameValues(String[][] nv) {\r
1965      \r
1966         FvImagesDocument.FvImages fi = getfpdFlash().getFvImages();\r
1967         if (fi == null){\r
1968             return;\r
1969         }\r
1970         List<FvImagesDocument.FvImages.NameValue> l = fi.getNameValueList();\r
1971         int i = 0;\r
1972         ListIterator li = l.listIterator();\r
1973         while (li.hasNext()) {\r
1974             FvImagesDocument.FvImages.NameValue e = (FvImagesDocument.FvImages.NameValue) li\r
1975                                                                                                                     .next();\r
1976             nv[i][0] = e.getName();\r
1977             nv[i][1] = e.getValue();\r
1978             \r
1979             i++;\r
1980         }\r
1981     }\r
1982     \r
1983     public void genFvImagesFvImage(String[] names, String types, Map<String, String> options) {\r
1984       \r
1985         FvImagesDocument.FvImages fis = null;\r
1986         if ((fis = getfpdFlash().getFvImages()) == null) {\r
1987             fis = getfpdFlash().addNewFvImages();\r
1988         }\r
1989         \r
1990         //\r
1991         //gen FvImage with FvImageNames array\r
1992         //\r
1993         FvImagesDocument.FvImages.FvImage fi = fis.addNewFvImage();\r
1994         for (int i = 0; i < names.length; ++i) {\r
1995             fi.addFvImageNames(names[i]);\r
1996         }\r
1997         fi.setType(FvImageTypes.Enum.forString(types));\r
1998         if (options != null){\r
1999             setFvImagesFvImageFvImageOptions(options, fi);\r
2000         }\r
2001     }\r
2002     \r
2003     private void setFvImagesFvImageFvImageOptions(Map<String, String> options, FvImagesDocument.FvImages.FvImage fi){\r
2004         FvImagesDocument.FvImages.FvImage.FvImageOptions fio = fi.getFvImageOptions();\r
2005         if (fio == null){\r
2006             fio = fi.addNewFvImageOptions();\r
2007         }\r
2008         \r
2009         Set<String> key = options.keySet();\r
2010         Iterator<String> i = key.iterator();\r
2011         while (i.hasNext()) {\r
2012             \r
2013             FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = fio.addNewNameValue();\r
2014             String k = (String)i.next();\r
2015             \r
2016             nv.setName(k);\r
2017             nv.setValue((String)options.get(k));\r
2018             \r
2019         }\r
2020         \r
2021     }\r
2022     \r
2023     \r
2024     public void removeFvImagesFvImage(int i) {\r
2025       \r
2026         XmlObject o = getfpdFlash().getFvImages();\r
2027         if (o == null) {\r
2028             return;\r
2029         }\r
2030         \r
2031         QName qFvImage = new QName(xmlNs, "FvImage");\r
2032         XmlCursor cursor = o.newCursor();\r
2033         if (cursor.toChild(qFvImage)) {\r
2034             for (int j = 0; j < i; ++j) {\r
2035                 cursor.toNextSibling(qFvImage);\r
2036             }\r
2037             cursor.removeXml();\r
2038         }\r
2039         cursor.dispose();\r
2040     }\r
2041     \r
2042     public void updateFvImagesFvImage(int i, String[] names, String types, Map<String, String> options){\r
2043            \r
2044         XmlObject o = getfpdFlash().getFvImages();\r
2045         if (o == null) {\r
2046             return;\r
2047         }\r
2048         XmlCursor cursor = o.newCursor();\r
2049         QName qFvImage = new QName(xmlNs, "FvImage");\r
2050         if (cursor.toChild(qFvImage)) {\r
2051             for (int j = 0; j < i; ++j) {\r
2052                 cursor.toNextSibling(qFvImage);\r
2053             }\r
2054             FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject();\r
2055             fi.setType(FvImageTypes.Enum.forString(types));\r
2056             \r
2057             //\r
2058             // remove old FvImageNames before adding new ones\r
2059             //\r
2060             QName qFvImageNames = new QName(xmlNs, "FvImageNames"); \r
2061             cursor.toChild(qFvImageNames);\r
2062             cursor.removeXml();\r
2063             while (cursor.toNextSibling(qFvImageNames)) {\r
2064                 cursor.removeXml();\r
2065             }\r
2066             \r
2067             for (int k = 0; k < names.length; ++k) {\r
2068                 fi.addFvImageNames(names[k]);\r
2069             }\r
2070             //\r
2071             // remove old FvImageOptions before adding new options\r
2072             //\r
2073             QName qFvImageOptions = new QName(xmlNs, "FvImageOptions");\r
2074             cursor.toNextSibling(qFvImageOptions);\r
2075             cursor.removeXml();\r
2076             \r
2077             setFvImagesFvImageFvImageOptions(options, fi);\r
2078         }\r
2079         cursor.dispose();\r
2080     }\r
2081     \r
2082     public int getFvImagesFvImageCount() {\r
2083         \r
2084         if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) {\r
2085             return 0;\r
2086         }\r
2087         return getfpdFlash().getFvImages().getFvImageList().size();\r
2088     }\r
2089     \r
2090     /**Only Get Fv image setting - name and type.\r
2091      * @param saa\r
2092      */\r
2093     public void getFvImagesFvImages(String[][] saa) {\r
2094     \r
2095         if (getfpdFlash().getFvImages() == null) {\r
2096             return;\r
2097         }\r
2098         List<FvImagesDocument.FvImages.FvImage> l = getfpdFlash().getFvImages().getFvImageList();\r
2099         if (l == null) {\r
2100             return;\r
2101         }\r
2102         ListIterator li = l.listIterator();\r
2103         int i = 0;\r
2104         while(li.hasNext()) {\r
2105             FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next();\r
2106             //\r
2107             // get FvImageNames array, space separated\r
2108             //\r
2109             List<String> lfn = fi.getFvImageNamesList();\r
2110             ListIterator lfni = lfn.listIterator();\r
2111             saa[i][0] = " ";\r
2112             while (lfni.hasNext()) {\r
2113                 saa[i][0] += (String)lfni.next();\r
2114                 saa[i][0] += " ";\r
2115             }\r
2116             saa[i][0] = saa[i][0].trim();\r
2117             \r
2118             saa[i][1] = fi.getType()+"";\r
2119             \r
2120             ++i;\r
2121         }\r
2122     }\r
2123     \r
2124     /**Get FvImage Options for FvImage i\r
2125      * @param i the ith FvImage\r
2126      */\r
2127     public void getFvImagesFvImageOptions(int i, Map<String, String> m) {\r
2128         XmlObject o = getfpdFlash().getFvImages();\r
2129         if (o == null) {\r
2130             return;\r
2131         }\r
2132         XmlCursor cursor = o.newCursor();\r
2133         QName qFvImage = new QName(xmlNs, "FvImage");\r
2134         if (cursor.toChild(qFvImage)) {\r
2135             for (int j = 0; j < i; ++j) {\r
2136                 cursor.toNextSibling(qFvImage);\r
2137             }\r
2138             FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject();\r
2139             if (fi.getFvImageOptions() == null || fi.getFvImageOptions().getNameValueList() == null){\r
2140                 return;\r
2141             }\r
2142             ListIterator<FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue> li = fi.getFvImageOptions().getNameValueList().listIterator();\r
2143             while(li.hasNext()){\r
2144                 FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = li.next();\r
2145                 m.put(nv.getName(), nv.getValue());\r
2146             }\r
2147         }\r
2148     }\r
2149     \r
2150     /**\r
2151      Get platform header element\r
2152      @return PlatformHeaderDocument.PlatformHeader\r
2153     **/\r
2154     public PlatformHeaderDocument.PlatformHeader getFpdHdr() {\r
2155         if (fpdHdr == null) {\r
2156             fpdHdr = fpdRoot.addNewPlatformHeader();\r
2157         }\r
2158         genPlatformDefsSkuInfo("0", "DEFAULT");\r
2159         return fpdHdr;\r
2160     }\r
2161     \r
2162     public String getFpdHdrPlatformName() {\r
2163         return getFpdHdr().getPlatformName();\r
2164     }\r
2165     \r
2166     public String getFpdHdrGuidValue() {\r
2167         return getFpdHdr().getGuidValue();\r
2168     }\r
2169     \r
2170     public String getFpdHdrVer() {\r
2171         return getFpdHdr().getVersion();\r
2172     }\r
2173     \r
2174     public String getFpdHdrAbs() {\r
2175         return getFpdHdr().getAbstract();\r
2176     }\r
2177     \r
2178     public String getFpdHdrDescription() {\r
2179         return getFpdHdr().getDescription();\r
2180     }\r
2181     \r
2182     public String getFpdHdrCopyright() {\r
2183         return getFpdHdr().getCopyright();\r
2184     }\r
2185     \r
2186     public String getFpdHdrLicense() {\r
2187         LicenseDocument.License l = getFpdHdr().getLicense();\r
2188         if (l == null) {\r
2189             return null;\r
2190         }\r
2191         return l.getStringValue();\r
2192     }\r
2193     \r
2194     public String getFpdHdrUrl() {\r
2195         LicenseDocument.License l = getFpdHdr().getLicense();\r
2196         if (l == null) {\r
2197             return null;\r
2198         }\r
2199         return l.getURL();\r
2200     }\r
2201     \r
2202     public String getFpdHdrSpec() {\r
2203 \r
2204         return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";\r
2205 //        return getFpdHdr().getSpecification();\r
2206     }\r
2207     \r
2208     public void setFpdHdrPlatformName(String name){\r
2209         getFpdHdr().setPlatformName(name);\r
2210     }\r
2211     \r
2212     public void setFpdHdrGuidValue(String guid){\r
2213         getFpdHdr().setGuidValue(guid);\r
2214     }\r
2215     \r
2216     public void setFpdHdrVer(String v){\r
2217         getFpdHdr().setVersion(v);\r
2218     }\r
2219     \r
2220     public void setFpdHdrAbs(String abs) {\r
2221         getFpdHdr().setAbstract(abs);\r
2222     }\r
2223     \r
2224     public void setFpdHdrDescription(String desc){\r
2225         getFpdHdr().setDescription(desc);\r
2226     }\r
2227     \r
2228     public void setFpdHdrCopyright(String cr) {\r
2229         getFpdHdr().setCopyright(cr);\r
2230     }\r
2231     \r
2232     public void setFpdHdrLicense(String license){\r
2233         LicenseDocument.License l = getFpdHdr().getLicense();\r
2234         if (l == null) {\r
2235             getFpdHdr().addNewLicense().setStringValue(license);\r
2236         }\r
2237         else {\r
2238             l.setStringValue(license);\r
2239         }\r
2240     }\r
2241 \r
2242     public void setFpdHdrUrl(String url){\r
2243         LicenseDocument.License l = getFpdHdr().getLicense();\r
2244         \r
2245         l.setURL(url);\r
2246         \r
2247     }\r
2248     \r
2249     public void setFpdHdrSpec(String s){\r
2250         s = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";\r
2251         getFpdHdr().setSpecification(s);\r
2252     }\r
2253     /**\r
2254     Save the processed xml contents to file\r
2255     \r
2256     @param fpdFile The file to save xml contents\r
2257     @throws IOException Exceptions during file operation\r
2258     **/\r
2259     public void saveAs(File fpdFile) throws IOException {\r
2260 \r
2261        XmlOptions options = new XmlOptions();\r
2262 \r
2263        options.setCharacterEncoding("UTF-8");\r
2264        options.setSavePrettyPrint();\r
2265        options.setSavePrettyPrintIndent(2);\r
2266        try {\r
2267            fpdd.save(fpdFile, options);\r
2268        } catch (IOException e) {\r
2269            e.printStackTrace();\r
2270        }\r
2271 \r
2272     }\r
2273     \r
2274     private String listToString(List l) {\r
2275         if (l == null) {\r
2276             return null;\r
2277         }\r
2278         String s = " ";\r
2279         ListIterator li = l.listIterator();\r
2280         while(li.hasNext()) {\r
2281             s += li.next();\r
2282             s += " ";\r
2283         }\r
2284         return s.trim();\r
2285     }\r
2286 }\r
2287 \r
2288 class PcdItemTypeConflictException extends Exception {\r
2289 \r
2290     /**\r
2291      * \r
2292      */\r
2293     private static final long serialVersionUID = 1L;\r
2294     private String details = null;\r
2295     \r
2296     PcdItemTypeConflictException(String info){\r
2297         details = info;\r
2298     }\r
2299     \r
2300     public String getMessage() {\r
2301         return details;\r
2302     }\r
2303 }\r
2304 \r
2305 class PcdDeclNotFound extends Exception {\r
2306 \r
2307     /**\r
2308      * \r
2309      */\r
2310     private static final long serialVersionUID = 1L;\r
2311     private String details = null;\r
2312     \r
2313     PcdDeclNotFound(String info) {\r
2314         details = info;\r
2315     }\r
2316     \r
2317     public String getMessage() {\r
2318         return details;\r
2319     }\r
2320 }\r
2321 \r
2322 class PcdValueMalFormed extends Exception {\r
2323 \r
2324     /**\r
2325      * \r
2326      */\r
2327     private static final long serialVersionUID = 1L;\r
2328     private String details = null;\r
2329     \r
2330     PcdValueMalFormed(String info) {\r
2331         details = info;\r
2332     }\r
2333     \r
2334     public String getMessage() {\r
2335         return details;\r
2336     }\r
2337 }\r