]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java
Flash Setting Refinement
[mirror_edk2.git] / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdFileContents.java
CommitLineData
a13899c5 1/** @file\r
2 Java class FpdFileContents is used to parse fpd xml file.\r
3 \r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12**/\r
13package org.tianocore.frameworkwizard.platform.ui;\r
14\r
15import java.io.File;\r
16import java.io.IOException;\r
17import java.math.BigInteger;\r
18import java.util.ArrayList;\r
19import java.util.HashMap;\r
20import java.util.Iterator;\r
21import java.util.LinkedHashMap;\r
22import java.util.List;\r
23import java.util.ListIterator;\r
24import java.util.Map;\r
25import java.util.Set;\r
26\r
27import javax.xml.namespace.QName;\r
28\r
29import org.apache.xmlbeans.XmlCursor;\r
30import org.apache.xmlbeans.XmlObject;\r
31import org.apache.xmlbeans.XmlOptions;\r
32import org.tianocore.AntTaskDocument;\r
33import org.tianocore.BuildOptionsDocument;\r
34import org.tianocore.DynamicPcdBuildDefinitionsDocument;\r
35import org.tianocore.FlashDefinitionFileDocument;\r
a13899c5 36import org.tianocore.FlashDocument;\r
37import org.tianocore.FrameworkModulesDocument;\r
a13899c5 38import org.tianocore.LibrariesDocument;\r
39import org.tianocore.ModuleSADocument;\r
40import org.tianocore.ModuleSurfaceAreaDocument;\r
41import org.tianocore.OptionDocument;\r
42import org.tianocore.OptionsDocument;\r
43import org.tianocore.PcdBuildDefinitionDocument;\r
44import org.tianocore.PcdCodedDocument;\r
45import org.tianocore.PcdDataTypes;\r
46import org.tianocore.PcdDeclarationsDocument;\r
47import org.tianocore.PcdItemTypes;\r
48import org.tianocore.PlatformDefinitionsDocument;\r
49import org.tianocore.PlatformSurfaceAreaDocument;\r
50import org.tianocore.FvImageTypes;\r
51import org.tianocore.FvImagesDocument;\r
52import org.tianocore.LicenseDocument;\r
53import org.tianocore.PlatformHeaderDocument;\r
54import org.tianocore.SkuInfoDocument;\r
55import org.tianocore.UserDefinedAntTasksDocument;\r
56import org.tianocore.frameworkwizard.platform.ui.global.GlobalData;\r
57import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
58import org.tianocore.frameworkwizard.platform.ui.id.ModuleIdentification;\r
59import org.tianocore.frameworkwizard.platform.ui.id.PackageIdentification;\r
60\r
61/**\r
62 This class processes fpd file contents such as add remove xml elements. \r
63 @since PackageEditor 1.0\r
64**/\r
65public class FpdFileContents {\r
66\r
67 static final String xmlNs = "http://www.TianoCore.org/2006/Edk2.0";\r
68 \r
69 private PlatformSurfaceAreaDocument fpdd = null;\r
70 \r
71 private PlatformSurfaceAreaDocument.PlatformSurfaceArea fpdRoot = null;\r
72 \r
73 private PlatformHeaderDocument.PlatformHeader fpdHdr = null;\r
74 \r
75 private PlatformDefinitionsDocument.PlatformDefinitions fpdPlatformDefs = null;\r
76 \r
77 private FlashDocument.Flash fpdFlash = null;\r
78 \r
79 private BuildOptionsDocument.BuildOptions fpdBuildOpts = null;\r
80 \r
81 private FrameworkModulesDocument.FrameworkModules fpdFrameworkModules = null;\r
82 \r
83 private DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs = null;\r
84 \r
85 public static HashMap<String, ArrayList<String>> dynPcdMap = null;\r
86 \r
87 /**\r
88 * look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings.\r
89 */\r
90 public void initDynPcdMap() {\r
91 if (dynPcdMap == null) {\r
92 dynPcdMap = new HashMap<String, ArrayList<String>>();\r
93 List<ModuleSADocument.ModuleSA> l = getfpdFrameworkModules().getModuleSAList();\r
94 if (l == null) {\r
95 return;\r
96 }\r
97 ListIterator<ModuleSADocument.ModuleSA> li = l.listIterator();\r
98 while (li.hasNext()) {\r
99 ModuleSADocument.ModuleSA msa = li.next();\r
100 if (msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null) {\r
101 continue;\r
102 }\r
103 String ModuleInfo = msa.getModuleGuid() + " " + msa.getModuleVersion() +\r
104 " " + msa.getPackageGuid() + " " + msa.getPackageVersion();\r
105 List<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> lp = msa.getPcdBuildDefinition().getPcdDataList();\r
106 ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> lpi = lp.listIterator();\r
107 while (lpi.hasNext()) {\r
108 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = lpi.next();\r
109 String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
110 if (dynPcdMap.get(pcdKey) == null) {\r
111 ArrayList<String> al = new ArrayList<String>();\r
112 al.add(ModuleInfo + " " + pcdData.getItemType().toString());\r
113 dynPcdMap.put(pcdKey, al);\r
114 }\r
115 else{\r
116 dynPcdMap.get(pcdKey).add(ModuleInfo + " " + pcdData.getItemType().toString());\r
117 }\r
118 }\r
119 }\r
120 }\r
121 }\r
122 /**\r
123 Constructor to create a new spd file\r
124 **/\r
125 public FpdFileContents() {\r
126\r
127 fpdd = PlatformSurfaceAreaDocument.Factory.newInstance();\r
128 fpdRoot = fpdd.addNewPlatformSurfaceArea();\r
129\r
130 }\r
131\r
132 /**\r
133 Constructor for existing document object\r
134 @param psa\r
135 **/\r
136 public FpdFileContents(PlatformSurfaceAreaDocument.PlatformSurfaceArea fpd) {\r
137 fpdRoot = fpd;\r
138 fpdHdr = fpdRoot.getPlatformHeader();\r
139 fpdPlatformDefs = fpdRoot.getPlatformDefinitions();\r
140 fpdBuildOpts = fpdRoot.getBuildOptions();\r
141 fpdFrameworkModules = fpdRoot.getFrameworkModules();\r
142 fpdDynPcdBuildDefs = fpdRoot.getDynamicPcdBuildDefinitions();\r
143 fpdFlash = fpdRoot.getFlash();\r
144 }\r
145\r
146 /**\r
147 Constructor based on an existing spd file\r
148 \r
149 @param f Existing spd file\r
150 **/\r
151 public FpdFileContents(File f) {\r
152 try {\r
153 fpdd = PlatformSurfaceAreaDocument.Factory.parse(f);\r
154 fpdRoot = fpdd.getPlatformSurfaceArea();\r
155 } catch (Exception e) {\r
156 System.out.println(e.toString());\r
157 }\r
158 }\r
159 \r
160 public DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions getfpdDynPcdBuildDefs() {\r
161 if (fpdDynPcdBuildDefs == null){\r
162 fpdDynPcdBuildDefs = fpdRoot.addNewDynamicPcdBuildDefinitions();\r
163 }\r
164 return fpdDynPcdBuildDefs;\r
165 }\r
166 \r
167 public FrameworkModulesDocument.FrameworkModules getfpdFrameworkModules() {\r
168 if (fpdFrameworkModules == null){\r
169 fpdFrameworkModules = fpdRoot.addNewFrameworkModules();\r
170 }\r
171 return fpdFrameworkModules;\r
172 }\r
173 \r
174 public int getPlatformDefsSkuInfoCount(){\r
175 if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {\r
176 return 0;\r
177 }\r
178 return getfpdPlatformDefs().getSkuInfo().getUiSkuNameList().size();\r
179 }\r
180 \r
181 public void getPlatformDefsSkuInfos(String[][] saa){\r
182 if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) {\r
183 return ;\r
184 }\r
185 \r
186 List<SkuInfoDocument.SkuInfo.UiSkuName> l = getfpdPlatformDefs().getSkuInfo().getUiSkuNameList();\r
187 ListIterator<SkuInfoDocument.SkuInfo.UiSkuName> li = l.listIterator();\r
188 int i = 0;\r
189 while(li.hasNext()) {\r
190 SkuInfoDocument.SkuInfo.UiSkuName sku = li.next();\r
191 saa[i][0] = sku.getSkuID()+"";\r
192 saa[i][1] = sku.getStringValue();\r
193 ++i;\r
194 }\r
195 }\r
196 \r
197 public int getFrameworkModulesCount() {\r
198 if (getfpdFrameworkModules().getModuleSAList() == null){\r
199 return 0;\r
200 }\r
201 return getfpdFrameworkModules().getModuleSAList().size();\r
202 }\r
203 \r
204 public void getFrameworkModulesInfo(String[][] saa) {\r
205 if (getFrameworkModulesCount() == 0){\r
206 return;\r
207 }\r
208 \r
209 ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator();\r
210 int i = 0;\r
211 while(li.hasNext()) {\r
212 ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next();\r
213 saa[i][1] = msa.getModuleGuid();\r
214 saa[i][2] = msa.getModuleVersion();\r
215 \r
216 saa[i][3] = msa.getPackageGuid();\r
217 saa[i][4] = msa.getPackageVersion();\r
218// saa[i][4] = listToString(msa.getSupArchList());\r
219 ++i;\r
220 }\r
221 }\r
222 \r
223 public ModuleSADocument.ModuleSA getModuleSA(String key) {\r
224 String[] s = key.split(" ");\r
225 if (getfpdFrameworkModules().getModuleSAList() == null) {\r
226 return null;\r
227 }\r
228 ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator();\r
229 while(li.hasNext()) {\r
230 ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next();\r
231 if (msa.getModuleGuid().equals(s[0]) && msa.getModuleVersion().equals(s[1])\r
232 && msa.getPackageGuid().equals(s[2]) && msa.getPackageVersion().equals(s[3])) {\r
233 \r
234 return msa;\r
235 }\r
236 }\r
237 return null;\r
238 }\r
239 public void removeModuleSA(int i) {\r
240 XmlObject o = getfpdFrameworkModules();\r
241 if (o == null) {\r
242 return;\r
243 }\r
244 \r
245 XmlCursor cursor = o.newCursor();\r
246 if (cursor.toFirstChild()) {\r
247 for (int j = 0; j < i; ++j) {\r
248 cursor.toNextSibling();\r
249 }\r
250 //\r
251 // remove pcd from dynPcdMap, if DynamicPcdBuildData exists, remove them too.\r
252 //\r
253 ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)cursor.getObject();\r
254 String moduleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " +\r
255 moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion();\r
256 PcdBuildDefinitionDocument.PcdBuildDefinition pcdBuildDef = moduleSa.getPcdBuildDefinition();\r
257 if (pcdBuildDef != null) {\r
258 maintainDynPcdMap(pcdBuildDef, moduleInfo);\r
259 }\r
260 cursor.removeXml();\r
261 }\r
262 cursor.dispose();\r
263 }\r
264 \r
265 private void maintainDynPcdMap(PcdBuildDefinitionDocument.PcdBuildDefinition o, String moduleInfo) {\r
266 XmlCursor cursor = o.newCursor();\r
267 boolean fromLibInstance = false;\r
268 if (!cursor.toFirstChild()){\r
269 return;\r
270 }\r
271 //\r
272 // deal with first child, same process in the while loop below for siblings.\r
273 //\r
274 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
275 String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
276 ArrayList<String> al = dynPcdMap.get(pcdKey);\r
277 for(int i = 0; i < al.size(); ++i){\r
278 if (al.get(i).startsWith(moduleInfo)){\r
279 fromLibInstance = true;\r
280 break;\r
281 }\r
282 }\r
283 al.remove(moduleInfo + " " + pcdData.getItemType().toString());\r
284 if (al.size() == 0) {\r
285 dynPcdMap.remove(pcdKey);\r
286 }\r
287 \r
288 if (pcdData.getItemType().toString().equals("DYNAMIC")) {\r
289 if (dynPcdMap.get(pcdKey) == null) {\r
290 removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName());\r
291 }\r
292 }\r
293 if (fromLibInstance){\r
294 cursor.removeXml();\r
295 }\r
296 while(cursor.toNextSibling()) {\r
297 fromLibInstance = false;\r
298 pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
299 //\r
300 // remove each pcd record from dynPcdMap\r
301 //\r
302 pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
303 al = dynPcdMap.get(pcdKey);\r
304 for(int i = 0; i < al.size(); ++i){\r
305 if (al.get(i).startsWith(moduleInfo)){\r
306 fromLibInstance = true;\r
307 break;\r
308 }\r
309 }\r
310 al.remove(moduleInfo + " " + pcdData.getItemType().toString());\r
311 if (al.size() == 0) {\r
312 dynPcdMap.remove(pcdKey);\r
313 }\r
314 \r
315 if (pcdData.getItemType().toString().equals("DYNAMIC")) {\r
316 //\r
317 // First check whether this is the only consumer of this dyn pcd.\r
318 //\r
319 if (dynPcdMap.get(pcdKey) == null) {\r
320 //\r
321 // delete corresponding entry in DynamicPcdBuildData\r
322 //\r
323 removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName());\r
324 }\r
325 }\r
326 if (fromLibInstance){\r
327 cursor.removeXml();\r
328 }\r
329 }\r
330 }\r
331 //\r
332 // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
333 //\r
334 public int getPcdDataCount(String key){\r
335 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
336 if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
337 return 0;\r
338 }\r
339 return msa.getPcdBuildDefinition().getPcdDataList().size();\r
340 }\r
341 \r
342 public void getPcdData(String key, String[][] saa) {\r
343 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
344 if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){\r
345 return;\r
346 }\r
347 ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData>li = msa.getPcdBuildDefinition().getPcdDataList().listIterator();\r
348 for (int i = 0; i < saa.length; ++i) {\r
349 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next();\r
350 saa[i][0] = pcdData.getCName();\r
351 saa[i][1] = pcdData.getTokenSpaceGuidCName();\r
352 saa[i][2] = pcdData.getItemType().toString();\r
353 saa[i][3] = pcdData.getToken().toString();\r
354 saa[i][4] = pcdData.getDatumType().toString();\r
355 saa[i][5] = pcdData.getValue();\r
356 \r
357 }\r
358 }\r
359 //\r
360 // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
361 //\r
362 public int getLibraryInstancesCount(String key) {\r
363 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
364 if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){\r
365 return 0;\r
366 }\r
367 return msa.getLibraries().getInstanceList().size();\r
368 }\r
369 \r
370 public void getLibraryInstances(String key, String[][] saa){\r
371 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
372 if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){\r
373 return ;\r
374 }\r
375 \r
376 ListIterator<LibrariesDocument.Libraries.Instance> li = msa.getLibraries().getInstanceList().listIterator();\r
377 for (int i = 0; i < saa.length; ++i) {\r
378 LibrariesDocument.Libraries.Instance instance = li.next();\r
379 saa[i][1] = instance.getModuleGuid();\r
380 saa[i][2] = instance.getModuleVersion();\r
381 saa[i][3] = instance.getPackageGuid();\r
382 saa[i][4] = instance.getPackageVersion();\r
383 }\r
384 }\r
385 \r
386 public void removeLibraryInstances(String key) {\r
387 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
388 if (msa == null || msa.getLibraries() == null){\r
389 return ;\r
390 }\r
391 \r
392 XmlCursor cursor = msa.getLibraries().newCursor();\r
393 cursor.removeXml();\r
394 cursor.dispose();\r
395 }\r
396 \r
397 public void genLibraryInstance(String mg, String mv, String pg, String pv, String key) {\r
398 ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
399 if (msa == null){\r
400 msa = getfpdFrameworkModules().addNewModuleSA();\r
401 }\r
402 LibrariesDocument.Libraries libs = msa.getLibraries();\r
403 if(libs == null){\r
404 libs = msa.addNewLibraries();\r
405 }\r
406 \r
407 LibrariesDocument.Libraries.Instance instance = libs.addNewInstance();\r
408 instance.setModuleGuid(mg);\r
409 instance.setModuleVersion(mv);\r
410 instance.setPackageGuid(pg);\r
411 instance.setPackageVersion(pv);\r
412 \r
413 }\r
414 /**add pcd information of module mi to a ModuleSA. \r
415 * @param mi\r
416 * @param moduleSa if null, generate a new ModuleSA.\r
417 */\r
418 public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi, ModuleSADocument.ModuleSA moduleSa){\r
419 //ToDo add Arch filter\r
420 \r
421 try {\r
422 ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(mi);\r
423 if (msa.getPcdCoded() == null) {\r
424 return;\r
425 }\r
426 if (moduleSa == null) {\r
427 moduleSa = genModuleSA(mi);\r
428 }\r
429 Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
430 m.put("ModuleSurfaceArea", msa);\r
431 SurfaceAreaQuery.setDoc(m);\r
432 PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null);\r
433 //\r
434 // Implementing InitializePlatformPcdBuildDefinitions\r
435 //\r
436 List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
437 ListIterator li = l.listIterator();\r
438 while(li.hasNext()) {\r
439 PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
440 PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
441 if (spdPcd == null) {\r
442 //\r
443 // ToDo Error \r
444 //\r
445 break;\r
446 }\r
447 //\r
448 // AddItem to ModuleSA PcdBuildDefinitions\r
449 //\r
450 String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue();\r
451 genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType()+"", defaultVal, moduleSa);\r
452 }\r
453 \r
454 }\r
455 catch (Exception e){\r
456 e.printStackTrace();\r
457 }\r
458 \r
459 }\r
460 \r
461 private PcdDeclarationsDocument.PcdDeclarations.PcdEntry LookupPcdDeclaration (PcdCodedDocument.PcdCoded.PcdEntry msaPcd, PackageIdentification[] depPkgs) {\r
462 \r
463 Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
464 PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = null;\r
465 for (int i = 0; i < depPkgs.length; ++i) {\r
466 m.put("PackageSurfaceArea", GlobalData.getPackageXmlObject(depPkgs[i]));\r
467 SurfaceAreaQuery.setDoc(m);\r
468 XmlObject[] xo = SurfaceAreaQuery.getSpdPcdDeclarations();\r
469 if (xo == null) {\r
470 continue;\r
471 }\r
472 for (int j = 0; j < xo.length; ++j) {\r
473 spdPcd = (PcdDeclarationsDocument.PcdDeclarations.PcdEntry)xo[j];\r
474 if (msaPcd.getTokenSpaceGuidCName() == null) {\r
475 if (spdPcd.getCName().equals(msaPcd.getCName())) {\r
476 return spdPcd;\r
477 }\r
478 }\r
479 else{\r
480 if (spdPcd.getCName().equals(msaPcd.getCName()) && spdPcd.getTokenSpaceGuidCName().equals(msaPcd.getTokenSpaceGuidCName())) {\r
481 return spdPcd;\r
482 }\r
483 }\r
484 \r
485 }\r
486 \r
487 }\r
488 return null;\r
489 }\r
490 \r
491 private ModuleSADocument.ModuleSA genModuleSA (ModuleIdentification mi) {\r
492 PackageIdentification pi = GlobalData.getPackageForModule(mi);\r
493 ModuleSADocument.ModuleSA msa = getfpdFrameworkModules().addNewModuleSA();\r
494 msa.setModuleGuid(mi.getGuid());\r
495 msa.setModuleVersion(mi.getVersion());\r
496 msa.setPackageGuid(pi.getGuid());\r
497 msa.setPackageVersion(pi.getVersion());\r
498 \r
499 return msa;\r
500 }\r
501 \r
502 private void genPcdData (String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal, ModuleSADocument.ModuleSA moduleSa) {\r
503 if (moduleSa.getPcdBuildDefinition() == null){\r
504 moduleSa.addNewPcdBuildDefinition();\r
505 }\r
506 //\r
507 // constructe pcd to modulesa mapping first.\r
508 // Attention : for any error condition, remove from map this pcd.\r
509 //\r
510 ArrayList<String> pcdConsumer = LookupPlatformPcdData(cName + " " + tsGuid);\r
511 if (pcdConsumer == null) {\r
512 pcdConsumer = new ArrayList<String>();\r
513 }\r
514 String listValue = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() \r
515 + " " + moduleSa.getPackageGuid() + " " + moduleSa.getPackageVersion() \r
516 + " " + itemType;\r
517 pcdConsumer.add(listValue);\r
518 dynPcdMap.put(cName + " " + tsGuid, pcdConsumer);\r
519 //\r
520 // Special dynamic type, if this pcd already exists in other ModuleSA\r
521 //\r
522 if (itemType.equals("DYNAMIC")) {\r
523 \r
524 ListIterator li = pcdConsumer.listIterator();\r
525 while(li.hasNext()) {\r
526 String value = li.next().toString();\r
527 String[] valuePart= value.split(" ");\r
528 if (!valuePart[4].equals("DYNAMIC")) {\r
529 //ToDo error for same pcd, other type than dynamic\r
530 pcdConsumer.remove(listValue);\r
531 return;\r
532 }\r
533 }\r
534 }\r
535 else {\r
536 ListIterator li = pcdConsumer.listIterator();\r
537 while(li.hasNext()) {\r
538 String value = li.next().toString();\r
539 String[] valuePart= value.split(" ");\r
540 if (valuePart[4].equals("DYNAMIC")) {\r
541 //ToDo error for same pcd, other type than non-dynamic\r
542 pcdConsumer.remove(listValue);\r
543 return;\r
544 }\r
545 }\r
546 }\r
547 \r
548 PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData fpdPcd = moduleSa.getPcdBuildDefinition().addNewPcdData();\r
549 fpdPcd.setCName(cName);\r
550 fpdPcd.setToken(token);\r
551 fpdPcd.setTokenSpaceGuidCName(tsGuid);\r
552 fpdPcd.setDatumType(PcdDataTypes.Enum.forString(dataType));\r
553 fpdPcd.setItemType(PcdItemTypes.Enum.forString(itemType));\r
554 \r
555 if (itemType.equals("DYNAMIC") || itemType.equals("DYNAMIC_EX")) {\r
556 ArrayList<String> al = LookupDynamicPcdBuildDefinition(cName + " " + tsGuid);\r
557 //\r
558 // if only one module mapped to this pcd, then the one is myself. so no other module mapped.\r
559 // so need to add one dyn pcd.\r
560 //\r
561 if (al.size() == 1) {\r
562 addDynamicPcdBuildData(cName, token, tsGuid, itemType, dataType, defaultVal);\r
563 }\r
564 }\r
565 else {\r
566 if (defaultVal != null){\r
567 fpdPcd.setValue(defaultVal);\r
568 }\r
569 else {\r
570 if (dataType.equals("UINT8") || dataType.equals("UINT16") || dataType.equals("UINT32") || dataType.equals("UINT64")) {\r
571 fpdPcd.setValue("0");\r
572 }\r
573 if (dataType.equals("BOOLEAN")){\r
574 fpdPcd.setValue("false");\r
575 }\r
576 if (dataType.equals("VOID*")) {\r
577 fpdPcd.setValue("");\r
578 }\r
579 }\r
580 if (dataType.equals("UINT8")){\r
581 fpdPcd.setMaxDatumSize(1);\r
582 }\r
583 if (dataType.equals("UINT16")) {\r
584 fpdPcd.setMaxDatumSize(2);\r
585 }\r
586 if (dataType.equals("UINT32")) {\r
587 fpdPcd.setMaxDatumSize(4);\r
588 }\r
589 if (dataType.equals("UINT64")){\r
590 fpdPcd.setMaxDatumSize(8);\r
591 }\r
592 if (dataType.equals("BOOLEAN")){\r
593 fpdPcd.setMaxDatumSize(1);\r
594 }\r
595 if (dataType.equals("VOID*")) {\r
596 int maxSize = setMaxSizeForPointer(fpdPcd.getValue());\r
597 fpdPcd.setMaxDatumSize(maxSize);\r
598 }\r
599 }\r
600 }\r
601 \r
602 private int setMaxSizeForPointer(String datum) {\r
603 if (datum == null) {\r
604 return 0;\r
605 }\r
606 char ch = datum.charAt(0);\r
607 int start, end;\r
608 String strValue;\r
609 //\r
610 // For void* type PCD, only three datum is support:\r
611 // 1) Unicode: string with start char is "L"\r
612 // 2) Ansci: String is ""\r
613 // 3) byte array: String start char "{"\r
614 // \r
615 if (ch == 'L') {\r
616 start = datum.indexOf('\"');\r
617 end = datum.lastIndexOf('\"');\r
618 if ((start > end) || \r
619 (end > datum.length())||\r
620 ((start == end) && (datum.length() > 0))) {\r
621 //ToDo Error handling here\r
622 }\r
623\r
624 strValue = datum.substring(start + 1, end);\r
625 return strValue.length() * 2;\r
626 } else if (ch == '\"'){\r
627 start = datum.indexOf('\"');\r
628 end = datum.lastIndexOf('\"');\r
629 if ((start > end) || \r
630 (end > datum.length())||\r
631 ((start == end) && (datum.length() > 0))) {\r
632 \r
633 }\r
634 strValue = datum.substring(start + 1, end);\r
635 return strValue.length();\r
636 } else if (ch =='{') {\r
637 String[] strValueArray;\r
638\r
639 start = datum.indexOf('{');\r
640 end = datum.lastIndexOf('}');\r
641 strValue = datum.substring(start + 1, end);\r
642 strValue = strValue.trim();\r
643 if (strValue.length() == 0) {\r
644 return 0;\r
645 }\r
646 strValueArray = strValue.split(",");\r
647 for (int index = 0; index < strValueArray.length; index ++) {\r
648 Integer value = Integer.decode(strValueArray[index].trim());\r
649 \r
650 if (value > 0xFF) {\r
651// "[FPD file error] The datum type of PCD %s in %s is VOID*, "+\r
652// "it is byte array in fact. But the element of %s exceed the byte range",\r
653 \r
654 }\r
655 }\r
656 return strValueArray.length;\r
657\r
658\r
659 } else {\r
660// "[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+\r
661// "1) UNICODE string: like L\"xxxx\";\r\n"+\r
662// "2) ANSIC string: like \"xxx\";\r\n"+\r
663// "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+\r
664// "but the datum in seems does not following above format!",\r
665 return -1; \r
666 \r
667 }\r
668 }\r
669 \r
670 private ArrayList<String> LookupDynamicPcdBuildDefinition(String dynPcdKey) {\r
671 ArrayList<String> al = dynPcdMap.get(dynPcdKey);\r
672 \r
673 return al;\r
674 }\r
675 \r
676 private ArrayList<String> LookupPlatformPcdData(String pcdKey) {\r
677 \r
678 return dynPcdMap.get("pcdKey");\r
679 }\r
680 \r
681 public int getDynamicPcdBuildDataCount() {\r
682 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) {\r
683 return 0;\r
684 }\r
685 return getfpdDynPcdBuildDefs().getPcdBuildDataList().size();\r
686 }\r
687 \r
688 public void getDynamicPcdBuildData(String[][] saa) {\r
689 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) {\r
690 return ;\r
691 }\r
692 List<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData> l = getfpdDynPcdBuildDefs().getPcdBuildDataList();\r
693 ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData> li = l.listIterator();\r
694 int i = 0;\r
695 while(li.hasNext()) {\r
696 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcd = li.next();\r
697 saa[i][0] = dynPcd.getCName();\r
698 saa[i][1] = dynPcd.getToken().toString();\r
699 saa[i][2] = dynPcd.getTokenSpaceGuidCName();\r
700 saa[i][3] = dynPcd.getMaxDatumSize()+"";\r
701 saa[i][4] = dynPcd.getDatumType().toString();\r
702 \r
703 ++i;\r
704 }\r
705 }\r
706 \r
707 private void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) {\r
708 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcdData = getfpdDynPcdBuildDefs().addNewPcdBuildData();\r
709 dynPcdData.setItemType(PcdItemTypes.Enum.forString(itemType));\r
710 dynPcdData.setCName(cName);\r
711 dynPcdData.setToken(token);\r
712 dynPcdData.setTokenSpaceGuidCName(tsGuid);\r
713 dynPcdData.setDatumType(PcdDataTypes.Enum.forString(dataType));\r
714 \r
715 BigInteger bigInt = new BigInteger("0");\r
716 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = dynPcdData.addNewSkuInfo();\r
717 skuInfo.setSkuId(bigInt);\r
718 if (defaultVal != null){\r
719 skuInfo.setValue(defaultVal);\r
720 }\r
721 else {\r
722 if (dataType.equals("UINT8")){\r
723 skuInfo.setValue("0");\r
724 }\r
725 if (dataType.equals("UINT16")) {\r
726 skuInfo.setValue("0");\r
727 }\r
728 if (dataType.equals("UINT32")) {\r
729 skuInfo.setValue("0");\r
730 }\r
731 if (dataType.equals("UINT64")){\r
732 skuInfo.setValue("0");\r
733 }\r
734 if (dataType.equals("BOOLEAN")){\r
735 skuInfo.setValue("false");\r
736 }\r
737 if (dataType.equals("VOID*")) {\r
738 skuInfo.setValue("");\r
739 }\r
740 }\r
741 if (dataType.equals("UINT8")){\r
742 dynPcdData.setMaxDatumSize(1);\r
743 }\r
744 if (dataType.equals("UINT16")) {\r
745 dynPcdData.setMaxDatumSize(2);\r
746 }\r
747 if (dataType.equals("UINT32")) {\r
748 dynPcdData.setMaxDatumSize(4);\r
749 }\r
750 if (dataType.equals("UINT64")){\r
751 dynPcdData.setMaxDatumSize(8);\r
752 }\r
753 if (dataType.equals("BOOLEAN")){\r
754 dynPcdData.setMaxDatumSize(1);\r
755 }\r
756 if (dataType.equals("VOID*")) {\r
757 int maxSize = setMaxSizeForPointer(defaultVal);\r
758 dynPcdData.setMaxDatumSize(maxSize);\r
759 }\r
760 }\r
761 \r
762 private void removeDynamicPcdBuildData(String cName, String tsGuid) {\r
763 XmlObject o = getfpdDynPcdBuildDefs();\r
764 \r
765 XmlCursor cursor = o.newCursor();\r
766 if (cursor.toFirstChild()) {\r
767 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdBuildData = \r
768 (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
769 while (!(pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid))) {\r
770 cursor.toNextSibling();\r
771 pcdBuildData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
772 }\r
773 \r
774 cursor.removeXml();\r
775 }\r
776 cursor.dispose();\r
777 }\r
778 //\r
779 // Get the Sku Info count of ith dyn pcd element.\r
780 //\r
781 public int getDynamicPcdSkuInfoCount(int i){\r
782 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
783 return 0;\r
784 }\r
785 \r
786 int skuInfoCount = 0;\r
787 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
788 if (cursor.toFirstChild()) {\r
789 for (int j = 0; j < i; ++j) {\r
790 cursor.toNextSibling();\r
791 }\r
792 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
793 if (pcdData.getSkuInfoList() == null) {\r
794 skuInfoCount = 0;\r
795 }\r
796 else {\r
797 skuInfoCount = pcdData.getSkuInfoList().size();\r
798 }\r
799 }\r
800 cursor.dispose();\r
801 return skuInfoCount;\r
802 }\r
803 \r
804 public void getDynamicPcdSkuInfos(int i, String[][] saa){\r
805 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
806 return;\r
807 }\r
808 \r
809 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
810 if (cursor.toFirstChild()) {\r
811 for (int j = 0; j < i; ++j) {\r
812 cursor.toNextSibling();\r
813 }\r
814 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
815 if (pcdData.getSkuInfoList() == null) {\r
816 cursor.dispose();\r
817 return;\r
818 }\r
819 else {\r
820 ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo> li = pcdData.getSkuInfoList().listIterator();\r
821 int k = 0;\r
822 while (li.hasNext()) {\r
823 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next();\r
824 saa[k][0] = skuInfo.getSkuId()+"";\r
825 saa[k][1] = skuInfo.getVariableName();\r
826 saa[k][2] = skuInfo.getVariableGuid();\r
827 saa[k][3] = skuInfo.getVariableOffset();\r
828 saa[k][4] = skuInfo.getHiiDefaultValue();\r
829 saa[k][5] = skuInfo.getVpdOffset();\r
830 saa[k][6] = skuInfo.getValue();\r
831 ++k;\r
832 }\r
833 \r
834 }\r
835 }\r
836 cursor.dispose();\r
837 \r
838 }\r
839 \r
840 public String getDynamicPcdBuildDataValue(int i){\r
841 String value = null;\r
842 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
843 return value;\r
844 }\r
845 \r
846 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
847 if (cursor.toFirstChild()) {\r
848 for (int j = 0; j < i; ++j) {\r
849 cursor.toNextSibling();\r
850 }\r
851 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
852 if (pcdData.getSkuInfoList() == null) {\r
853 value = null;\r
854 }\r
855 else {\r
856 value = pcdData.getSkuInfoArray(0).getValue();\r
857 }\r
858 }\r
859 cursor.dispose();\r
860 return value;\r
861 }\r
862 \r
863 public String getDynamicPcdBuildDataVpdOffset(int i){\r
864 String vpdOffset = null;\r
865 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
866 return vpdOffset;\r
867 }\r
868 \r
869 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
870 if (cursor.toFirstChild()) {\r
871 for (int j = 0; j < i; ++j) {\r
872 cursor.toNextSibling();\r
873 }\r
874 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
875 if (pcdData.getSkuInfoList() == null) {\r
876 vpdOffset = null;\r
877 }\r
878 else {\r
879 vpdOffset = pcdData.getSkuInfoArray(0).getVpdOffset();\r
880 }\r
881 }\r
882 cursor.dispose();\r
883 return vpdOffset;\r
884 }\r
885 \r
886 public void removeDynamicPcdBuildDataSkuInfo(int i) {\r
887 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
888 return;\r
889 }\r
890 \r
891 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
892 if (cursor.toFirstChild()) {\r
893 for (int j = 0; j < i; ++j) {\r
894 cursor.toNextSibling();\r
895 }\r
896 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
897 if (pcdData.getSkuInfoList() == null) {\r
898 cursor.dispose();\r
899 return;\r
900 }\r
901 else {\r
902 QName qSkuInfo = new QName(xmlNs, "SkuInfo");\r
903 cursor.toChild(qSkuInfo);\r
904 cursor.removeXml();\r
905 }\r
906 }\r
907 cursor.dispose();\r
908 }\r
909 //\r
910 // generate sku info for ith dyn pcd build data.\r
911 //\r
912 public void genDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, \r
913 String hiiDefault, String vpdOffset, String value, int i) {\r
914 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
915 return;\r
916 }\r
917 \r
918 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
919 if (cursor.toFirstChild()) {\r
920 for (int j = 0; j < i; ++j) {\r
921 cursor.toNextSibling();\r
922 }\r
923 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
924 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = pcdData.addNewSkuInfo();\r
925 skuInfo.setSkuId(new BigInteger(id));\r
926 if (varName != null){\r
927 skuInfo.setVariableName(varName);\r
928 skuInfo.setVariableGuid(varGuid);\r
929 skuInfo.setVariableOffset(varOffset);\r
930 skuInfo.setHiiDefaultValue(hiiDefault);\r
931 }\r
932 else if (vpdOffset != null){\r
933 skuInfo.setVpdOffset(vpdOffset);\r
934 }\r
935 else{\r
936 skuInfo.setValue(value);\r
937 }\r
938 }\r
939 }\r
940 \r
941 public void updateDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, \r
942 String hiiDefault, String vpdOffset, String value, int i){\r
943 if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) {\r
944 return;\r
945 }\r
946 \r
947 XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor();\r
948 if (cursor.toFirstChild()) {\r
949 for (int j = 0; j < i; ++j) {\r
950 cursor.toNextSibling();\r
951 }\r
952 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
953 ListIterator<DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo> li = pcdData.getSkuInfoList().listIterator();\r
954 while (li.hasNext()) {\r
955 DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next();\r
956 if (skuInfo.getSkuId().toString().equals(id)){\r
957 if (varName != null){\r
958 skuInfo.setVariableName(varName);\r
959 skuInfo.setVariableGuid(varGuid);\r
960 skuInfo.setVariableOffset(varOffset);\r
961 skuInfo.setHiiDefaultValue(hiiDefault);\r
962 }\r
963 else if (vpdOffset != null){\r
964 skuInfo.setVpdOffset(vpdOffset);\r
965 }\r
966 else{\r
967 skuInfo.setValue(value);\r
968 }\r
969 break;\r
970 }\r
971 }\r
972 }\r
973 }\r
974 \r
975 public void removePcdDataFromLibraryInstance(String moduleKey, String libInstanceKey){\r
976 ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey);\r
977 //\r
978 // should better maintain pcd from lib instance only, but maintain all is acceptable now. \r
979 //\r
980 maintainDynPcdMap(moduleSa.getPcdBuildDefinition(), libInstanceKey);\r
981 \r
982 }\r
983 \r
984 public BuildOptionsDocument.BuildOptions getfpdBuildOpts() {\r
985 if (fpdBuildOpts == null) {\r
986 fpdBuildOpts = fpdRoot.addNewBuildOptions();\r
987 }\r
988 return fpdBuildOpts;\r
989 }\r
990 \r
991 public void genBuildOptionsUserDefAntTask (String id, String fileName, String execOrder) {\r
992 UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
993 if (udats == null) {\r
994 udats = getfpdBuildOpts().addNewUserDefinedAntTasks();\r
995 }\r
996 \r
997 AntTaskDocument.AntTask at = udats.addNewAntTask();\r
998 setBuildOptionsUserDefAntTask(id, fileName, execOrder, at);\r
999 }\r
1000 \r
1001 private void setBuildOptionsUserDefAntTask(String id, String fileName, String execOrder, AntTaskDocument.AntTask at) {\r
1002 at.setId(new Integer(id));\r
1003 if (fileName != null){\r
1004 at.setFilename(fileName);\r
1005 }\r
202c4f38 1006 if (execOrder != null) {\r
a13899c5 1007 at.setAntCmdOptions(execOrder);\r
1008 }\r
1009 }\r
1010 \r
1011 public void removeBuildOptionsUserDefAntTask(int i) {\r
1012 XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks();\r
1013 if (o == null) {\r
1014 return;\r
1015 }\r
1016 XmlCursor cursor = o.newCursor();\r
1017 if (cursor.toFirstChild()) {\r
1018 for (int j = 0; j < i; ++j) {\r
1019 cursor.toNextSibling();\r
1020 }\r
1021 cursor.removeXml();\r
1022 }\r
1023 cursor.dispose();\r
1024 }\r
1025 \r
1026 public void updateBuildOptionsUserDefAntTask(int i, String id, String fileName, String execOrder){\r
1027 XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks();\r
1028 if (o == null) {\r
1029 return;\r
1030 }\r
1031 XmlCursor cursor = o.newCursor();\r
1032 if (cursor.toFirstChild()) {\r
1033 for (int j = 0; j < i; ++j) {\r
1034 cursor.toNextSibling();\r
1035 }\r
1036 AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)cursor.getObject();\r
1037 setBuildOptionsUserDefAntTask(id, fileName, execOrder, at);\r
1038 }\r
1039 cursor.dispose();\r
1040 }\r
1041 \r
1042 public int getBuildOptionsUserDefAntTaskCount() {\r
1043 UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
1044 if (udats == null || udats.getAntTaskList() == null) {\r
1045 return 0;\r
1046 }\r
1047 \r
1048 return udats.getAntTaskList().size();\r
1049 }\r
1050 \r
1051 public void getBuildOptionsUserDefAntTasks(String[][] saa) {\r
1052 UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks();\r
1053 if (udats == null || udats.getAntTaskList() == null) {\r
1054 return ;\r
1055 }\r
1056 \r
1057 List<AntTaskDocument.AntTask> l = udats.getAntTaskList();\r
1058 ListIterator li = l.listIterator();\r
1059 int i = 0;\r
1060 while (li.hasNext()) {\r
1061 AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)li.next();\r
1062 saa[i][0] = at.getId() + "";\r
1063 saa[i][1] = saa[i][2] = "";\r
1064 if (at.getFilename() != null){\r
1065 saa[i][1] = at.getFilename();\r
1066 }\r
1067 if (at.getAntCmdOptions() != null) {\r
1068 saa[i][2] = at.getAntCmdOptions();\r
1069 }\r
1070 ++i;\r
1071 }\r
1072 }\r
1073 public void genBuildOptionsOpt(String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents) {\r
1074 OptionsDocument.Options opts = getfpdBuildOpts().getOptions();\r
1075 if (opts == null) {\r
1076 opts = getfpdBuildOpts().addNewOptions();\r
1077 }\r
1078 OptionDocument.Option opt = opts.addNewOption();\r
1079 setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
1080 }\r
1081 \r
1082 private void setBuildOptionsOpt(String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents, OptionDocument.Option opt){\r
1083 opt.setStringValue(contents);\r
1084// opt.setBuildTargets(buildTargets);\r
1085 opt.setToolChainFamily(toolChain);\r
1086 opt.setTagName(tagName);\r
1087 opt.setToolCode(toolCmd);\r
1088 String[] s = archList.split(" ");\r
1089 ArrayList<String> al = new ArrayList<String>();\r
1090 for (int i = 0; i < s.length; ++i) {\r
1091 al.add(s[i]);\r
1092 }\r
1093 opt.setSupArchList(al);\r
1094 }\r
1095 \r
1096 public void removeBuildOptionsOpt(int i){\r
1097 \r
1098 XmlObject o = getfpdBuildOpts().getOptions();\r
1099 if (o == null) {\r
1100 return;\r
1101 }\r
1102 \r
1103 XmlCursor cursor = o.newCursor();\r
1104 if (cursor.toFirstChild()) {\r
1105 for (int j = 0; j < i; ++j) {\r
1106 cursor.toNextSibling();\r
1107 }\r
1108 cursor.removeXml();\r
1109 }\r
1110 cursor.dispose();\r
1111 }\r
1112 \r
1113 public void updateBuildOptionsOpt(int i, String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents) {\r
1114 XmlObject o = getfpdBuildOpts().getOptions();\r
1115 if (o == null) {\r
1116 return;\r
1117 }\r
1118 \r
1119 XmlCursor cursor = o.newCursor();\r
1120 if (cursor.toFirstChild()) {\r
1121 for (int j = 0; j < i; ++j) {\r
1122 cursor.toNextSibling();\r
1123 }\r
1124 OptionDocument.Option opt = (OptionDocument.Option)cursor.getObject();\r
1125 setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt);\r
1126 }\r
1127 cursor.dispose();\r
1128 }\r
1129 \r
1130 public int getBuildOptionsOptCount(){\r
1131 if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {\r
1132 return 0;\r
1133 }\r
1134 return getfpdBuildOpts().getOptions().getOptionList().size();\r
1135 }\r
1136 \r
1137 public void getBuildOptionsOpts(String[][] saa) {\r
1138 if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) {\r
1139 return ;\r
1140 }\r
1141 \r
1142 List<OptionDocument.Option> lOpt = getfpdBuildOpts().getOptions().getOptionList();\r
1143 ListIterator li = lOpt.listIterator();\r
1144 int i = 0;\r
1145 while(li.hasNext()) {\r
1146 OptionDocument.Option opt = (OptionDocument.Option)li.next();\r
1147// saa[i][0] = opt.getBuildTargets();\r
1148 saa[i][1] = opt.getToolChainFamily();\r
1149 if (opt.getSupArchList() != null){\r
1150 Object[] archs = opt.getSupArchList().toArray();\r
1151 saa[i][2] = " ";\r
1152 for (int j = 0; j < archs.length; ++j){\r
1153 saa[i][2] += archs[j];\r
1154 saa[i][2] += " ";\r
1155 }\r
1156 saa[i][2] = saa[i][2].trim();\r
1157 }\r
1158 saa[i][3] = opt.getToolCode();\r
1159 saa[i][4] = opt.getTagName();\r
1160 saa[i][5] = opt.getStringValue();\r
1161 \r
1162 ++i;\r
1163 }\r
1164 }\r
1165 \r
1166 public PlatformDefinitionsDocument.PlatformDefinitions getfpdPlatformDefs(){\r
1167 if (fpdPlatformDefs == null){\r
1168 fpdPlatformDefs = fpdRoot.addNewPlatformDefinitions();\r
1169 }\r
1170 return fpdPlatformDefs;\r
1171 }\r
1172 \r
1173 public FlashDocument.Flash getfpdFlash() {\r
1174 if (fpdFlash == null) {\r
1175 fpdFlash = fpdRoot.addNewFlash();\r
1176 }\r
1177 return fpdFlash;\r
1178 }\r
1179 \r
1180 public void genFlashDefinitionFile(String file) {\r
1181 FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile();\r
1182 if (fdf == null) {\r
1183 fdf = getfpdFlash().addNewFlashDefinitionFile();\r
1184 }\r
1185 \r
1186 fdf.setStringValue(file);\r
1187 }\r
1188 \r
1189 public String getFlashDefinitionFile() {\r
1190 FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile();\r
1191 if (fdf == null) {\r
1192 return "";\r
1193 }\r
1194 \r
1195 return fdf.getStringValue();\r
1196 }\r
1197 \r
1198 \r
1199 \r
1200 public void genFvImagesNameValue(String name, String value) {\r
1201 \r
1202 FvImagesDocument.FvImages fi = getfpdFlash().getFvImages();\r
1203 if (fi == null) {\r
1204 fi = getfpdFlash().addNewFvImages();\r
1205 }\r
1206 \r
1207 FvImagesDocument.FvImages.NameValue nv = fi.addNewNameValue();\r
1208 nv.setName(name);\r
1209 nv.setValue(value);\r
1210 }\r
1211 \r
1212 public void removeFvImagesNameValue(int i){\r
1213 \r
1214 XmlObject o = getfpdFlash().getFvImages();\r
1215 if (o == null) {\r
1216 return;\r
1217 }\r
1218 \r
1219 QName qNameValue = new QName(xmlNs, "NameValue");\r
1220 XmlCursor cursor = o.newCursor();\r
1221 if (cursor.toChild(qNameValue)) {\r
1222 for (int j = 0; j < i; ++j) {\r
1223 cursor.toNextSibling(qNameValue);\r
1224 }\r
1225 cursor.removeXml();\r
1226 }\r
1227 cursor.dispose();\r
1228 }\r
1229 \r
1230 public void updateFvImagesNameValue(int i, String name, String value){\r
1231 \r
1232 XmlObject o = getfpdFlash().getFvImages();\r
1233 if (o == null) {\r
1234 return;\r
1235 }\r
1236 \r
1237 QName qNameValue = new QName(xmlNs, "NameValue");\r
1238 XmlCursor cursor = o.newCursor();\r
1239 if (cursor.toChild(qNameValue)) {\r
1240 for (int j = 0; j < i; ++j) {\r
1241 cursor.toNextSibling(qNameValue);\r
1242 }\r
1243 FvImagesDocument.FvImages.NameValue nv = (FvImagesDocument.FvImages.NameValue)cursor.getObject();\r
1244 nv.setName(name);\r
1245 nv.setValue(value);\r
1246 }\r
1247 cursor.dispose();\r
1248 }\r
1249 \r
1250 public int getFvImagesNameValueCount() {\r
1251 \r
1252 FvImagesDocument.FvImages fi = null;\r
1253 if ((fi = getfpdFlash().getFvImages()) == null || fi.getNameValueList() == null) {\r
1254 return 0;\r
1255 }\r
1256 return fi.getNameValueList().size();\r
1257 }\r
1258 \r
1259 public void getFvImagesNameValues(String[][] nv) {\r
1260 \r
1261 FvImagesDocument.FvImages fi = getfpdFlash().getFvImages();\r
1262 if (fi == null){\r
1263 return;\r
1264 }\r
1265 List<FvImagesDocument.FvImages.NameValue> l = fi.getNameValueList();\r
1266 int i = 0;\r
1267 ListIterator li = l.listIterator();\r
1268 while (li.hasNext()) {\r
1269 FvImagesDocument.FvImages.NameValue e = (FvImagesDocument.FvImages.NameValue) li\r
1270 .next();\r
1271 nv[i][0] = e.getName();\r
1272 nv[i][1] = e.getValue();\r
1273 \r
1274 i++;\r
1275 }\r
1276 }\r
1277 \r
1278 public void genFvImagesFvImage(String[] names, String types, Map<String, String> options) {\r
1279 \r
1280 FvImagesDocument.FvImages fis = null;\r
1281 if ((fis = getfpdFlash().getFvImages()) == null) {\r
1282 fis = getfpdFlash().addNewFvImages();\r
1283 }\r
1284 \r
1285 //\r
1286 //gen FvImage with FvImageNames array\r
1287 //\r
1288 FvImagesDocument.FvImages.FvImage fi = fis.addNewFvImage();\r
1289 for (int i = 0; i < names.length; ++i) {\r
1290 fi.addFvImageNames(names[i]);\r
1291 }\r
1292 fi.setType(FvImageTypes.Enum.forString(types));\r
1293 if (options != null){\r
1294 setFvImagesFvImageFvImageOptions(options, fi);\r
1295 }\r
1296 }\r
1297 \r
1298 private void setFvImagesFvImageFvImageOptions(Map<String, String> options, FvImagesDocument.FvImages.FvImage fi){\r
1299 FvImagesDocument.FvImages.FvImage.FvImageOptions fio = fi.getFvImageOptions();\r
1300 if (fio == null){\r
1301 fio = fi.addNewFvImageOptions();\r
1302 }\r
1303 \r
1304 Set<String> key = options.keySet();\r
1305 Iterator<String> i = key.iterator();\r
1306 while (i.hasNext()) {\r
44053733 1307 \r
a13899c5 1308 FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = fio.addNewNameValue();\r
1309 String k = (String)i.next();\r
ae0d4fd2 1310 \r
a13899c5 1311 nv.setName(k);\r
1312 nv.setValue((String)options.get(k));\r
1313 \r
1314 }\r
1315 \r
1316 }\r
1317 \r
44053733 1318 \r
a13899c5 1319 public void removeFvImagesFvImage(int i) {\r
1320 \r
1321 XmlObject o = getfpdFlash().getFvImages();\r
1322 if (o == null) {\r
1323 return;\r
1324 }\r
1325 \r
1326 QName qFvImage = new QName(xmlNs, "FvImage");\r
1327 XmlCursor cursor = o.newCursor();\r
1328 if (cursor.toChild(qFvImage)) {\r
1329 for (int j = 0; j < i; ++j) {\r
1330 cursor.toNextSibling(qFvImage);\r
1331 }\r
1332 cursor.removeXml();\r
1333 }\r
1334 cursor.dispose();\r
1335 }\r
1336 \r
1337 public void updateFvImagesFvImage(int i, String[] names, String types, Map<String, String> options){\r
1338 \r
1339 XmlObject o = getfpdFlash().getFvImages();\r
1340 if (o == null) {\r
1341 return;\r
1342 }\r
1343 XmlCursor cursor = o.newCursor();\r
1344 QName qFvImage = new QName(xmlNs, "FvImage");\r
1345 if (cursor.toChild(qFvImage)) {\r
1346 for (int j = 0; j < i; ++j) {\r
1347 cursor.toNextSibling(qFvImage);\r
1348 }\r
1349 FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject();\r
1350 fi.setType(FvImageTypes.Enum.forString(types));\r
1351 \r
1352 //\r
1353 // remove old FvImageNames before adding new ones\r
1354 //\r
1355 QName qFvImageNames = new QName(xmlNs, "FvImageNames"); \r
1356 cursor.toChild(qFvImageNames);\r
1357 cursor.removeXml();\r
1358 while (cursor.toNextSibling(qFvImageNames)) {\r
1359 cursor.removeXml();\r
1360 }\r
1361 \r
1362 for (int k = 0; k < names.length; ++k) {\r
1363 fi.addFvImageNames(names[k]);\r
1364 }\r
1365 //\r
1366 // remove old FvImageOptions before adding new options\r
1367 //\r
1368 QName qFvImageOptions = new QName(xmlNs, "FvImageOptions");\r
1369 cursor.toNextSibling(qFvImageOptions);\r
1370 cursor.removeXml();\r
1371 \r
1372 setFvImagesFvImageFvImageOptions(options, fi);\r
1373 }\r
1374 cursor.dispose();\r
1375 }\r
1376 \r
1377 public int getFvImagesFvImageCount() {\r
1378 \r
1379 if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) {\r
1380 return 0;\r
1381 }\r
1382 return getfpdFlash().getFvImages().getFvImageList().size();\r
1383 }\r
1384 \r
ae0d4fd2 1385 /**Only Get Fv image setting - name and type.\r
1386 * @param saa\r
1387 */\r
1388 public void getFvImagesFvImages(String[][] saa) {\r
a13899c5 1389 \r
1390 if (getfpdFlash().getFvImages() == null) {\r
1391 return;\r
1392 }\r
1393 List<FvImagesDocument.FvImages.FvImage> l = getfpdFlash().getFvImages().getFvImageList();\r
1394 if (l == null) {\r
1395 return;\r
1396 }\r
1397 ListIterator li = l.listIterator();\r
1398 int i = 0;\r
1399 while(li.hasNext()) {\r
1400 FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next();\r
1401 //\r
1402 // get FvImageNames array, space separated\r
1403 //\r
1404 List<String> lfn = fi.getFvImageNamesList();\r
1405 ListIterator lfni = lfn.listIterator();\r
1406 saa[i][0] = " ";\r
1407 while (lfni.hasNext()) {\r
1408 saa[i][0] += (String)lfni.next();\r
1409 saa[i][0] += " ";\r
1410 }\r
1411 saa[i][0] = saa[i][0].trim();\r
1412 \r
1413 saa[i][1] = fi.getType()+"";\r
1414 \r
ae0d4fd2 1415 ++i;\r
1416 }\r
1417 }\r
1418 \r
1419 /**Get FvImage Options for FvImage i\r
1420 * @param i the ith FvImage\r
1421 */\r
1422 public void getFvImagesFvImageOptions(int i, Map<String, String> m) {\r
1423 XmlObject o = getfpdFlash().getFvImages();\r
1424 if (o == null) {\r
1425 return;\r
1426 }\r
1427 XmlCursor cursor = o.newCursor();\r
1428 QName qFvImage = new QName(xmlNs, "FvImage");\r
1429 if (cursor.toChild(qFvImage)) {\r
1430 for (int j = 0; j < i; ++j) {\r
1431 cursor.toNextSibling(qFvImage);\r
a13899c5 1432 }\r
ae0d4fd2 1433 FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject();\r
1434 if (fi.getFvImageOptions() == null || fi.getFvImageOptions().getNameValueList() == null){\r
1435 return;\r
a13899c5 1436 }\r
ae0d4fd2 1437 ListIterator<FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue> li = fi.getFvImageOptions().getNameValueList().listIterator();\r
1438 while(li.hasNext()){\r
1439 FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = li.next();\r
a13899c5 1440 m.put(nv.getName(), nv.getValue());\r
1441 }\r
a13899c5 1442 }\r
1443 }\r
1444 \r
1445 /**\r
1446 Get platform header element\r
1447 @return PlatformHeaderDocument.PlatformHeader\r
1448 **/\r
1449 public PlatformHeaderDocument.PlatformHeader getFpdHdr() {\r
1450 if (fpdHdr == null) {\r
1451 fpdHdr = fpdRoot.addNewPlatformHeader();\r
1452 }\r
1453 genPlatformDefsSkuInfo("0", "DEFAULT");\r
1454 return fpdHdr;\r
1455 }\r
1456 \r
1457 public void genPlatformDefsSkuInfo(String id, String name) {\r
1458 SkuInfoDocument.SkuInfo skuInfo = null;\r
1459 if (getfpdPlatformDefs().getSkuInfo() == null) {\r
1460 skuInfo = getfpdPlatformDefs().addNewSkuInfo();\r
1461 }\r
1462 skuInfo = getfpdPlatformDefs().getSkuInfo();\r
1463 if (skuInfo.getUiSkuNameList() == null || skuInfo.getUiSkuNameList().size() == 0) {\r
1464 SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName();\r
1465 skuName.setSkuID(new BigInteger("0"));\r
1466 skuName.setStringValue("DEFAULT");\r
1467 }\r
1468 if (id.equals("0")) {\r
1469 return;\r
1470 }\r
1471 SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName();\r
1472 skuName.setSkuID(new BigInteger(id));\r
1473 skuName.setStringValue(name);\r
1474 \r
1475 \r
1476 }\r
1477 public String getFpdHdrPlatformName() {\r
1478 return getFpdHdr().getPlatformName();\r
1479 }\r
1480 \r
1481 public String getFpdHdrGuidValue() {\r
1482 return getFpdHdr().getGuidValue();\r
1483 }\r
1484 \r
1485 public String getFpdHdrVer() {\r
1486 return getFpdHdr().getVersion();\r
1487 }\r
1488 \r
1489 public String getFpdHdrAbs() {\r
1490 return getFpdHdr().getAbstract();\r
1491 }\r
1492 \r
1493 public String getFpdHdrDescription() {\r
1494 return getFpdHdr().getDescription();\r
1495 }\r
1496 \r
1497 public String getFpdHdrCopyright() {\r
1498 return getFpdHdr().getCopyright();\r
1499 }\r
1500 \r
1501 public String getFpdHdrLicense() {\r
1502 LicenseDocument.License l = getFpdHdr().getLicense();\r
1503 if (l == null) {\r
1504 return null;\r
1505 }\r
1506 return l.getStringValue();\r
1507 }\r
1508 \r
1509 public String getFpdHdrUrl() {\r
1510 LicenseDocument.License l = getFpdHdr().getLicense();\r
1511 if (l == null) {\r
1512 return null;\r
1513 }\r
1514 return l.getURL();\r
1515 }\r
1516 \r
1517 public String getFpdHdrSpec() {\r
1518\r
1519 return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";\r
1520// return getFpdHdr().getSpecification();\r
1521 }\r
1522 \r
1523 public void setFpdHdrPlatformName(String name){\r
1524 getFpdHdr().setPlatformName(name);\r
1525 }\r
1526 \r
1527 public void setFpdHdrGuidValue(String guid){\r
1528 getFpdHdr().setGuidValue(guid);\r
1529 }\r
1530 \r
1531 public void setFpdHdrVer(String v){\r
1532 getFpdHdr().setVersion(v);\r
1533 }\r
1534 \r
1535 public void setFpdHdrAbs(String abs) {\r
1536 getFpdHdr().setAbstract(abs);\r
1537 }\r
1538 \r
1539 public void setFpdHdrDescription(String desc){\r
1540 getFpdHdr().setDescription(desc);\r
1541 }\r
1542 \r
1543 public void setFpdHdrCopyright(String cr) {\r
1544 getFpdHdr().setCopyright(cr);\r
1545 }\r
1546 \r
1547 public void setFpdHdrLicense(String license){\r
1548 LicenseDocument.License l = getFpdHdr().getLicense();\r
1549 if (l == null) {\r
1550 getFpdHdr().addNewLicense().setStringValue(license);\r
1551 }\r
1552 else {\r
1553 l.setStringValue(license);\r
1554 }\r
1555 }\r
1556\r
1557 public void setFpdHdrUrl(String url){\r
1558 LicenseDocument.License l = getFpdHdr().getLicense();\r
1559 \r
1560 l.setURL(url);\r
1561 \r
1562 }\r
1563 \r
1564 public void setFpdHdrSpec(String s){\r
1565 s = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052";\r
1566 getFpdHdr().setSpecification(s);\r
1567 }\r
1568 /**\r
1569 Save the processed xml contents to file\r
1570 \r
1571 @param fpdFile The file to save xml contents\r
1572 @throws IOException Exceptions during file operation\r
1573 **/\r
1574 public void saveAs(File fpdFile) throws IOException {\r
1575\r
1576 XmlOptions options = new XmlOptions();\r
1577\r
1578 options.setCharacterEncoding("UTF-8");\r
1579 options.setSavePrettyPrint();\r
1580 options.setSavePrettyPrintIndent(2);\r
1581 try {\r
1582 fpdd.save(fpdFile, options);\r
1583 } catch (IOException e) {\r
1584 e.printStackTrace();\r
1585 }\r
1586\r
1587 }\r
1588 \r
1589 private String listToString(List<String> l) {\r
1590 if (l == null) {\r
1591 return null;\r
1592 }\r
1593 String s = " ";\r
1594 ListIterator li = l.listIterator();\r
1595 while(li.hasNext()) {\r
1596 s += li.next();\r
1597 s += " ";\r
1598 }\r
1599 return s.trim();\r
1600 }\r
1601}\r