X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Tools%2FSource%2FFrameworkWizard%2Fsrc%2Forg%2Ftianocore%2Fframeworkwizard%2Fplatform%2Fui%2FFpdFileContents.java;h=26d3d694c952860db0552209be4884e74d9ad846;hp=d97f2a7cba0d101f4dca1c78367ee0fa0732434a;hb=a0783edc77ae576d8032461935362f43293bc467;hpb=ae0d4fd2dd7995e9462c65dec07d633e7820f224 diff --git a/Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java b/Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java index d97f2a7cba..26d3d694c9 100644 --- a/Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java +++ b/Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFileContents.java @@ -23,6 +23,7 @@ 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; @@ -32,11 +33,14 @@ 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; @@ -53,10 +57,11 @@ import org.tianocore.LicenseDocument; import org.tianocore.PlatformHeaderDocument; import org.tianocore.SkuInfoDocument; import org.tianocore.UserDefinedAntTasksDocument; -import org.tianocore.frameworkwizard.platform.ui.global.GlobalData; +import org.tianocore.UserExtensionsDocument; +import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile; import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery; -import org.tianocore.frameworkwizard.platform.ui.id.ModuleIdentification; -import org.tianocore.frameworkwizard.platform.ui.id.PackageIdentification; +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. @@ -65,6 +70,7 @@ import org.tianocore.frameworkwizard.platform.ui.id.PackageIdentification; public class FpdFileContents { static final String xmlNs = "http://www.TianoCore.org/2006/Edk2.0"; + static final String regExpNewLineAndSpaces = "((\n)|(\r\n)|(\r)|(\u0085)|(\u2028)|(\u2029))(\\s)*"; private PlatformSurfaceAreaDocument fpdd = null; @@ -82,7 +88,14 @@ public class FpdFileContents { private DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs = null; - public static HashMap> dynPcdMap = null; + private HashMap> dynPcdMap = null; + + private HashMap defaultPcdValue = new HashMap(); + + private String itemType (String pcdInfo) { + + return pcdInfo.substring(pcdInfo.lastIndexOf(" ") + 1); + } /** * look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings. @@ -92,17 +105,19 @@ public class FpdFileContents { dynPcdMap = new HashMap>(); List l = getfpdFrameworkModules().getModuleSAList(); if (l == null) { + removeElement(getfpdFrameworkModules()); + fpdFrameworkModules = null; return; } ListIterator li = l.listIterator(); while (li.hasNext()) { - ModuleSADocument.ModuleSA msa = li.next(); - if (msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null) { + ModuleSADocument.ModuleSA moduleSa = li.next(); + if (moduleSa.getPcdBuildDefinition() == null || moduleSa.getPcdBuildDefinition().getPcdDataList() == null) { continue; } - String ModuleInfo = msa.getModuleGuid() + " " + msa.getModuleVersion() + - " " + msa.getPackageGuid() + " " + msa.getPackageVersion(); - List lp = msa.getPcdBuildDefinition().getPcdDataList(); + 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(); @@ -119,6 +134,10 @@ public class FpdFileContents { } } } + + public ArrayList getDynPcdMapValue(String key) { + return dynPcdMap.get(key); + } /** Constructor to create a new spd file **/ @@ -171,31 +190,43 @@ public class FpdFileContents { return fpdFrameworkModules; } - 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) { - return ; + public void getFrameworkModuleSAByFvBinding (String fvName, Vector vGuid) { + if (getFrameworkModulesCount() == 0){ + return; } - List l = getfpdPlatformDefs().getSkuInfo().getUiSkuNameList(); - ListIterator li = l.listIterator(); - int i = 0; + ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); while(li.hasNext()) { - SkuInfoDocument.SkuInfo.UiSkuName sku = li.next(); - saa[i][0] = sku.getSkuID()+""; - saa[i][1] = sku.getStringValue(); - ++i; + 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) { + // + // BugBug : underscore "_" should not be replaced!!! + // But Fv name FVMAIN from fdf file not consist with FV_MAIN in fpd file. + // + if (fvNames[i].equals(fvName) || fvNames[i].replaceAll("_", "").equals(fvName)) { + String[] sa = new String[] {moduleSa.getModuleGuid(), moduleSa.getModuleVersion(), + moduleSa.getPackageGuid(), moduleSa.getPackageVersion(), + listToString(moduleSa.getSupArchList())}; + vGuid.add(sa); + break; + } + } } } public int getFrameworkModulesCount() { - if (getfpdFrameworkModules().getModuleSAList() == null){ + if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0){ + removeElement(getfpdFrameworkModules()); + fpdFrameworkModules = null; return 0; } return getfpdFrameworkModules().getModuleSAList().size(); @@ -209,35 +240,94 @@ public class FpdFileContents { ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); int i = 0; while(li.hasNext()) { - ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next(); - saa[i][1] = msa.getModuleGuid(); - saa[i][2] = msa.getModuleVersion(); + ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)li.next(); + saa[i][0] = moduleSa.getModuleGuid(); + saa[i][1] = moduleSa.getModuleVersion(); - saa[i][3] = msa.getPackageGuid(); - saa[i][4] = msa.getPackageVersion(); -// saa[i][4] = listToString(msa.getSupArchList()); + 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) { + + if (getfpdFrameworkModules().getModuleSAList() == null || getfpdFrameworkModules().getModuleSAList().size() == 0) { + removeElement(getfpdFrameworkModules()); + fpdFrameworkModules = null; return null; } + String[] s = key.split(" "); + String archsInKey = ""; + if (s.length > 4) { + for (int i = 4; i < s.length; ++i) { + archsInKey += s[i]; + archsInKey += " "; + } + archsInKey = archsInKey.trim(); + } + ListIterator li = getfpdFrameworkModules().getModuleSAList().listIterator(); while(li.hasNext()) { - ModuleSADocument.ModuleSA msa = (ModuleSADocument.ModuleSA)li.next(); - if (msa.getModuleGuid().equals(s[0]) && msa.getModuleVersion().equals(s[1]) - && msa.getPackageGuid().equals(s[2]) && msa.getPackageVersion().equals(s[3])) { - - return msa; + 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 . + if (moduleSa.getSupArchList() != null) { + if (listToString(moduleSa.getSupArchList()).equals(archsInKey)) { + return moduleSa; + } + } + else { + if (archsInKey.length() == 0) { + 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 = getfpdFrameworkModules(); + XmlObject o = fpdRoot.getFrameworkModules(); if (o == null) { return; } @@ -252,112 +342,388 @@ public class FpdFileContents { // ModuleSADocument.ModuleSA moduleSa = (ModuleSADocument.ModuleSA)cursor.getObject(); String moduleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " + - moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion(); + moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion() + " " + listToString(moduleSa.getSupArchList()); PcdBuildDefinitionDocument.PcdBuildDefinition pcdBuildDef = moduleSa.getPcdBuildDefinition(); - if (pcdBuildDef != null) { - maintainDynPcdMap(pcdBuildDef, moduleInfo); + 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(); + while (cursor.hasPrevToken()) { + cursor.toPrevToken(); + if (!cursor.isText()) { + break; + } + String s = cursor.getTextValue(); + if (s.matches(regExpNewLineAndSpaces)) { + continue; + } } + + if (cursor.isComment()) { + cursor.removeXml(); + } + + cursor.pop(); cursor.removeXml(); + if (getFrameworkModulesCount() == 0) { + cursor.toParent(); + cursor.removeXml(); + } } cursor.dispose(); } - private void maintainDynPcdMap(PcdBuildDefinitionDocument.PcdBuildDefinition o, String moduleInfo) { - XmlCursor cursor = o.newCursor(); - boolean fromLibInstance = false; - if (!cursor.toFirstChild()){ - return; + 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); } + + 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; + } // - // deal with first child, same process in the while loop below for siblings. + // add new Pcd from MSA file to ModuleSA. // - PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject(); - String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(); + 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; + } + + } + + 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){ - if (al.get(i).startsWith(moduleInfo)){ - fromLibInstance = true; + 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; } } - al.remove(moduleInfo + " " + pcdData.getItemType().toString()); + 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; } - if (pcdData.getItemType().toString().equals("DYNAMIC")) { - if (dynPcdMap.get(pcdKey) == null) { - removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName()); + 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()); + } - if (fromLibInstance){ - cursor.removeXml(); + 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; } - while(cursor.toNextSibling()) { - fromLibInstance = false; - pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject(); - // - // remove each pcd record from dynPcdMap - // - pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(); - al = dynPcdMap.get(pcdKey); - for(int i = 0; i < al.size(); ++i){ - if (al.get(i).startsWith(moduleInfo)){ - fromLibInstance = true; + + 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)) { + // + // change item type while not updating dynPcdData???? + // + 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; } } - al.remove(moduleInfo + " " + pcdData.getItemType().toString()); - if (al.size() == 0) { - dynPcdMap.remove(pcdKey); + 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; } - if (pcdData.getItemType().toString().equals("DYNAMIC")) { - // - // First check whether this is the only consumer of this dyn pcd. - // - if (dynPcdMap.get(pcdKey) == null) { + 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) { // - // delete corresponding entry in DynamicPcdBuildData + // ToDo Error // - removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName()); + 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()+""; + sa[2] = msa.getModuleDefinitions().getBinaryModule()+""; + return true; } - if (fromLibInstance){ - cursor.removeXml(); - } + + } - } - // - // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer" - // - public int getPcdDataCount(String key){ - ModuleSADocument.ModuleSA msa = getModuleSA(key); - if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){ - return 0; + catch (Exception e){ + e.printStackTrace(); + throw e; } - return msa.getPcdBuildDefinition().getPcdDataList().size(); + + return false; } - public void getPcdData(String key, String[][] saa) { - ModuleSADocument.ModuleSA msa = getModuleSA(key); - if (msa == null || msa.getPcdBuildDefinition() == null || msa.getPcdBuildDefinition().getPcdDataList() == null){ - return; + private boolean multiSourcePcd (String cName, String tsGuidCName, String moduleKey) { + 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); } - ListIteratorli = msa.getPcdBuildDefinition().getPcdDataList().listIterator(); - for (int i = 0; i < saa.length; ++i) { - PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next(); - saa[i][0] = pcdData.getCName(); - saa[i][1] = pcdData.getTokenSpaceGuidCName(); - saa[i][2] = pcdData.getItemType().toString(); - saa[i][3] = pcdData.getToken().toString(); - saa[i][4] = pcdData.getDatumType().toString(); - saa[i][5] = pcdData.getValue(); - + + int pcdSourceCount = 0; + for (int i = 0; i < vMi.size(); ++i) { + if (WorkspaceProfile.pcdInMsa(cName, tsGuidCName, vMi.get(i))) { + pcdSourceCount++; + } + } + + if (pcdSourceCount < 2) { + return false; + } + else { + return true; } + + } + + /**Remove PCDBuildDefinition entries from ModuleSA + * @param moduleKey identifier of ModuleSA. + * @param consumer where these entries come from. + */ + public void removePcdData(String moduleKey, ModuleIdentification consumer) { + + 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(); + cursor.push(); + if (cursor.toFirstChild()) { + do { + PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData) cursor + .getObject(); + String cName = msaPcd.getCName(); + String tsGuidCName = msaPcd.getTokenSpaceGuidCName(); + if (cName.equals(pcdData.getCName()) + && tsGuidCName.equals(pcdData.getTokenSpaceGuidCName()) && !multiSourcePcd(cName, tsGuidCName, moduleKey)) { + + maintainDynPcdMap(pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(), + moduleKey); + cursor.removeXml(); + break; + } + } while (cursor.toNextSibling()); + } + + cursor.pop(); + if (moduleSA.getPcdBuildDefinition().getPcdDataList().size() == 0) { + cursor.removeXml(); + } + cursor.dispose(); + } + } + } // - // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer" + // key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer Arch" // public int getLibraryInstancesCount(String key) { ModuleSADocument.ModuleSA msa = getModuleSA(key); @@ -383,18 +749,44 @@ public class FpdFileContents { } } - public void removeLibraryInstances(String key) { + public void removeLibraryInstance(String key, int i) { ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null || msa.getLibraries() == null){ return ; } XmlCursor cursor = msa.getLibraries().newCursor(); - cursor.removeXml(); + if (cursor.toFirstChild()) { + for (int j = 0; j < i; ++j) { + cursor.toNextSibling(); + } + cursor.push(); + while (cursor.hasPrevToken()) { + cursor.toPrevToken(); + if (!cursor.isText()) { + break; + } + String s = cursor.getTextValue(); + if (s.matches(regExpNewLineAndSpaces)) { + continue; + } + } + + if (cursor.isComment()) { + cursor.removeXml(); + } + cursor.pop(); + cursor.removeXml(); + if (getLibraryInstancesCount(key) == 0) { + cursor.toParent(); + cursor.removeXml(); + } + } + cursor.dispose(); } - public void genLibraryInstance(String mg, String mv, String pg, String pv, String key) { + public void genLibraryInstance(ModuleIdentification libMi, String key) { ModuleSADocument.ModuleSA msa = getModuleSA(key); if (msa == null){ msa = getfpdFrameworkModules().addNewModuleSA(); @@ -404,32 +796,357 @@ public class FpdFileContents { 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); } - /**add pcd information of module mi to a ModuleSA. - * @param mi - * @param moduleSa if null, generate a new ModuleSA. - */ - public void addFrameworkModulesPcdBuildDefs(ModuleIdentification mi, ModuleSADocument.ModuleSA moduleSa){ - //ToDo add Arch filter - - try { - ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(mi); - if (msa.getPcdCoded() == null) { - return; - } - if (moduleSa == null) { - moduleSa = genModuleSA(mi); - } + + 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 (String moduleKey, String fvName) { + + 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); + PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null, mi); // // Implementing InitializePlatformPcdBuildDefinitions // @@ -442,30 +1159,30 @@ public class FpdFileContents { // // ToDo Error // - break; + 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){ - e.printStackTrace(); + + throw e; } } private PcdDeclarationsDocument.PcdDeclarations.PcdEntry LookupPcdDeclaration (PcdCodedDocument.PcdCoded.PcdEntry msaPcd, PackageIdentification[] depPkgs) { - Map m = new HashMap(); PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = null; for (int i = 0; i < depPkgs.length; ++i) { - m.put("PackageSurfaceArea", GlobalData.getPackageXmlObject(depPkgs[i])); - SurfaceAreaQuery.setDoc(m); - XmlObject[] xo = SurfaceAreaQuery.getSpdPcdDeclarations(); + + XmlObject[] xo = SurfaceAreaQuery.getSpdPcdDeclarations(depPkgs[i]); if (xo == null) { continue; } @@ -488,18 +1205,36 @@ public class FpdFileContents { return null; } - private ModuleSADocument.ModuleSA genModuleSA (ModuleIdentification mi) { - PackageIdentification pi = GlobalData.getPackageForModule(mi); + 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) { + 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(); } @@ -511,39 +1246,27 @@ public class FpdFileContents { if (pcdConsumer == null) { pcdConsumer = new ArrayList(); } - String listValue = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() - + " " + moduleSa.getPackageGuid() + " " + moduleSa.getPackageVersion() - + " " + itemType; - pcdConsumer.add(listValue); - dynPcdMap.put(cName + " " + tsGuid, pcdConsumer); // - // Special dynamic type, if this pcd already exists in other ModuleSA + // Check whether this PCD has already added to ModuleSA, if so, just return. // - if (itemType.equals("DYNAMIC")) { - - ListIterator li = pcdConsumer.listIterator(); - while(li.hasNext()) { - String value = li.next().toString(); - String[] valuePart= value.split(" "); - if (!valuePart[4].equals("DYNAMIC")) { - //ToDo error for same pcd, other type than dynamic - pcdConsumer.remove(listValue); - return; - } + String moduleInfo = moduleSa.getModuleGuid().toLowerCase() + " " + moduleSa.getModuleVersion() + + " " + moduleSa.getPackageGuid().toLowerCase() + " " + moduleSa.getPackageVersion() + " " + listToString(moduleSa.getSupArchList()); + for (int i = 0; i < pcdConsumer.size(); ++i) { + String pcdInfo = pcdConsumer.get(i); + if (moduleInfo.equals(pcdInfo.substring(0, pcdInfo.lastIndexOf(" ")))){ + return; } } - else { - ListIterator li = pcdConsumer.listIterator(); - while(li.hasNext()) { - String value = li.next().toString(); - String[] valuePart= value.split(" "); - if (valuePart[4].equals("DYNAMIC")) { - //ToDo error for same pcd, other type than non-dynamic - pcdConsumer.remove(listValue); - return; - } - } + // + // Using existing Pcd type, if this pcd already exists in other ModuleSA + // + if (pcdConsumer.size() > 0) { + + itemType = itemType (pcdConsumer.get(0)); } + String listValue = moduleInfo + " " + itemType; + pcdConsumer.add(listValue); + dynPcdMap.put(cName + " " + tsGuid, pcdConsumer); PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData fpdPcd = moduleSa.getPcdBuildDefinition().addNewPcdData(); fpdPcd.setCName(cName); @@ -552,6 +1275,51 @@ public class FpdFileContents { 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); // @@ -562,44 +1330,10 @@ public class FpdFileContents { addDynamicPcdBuildData(cName, token, tsGuid, itemType, dataType, defaultVal); } } - else { - 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(""); - } - } - 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); - } - } + } - private int setMaxSizeForPointer(String datum) { + public int setMaxSizeForPointer(String datum) throws PcdValueMalFormed{ if (datum == null) { return 0; } @@ -619,6 +1353,7 @@ public class FpdFileContents { (end > datum.length())|| ((start == end) && (datum.length() > 0))) { //ToDo Error handling here + throw new PcdValueMalFormed (datum); } strValue = datum.substring(start + 1, end); @@ -629,7 +1364,7 @@ public class FpdFileContents { if ((start > end) || (end > datum.length())|| ((start == end) && (datum.length() > 0))) { - + throw new PcdValueMalFormed (datum); } strValue = datum.substring(start + 1, end); return strValue.length(); @@ -649,8 +1384,8 @@ public class FpdFileContents { if (value > 0xFF) { // "[FPD file error] The datum type of PCD %s in %s is VOID*, "+ -// "it is byte array in fact. But the element of %s exceed the byte range", - +// "it must be a byte array. But the element of %s exceed the byte range", + throw new PcdValueMalFormed (datum); } } return strValueArray.length; @@ -662,7 +1397,7 @@ public class FpdFileContents { // "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!", - return -1; + throw new PcdValueMalFormed (datum); } } @@ -675,18 +1410,22 @@ public class FpdFileContents { private ArrayList LookupPlatformPcdData(String pcdKey) { - return dynPcdMap.get("pcdKey"); + return dynPcdMap.get(pcdKey); } public int getDynamicPcdBuildDataCount() { - if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null) { + 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) { + if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + removeElement(getfpdDynPcdBuildDefs()); + fpdDynPcdBuildDefs = null; return ; } List l = getfpdDynPcdBuildDefs().getPcdBuildDataList(); @@ -704,7 +1443,8 @@ public class FpdFileContents { } } - private void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) { + 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); @@ -759,19 +1499,28 @@ public class FpdFileContents { } } - private void removeDynamicPcdBuildData(String cName, String tsGuid) { - XmlObject o = getfpdDynPcdBuildDefs(); + public void removeDynamicPcdBuildData(String cName, String tsGuid) { + XmlObject o = fpdRoot.getDynamicPcdBuildDefinitions(); + if (o == null) { + return; + } XmlCursor cursor = o.newCursor(); if (cursor.toFirstChild()) { - DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdBuildData = - (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); - while (!(pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid))) { - cursor.toNextSibling(); - pcdBuildData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject(); + 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; + } } - - cursor.removeXml(); + while (cursor.toNextSibling()); } cursor.dispose(); } @@ -779,7 +1528,8 @@ public class FpdFileContents { // Get the Sku Info count of ith dyn pcd element. // public int getDynamicPcdSkuInfoCount(int i){ - if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + if (fpdRoot.getDynamicPcdBuildDefinitions() == null || fpdRoot.getDynamicPcdBuildDefinitions().getPcdBuildDataList() == null + || fpdRoot.getDynamicPcdBuildDefinitions().getPcdBuildDataList().size() == 0) { return 0; } @@ -803,6 +1553,8 @@ public class FpdFileContents { public void getDynamicPcdSkuInfos(int i, String[][] saa){ if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + removeElement(getfpdDynPcdBuildDefs()); + fpdDynPcdBuildDefs = null; return; } @@ -840,6 +1592,8 @@ public class FpdFileContents { public String getDynamicPcdBuildDataValue(int i){ String value = null; if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + removeElement(getfpdDynPcdBuildDefs()); + fpdDynPcdBuildDefs = null; return value; } @@ -863,6 +1617,8 @@ public class FpdFileContents { public String getDynamicPcdBuildDataVpdOffset(int i){ String vpdOffset = null; if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + removeElement(getfpdDynPcdBuildDefs()); + fpdDynPcdBuildDefs = null; return vpdOffset; } @@ -885,6 +1641,8 @@ public class FpdFileContents { public void removeDynamicPcdBuildDataSkuInfo(int i) { if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { + removeElement(getfpdDynPcdBuildDefs()); + fpdDynPcdBuildDefs = null; return; } @@ -911,9 +1669,9 @@ public class FpdFileContents { // 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; - } +// if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { +// return; +// } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { @@ -940,9 +1698,9 @@ public class FpdFileContents { 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; - } +// if (getfpdDynPcdBuildDefs().getPcdBuildDataList() == null || getfpdDynPcdBuildDefs().getPcdBuildDataList().size() == 0) { +// return; +// } XmlCursor cursor = getfpdDynPcdBuildDefs().newCursor(); if (cursor.toFirstChild()) { @@ -972,15 +1730,6 @@ public class FpdFileContents { } } - public void removePcdDataFromLibraryInstance(String moduleKey, String libInstanceKey){ - ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey); - // - // should better maintain pcd from lib instance only, but maintain all is acceptable now. - // - maintainDynPcdMap(moduleSa.getPcdBuildDefinition(), libInstanceKey); - - } - public BuildOptionsDocument.BuildOptions getfpdBuildOpts() { if (fpdBuildOpts == null) { fpdBuildOpts = fpdRoot.addNewBuildOptions(); @@ -988,6 +1737,299 @@ public class FpdFileContents { 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]); + if (!includeModules.get(i)[1].equals("null") && includeModules.get(i)[1].length() != 0) { + cursor.insertAttributeWithValue("ModuleVersion", includeModules.get(i)[1]); + } + cursor.insertAttributeWithValue("PackageGuid", includeModules.get(i)[2]); + if (!includeModules.get(i)[3].equals("null") && includeModules.get(i)[3].length() != 0) { + cursor.insertAttributeWithValue("PackageVersion", includeModules.get(i)[3]); + } + + cursor.insertAttributeWithValue("Arch", includeModules.get(i)[4]); + 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 attribModuleVersion = new QName("ModuleVersion"); + QName attribPackageGuid = new QName("PackageGuid"); + QName attribPackageVersion = new QName("PackageVersion"); + QName attribArch = new QName("Arch"); + + 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(attribModuleVersion); + saa[i][2] = cursor.getAttributeText(attribPackageGuid); + saa[i][3] = cursor.getAttributeText(attribPackageVersion); + saa[i][4] = cursor.getAttributeText(attribArch); + ++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(); + } + + } + + private boolean versionEqual (String v1, String v2) { + + if ((v1 == null || v1.length() == 0 || v1.equalsIgnoreCase("null")) + && (v2 == null || v2.length() == 0 || v2.equalsIgnoreCase("null"))) { + return true; + } + + if (v1 != null && v1.equals(v2)) { + return true; + } + + return false; + } + + public boolean moduleInBuildOptionsUserExtensions (String fvName, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) { + boolean inList = false; + if (getUserExtsIncModCount(fvName) > 0) { + + 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 attribModuleVersion = new QName("ModuleVersion"); + QName attribPackageGuid = new QName("PackageGuid"); + QName attribPackageVersion = new QName("PackageVersion"); + QName attribArch = new QName("Arch"); + + 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()) { + + do { + String mg = cursor.getAttributeText(attribModuleGuid); + String mv = cursor.getAttributeText(attribModuleVersion); + String pg = cursor.getAttributeText(attribPackageGuid); + String pv = cursor.getAttributeText(attribPackageVersion); + String ar = cursor.getAttributeText(attribArch); + if (!moduleGuid.equalsIgnoreCase(mg)) { + continue; + } + if (!packageGuid.equalsIgnoreCase(pg)) { + continue; + } + if (!arch.equalsIgnoreCase(ar)) { + continue; + } + if (!versionEqual(moduleVersion, mv)) { + continue; + } + if (!versionEqual(packageVersion, pv)) { + continue; + } + inList = true; + break; + }while (cursor.toNextSibling()); + } + break; + } + } + cursor.pop(); + }while (cursor.toNextSibling(elementUserExts)); + } + cursor.dispose(); + } + return inList; + } + + public void removeModuleInBuildOptionsUserExtensions (String fvName, String moduleGuid, String moduleVersion, String packageGuid, String packageVersion, String arch) { + if (getUserExtsIncModCount(fvName) > 0) { + + 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 attribModuleVersion = new QName("ModuleVersion"); + QName attribPackageGuid = new QName("PackageGuid"); + QName attribPackageVersion = new QName("PackageVersion"); + QName attribArch = new QName("Arch"); + + 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()) { + + do { + String mg = cursor.getAttributeText(attribModuleGuid); + String mv = cursor.getAttributeText(attribModuleVersion); + String pg = cursor.getAttributeText(attribPackageGuid); + String pv = cursor.getAttributeText(attribPackageVersion); + String ar = cursor.getAttributeText(attribArch); + if (!moduleGuid.equalsIgnoreCase(mg)) { + continue; + } + if (!packageGuid.equalsIgnoreCase(pg)) { + continue; + } + if (!arch.equalsIgnoreCase(ar)) { + continue; + } + if (!versionEqual(moduleVersion, mv)) { + continue; + } + if (!versionEqual(packageVersion, pv)) { + continue; + } + cursor.removeXml(); + }while (cursor.toNextSibling()); + } + break; + } + } + cursor.pop(); + }while (cursor.toNextSibling(elementUserExts)); + } + cursor.dispose(); + } + } + public void genBuildOptionsUserDefAntTask (String id, String fileName, String execOrder) { UserDefinedAntTasksDocument.UserDefinedAntTasks udats = getfpdBuildOpts().getUserDefinedAntTasks(); if (udats == null) { @@ -1000,12 +2042,20 @@ public class FpdFileContents { 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) { @@ -1019,6 +2069,10 @@ public class FpdFileContents { cursor.toNextSibling(); } cursor.removeXml(); + if (getBuildOptionsUserDefAntTaskCount() == 0) { + cursor.toParent(); + cursor.removeXml(); + } } cursor.dispose(); } @@ -1070,7 +2124,7 @@ public class FpdFileContents { ++i; } } - public void genBuildOptionsOpt(String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents) { + 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(); @@ -1079,18 +2133,22 @@ public class FpdFileContents { setBuildOptionsOpt(buildTargets, toolChain, tagName, toolCmd, archList, contents, opt); } - private void setBuildOptionsOpt(String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents, OptionDocument.Option 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.setBuildTargets(buildTargets); opt.setToolChainFamily(toolChain); opt.setTagName(tagName); opt.setToolCode(toolCmd); - String[] s = archList.split(" "); - ArrayList al = new ArrayList(); - for (int i = 0; i < s.length; ++i) { - al.add(s[i]); + + if (archList != null) { + opt.setSupArchList(archList); + } + else { + if (opt.isSetSupArchList()) { + opt.unsetSupArchList(); + } } - opt.setSupArchList(al); } public void removeBuildOptionsOpt(int i){ @@ -1106,11 +2164,15 @@ public class FpdFileContents { cursor.toNextSibling(); } cursor.removeXml(); + if (getBuildOptionsOptCount() == 0) { + cursor.toParent(); + cursor.removeXml(); + } } cursor.dispose(); } - public void updateBuildOptionsOpt(int i, String buildTargets, String toolChain, String tagName, String toolCmd, String archList, String contents) { + 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; @@ -1144,16 +2206,13 @@ public class FpdFileContents { int i = 0; while(li.hasNext()) { OptionDocument.Option opt = (OptionDocument.Option)li.next(); -// saa[i][0] = opt.getBuildTargets(); + if (opt.getBuildTargets() != null) { + saa[i][0] = listToString(opt.getBuildTargets()); + } saa[i][1] = opt.getToolChainFamily(); if (opt.getSupArchList() != null){ - Object[] archs = opt.getSupArchList().toArray(); - saa[i][2] = " "; - for (int j = 0; j < archs.length; ++j){ - saa[i][2] += archs[j]; - saa[i][2] += " "; - } - saa[i][2] = saa[i][2].trim(); + saa[i][2] = listToString(opt.getSupArchList()); + } saa[i][3] = opt.getToolCode(); saa[i][4] = opt.getTagName(); @@ -1163,6 +2222,347 @@ public class FpdFileContents { } } + 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(); @@ -1170,6 +2570,151 @@ public class FpdFileContents { 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(); @@ -1195,8 +2740,6 @@ public class FpdFileContents { return fdf.getStringValue(); } - - public void genFvImagesNameValue(String name, String value) { FvImagesDocument.FvImages fi = getfpdFlash().getFvImages(); @@ -1275,6 +2818,64 @@ public class FpdFileContents { } } + 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")) { + addFvImageNamesInFvImage (fi, fvNames); + return; + } + } + genFvImagesFvImage (fvNames, "ImageName", null); + } + + public void addFvImageNamesInFvImage (FvImagesDocument.FvImages.FvImage fi, String[] fvNames) { + + for (int i = 0; i < fvNames.length; ++i) { + fi.addFvImageNames(fvNames[i]); + } + } + + public void addFvImageNamesInFvImage (int i, String[] fvNames) { + 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(); + addFvImageNamesInFvImage(fi, fvNames); + } + cursor.dispose(); + } + public void genFvImagesFvImage(String[] names, String types, Map options) { FvImagesDocument.FvImages fis = null; @@ -1289,47 +2890,128 @@ public class FpdFileContents { for (int i = 0; i < names.length; ++i) { fi.addFvImageNames(names[i]); } - fi.setType(FvImageTypes.Enum.forString(types)); - if (options != null){ - setFvImagesFvImageFvImageOptions(options, fi); + 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(); + } } } - private void setFvImagesFvImageFvImageOptions(Map options, FvImagesDocument.FvImages.FvImage fi){ - FvImagesDocument.FvImages.FvImage.FvImageOptions fio = fi.getFvImageOptions(); - if (fio == null){ - fio = fi.addNewFvImageOptions(); + public void updateFvImageNamesInFvImage (int i, String oldFvName, String newFvName) { + 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(); + updateFvImageNamesInFvImage (fi, oldFvName, newFvName); } + cursor.dispose(); + } + /** + * @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(); - 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)); - + 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(); } - - public void removeFvImagesFvImage(int i) { - + /**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; } - - QName qFvImage = new QName(xmlNs, "FvImage"); XmlCursor cursor = o.newCursor(); + QName qFvImage = new QName(xmlNs, "FvImage"); if (cursor.toChild(qFvImage)) { for (int j = 0; j < i; ++j) { cursor.toNextSibling(qFvImage); } - cursor.removeXml(); + FvImagesDocument.FvImages.FvImage fi = (FvImagesDocument.FvImages.FvImage)cursor.getObject(); + fi.setType(FvImageTypes.Enum.forString(type)); } cursor.dispose(); } @@ -1374,18 +3056,50 @@ public class FpdFileContents { cursor.dispose(); } - public int getFvImagesFvImageCount() { + public int getFvImagesFvImageCount(String type) { if (getfpdFlash().getFvImages() == null || getfpdFlash().getFvImages().getFvImageList() == null) { return 0; } - return getfpdFlash().getFvImages().getFvImageList().size(); + 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; } - /**Only Get Fv image setting - name and type. + 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) { + public void getFvImagesFvImages(String[][] saa, String type) { if (getfpdFlash().getFvImages() == null) { return; @@ -1398,6 +3112,9 @@ public class FpdFileContents { 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 // @@ -1416,6 +3133,224 @@ public class FpdFileContents { } } + public void removeFvImageNameValue (int i, String attributeName) { + 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(); + removeFvImageNameValue (fi, attributeName); + } + cursor.dispose(); + } + /**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); + } + + } + + public void setFvImagesFvImageNameValue (int i, String name, String value) { + 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(); + setFvImagesFvImageNameValue (fi, name, value, null); + } + cursor.dispose(); + } + + /**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) { + FvImagesDocument.FvImages.FvImage.FvImageOptions.NameValue nv = fi.addNewFvImageOptions().addNewNameValue(); + nv.setName(name); + nv.setValue(value); + if (newName != null) { + nv.setName(newName); + } + 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.trim().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 */ @@ -1432,6 +3367,7 @@ public class FpdFileContents { } 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(); @@ -1440,6 +3376,7 @@ public class FpdFileContents { m.put(nv.getName(), nv.getValue()); } } + cursor.dispose(); } /** @@ -1450,30 +3387,10 @@ public class FpdFileContents { if (fpdHdr == null) { fpdHdr = fpdRoot.addNewPlatformHeader(); } - genPlatformDefsSkuInfo("0", "DEFAULT"); + return fpdHdr; } - 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 String getFpdHdrPlatformName() { return getFpdHdr().getPlatformName(); } @@ -1516,7 +3433,7 @@ public class FpdFileContents { public String getFpdHdrSpec() { - return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; + return "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; // return getFpdHdr().getSpecification(); } @@ -1562,7 +3479,7 @@ public class FpdFileContents { } public void setFpdHdrSpec(String s){ - s = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; + s = "FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052"; getFpdHdr().setSpecification(s); } /** @@ -1586,7 +3503,7 @@ public class FpdFileContents { } - private String listToString(List l) { + private String listToString(List l) { if (l == null) { return null; } @@ -1598,4 +3515,62 @@ public class FpdFileContents { } 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; + } }