/** @file Java class FpdFileContents is used to parse fpd xml file. Copyright (c) 2006, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ package org.tianocore.frameworkwizard.platform.ui; import java.io.File; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; import java.util.Vector; import javax.xml.namespace.QName; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.tianocore.AntTaskDocument; import org.tianocore.BuildOptionsDocument; import org.tianocore.DynamicPcdBuildDefinitionsDocument; import org.tianocore.EfiSectionType; import org.tianocore.FlashDefinitionFileDocument; import org.tianocore.FlashDocument; import org.tianocore.FrameworkModulesDocument; import org.tianocore.IntermediateOutputType; import org.tianocore.LibrariesDocument; import org.tianocore.ModuleSADocument; import org.tianocore.ModuleSaBuildOptionsDocument; import org.tianocore.ModuleSurfaceAreaDocument; import org.tianocore.OptionDocument; import org.tianocore.OptionsDocument; import org.tianocore.PcdBuildDefinitionDocument; import org.tianocore.PcdCodedDocument; import org.tianocore.PcdDataTypes; import org.tianocore.PcdDeclarationsDocument; import org.tianocore.PcdItemTypes; import org.tianocore.PlatformDefinitionsDocument; import org.tianocore.PlatformSurfaceAreaDocument; import org.tianocore.FvImageTypes; import org.tianocore.FvImagesDocument; import org.tianocore.LicenseDocument; import org.tianocore.PlatformHeaderDocument; import org.tianocore.SkuInfoDocument; import org.tianocore.UserDefinedAntTasksDocument; import org.tianocore.UserExtensionsDocument; import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile; import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery; import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification; import org.tianocore.frameworkwizard.packaging.PackageIdentification; /** This class processes fpd file contents such as add remove xml elements. @since PackageEditor 1.0 **/ public class FpdFileContents { static final String xmlNs = "http://www.TianoCore.org/2006/Edk2.0"; private PlatformSurfaceAreaDocument fpdd = null; private PlatformSurfaceAreaDocument.PlatformSurfaceArea fpdRoot = null; private PlatformHeaderDocument.PlatformHeader fpdHdr = null; private PlatformDefinitionsDocument.PlatformDefinitions fpdPlatformDefs = null; private FlashDocument.Flash fpdFlash = null; private BuildOptionsDocument.BuildOptions fpdBuildOpts = null; private FrameworkModulesDocument.FrameworkModules fpdFrameworkModules = null; private DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs = null; private HashMap> dynPcdMap = null; private HashMap defaultPcdValue = new HashMap(); /** * look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings. */ public void initDynPcdMap() { if (dynPcdMap == null) { dynPcdMap = new HashMap>(); List l = getfpdFrameworkModules().getModuleSAList(); if (l == null) { removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return; } ListIterator li = l.listIterator(); while (li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = li.next(); if (moduleSa.getPcdBuildDefinition() == null || moduleSa.getPcdBuildDefinition().getPcdDataList() == null) { continue; } String ModuleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " + moduleSa.getPackageGuid() + " " + moduleSa.getPackageVersion() + " " + listToString(moduleSa.getSupArchList()); List lp = moduleSa.getPcdBuildDefinition().getPcdDataList(); ListIterator lpi = lp.listIterator(); while (lpi.hasNext()) { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = lpi.next(); String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(); if (dynPcdMap.get(pcdKey) == null) { ArrayList al = new ArrayList(); al.add(ModuleInfo + " " + pcdData.getItemType().toString()); dynPcdMap.put(pcdKey, al); } else{ dynPcdMap.get(pcdKey).add(ModuleInfo + " " + pcdData.getItemType().toString()); } } } } } public ArrayList getDynPcdMapValue(String key) { return dynPcdMap.get(key); } /** Constructor to create a new spd file **/ public FpdFileContents() { fpdd = PlatformSurfaceAreaDocument.Factory.newInstance(); fpdRoot = fpdd.addNewPlatformSurfaceArea(); } /** Constructor for existing document object @param psa **/ public FpdFileContents(PlatformSurfaceAreaDocument.PlatformSurfaceArea fpd) { fpdRoot = fpd; fpdHdr = fpdRoot.getPlatformHeader(); fpdPlatformDefs = fpdRoot.getPlatformDefinitions(); fpdBuildOpts = fpdRoot.getBuildOptions(); fpdFrameworkModules = fpdRoot.getFrameworkModules(); fpdDynPcdBuildDefs = fpdRoot.getDynamicPcdBuildDefinitions(); fpdFlash = fpdRoot.getFlash(); } /** Constructor based on an existing spd file @param f Existing spd file **/ public FpdFileContents(File f) { try { fpdd = PlatformSurfaceAreaDocument.Factory.parse(f); fpdRoot = fpdd.getPlatformSurfaceArea(); } catch (Exception e) { System.out.println(e.toString()); } } public DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions getfpdDynPcdBuildDefs() { if (fpdDynPcdBuildDefs == null){ fpdDynPcdBuildDefs = fpdRoot.addNewDynamicPcdBuildDefinitions(); } return fpdDynPcdBuildDefs; } public FrameworkModulesDocument.FrameworkModules getfpdFrameworkModules() { if (fpdFrameworkModules == null){ fpdFrameworkModules = fpdRoot.addNewFrameworkModules(); } return fpdFrameworkModules; } public void getFrameworkModuleGuid (String fvName, Vector vGuid) { if (getFrameworkModulesCount() == 0){ return; } ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); while(li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)li.next(); if (moduleSa.getModuleSaBuildOptions() == null) { continue; } String fvBinding = moduleSa.getModuleSaBuildOptions().getFvBinding(); if (fvBinding == null) { continue; } String[] fvNames = fvBinding.split(" "); for (int i = 0; i < fvNames.length; ++i) { if (fvNames[i].equals(fvName) || fvNames[i].replaceAll("_", "").equals(fvName)) { vGuid.add(moduleSa.getModuleGuid()); break; } } } } public int getFrameworkModulesCount() { if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){ removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return 0; } return getfpdFrameworkModules().getModuleSAList().size(); } public void getFrameworkModulesInfo(String[][] saa) { if (getFrameworkModulesCount() == 0){ return; } ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); int i = 0; while(li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)li.next(); saa[i][0] = moduleSa.getModuleGuid(); saa[i][1] = moduleSa.getModuleVersion(); saa[i][2] = moduleSa.getPackageGuid(); saa[i][3] = moduleSa.getPackageVersion(); saa[i][4] = listToString(moduleSa.getSupArchList()); ++i; } } public void getFrameworkModuleInfo(int i, String[] sa) { ModuleSADocument.ModuleSA msa = getModuleSA(i); if (msa == null) { return; } sa[0] = msa.getModuleGuid(); sa[1] = msa.getModuleVersion(); sa[2] = msa.getPackageGuid(); sa[3] = msa.getPackageVersion(); sa[4] = listToString(msa.getSupArchList()); } public ModuleSADocument.ModuleSA getModuleSA(String key) { String[] s = key.split(" "); if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0) { removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return null; } ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); while(li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)li.next(); if (moduleSa.getModuleGuid().equalsIgnoreCase(s[0]) && moduleSa.getPackageGuid().equalsIgnoreCase(s[2])) { if (moduleSa.getModuleVersion() != null) { if (!moduleSa.getModuleVersion().equals(s[1])) { continue; } } if (moduleSa.getPackageVersion() != null) { if (!moduleSa.getPackageVersion().equals(s[3])) { continue; } } //ToDo add arch check for s[4] if (moduleSa.getSupArchList() != null) { if (!listToString(moduleSa.getSupArchList()).equals(s[4])) { continue; } } return moduleSa; } } return null; } private ModuleSADocument.ModuleSA getModuleSA(int i) { ModuleSADocument.ModuleSA moduleSa = null; if (fpdRoot.getFrameworkModules() == null) { return null; } XmlCursor cursor = fpdRoot.getFrameworkModules().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } moduleSa = (ModuleSADocument.ModuleSA)cursor.getObject(); } cursor.dispose(); return moduleSa; } public void removeModuleSA(int i) { XmlObject o = fpdRoot.getFrameworkModules(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } // // remove pcd from dynPcdMap, if DynamicPcdBuildData exists, remove them too. // ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)cursor.getObject(); String moduleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " + moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion() + " " + listToString(moduleSa.getSupArchList()); PcdBuildDefinitionDocument.PcdBuildDefinition pcdBuildDef = moduleSa.getPcdBuildDefinition(); if (pcdBuildDef != null && pcdBuildDef.getPcdDataList() != null) { ListIterator li = pcdBuildDef.getPcdDataList().listIterator(); while(li.hasNext()) { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next(); maintainDynPcdMap(pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(), moduleInfo); } } cursor.push(); cursor.toPrevToken(); if (cursor.isComment()) { cursor.removeXml(); } cursor.pop(); cursor.removeXml(); if (getFrameworkModulesCount() == 0) { cursor.toParent(); cursor.removeXml(); } } cursor.dispose(); } public boolean adjustPcd (int seqModuleSa) throws Exception { boolean dataModified = false; ModuleSADocument.ModuleSA moduleSa = getModuleSA(seqModuleSa); int pcdCount = getPcdDataCount(seqModuleSa); String[][] saaModuleSaPcd = new String[pcdCount][7]; getPcdData(seqModuleSa, saaModuleSaPcd); String mg = moduleSa.getModuleGuid(); String mv = moduleSa.getModuleVersion(); String pg = moduleSa.getPackageGuid(); String pv = moduleSa.getPackageVersion(); String arch = listToString(moduleSa.getSupArchList()); // // delete pcd in ModuleSA but not in MSA files any longer. // String moduleKey = mg + " " + mv + " " + pg + " " + pv + " " + arch; int libCount = getLibraryInstancesCount(moduleKey); String[][] saaLib = new String[libCount][5]; getLibraryInstances(moduleKey, saaLib); ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey); Vector vMi = new Vector(); // // create vector for module & library instance MIs. // vMi.add(mi); for (int j = 0; j < saaLib.length; ++j) { String libKey = saaLib[j][1] + " " + saaLib[j][2] + " " + saaLib[j][3] + " " + saaLib[j][4]; ModuleIdentification libMi = WorkspaceProfile.getModuleId(libKey); vMi.add(libMi); } try { nextPcd:for (int i = 0; i < saaModuleSaPcd.length; ++i) { for (int j = 0; j < vMi.size(); ++j) { ModuleIdentification nextMi = vMi.get(j); if (WorkspaceProfile.pcdInMsa(saaModuleSaPcd[i][0], saaModuleSaPcd[i][1], nextMi)) { continue nextPcd; } } removePcdData(seqModuleSa, saaModuleSaPcd[i][0], saaModuleSaPcd[i][1]); dataModified = true; } } catch (Exception e) { throw e; } // // add new Pcd from MSA file to ModuleSA. // try { for (int i = 0; i < vMi.size(); ++i) { ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea) WorkspaceProfile .getModuleXmlObject(vMi .get(i)); if (msa.getPcdCoded() == null || msa.getPcdCoded().getPcdEntryList() == null) { continue; } ListIterator li = msa.getPcdCoded().getPcdEntryList().listIterator(); msaPcdIter:while (li.hasNext()) { PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry) li.next(); ArrayList al = getDynPcdMapValue(msaPcd.getCName() + " " + msaPcd.getTokenSpaceGuidCName()); if (al != null) { for (int j = 0; j < al.size(); ++j) { if (al.get(j).contains(moduleKey)) { continue msaPcdIter; } } } PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, vMi.get(i)); PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs); if (spdPcd == null) { // // ToDo Error // throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + " in Module " + mi.getName()); } // // AddItem to ModuleSA PcdBuildDefinitions // String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue(); genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType() + "", defaultVal, moduleSa); dataModified = true; } } } catch (Exception e){ throw e; } return dataModified; } private void maintainDynPcdMap(String pcdKey, String moduleInfo) { ArrayList al = dynPcdMap.get(pcdKey); if (al == null) { return; } String[] s = moduleInfo.split(" "); for(int i = 0; i < al.size(); ++i){ String consumer = al.get(i); if (consumer.contains(s[0]) && consumer.contains(s[2])){ String[] consumerPart = consumer.split(" "); if (!consumerPart[4].equals(s[4])) { continue; } al.remove(consumer); break; } } if (al.size() == 0) { defaultPcdValue.remove(pcdKey); dynPcdMap.remove(pcdKey); String[] s1 = pcdKey.split(" "); removeDynamicPcdBuildData(s1[0], s1[1]); } } // // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch" // public int getPcdDataCount (int i){ ModuleSADocument.ModuleSA msa = getModuleSA(i); if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){ return 0; } return msa.getPcdBuildDefinition().getPcdDataList().size(); } public void getPcdData (int i, String[][] saa) { ModuleSADocument.ModuleSA msa = getModuleSA(i); if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){ return; } ListIteratorli = msa.getPcdBuildDefinition().getPcdDataList().listIterator(); for (int k = 0; k < saa.length; ++k) { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next(); saa[k][0] = pcdData.getCName(); saa[k][1] = pcdData.getTokenSpaceGuidCName(); saa[k][2] = pcdData.getItemType()+""; saa[k][3] = pcdData.getToken().toString(); saa[k][4] = pcdData.getMaxDatumSize()+""; saa[k][5] = pcdData.getDatumType()+""; saa[k][6] = pcdData.getValue(); } } public void removePcdData (int seqModuleSa, String cName, String tsGuid) { ModuleSADocument.ModuleSA moduleSa = getModuleSA(seqModuleSa); if (moduleSa == null || moduleSa.getPcdBuildDefinition() == null){ return; } String mg = moduleSa.getModuleGuid(); String mv = moduleSa.getModuleVersion(); String pg = moduleSa.getPackageGuid(); String pv = moduleSa.getPackageVersion(); String arch = listToString(moduleSa.getSupArchList()); String moduleKey = mg + " " + mv + " " + pg + " " + pv + " " + arch; XmlCursor cursor = moduleSa.getPcdBuildDefinition().newCursor(); if (cursor.toFirstChild()){ do { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject(); if (pcdData.getCName().equals(cName) && pcdData.getTokenSpaceGuidCName().equals(tsGuid)) { maintainDynPcdMap(cName + " " + tsGuid, moduleKey); if (getPcdDataCount(seqModuleSa) == 1) { cursor.toParent(); } cursor.removeXml(); break; } } while(cursor.toNextSibling()); } cursor.dispose(); } public void updatePcdData (String key, String cName, String tsGuid, String itemType, String maxSize, String value){ ModuleSADocument.ModuleSA moduleSa = getModuleSA(key); if (moduleSa == null || moduleSa.getPcdBuildDefinition() == null){ return; } XmlCursor cursor = moduleSa.getPcdBuildDefinition().newCursor(); if (cursor.toFirstChild()){ do { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject(); if (pcdData.getCName().equals(cName) && pcdData.getTokenSpaceGuidCName().equals(tsGuid)) { pcdData.setItemType(PcdItemTypes.Enum.forString(itemType)); if(pcdData.getDatumType().equals("VOID*")) { pcdData.setMaxDatumSize(new Integer(maxSize)); } pcdData.setValue(value); defaultPcdValue.put(cName + " " + tsGuid, value); break; } } while(cursor.toNextSibling()); } cursor.dispose(); } /**Get original Pcd info from MSA & SPD files. * @param mi ModuleIdentification from which MSA & SPD come * @param cName PCD cName * @param sa Results: HelpText, Original item type. * @return */ public boolean getPcdBuildDataInfo(ModuleIdentification mi, String cName, String tsGuid, String[] sa) throws Exception{ try { ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)WorkspaceProfile.getModuleXmlObject(mi); if (msa.getPcdCoded() == null) { return false; } Map m = new HashMap(); m.put("ModuleSurfaceArea", msa); SurfaceAreaQuery.setDoc(m); PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi); // // First look through MSA pcd entries. // List l = msa.getPcdCoded().getPcdEntryList(); ListIterator li = l.listIterator(); while(li.hasNext()) { PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next(); if (!msaPcd.getCName().equals(cName)) { continue; } if (!msaPcd.getTokenSpaceGuidCName().equals(tsGuid)) { continue; } PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs); if (spdPcd == null) { // // ToDo Error // throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName()); } // // Get Pcd help text and original item type. // sa[0] = spdPcd.getHelpText() + msaPcd.getHelpText(); sa[1] = msaPcd.getPcdItemType()+""; return true; } } catch (Exception e){ e.printStackTrace(); throw e; } return false; } /**Remove PCDBuildDefinition entries from ModuleSA * @param moduleKey identifier of ModuleSA. * @param consumer where these entries come from. */ public void removePcdData(String moduleKey, ModuleIdentification consumer) { try { ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)WorkspaceProfile.getModuleXmlObject(consumer); if (msa.getPcdCoded() == null) { return; } List l = msa.getPcdCoded().getPcdEntryList(); ListIterator li = l.listIterator(); while(li.hasNext()) { PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next(); ModuleSADocument.ModuleSA moduleSA = getModuleSA(moduleKey); if (moduleSA.getPcdBuildDefinition() != null) { XmlCursor cursor = moduleSA.getPcdBuildDefinition().newCursor(); if (cursor.toFirstChild()) { do { PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData) cursor .getObject(); if (msaPcd.getCName().equals(pcdData.getCName()) && msaPcd.getTokenSpaceGuidCName().equals(pcdData.getTokenSpaceGuidCName())) { maintainDynPcdMap(pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(), moduleKey); cursor.removeXml(); break; } } while (cursor.toNextSibling()); } cursor.dispose(); } } } catch (Exception e){ e.printStackTrace(); } } // // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch" // public int getLibraryInstancesCount(String key) { ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){ return 0; } return msa.getLibraries().getInstanceList().size(); } public void getLibraryInstances(String key, String[][] saa){ ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null || msa.getLibraries() == null || msa.getLibraries().getInstanceList() == null){ return ; } ListIterator li = msa.getLibraries().getInstanceList().listIterator(); for (int i = 0; i < saa.length; ++i) { LibrariesDocument.Libraries.Instance instance = li.next(); saa[i][1] = instance.getModuleGuid(); saa[i][2] = instance.getModuleVersion(); saa[i][3] = instance.getPackageGuid(); saa[i][4] = instance.getPackageVersion(); } } public void removeLibraryInstance(String key, int i) { ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null || msa.getLibraries() == null){ return ; } XmlCursor cursor = msa.getLibraries().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } cursor.push(); cursor.toPrevToken(); if (cursor.isComment()) { cursor.removeXml(); } cursor.pop(); cursor.removeXml(); if (getLibraryInstancesCount(key) == 0) { cursor.toParent(); cursor.removeXml(); } } cursor.dispose(); } public void genLibraryInstance(ModuleIdentification libMi, String key) { ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null){ msa = getfpdFrameworkModules().addNewModuleSA(); } LibrariesDocument.Libraries libs = msa.getLibraries(); if(libs == null){ libs = msa.addNewLibraries(); } String mn = libMi.getName(); String mg = libMi.getGuid(); String mv = libMi.getVersion(); String pn = libMi.getPackageId().getName(); String pg = libMi.getPackageId().getGuid(); String pv = libMi.getPackageId().getVersion(); LibrariesDocument.Libraries.Instance instance = libs.addNewInstance(); XmlCursor cursor = instance.newCursor(); try{ String comment = "Pkg: " + pn + " Mod: " + mn + " Path: " + libMi.getPath().substring(System.getenv("WORKSPACE").length() + 1); cursor.insertComment(comment); } catch (Exception e){ e.printStackTrace(); } finally { cursor.dispose(); } instance.setModuleGuid(mg); instance.setModuleVersion(mv); instance.setPackageGuid(pg); instance.setPackageVersion(pv); } public String getFvBinding(String moduleKey){ ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey); return getFvBinding (moduleSa); } public String getFvBinding (ModuleSADocument.ModuleSA moduleSa) { if (moduleSa == null || moduleSa.getModuleSaBuildOptions() == null) { return null; } return moduleSa.getModuleSaBuildOptions().getFvBinding(); } public void setFvBinding(ModuleSADocument.ModuleSA moduleSa, String fvBinding) { if (moduleSa == null ) { return; } if (fvBinding == null || fvBinding.length() == 0) { if(moduleSa.getModuleSaBuildOptions() != null){ moduleSa.getModuleSaBuildOptions().unsetFvBinding(); } } else { if(moduleSa.getModuleSaBuildOptions() == null){ moduleSa.addNewModuleSaBuildOptions().setFvBinding(fvBinding); return; } moduleSa.getModuleSaBuildOptions().setFvBinding(fvBinding); } } public void setFvBinding(String moduleKey, String fvBinding){ ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey); setFvBinding (moduleSa, fvBinding); } private int fvBindingForModuleSA (ModuleSADocument.ModuleSA moduleSa, String fvName) { if (moduleSa == null || moduleSa.getModuleSaBuildOptions() == null || moduleSa.getModuleSaBuildOptions().getFvBinding() == null) { return -1; } String fvNameList = moduleSa.getModuleSaBuildOptions().getFvBinding(); String[] fvNamesArray = fvNameList.split(" "); int occursAt = -1; for (int i = 0; i < fvNamesArray.length; ++i) { if (fvNamesArray[i].equals(fvName)) { occursAt = i; break; } } return occursAt; } public void removeFvBinding (ModuleSADocument.ModuleSA moduleSa, String fvName) { if (moduleSa == null || moduleSa.getModuleSaBuildOptions() == null || moduleSa.getModuleSaBuildOptions().getFvBinding() == null) { return; } String fvNameList = moduleSa.getModuleSaBuildOptions().getFvBinding(); String[] fvNamesArray = fvNameList.split(" "); int occursAt = -1; for (int i = 0; i < fvNamesArray.length; ++i) { if (fvNamesArray[i].equals(fvName)) { occursAt = i; break; } } // jump over where the input fvName occurs in the original Fv list. if (occursAt != -1) { String newFvNameList = " "; for (int i = 0; i < fvNamesArray.length; ++i) { if (i == occursAt) { continue; } newFvNameList += fvNamesArray[i]; } setFvBinding (moduleSa, newFvNameList.trim()); } } /** * @param fvName The FV name that to be removed from FvBinding List. */ public void removeFvBindingAll (String fvName) { if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){ removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return; } Iterator li = getfpdFrameworkModules().getModuleSAList().iterator(); while (li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = li.next(); removeFvBinding (moduleSa, fvName); } } public void appendFvBindingAll (String fvName) { if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){ removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return; } Iterator li = getfpdFrameworkModules().getModuleSAList().iterator(); while (li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = li.next(); appendFvBinding (moduleSa, fvName); } } public void appendFvBindingFor (String oldFvName, String newFvName) { if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){ removeElement(getfpdFrameworkModules()); fpdFrameworkModules = null; return; } Iterator li = getfpdFrameworkModules().getModuleSAList().iterator(); while (li.hasNext()) { ModuleSADocument.ModuleSA moduleSa = li.next(); String fvBinding = getFvBinding (moduleSa); if (fvBinding != null && fvBindingForModuleSA (moduleSa, oldFvName) >= 0) { appendFvBinding (moduleSa, newFvName); } } } public void appendFvBinding (String moduleKey, String fvName) { ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey); appendFvBinding (moduleSa, fvName); } public void appendFvBinding (ModuleSADocument.ModuleSA moduleSa, String fvName) { if (moduleSa == null) { return; } if (moduleSa.getModuleSaBuildOptions() == null || moduleSa.getModuleSaBuildOptions().getFvBinding() == null) { setFvBinding(moduleSa, fvName); return; } String fvNameList = moduleSa.getModuleSaBuildOptions().getFvBinding(); String newFvNameList = fvNameList + " " + fvName; setFvBinding (moduleSa, newFvNameList.trim()); } public void updateFvBindingInModuleSA (ModuleIdentification mi, String fvName) { Vector vSupArchs = new Vector(); getPlatformDefsSupportedArchs(vSupArchs); String moduleInfo = mi.getGuid() + " " + mi.getVersion() + " " + mi.getPackageId().getGuid() + " " + mi.getPackageId().getVersion(); for (int i = 0; i < vSupArchs.size(); ++i) { String moduleKey = moduleInfo + " " + vSupArchs.get(i); appendFvBinding (moduleKey, fvName); } } public String getFfsFileNameGuid(String moduleKey){ ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey); if (moduleSa == null || moduleSa.getModuleSaBuildOptions() == null) { return null; } return moduleSa.getModuleSaBuildOptions().getFfsFileNameGuid(); } public void setFfsFileNameGuid(String moduleKey, String fileGuid){ ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa == null ) { return; } if(msa.getModuleSaBuildOptions() == null){ msa.addNewModuleSaBuildOptions(); } ModuleSaBuildOptionsDocument.ModuleSaBuildOptions msaBuildOpts= msa.getModuleSaBuildOptions(); if (fileGuid != null) { msaBuildOpts.setFfsFileNameGuid(fileGuid); } else{ XmlCursor cursor = msaBuildOpts.newCursor(); if (cursor.toChild(xmlNs, "FfsFileNameGuid")) { cursor.removeXml(); } cursor.dispose(); } } public String getFfsFormatKey(String moduleKey){ ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa == null || msa.getModuleSaBuildOptions() == null) { return null; } return msa.getModuleSaBuildOptions().getFfsFormatKey(); } public void setFfsFormatKey(String moduleKey, String ffsKey){ ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa == null ) { return; } if(msa.getModuleSaBuildOptions() == null){ msa.addNewModuleSaBuildOptions().setFfsFormatKey(ffsKey); return; } msa.getModuleSaBuildOptions().setFfsFormatKey(ffsKey); } public void setModuleSAForceDebug(int i, boolean dbgEnable) { ModuleSADocument.ModuleSA moduleSa = getModuleSA(i); moduleSa.setForceDebug(dbgEnable); } public boolean getModuleSAForceDebug (int i) { ModuleSADocument.ModuleSA moduleSa = getModuleSA(i); if (moduleSa.getForceDebug() == true) { return true; } return false; } public void getModuleSAOptions(String moduleKey, String[][] saa) { ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa == null || msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null || msa.getModuleSaBuildOptions().getOptions().getOptionList() == null) { return ; } List lOpt = msa.getModuleSaBuildOptions().getOptions().getOptionList(); ListIterator li = lOpt.listIterator(); int i = 0; while(li.hasNext()) { OptionDocument.Option opt = (OptionDocument.Option)li.next(); if (opt.getBuildTargets() != null) { saa[i][0] = listToString(opt.getBuildTargets()); } saa[i][1] = opt.getToolChainFamily(); saa[i][2] = opt.getTagName(); saa[i][3] = opt.getToolCode(); if (opt.getSupArchList() != null){ saa[i][4] = listToString(opt.getSupArchList()); } else { saa[i][4] = ""; } saa[i][5] = opt.getStringValue(); ++i; } } public int getModuleSAOptionsCount(String moduleKey){ ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa == null || msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null || msa.getModuleSaBuildOptions().getOptions().getOptionList() == null) { return 0; } return msa.getModuleSaBuildOptions().getOptions().getOptionList().size(); } public void genModuleSAOptionsOpt(String moduleKey, Vector buildTargets, String toolChain, String tagName, String toolCmd, Vector archList, String contents) { ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa.getModuleSaBuildOptions() == null) { msa.addNewModuleSaBuildOptions(); } if (msa.getModuleSaBuildOptions().getOptions() == null){ msa.getModuleSaBuildOptions().addNewOptions(); } OptionDocument.Option opt = msa.getModuleSaBuildOptions().getOptions().addNewOption(); setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt); } public void removeModuleSAOptionsOpt(String moduleKey, int i) { ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null) { return ; } OptionsDocument.Options opts = msa.getModuleSaBuildOptions().getOptions(); XmlCursor cursor = opts.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j){ cursor.toNextSibling(); } cursor.removeXml(); } cursor.dispose(); } public void updateModuleSAOptionsOpt(String moduleKey, int i, Vector buildTargets, String toolChain, String tagName, String toolCmd, Vector archList, String contents) { ModuleSADocument.ModuleSA msa = getModuleSA(moduleKey); if (msa.getModuleSaBuildOptions() == null || msa.getModuleSaBuildOptions().getOptions() == null) { return ; } OptionsDocument.Options opts = msa.getModuleSaBuildOptions().getOptions(); XmlCursor cursor = opts.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j){ cursor.toNextSibling(); } OptionDocument.Option opt = (OptionDocument.Option)cursor.getObject(); setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt); } cursor.dispose(); } /**add pcd information of module mi to a ModuleSA. * @param mi * @param moduleSa if null, generate a new ModuleSA. */ public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi, String arch, ModuleSADocument.ModuleSA moduleSa) throws Exception { //ToDo add Arch filter try { if (moduleSa == null) { moduleSa = genModuleSA(mi, arch); } ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)WorkspaceProfile.getModuleXmlObject(mi); if (msa.getPcdCoded() == null) { return; } Map m = new HashMap(); m.put("ModuleSurfaceArea", msa); SurfaceAreaQuery.setDoc(m); PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi); // // Implementing InitializePlatformPcdBuildDefinitions // List l = msa.getPcdCoded().getPcdEntryList(); ListIterator li = l.listIterator(); while(li.hasNext()) { PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next(); PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs); if (spdPcd == null) { // // ToDo Error // throw new PcdDeclNotFound("No Declaration for PCD Entry " + msaPcd.getCName() + " in Module " + mi.getName()); } // // AddItem to ModuleSA PcdBuildDefinitions // String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue(); genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType()+"", defaultVal, moduleSa); } } catch (Exception e){ throw e; } } private PcdDeclarationsDocument.PcdDeclarations.PcdEntry LookupPcdDeclaration (PcdCodedDocument.PcdCoded.PcdEntry msaPcd, PackageIdentification[] depPkgs) { PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = null; for (int i = 0; i < depPkgs.length; ++i) { XmlObject[] xo = SurfaceAreaQuery.getSpdPcdDeclarations(depPkgs[i]); if (xo == null) { continue; } for (int j = 0; j < xo.length; ++j) { spdPcd = (PcdDeclarationsDocument.PcdDeclarations.PcdEntry)xo[j]; if (msaPcd.getTokenSpaceGuidCName() == null) { if (spdPcd.getCName().equals(msaPcd.getCName())) { return spdPcd; } } else{ if (spdPcd.getCName().equals(msaPcd.getCName()) && spdPcd.getTokenSpaceGuidCName().equals(msaPcd.getTokenSpaceGuidCName())) { return spdPcd; } } } } return null; } private ModuleSADocument.ModuleSA genModuleSA (ModuleIdentification mi, String arch) { PackageIdentification pi = WorkspaceProfile.getPackageForModule(mi); ModuleSADocument.ModuleSA msa = getfpdFrameworkModules().addNewModuleSA(); XmlCursor cursor = msa.newCursor(); try{ String comment = "Mod: " + mi.getName() + " Type: " + SurfaceAreaQuery.getModuleType(mi) + " Path: " + mi.getPath().substring(System.getenv("WORKSPACE").length() + 1); cursor.insertComment(comment); } catch(Exception e){ e.printStackTrace(); } finally { cursor.dispose(); } msa.setModuleGuid(mi.getGuid()); msa.setModuleVersion(mi.getVersion()); msa.setPackageGuid(pi.getGuid()); msa.setPackageVersion(pi.getVersion()); if (arch != null) { Vector v = new Vector(); v.add(arch); msa.setSupArchList(v); } return msa; } private void genPcdData (String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal, ModuleSADocument.ModuleSA moduleSa) throws PcdItemTypeConflictException, PcdValueMalFormed{ if (moduleSa.getPcdBuildDefinition() == null){ moduleSa.addNewPcdBuildDefinition(); } // // constructe pcd to modulesa mapping first. // Attention : for any error condition, remove from map this pcd. // ArrayList pcdConsumer = LookupPlatformPcdData(cName + " " + tsGuid); if (pcdConsumer == null) { pcdConsumer = new ArrayList(); } // // Using existing Pcd type, if this pcd already exists in other ModuleSA // if (pcdConsumer.size() > 0) { String[] valPart = pcdConsumer.get(0).split(" "); itemType = valPart[5]; } String listValue = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " + moduleSa.getPackageGuid() + " " + moduleSa.getPackageVersion() + " " + listToString(moduleSa.getSupArchList()) + " " + itemType; pcdConsumer.add(listValue); dynPcdMap.put(cName + " " + tsGuid, pcdConsumer); PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData fpdPcd = moduleSa.getPcdBuildDefinition().addNewPcdData(); fpdPcd.setCName(cName); fpdPcd.setToken(token); fpdPcd.setTokenSpaceGuidCName(tsGuid); fpdPcd.setDatumType(PcdDataTypes.Enum.forString(dataType)); fpdPcd.setItemType(PcdItemTypes.Enum.forString(itemType)); if (defaultVal != null){ fpdPcd.setValue(defaultVal); } else { if (dataType.equals("UINT8") || dataType.equals("UINT16") || dataType.equals("UINT32") || dataType.equals("UINT64")) { fpdPcd.setValue("0"); } if (dataType.equals("BOOLEAN")){ fpdPcd.setValue("FALSE"); } if (dataType.equals("VOID*")) { fpdPcd.setValue(""); } } // // Using existing pcd value, if this pcd already exists in other moduleSa. // if (defaultPcdValue.get(cName + " " + tsGuid) == null) { defaultPcdValue.put(cName + " " + tsGuid, fpdPcd.getValue()); } else { fpdPcd.setValue(defaultPcdValue.get(cName + " " + tsGuid)); } if (dataType.equals("UINT8")){ fpdPcd.setMaxDatumSize(1); } if (dataType.equals("UINT16")) { fpdPcd.setMaxDatumSize(2); } if (dataType.equals("UINT32")) { fpdPcd.setMaxDatumSize(4); } if (dataType.equals("UINT64")){ fpdPcd.setMaxDatumSize(8); } if (dataType.equals("BOOLEAN")){ fpdPcd.setMaxDatumSize(1); } if (dataType.equals("VOID*")) { int maxSize = setMaxSizeForPointer(fpdPcd.getValue()); fpdPcd.setMaxDatumSize(maxSize); } if (itemType.equals("DYNAMIC") || itemType.equals("DYNAMIC_EX")) { ArrayList al = LookupDynamicPcdBuildDefinition(cName + " " + tsGuid); // // if only one module mapped to this pcd, then the one is myself. so no other module mapped. // so need to add one dyn pcd. // if (al.size() == 1) { addDynamicPcdBuildData(cName, token, tsGuid, itemType, dataType, defaultVal); } } } public int setMaxSizeForPointer(String datum) throws PcdValueMalFormed{ if (datum == null) { return 0; } char ch = datum.charAt(0); int start, end; String strValue; // // For void* type PCD, only three datum is support: // 1) Unicode: string with start char is "L" // 2) Ansci: String is "" // 3) byte array: String start char "{" // if (ch == 'L') { start = datum.indexOf('\"'); end = datum.lastIndexOf('\"'); if ((start > end) || (end > datum.length())|| ((start == end) && (datum.length() > 0))) { //ToDo Error handling here throw new PcdValueMalFormed (datum); } strValue = datum.substring(start + 1, end); return strValue.length() * 2; } else if (ch == '\"'){ start = datum.indexOf('\"'); end = datum.lastIndexOf('\"'); if ((start > end) || (end > datum.length())|| ((start == end) && (datum.length() > 0))) { throw new PcdValueMalFormed (datum); } strValue = datum.substring(start + 1, end); return strValue.length(); } else if (ch =='{') { String[] strValueArray; start = datum.indexOf('{'); end = datum.lastIndexOf('}'); strValue = datum.substring(start + 1, end); strValue = strValue.trim(); if (strValue.length() == 0) { return 0; } strValueArray = strValue.split(","); for (int index = 0; index < strValueArray.length; index ++) { Integer value = Integer.decode(strValueArray[index].trim()); if (value > 0xFF) { // "[FPD file error] The datum type of PCD %s in %s is VOID*, "+ // "it must be a byte array. But the element of %s exceed the byte range", throw new PcdValueMalFormed (datum); } } return strValueArray.length; } else { // "[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+ // "1) UNICODE string: like L\"xxxx\";\r\n"+ // "2) ANSIC string: like \"xxx\";\r\n"+ // "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+ // "but the datum in seems does not following above format!", throw new PcdValueMalFormed (datum); } } private ArrayList LookupDynamicPcdBuildDefinition(String dynPcdKey) { ArrayList al = dynPcdMap.get(dynPcdKey); return al; } private ArrayList LookupPlatformPcdData(String pcdKey) { return dynPcdMap.get(pcdKey); } public int getDynamicPcdBuildDataCount() { if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return 0; } return getfpdDynPcdBuildDefs().getPcdBuildDataList().size(); } public void getDynamicPcdBuildData(String[][] saa) { if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return ; } List l = getfpdDynPcdBuildDefs().getPcdBuildDataList(); ListIterator li = l.listIterator(); int i = 0; while(li.hasNext()) { DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcd = li.next(); saa[i][0] = dynPcd.getCName(); saa[i][1] = dynPcd.getToken().toString(); saa[i][2] = dynPcd.getTokenSpaceGuidCName(); saa[i][3] = dynPcd.getMaxDatumSize()+""; saa[i][4] = dynPcd.getDatumType().toString(); ++i; } } public void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) throws PcdValueMalFormed{ DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcdData = getfpdDynPcdBuildDefs().addNewPcdBuildData(); dynPcdData.setItemType(PcdItemTypes.Enum.forString(itemType)); dynPcdData.setCName(cName); dynPcdData.setToken(token); dynPcdData.setTokenSpaceGuidCName(tsGuid); dynPcdData.setDatumType(PcdDataTypes.Enum.forString(dataType)); BigInteger bigInt = new BigInteger("0"); DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = dynPcdData.addNewSkuInfo(); skuInfo.setSkuId(bigInt); if (defaultVal != null){ skuInfo.setValue(defaultVal); } else { if (dataType.equals("UINT8")){ skuInfo.setValue("0"); } if (dataType.equals("UINT16")) { skuInfo.setValue("0"); } if (dataType.equals("UINT32")) { skuInfo.setValue("0"); } if (dataType.equals("UINT64")){ skuInfo.setValue("0"); } if (dataType.equals("BOOLEAN")){ skuInfo.setValue("false"); } if (dataType.equals("VOID*")) { skuInfo.setValue(""); } } if (dataType.equals("UINT8")){ dynPcdData.setMaxDatumSize(1); } if (dataType.equals("UINT16")) { dynPcdData.setMaxDatumSize(2); } if (dataType.equals("UINT32")) { dynPcdData.setMaxDatumSize(4); } if (dataType.equals("UINT64")){ dynPcdData.setMaxDatumSize(8); } if (dataType.equals("BOOLEAN")){ dynPcdData.setMaxDatumSize(1); } if (dataType.equals("VOID*")) { int maxSize = setMaxSizeForPointer(defaultVal); dynPcdData.setMaxDatumSize(maxSize); } } public void removeDynamicPcdBuildData(String cName, String tsGuid) { XmlObject o = fpdRoot.getDynamicPcdBuildDefinitions(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { do { DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdBuildData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid)) { if (getDynamicPcdBuildDataCount() == 1) { cursor.toParent(); } cursor.removeXml(); cursor.dispose(); return; } } while (cursor.toNextSibling()); } cursor.dispose(); } // // Get the Sku Info count of ith dyn pcd element. // public int getDynamicPcdSkuInfoCount(int i){ if (fpdRoot.getDynamicPcdBuildDefinitions() == null || fpdRoot.getDynamicPcdBuildDefinitions().getPcdBuildDataList() == null || fpdRoot.getDynamicPcdBuildDefinitions().getPcdBuildDataList().size() == 0) { return 0; } int skuInfoCount = 0; XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdData.getSkuInfoList() == null) { skuInfoCount = 0; } else { skuInfoCount = pcdData.getSkuInfoList().size(); } } cursor.dispose(); return skuInfoCount; } public void getDynamicPcdSkuInfos(int i, String[][] saa){ if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return; } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdData.getSkuInfoList() == null) { cursor.dispose(); return; } else { ListIterator li = pcdData.getSkuInfoList().listIterator(); int k = 0; while (li.hasNext()) { DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next(); saa[k][0] = skuInfo.getSkuId()+""; saa[k][1] = skuInfo.getVariableName(); saa[k][2] = skuInfo.getVariableGuid(); saa[k][3] = skuInfo.getVariableOffset(); saa[k][4] = skuInfo.getHiiDefaultValue(); saa[k][5] = skuInfo.getVpdOffset(); saa[k][6] = skuInfo.getValue(); ++k; } } } cursor.dispose(); } public String getDynamicPcdBuildDataValue(int i){ String value = null; if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return value; } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdData.getSkuInfoList() == null) { value = null; } else { value = pcdData.getSkuInfoArray(0).getValue(); } } cursor.dispose(); return value; } public String getDynamicPcdBuildDataVpdOffset(int i){ String vpdOffset = null; if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return vpdOffset; } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdData.getSkuInfoList() == null) { vpdOffset = null; } else { vpdOffset = pcdData.getSkuInfoArray(0).getVpdOffset(); } } cursor.dispose(); return vpdOffset; } public void removeDynamicPcdBuildDataSkuInfo(int i) { if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; return; } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); if (pcdData.getSkuInfoList() == null) { cursor.dispose(); return; } else { QName qSkuInfo = new QName(xmlNs, "SkuInfo"); cursor.toChild(qSkuInfo); cursor.removeXml(); } } cursor.dispose(); } // // generate sku info for ith dyn pcd build data. // public void genDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, String hiiDefault, String vpdOffset, String value, int i) { // if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { // return; // } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = pcdData.addNewSkuInfo(); skuInfo.setSkuId(new BigInteger(id)); if (varName != null){ skuInfo.setVariableName(varName); skuInfo.setVariableGuid(varGuid); skuInfo.setVariableOffset(varOffset); skuInfo.setHiiDefaultValue(hiiDefault); } else if (vpdOffset != null){ skuInfo.setVpdOffset(vpdOffset); } else{ skuInfo.setValue(value); } } } public void updateDynamicPcdBuildDataSkuInfo(String id, String varName, String varGuid, String varOffset, String hiiDefault, String vpdOffset, String value, int i){ // if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { // return; // } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); ListIterator li = pcdData.getSkuInfoList().listIterator(); while (li.hasNext()) { DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo skuInfo = li.next(); if (skuInfo.getSkuId().toString().equals(id)){ if (varName != null){ skuInfo.setVariableName(varName); skuInfo.setVariableGuid(varGuid); skuInfo.setVariableOffset(varOffset); skuInfo.setHiiDefaultValue(hiiDefault); } else if (vpdOffset != null){ skuInfo.setVpdOffset(vpdOffset); } else{ skuInfo.setValue(value); } break; } } } } public BuildOptionsDocument.BuildOptions getfpdBuildOpts() { if (fpdBuildOpts == null) { fpdBuildOpts = fpdRoot.addNewBuildOptions(); } return fpdBuildOpts; } public void genBuildOptionsUserExtensions(String fvName, String outputFileName, Vector includeModules) { QName elementFvName = new QName (xmlNs, "FvName"); QName elementIncludeModules = new QName(xmlNs, "IncludeModules"); QName elementInfFileName = new QName(xmlNs, "InfFileName"); QName elementModule = new QName(xmlNs, "Module"); UserExtensionsDocument.UserExtensions userExts = getfpdBuildOpts().addNewUserExtensions(); userExts.setUserID("IMAGES"); userExts.setIdentifier(new BigInteger("1")); XmlCursor cursor = userExts.newCursor(); cursor.toEndToken(); cursor.beginElement(elementFvName); cursor.insertChars(fvName); cursor.toNextToken(); cursor.beginElement(elementInfFileName); cursor.insertChars(fvName + ".inf"); cursor.toNextToken(); cursor.beginElement(elementIncludeModules); for (int i = 0; i < includeModules.size(); ++i) { cursor.beginElement(elementModule); cursor.insertAttributeWithValue("ModuleGuid", includeModules.get(i)[0]); cursor.insertAttributeWithValue("BaseName", includeModules.get(i)[1]); cursor.toEndToken(); cursor.toNextToken(); } cursor.dispose(); } public int getUserExtsIncModCount (String fvName) { if (getfpdBuildOpts().getUserExtensionsList() == null) { return -1; } ListIterator li = getfpdBuildOpts().getUserExtensionsList().listIterator(); QName elementIncludeModules = new QName(xmlNs, "IncludeModules"); while (li.hasNext()) { UserExtensionsDocument.UserExtensions ues = li.next(); if (!ues.getUserID().equals("IMAGES")) { continue; } XmlCursor cursor = ues.newCursor(); cursor.toFirstChild(); String elementName = cursor.getTextValue(); if (elementName.equals(fvName)) { cursor.toNextSibling(elementIncludeModules); if (cursor.toFirstChild()) { int i = 1; for (i = 1; cursor.toNextSibling(); ++i); cursor.dispose(); return i; } cursor.dispose(); return 0; } cursor.dispose(); } return -1; } public void getUserExtsIncMods(String fvName, String[][] saa) { if (getfpdBuildOpts().getUserExtensionsList() == null) { return; } XmlCursor cursor = getfpdBuildOpts().newCursor(); QName elementUserExts = new QName (xmlNs, "UserExtensions"); QName attribUserId = new QName ("UserID"); QName elementFvName = new QName (xmlNs, "FvName"); QName elementIncludeModules = new QName(xmlNs, "IncludeModules"); QName attribModuleGuid = new QName("ModuleGuid"); QName attribBaseName = new QName("BaseName"); if (cursor.toChild(elementUserExts)) { do { cursor.push(); if (cursor.getAttributeText(attribUserId).equals("IMAGES")) { cursor.toChild(elementFvName); String elementName = cursor.getTextValue(); if (elementName.equals(fvName)) { cursor.toNextSibling(elementIncludeModules); if (cursor.toFirstChild()) { int i = 0; do { saa[i][0] = cursor.getAttributeText(attribModuleGuid); saa[i][1] = cursor.getAttributeText(attribBaseName); ++i; }while (cursor.toNextSibling()); } break; } } cursor.pop(); }while (cursor.toNextSibling(elementUserExts)); } cursor.dispose(); } public void updateBuildOptionsUserExtensions (String oldFvName, String newFvName) { if (getfpdBuildOpts().getUserExtensionsList() == null) { return; } ListIterator li = getfpdBuildOpts().getUserExtensionsList().listIterator(); while (li.hasNext()) { UserExtensionsDocument.UserExtensions ues = li.next(); if (!ues.getUserID().equals("IMAGES")) { continue; } XmlCursor cursor = ues.newCursor(); cursor.toFirstChild(); String elementName = cursor.getTextValue(); if (elementName.equals(oldFvName)) { cursor.setTextValue(newFvName); } cursor.dispose(); } } public void removeBuildOptionsUserExtensions (String fvName) { if (getfpdBuildOpts().getUserExtensionsList() == null) { return; } ListIterator li = getfpdBuildOpts().getUserExtensionsList().listIterator(); while (li.hasNext()) { UserExtensionsDocument.UserExtensions ues = li.next(); if (!ues.getUserID().equals("IMAGES")) { continue; } XmlCursor cursor = ues.newCursor(); cursor.toFirstChild(); String elementName = cursor.getTextValue(); if (elementName.equals(fvName)) { cursor.toParent(); cursor.removeXml(); cursor.dispose(); return; } cursor.dispose(); } } public void genBuildOptionsUserDefAntTask (String id, String fileName, String execOrder) { UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks(); if (udats == null) { udats = getfpdBuildOpts().addNewUserDefinedAntTasks(); } AntTaskDocument.AntTask at = udats.addNewAntTask(); setBuildOptionsUserDefAntTask(id, fileName, execOrder, at); } private void setBuildOptionsUserDefAntTask(String id, String fileName, String execOrder, AntTaskDocument.AntTask at) { at.setId(new Integer(id)); XmlCursor cursor = at.newCursor(); if (fileName != null){ at.setFilename(fileName); } else if (cursor.toChild(xmlNs, "Filename")) { cursor.removeXml(); } if (execOrder != null) { at.setAntCmdOptions(execOrder); } else if (cursor.toChild(xmlNs, "AntCmdOptions")) { cursor.removeXml(); } cursor.dispose(); } public void removeBuildOptionsUserDefAntTask(int i) { XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } cursor.removeXml(); if (getBuildOptionsUserDefAntTaskCount() == 0) { cursor.toParent(); cursor.removeXml(); } } cursor.dispose(); } public void updateBuildOptionsUserDefAntTask(int i, String id, String fileName, String execOrder){ XmlObject o = getfpdBuildOpts().getUserDefinedAntTasks(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)cursor.getObject(); setBuildOptionsUserDefAntTask(id, fileName, execOrder, at); } cursor.dispose(); } public int getBuildOptionsUserDefAntTaskCount() { UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks(); if (udats == null || udats.getAntTaskList() == null) { return 0; } return udats.getAntTaskList().size(); } public void getBuildOptionsUserDefAntTasks(String[][] saa) { UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks(); if (udats == null || udats.getAntTaskList() == null) { return ; } List l = udats.getAntTaskList(); ListIterator li = l.listIterator(); int i = 0; while (li.hasNext()) { AntTaskDocument.AntTask at = (AntTaskDocument.AntTask)li.next(); saa[i][0] = at.getId() + ""; saa[i][1] = saa[i][2] = ""; if (at.getFilename() != null){ saa[i][1] = at.getFilename(); } if (at.getAntCmdOptions() != null) { saa[i][2] = at.getAntCmdOptions(); } ++i; } } public void genBuildOptionsOpt(Vector buildTargets, String toolChain, String tagName, String toolCmd, Vector archList, String contents) { OptionsDocument.Options opts = getfpdBuildOpts().getOptions(); if (opts == null) { opts = getfpdBuildOpts().addNewOptions(); } OptionDocument.Option opt = opts.addNewOption(); setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt); } private void setBuildOptionsOpt(Vector buildTargets, String toolChain, String tagName, String toolCmd, Vector archList, String contents, OptionDocument.Option opt){ opt.setStringValue(contents); opt.setBuildTargets(buildTargets); opt.setToolChainFamily(toolChain); opt.setTagName(tagName); opt.setToolCode(toolCmd); if (archList != null) { opt.setSupArchList(archList); } else { if (opt.isSetSupArchList()) { opt.unsetSupArchList(); } } } public void removeBuildOptionsOpt(int i){ XmlObject o = getfpdBuildOpts().getOptions(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } cursor.removeXml(); if (getBuildOptionsOptCount() == 0) { cursor.toParent(); cursor.removeXml(); } } cursor.dispose(); } public void updateBuildOptionsOpt(int i, Vector buildTargets, String toolChain, String tagName, String toolCmd, Vector archList, String contents) { XmlObject o = getfpdBuildOpts().getOptions(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } OptionDocument.Option opt = (OptionDocument.Option)cursor.getObject(); setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt); } cursor.dispose(); } public int getBuildOptionsOptCount(){ if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) { return 0; } return getfpdBuildOpts().getOptions().getOptionList().size(); } public void getBuildOptionsOpts(String[][] saa) { if (getfpdBuildOpts().getOptions() == null || getfpdBuildOpts().getOptions().getOptionList() == null) { return ; } List lOpt = getfpdBuildOpts().getOptions().getOptionList(); ListIterator li = lOpt.listIterator(); int i = 0; while(li.hasNext()) { OptionDocument.Option opt = (OptionDocument.Option)li.next(); if (opt.getBuildTargets() != null) { saa[i][0] = listToString(opt.getBuildTargets()); } saa[i][1] = opt.getToolChainFamily(); if (opt.getSupArchList() != null){ saa[i][2] = listToString(opt.getSupArchList()); } saa[i][3] = opt.getToolCode(); saa[i][4] = opt.getTagName(); saa[i][5] = opt.getStringValue(); ++i; } } public void genBuildOptionsFfs(String ffsKey, String type) { BuildOptionsDocument.BuildOptions.Ffs ffs = getfpdBuildOpts().addNewFfs(); ffs.setFfsKey(ffsKey); if (type != null) { ffs.addNewSections().setEncapsulationType(type); } } public void updateBuildOptionsFfsSectionsType(int i, String type) { BuildOptionsDocument.BuildOptions.Ffs ffs = getfpdBuildOpts().addNewFfs(); if (type != null) { ffs.addNewSections().setEncapsulationType(type); } } public void genBuildOptionsFfsAttribute(int i, String name, String value) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = ffs.addNewAttribute(); attrib.setName(name); attrib.setValue(value); } /**update jth attribute of ith ffs. * @param i * @param j */ public void updateBuildOptionsFfsAttribute(int i, int j, String name, String value){ BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); XmlCursor cursor = ffs.newCursor(); QName qAttrib = new QName(xmlNs, "Attribute"); if (cursor.toChild(qAttrib)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qAttrib); } BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = (BuildOptionsDocument.BuildOptions.Ffs.Attribute)cursor.getObject(); attrib.setName(name); attrib.setValue(value); } cursor.dispose(); } public void removeBuildOptionsFfsAttribute(int i, int j){ BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); XmlCursor cursor = ffs.newCursor(); QName qAttrib = new QName(xmlNs, "Attribute"); if (cursor.toChild(qAttrib)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qAttrib); } cursor.removeXml(); } cursor.dispose(); } public void genBuildOptionsFfsSectionsSection(int i, String sectionType) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs == null) { return; } BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null){ sections = ffs.addNewSections(); } sections.addNewSection().setSectionType(EfiSectionType.Enum.forString(sectionType)); } public void removeBuildOptionsFfsSectionsSection(int i, int j) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSection = new QName(xmlNs, "Section"); if (cursor.toChild(qSection)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSection); } cursor.removeXml(); } cursor.dispose(); } public void updateBuildOptionsFfsSectionsSection(int i, int j, String type){ BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSection = new QName(xmlNs, "Section"); if (cursor.toChild(qSection)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSection); } BuildOptionsDocument.BuildOptions.Ffs.Sections.Section section = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Section)cursor.getObject(); section.setSectionType(EfiSectionType.Enum.forString(type)); } cursor.dispose(); } public void genBuildOptionsFfsSectionsSections(int i, String encapType) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs == null) { return; } BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null){ sections = ffs.addNewSections(); } sections.addNewSections().setEncapsulationType(encapType); } public void removeBuildOptionsFfsSectionsSections(int i, int j) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSections); } cursor.removeXml(); } cursor.dispose(); } public void updateBuildOptionsFfsSectionsSections(int i, int j, String type) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)) { for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSections); } BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject(); sections2.setEncapsulationType(type); } cursor.dispose(); } public void genBuildOptionsFfsSectionsSectionsSection(int i, int j, String type) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs == null) { return; } BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)){ for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSections); } BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject(); sections2.addNewSection().setSectionType(EfiSectionType.Enum.forString(type)); } cursor.dispose(); } public void removeBuildOptionsFfsSectionsSectionsSection(int i, int j, int k) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)) { for (int l = 0; l < j; ++l) { cursor.toNextSibling(qSections); } if (cursor.toFirstChild()) { int m = 0; for (; m < k; ++m) { cursor.toNextSibling(); } cursor.removeXml(); if (m == 0) { cursor.toParent(); cursor.removeXml(); } } } cursor.dispose(); } public void updateBuildOptionsFfsSectionsSectionsSection(int i, int j, int k, String type) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); if (sections == null) { return; } XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)) { for (int l = 0; l < j; ++l) { cursor.toNextSibling(qSections); } if (cursor.toFirstChild()) { for (int m = 0; m < k; ++m) { cursor.toNextSibling(); } BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section section = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section)cursor.getObject(); section.setSectionType(EfiSectionType.Enum.forString(type)); } } cursor.dispose(); } public void getBuildOptionsFfsSectionsSectionsSection(int i, int j, ArrayList al) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs == null) { return; } BuildOptionsDocument.BuildOptions.Ffs.Sections sections = ffs.getSections(); XmlCursor cursor = sections.newCursor(); QName qSections = new QName(xmlNs, "Sections"); if (cursor.toChild(qSections)){ for (int k = 0; k < j; ++k) { cursor.toNextSibling(qSections); } BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2 sections2 = (BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2)cursor.getObject(); if (sections2.getSectionList() == null){ cursor.dispose(); return; } ListIterator li = sections2.getSectionList().listIterator(); while(li.hasNext()) { BuildOptionsDocument.BuildOptions.Ffs.Sections.Sections2.Section section = li.next(); if (section.isSetSectionType()) { al.add(section.getSectionType().toString()); } } } cursor.dispose(); } public int getBuildOptionsFfsCount(){ if (getfpdBuildOpts().getFfsList() == null) { return 0; } return getfpdBuildOpts().getFfsList().size(); } public void getBuildOptionsFfsKey(String[][] saa) { if (getfpdBuildOpts().getFfsList() == null) { return; } ListIterator li = getfpdBuildOpts().getFfsList().listIterator(); int i = 0; while(li.hasNext()){ BuildOptionsDocument.BuildOptions.Ffs ffs = li.next(); saa[i][0] = ffs.getFfsKey(); ++i; } } public void updateBuildOptionsFfsKey(int i, String key) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); ffs.setFfsKey(key); } /**Get ith FFS key and contents. * @param saa */ public void getBuildOptionsFfs(int i, String[] sa, LinkedHashMap ffsAttribMap, ArrayList firstLevelSections, ArrayList firstLevelSection) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs != null) { sa[0] = ffs.getFfsKey(); if (ffs.getSections() != null) { if(ffs.getSections().getEncapsulationType() != null){ sa[1] = ffs.getSections().getEncapsulationType(); } if (ffs.getSections().getSectionList() != null){ ListIterator li = ffs.getSections().getSectionList().listIterator(); while (li.hasNext()) { firstLevelSection.add(li.next().getSectionType().toString()); } } if (ffs.getSections().getSectionsList() != null) { ListIterator li = ffs.getSections().getSectionsList().listIterator(); while(li.hasNext()) { firstLevelSections.add(li.next().getEncapsulationType()); } } } if (ffs.getAttributeList() != null) { ListIterator li = ffs.getAttributeList().listIterator(); while(li.hasNext()) { BuildOptionsDocument.BuildOptions.Ffs.Attribute attrib = li.next(); ffsAttribMap.put(attrib.getName(), attrib.getValue()); } } } } private BuildOptionsDocument.BuildOptions.Ffs getFfs(int i) { XmlObject o = getfpdBuildOpts(); BuildOptionsDocument.BuildOptions.Ffs ffs = null; XmlCursor cursor = o.newCursor(); QName qFfs = new QName(xmlNs, "Ffs"); if (cursor.toChild(qFfs)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFfs); } ffs = (BuildOptionsDocument.BuildOptions.Ffs)cursor.getObject(); } cursor.dispose(); return ffs; } public void removeBuildOptionsFfs(int i) { BuildOptionsDocument.BuildOptions.Ffs ffs = getFfs(i); if (ffs == null){ return; } XmlCursor cursor = ffs.newCursor(); cursor.removeXml(); cursor.dispose(); } public PlatformDefinitionsDocument.PlatformDefinitions getfpdPlatformDefs(){ if (fpdPlatformDefs == null){ fpdPlatformDefs = fpdRoot.addNewPlatformDefinitions(); } return fpdPlatformDefs; } public void getPlatformDefsSupportedArchs(Vector archs){ if (getfpdPlatformDefs().getSupportedArchitectures() == null) { return; } ListIterator li = getfpdPlatformDefs().getSupportedArchitectures().listIterator(); while(li.hasNext()) { archs.add(li.next()); } } public void setPlatformDefsSupportedArchs(Vector archs) { if (archs != null) { getfpdPlatformDefs().setSupportedArchitectures(archs); } // else { // XmlCursor cursor = getfpdPlatformDefs().newCursor(); // if (cursor.toChild(xmlNs, "SupportedArchitectures")) { // cursor.removeXml(); // } // cursor.dispose(); // } } public void getPlatformDefsBuildTargets(Vector targets) { if (getfpdPlatformDefs().getBuildTargets() == null) { return; } ListIterator li = getfpdPlatformDefs().getBuildTargets().listIterator(); while(li.hasNext()) { targets.add(li.next()); } } public void setPlatformDefsBuildTargets(Vector targets) { getfpdPlatformDefs().setBuildTargets(targets); } public void genPlatformDefsSkuInfo(String id, String name) { SkuInfoDocument.SkuInfo skuInfo = null; if (getfpdPlatformDefs().getSkuInfo() == null) { skuInfo = getfpdPlatformDefs().addNewSkuInfo(); } skuInfo = getfpdPlatformDefs().getSkuInfo(); if (skuInfo.getUiSkuNameList() == null || skuInfo.getUiSkuNameList().size() == 0) { SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName(); skuName.setSkuID(new BigInteger("0")); skuName.setStringValue("DEFAULT"); } if (id.equals("0")) { return; } SkuInfoDocument.SkuInfo.UiSkuName skuName = skuInfo.addNewUiSkuName(); skuName.setSkuID(new BigInteger(id)); skuName.setStringValue(name); } public int getPlatformDefsSkuInfoCount(){ if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) { return 0; } return getfpdPlatformDefs().getSkuInfo().getUiSkuNameList().size(); } public void getPlatformDefsSkuInfos(String[][] saa){ if (getfpdPlatformDefs().getSkuInfo() == null || getfpdPlatformDefs().getSkuInfo().getUiSkuNameList() == null) { if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) { removeElement(getfpdDynPcdBuildDefs()); fpdDynPcdBuildDefs = null; } return ; } List l = getfpdPlatformDefs().getSkuInfo().getUiSkuNameList(); ListIterator li = l.listIterator(); int i = 0; while(li.hasNext()) { SkuInfoDocument.SkuInfo.UiSkuName sku = li.next(); saa[i][0] = sku.getSkuID()+""; saa[i][1] = sku.getStringValue(); ++i; } } public void removePlatformDefsSkuInfo(int i) { SkuInfoDocument.SkuInfo skuInfo = getfpdPlatformDefs().getSkuInfo(); if (skuInfo == null || i == 0) { return ; } XmlCursor cursor = skuInfo.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } cursor.removeXml(); } cursor.dispose(); } public void updatePlatformDefsSkuInfo(int i, String id, String name) { SkuInfoDocument.SkuInfo skuInfo = getfpdPlatformDefs().getSkuInfo(); if (skuInfo == null || i == 0) { return ; } XmlCursor cursor = skuInfo.newCursor(); if (cursor.toFirstChild()) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(); } SkuInfoDocument.SkuInfo.UiSkuName sku = (SkuInfoDocument.SkuInfo.UiSkuName)cursor.getObject(); sku.setSkuID(new BigInteger(id)); sku.setStringValue(name); } cursor.dispose(); } public String getPlatformDefsInterDir(){ if (getfpdPlatformDefs().getIntermediateDirectories() == null) { return null; } return getfpdPlatformDefs().getIntermediateDirectories().toString(); } public void setPlatformDefsInterDir(String interDir){ getfpdPlatformDefs().setIntermediateDirectories(IntermediateOutputType.Enum.forString(interDir)); } public String getPlatformDefsOutputDir() { return getfpdPlatformDefs().getOutputDirectory(); } public void setPlatformDefsOutputDir(String outputDir) { if (outputDir != null && outputDir.length() > 0) { getfpdPlatformDefs().setOutputDirectory(outputDir); } else{ XmlCursor cursor = getfpdPlatformDefs().newCursor(); if (cursor.toChild(new QName(xmlNs, "OutputDirectory"))) { cursor.removeXml(); } cursor.dispose(); } } public FlashDocument.Flash getfpdFlash() { if (fpdFlash == null) { fpdFlash = fpdRoot.addNewFlash(); } return fpdFlash; } public void genFlashDefinitionFile(String file) { FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile(); if (fdf == null) { fdf = getfpdFlash().addNewFlashDefinitionFile(); } fdf.setStringValue(file); } public String getFlashDefinitionFile() { FlashDefinitionFileDocument.FlashDefinitionFile fdf = getfpdFlash().getFlashDefinitionFile(); if (fdf == null) { return ""; } return fdf.getStringValue(); } public void genFvImagesNameValue(String name, String value) { FvImagesDocument.FvImages fi = getfpdFlash().getFvImages(); if (fi == null) { fi = getfpdFlash().addNewFvImages(); } FvImagesDocument.FvImages.NameValue nv = fi.addNewNameValue(); nv.setName(name); nv.setValue(value); } public void removeFvImagesNameValue(int i){ XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } QName qNameValue = new QName(xmlNs, "NameValue"); XmlCursor cursor = o.newCursor(); if (cursor.toChild(qNameValue)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qNameValue); } cursor.removeXml(); } cursor.dispose(); } public void updateFvImagesNameValue(int i, String name, String value){ XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } QName qNameValue = new QName(xmlNs, "NameValue"); XmlCursor cursor = o.newCursor(); if (cursor.toChild(qNameValue)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qNameValue); } FvImagesDocument.FvImages.NameValue nv = (FvImagesDocument.FvImages.NameValue)cursor.getObject(); nv.setName(name); nv.setValue(value); } cursor.dispose(); } public int getFvImagesNameValueCount() { FvImagesDocument.FvImages fi = null; if ((fi = getfpdFlash().getFvImages()) == null || fi.getNameValueList() == null) { return 0; } return fi.getNameValueList().size(); } public void getFvImagesNameValues(String[][] nv) { FvImagesDocument.FvImages fi = getfpdFlash().getFvImages(); if (fi == null){ return; } List l = fi.getNameValueList(); int i = 0; ListIterator li = l.listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.NameValue e = (FvImagesDocument.FvImages.NameValue) li .next(); nv[i][0] = e.getName(); nv[i][1] = e.getValue(); i++; } } public void getFvImagesFvImageFvImageNames (Vector vImageNames) { FvImagesDocument.FvImages fis = getfpdFlash().getFvImages(); if (fis == null || fis.getFvImageList() == null) { return; } ListIterator li = fis.getFvImageList().listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = li.next(); if (fi.getType().toString().equals("ImageName")) { vImageNames.addAll(fi.getFvImageNamesList()); return; } } } public void AddFvImageFvImageNames (String[] fvNames) { FvImagesDocument.FvImages fis = getfpdFlash().getFvImages(); if (fis == null || fis.getFvImageList() == null) { genFvImagesFvImage (fvNames, "ImageName", null); return; } ListIterator li = fis.getFvImageList().listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = li.next(); if (fi.getType().toString().equals("ImageName")) { for (int i = 0; i < fvNames.length; ++i) { fi.addFvImageNames(fvNames[i]); } return; } } genFvImagesFvImage (fvNames, "ImageName", null); } public void genFvImagesFvImage(String[] names, String types, Map options) { FvImagesDocument.FvImages fis = null; if ((fis = getfpdFlash().getFvImages()) == null) { fis = getfpdFlash().addNewFvImages(); } // //gen FvImage with FvImageNames array // FvImagesDocument.FvImages.FvImage fi = fis.addNewFvImage(); for (int i = 0; i < names.length; ++i) { fi.addFvImageNames(names[i]); } fi.setType(FvImageTypes.Enum.forString(types)); if (options != null){ setFvImagesFvImageFvImageOptions(options, fi); } } private void setFvImagesFvImageFvImageOptions(Map options, FvImagesDocument.FvImages.FvImage fi){ FvImagesDocument.FvImages.FvImage.FvImageOptions fio = fi.getFvImageOptions(); if (fio == null){ fio = fi.addNewFvImageOptions(); } Set key = options.keySet(); Iterator i = key.iterator(); while (i.hasNext()) { FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = fio.addNewNameValue(); String k = (String)i.next(); nv.setName(k); nv.setValue((String)options.get(k)); } } public void removeFvImagesFvImage(int i) { XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } QName qFvImage = new QName(xmlNs, "FvImage"); XmlCursor cursor = o.newCursor(); if (cursor.toChild(qFvImage)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFvImage); } cursor.removeXml(); } cursor.dispose(); } /** * @param oldFvName * @param newFvName The New FV Name. If null, remove the old FvImageNames entry. */ public void updateFvImageNameAll (String oldFvName, String newFvName) { if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) { return; } ListIterator li = getfpdFlash().getFvImages().getFvImageList().listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = li.next(); updateFvImageNamesInFvImage (fi, oldFvName, newFvName); if (fi.getFvImageNamesList().size() == 0) { li.remove(); } } } /** * @param fi * @param oldFvName The FV Name to be replaced. * @param newFvName The New FV Name. If null, remove the old FvImageNames entry. */ public void updateFvImageNamesInFvImage (FvImagesDocument.FvImages.FvImage fi, String oldFvName, String newFvName) { QName qFvImageNames = new QName(xmlNs, "FvImageNames"); XmlCursor cursor = fi.newCursor(); if (cursor.toChild(qFvImageNames)) { do { String xmlValue = cursor.getTextValue(); if (xmlValue.equals(oldFvName)){ if (newFvName != null) { cursor.setTextValue(newFvName); } else { cursor.removeXml(); } } }while (cursor.toNextSibling(qFvImageNames)); } cursor.dispose(); } /**update the Type attribute of ith FvImage with new type. * @param i * @param type */ public void updateFvImagesFvImageType (int i, String type) { XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); QName qFvImage = new QName(xmlNs, "FvImage"); if (cursor.toChild(qFvImage)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFvImage); } FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject(); fi.setType(FvImageTypes.Enum.forString(type)); } cursor.dispose(); } public void updateFvImagesFvImage(int i, String[] names, String types, Map options){ XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); QName qFvImage = new QName(xmlNs, "FvImage"); if (cursor.toChild(qFvImage)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFvImage); } FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject(); fi.setType(FvImageTypes.Enum.forString(types)); // // remove old FvImageNames before adding new ones // QName qFvImageNames = new QName(xmlNs, "FvImageNames"); cursor.toChild(qFvImageNames); cursor.removeXml(); while (cursor.toNextSibling(qFvImageNames)) { cursor.removeXml(); } for (int k = 0; k < names.length; ++k) { fi.addFvImageNames(names[k]); } // // remove old FvImageOptions before adding new options // QName qFvImageOptions = new QName(xmlNs, "FvImageOptions"); cursor.toNextSibling(qFvImageOptions); cursor.removeXml(); setFvImagesFvImageFvImageOptions(options, fi); } cursor.dispose(); } public int getFvImagesFvImageCount(String type) { if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) { return 0; } List l = getfpdFlash().getFvImages().getFvImageList(); ListIterator li = l.listIterator(); int i = 0; while(li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next(); if (!fi.getType().toString().equals(type) && !type.equals("ALL")) { continue; } ++i; } return i; } public Vector getFvImagesFvImageWithName (String fvName, String type) { Vector vFvImage = new Vector(); if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) { return vFvImage; } List l = getfpdFlash().getFvImages().getFvImageList(); ListIterator li = l.listIterator(); while(li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next(); if (!fi.getType().toString().equals(type) && !type.equals("ALL")) { continue; } if (fi.getFvImageNamesList().contains(fvName)) { vFvImage.add(fi); } } return vFvImage; } /** * @param saa * @param type "ALL" means all FvImage types: ImageName, Options, Attributes, Components. */ public void getFvImagesFvImages(String[][] saa, String type) { if (getfpdFlash().getFvImages() == null) { return; } List l = getfpdFlash().getFvImages().getFvImageList(); if (l == null) { return; } ListIterator li = l.listIterator(); int i = 0; while(li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next(); if (!fi.getType().toString().equals(type) && !type.equals("ALL")) { continue; } // // get FvImageNames array, space separated // List lfn = fi.getFvImageNamesList(); ListIterator lfni = lfn.listIterator(); saa[i][0] = " "; while (lfni.hasNext()) { saa[i][0] += (String)lfni.next(); saa[i][0] += " "; } saa[i][0] = saa[i][0].trim(); saa[i][1] = fi.getType()+""; ++i; } } /**Remove from fi the attribute pair with attributeName in FvImageOptions. * @param fi * @param attributeName */ public void removeFvImageNameValue (FvImagesDocument.FvImages.FvImage fi, String attributeName) { if (fi.getFvImageOptions() != null && fi.getFvImageOptions().getNameValueList() != null) { ListIterator li = fi.getFvImageOptions().getNameValueList().listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = li.next(); if (nv.getName().equals(attributeName)) { li.remove(); } } } } public void removeTypedNamedFvImageNameValue (String fvName, String type, String optName) { Vector vFvImage = getFvImagesFvImageWithName(fvName, type); for (int i = 0; i < vFvImage.size(); ++i) { FvImagesDocument.FvImages.FvImage fi = vFvImage.get(i); removeFvImageNameValue (fi, optName); } } /**Add name-value pair to FvImage element with type. * @param fvName FV name to add name-value pair. * @param type FvImage attribute. * @param name * @param value */ public void setTypedNamedFvImageNameValue (String fvName, String type, String name, String value) { boolean fvImageExists = false; if (getfpdFlash().getFvImages() == null) { return; } List l = getfpdFlash().getFvImages().getFvImageList(); if (l == null) { return; } ListIterator li = l.listIterator(); while(li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next(); if (!fi.getType().toString().equals(type) && !type.equals("ALL")) { continue; } if (!fi.getFvImageNamesList().contains(fvName)) { continue; } fvImageExists = true; setFvImagesFvImageNameValue (fi, name, value, null); } if (!fvImageExists) { HashMap map = new HashMap(); map.put(name, value); genFvImagesFvImage(new String[]{fvName}, type, map); } } /**Add to all FvImage elements with type, the name-value pair. * @param type * @param name * @param value */ public void setTypedFvImageNameValue (String type, String name, String value) { if (getfpdFlash().getFvImages() == null) { return; } List l = getfpdFlash().getFvImages().getFvImageList(); if (l == null) { return; } ListIterator li = l.listIterator(); while(li.hasNext()) { FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)li.next(); if (!fi.getType().toString().equals(type) && !type.equals("ALL")) { continue; } setFvImagesFvImageNameValue (fi, name, value, null); } } /**Add to FvImage the name-value pair, or replace old name with newName, or generate new name-value pair if not exists before. * @param fi * @param name * @param value * @param newName */ public void setFvImagesFvImageNameValue (FvImagesDocument.FvImages.FvImage fi, String name, String value, String newName) { if (fi.getFvImageOptions() == null || fi.getFvImageOptions().getNameValueList() == null) { return; } XmlCursor cursor = fi.getFvImageOptions().newCursor(); if (cursor.toFirstChild()) { do { FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = (FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue)cursor.getObject(); if (nv.getName().equals(name)) { nv.setValue(value); if (newName != null) { nv.setName(newName); } cursor.dispose(); return; } }while (cursor.toNextSibling()); } FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = fi.getFvImageOptions().addNewNameValue(); nv.setName(name); nv.setValue(value); if (newName != null) { nv.setName(newName); } cursor.dispose(); } public void getFvImagesFvImageOptions (String fvName, Map m) { Vector vFvImage = getFvImagesFvImageWithName (fvName, "Options"); for (int i = 0; i < vFvImage.size(); ++i) { FvImagesDocument.FvImages.FvImage fi = vFvImage.get(i); if (fi == null || fi.getFvImageOptions() == null || fi.getFvImageOptions().getNameValueList() == null) { continue; } ListIterator li = fi.getFvImageOptions() .getNameValueList() .listIterator(); while (li.hasNext()) { FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = li.next(); m.put(nv.getName(), nv.getValue()); } } } public int getFvImagePosInFvImages (String fvNameList, String type) { XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return -1; } int pos = -1; String[] fvNameArray = fvNameList.split(" "); Vector vFvNames = new Vector(); XmlCursor cursor = o.newCursor(); QName qFvImage = new QName(xmlNs, "FvImage"); if (cursor.toChild(qFvImage)) { do { pos++; vFvNames.removeAllElements(); for (int i = 0; i < fvNameArray.length; ++i) { vFvNames.add(fvNameArray[i]); } FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject(); if (!fi.getType().toString().equals(type)) { continue; } if (fi.getFvImageNamesList() == null || fi.getFvImageNamesList().size() != vFvNames.size()) { continue; } ListIterator li = fi.getFvImageNamesList().listIterator(); while (li.hasNext()) { String name = li.next(); vFvNames.remove(name); } if (vFvNames.size() == 0) { cursor.dispose(); return pos; } }while (cursor.toNextSibling(qFvImage)); } cursor.dispose(); return -1; } /**Get FvImage Options for FvImage i * @param i the ith FvImage */ public void getFvImagesFvImageOptions(int i, Map m) { XmlObject o = getfpdFlash().getFvImages(); if (o == null) { return; } XmlCursor cursor = o.newCursor(); QName qFvImage = new QName(xmlNs, "FvImage"); if (cursor.toChild(qFvImage)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFvImage); } FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject(); if (fi.getFvImageOptions() == null || fi.getFvImageOptions().getNameValueList() == null){ cursor.dispose(); return; } ListIterator li = fi.getFvImageOptions().getNameValueList().listIterator(); while(li.hasNext()){ FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = li.next(); m.put(nv.getName(), nv.getValue()); } } cursor.dispose(); } /** Get platform header element @return PlatformHeaderDocument.PlatformHeader **/ public PlatformHeaderDocument.PlatformHeader getFpdHdr() { if (fpdHdr == null) { fpdHdr = fpdRoot.addNewPlatformHeader(); } return fpdHdr; } public String getFpdHdrPlatformName() { return getFpdHdr().getPlatformName(); } public String getFpdHdrGuidValue() { return getFpdHdr().getGuidValue(); } public String getFpdHdrVer() { return getFpdHdr().getVersion(); } public String getFpdHdrAbs() { return getFpdHdr().getAbstract(); } public String getFpdHdrDescription() { return getFpdHdr().getDescription(); } public String getFpdHdrCopyright() { return getFpdHdr().getCopyright(); } public String getFpdHdrLicense() { LicenseDocument.License l = getFpdHdr().getLicense(); if (l == null) { return null; } return l.getStringValue(); } public String getFpdHdrUrl() { LicenseDocument.License l = getFpdHdr().getLicense(); if (l == null) { return null; } return l.getURL(); } public String getFpdHdrSpec() { return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; // return getFpdHdr().getSpecification(); } public void setFpdHdrPlatformName(String name){ getFpdHdr().setPlatformName(name); } public void setFpdHdrGuidValue(String guid){ getFpdHdr().setGuidValue(guid); } public void setFpdHdrVer(String v){ getFpdHdr().setVersion(v); } public void setFpdHdrAbs(String abs) { getFpdHdr().setAbstract(abs); } public void setFpdHdrDescription(String desc){ getFpdHdr().setDescription(desc); } public void setFpdHdrCopyright(String cr) { getFpdHdr().setCopyright(cr); } public void setFpdHdrLicense(String license){ LicenseDocument.License l = getFpdHdr().getLicense(); if (l == null) { getFpdHdr().addNewLicense().setStringValue(license); } else { l.setStringValue(license); } } public void setFpdHdrUrl(String url){ LicenseDocument.License l = getFpdHdr().getLicense(); l.setURL(url); } public void setFpdHdrSpec(String s){ s = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; getFpdHdr().setSpecification(s); } /** Save the processed xml contents to file @param fpdFile The file to save xml contents @throws IOException Exceptions during file operation **/ public void saveAs(File fpdFile) throws IOException { XmlOptions options = new XmlOptions(); options.setCharacterEncoding("UTF-8"); options.setSavePrettyPrint(); options.setSavePrettyPrintIndent(2); try { fpdd.save(fpdFile, options); } catch (IOException e) { e.printStackTrace(); } } private String listToString(List l) { if (l == null) { return null; } String s = " "; ListIterator li = l.listIterator(); while(li.hasNext()) { s += li.next(); s += " "; } return s.trim(); } private void removeElement(XmlObject o) { XmlCursor cursor = o.newCursor(); cursor.removeXml(); cursor.dispose(); } } class PcdItemTypeConflictException extends Exception { /** * */ private static final long serialVersionUID = 1L; private String details = null; PcdItemTypeConflictException(String pcdName, String info){ ModuleIdentification mi = WorkspaceProfile.getModuleId(info); details = pcdName + " ItemType Conflicts with " + mi.getName() + " in Pkg " + mi.getPackageId().getName(); } public String getMessage() { return details; } } class PcdDeclNotFound extends Exception { /** * */ private static final long serialVersionUID = 1L; private String details = null; PcdDeclNotFound(String info) { details = "PcdDeclNotFound: " + info; } public String getMessage() { return details; } } class PcdValueMalFormed extends Exception { /** * */ private static final long serialVersionUID = 1L; private String details = null; PcdValueMalFormed(String info) { details = "PcdValueMalFormed: " + info; } public String getMessage() { return details; } }