\r
private DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions fpdDynPcdBuildDefs = null;\r
\r
- public static HashMap<String, ArrayList<String>> dynPcdMap = null;\r
+ private HashMap<String, ArrayList<String>> dynPcdMap = null;\r
\r
/**\r
* look through all pcd data in all ModuleSA, create pcd -> ModuleSA mappings.\r
}\r
}\r
}\r
+ \r
+ public ArrayList<String> getDynPcdMapValue(String key) {\r
+ return dynPcdMap.get(key);\r
+ }\r
/**\r
Constructor to create a new spd file\r
**/\r
String moduleInfo = moduleSa.getModuleGuid() + " " + moduleSa.getModuleVersion() + " " +\r
moduleSa.getPackageGuid()+ " " + moduleSa.getPackageVersion();\r
PcdBuildDefinitionDocument.PcdBuildDefinition pcdBuildDef = moduleSa.getPcdBuildDefinition();\r
- if (pcdBuildDef != null) {\r
- maintainDynPcdMap(pcdBuildDef, moduleInfo);\r
+ if (pcdBuildDef != null && pcdBuildDef.getPcdDataList() != null) {\r
+ ListIterator<PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData> li = pcdBuildDef.getPcdDataList().listIterator();\r
+ while(li.hasNext()) {\r
+ PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = li.next();\r
+ maintainDynPcdMap(pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName(), moduleInfo);\r
+ }\r
}\r
cursor.removeXml();\r
}\r
cursor.dispose();\r
}\r
\r
- private void maintainDynPcdMap(PcdBuildDefinitionDocument.PcdBuildDefinition o, String moduleInfo) {\r
- XmlCursor cursor = o.newCursor();\r
- boolean fromLibInstance = false;\r
- if (!cursor.toFirstChild()){\r
+ private void maintainDynPcdMap(String pcdKey, String moduleInfo) {\r
+ \r
+ ArrayList<String> al = dynPcdMap.get(pcdKey);\r
+ if (al == null) {\r
return;\r
}\r
- //\r
- // deal with first child, same process in the while loop below for siblings.\r
- //\r
- PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
- String pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
- ArrayList<String> al = dynPcdMap.get(pcdKey);\r
+ String[] s = moduleInfo.split(" ");\r
for(int i = 0; i < al.size(); ++i){\r
- if (al.get(i).startsWith(moduleInfo)){\r
- fromLibInstance = true;\r
+ String consumer = al.get(i);\r
+ if (consumer.contains(s[0]) && consumer.contains(s[2])){\r
+ al.remove(consumer);\r
break;\r
}\r
}\r
- al.remove(moduleInfo + " " + pcdData.getItemType().toString());\r
+\r
if (al.size() == 0) {\r
dynPcdMap.remove(pcdKey);\r
+ String[] s1 = pcdKey.split(" ");\r
+ removeDynamicPcdBuildData(s1[0], s1[1]);\r
}\r
\r
- if (pcdData.getItemType().toString().equals("DYNAMIC")) {\r
- if (dynPcdMap.get(pcdKey) == null) {\r
- removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName());\r
- }\r
- }\r
- if (fromLibInstance){\r
- cursor.removeXml();\r
- }\r
- while(cursor.toNextSibling()) {\r
- fromLibInstance = false;\r
- pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
- //\r
- // remove each pcd record from dynPcdMap\r
- //\r
- pcdKey = pcdData.getCName() + " " + pcdData.getTokenSpaceGuidCName();\r
- al = dynPcdMap.get(pcdKey);\r
- for(int i = 0; i < al.size(); ++i){\r
- if (al.get(i).startsWith(moduleInfo)){\r
- fromLibInstance = true;\r
- break;\r
- }\r
- }\r
- al.remove(moduleInfo + " " + pcdData.getItemType().toString());\r
- if (al.size() == 0) {\r
- dynPcdMap.remove(pcdKey);\r
- }\r
- \r
- if (pcdData.getItemType().toString().equals("DYNAMIC")) {\r
- //\r
- // First check whether this is the only consumer of this dyn pcd.\r
- //\r
- if (dynPcdMap.get(pcdKey) == null) {\r
- //\r
- // delete corresponding entry in DynamicPcdBuildData\r
- //\r
- removeDynamicPcdBuildData(pcdData.getCName(), pcdData.getTokenSpaceGuidCName());\r
- }\r
- }\r
- if (fromLibInstance){\r
- cursor.removeXml();\r
- }\r
- }\r
}\r
//\r
// key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
\r
}\r
}\r
+ \r
+ public void updatePcdData(String key, String cName, String tsGuid, String itemType, String maxSize, String value){\r
+ ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
+ if (msa == null || msa.getPcdBuildDefinition() == null){\r
+ return;\r
+ }\r
+ \r
+ XmlCursor cursor = msa.getPcdBuildDefinition().newCursor();\r
+ if (cursor.toFirstChild()){\r
+ do {\r
+ PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
+ if (pcdData.getCName().equals(cName) && pcdData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
+ pcdData.setItemType(PcdItemTypes.Enum.forString(itemType));\r
+ if(pcdData.getDatumType().equals("VOID*")) {\r
+ pcdData.setMaxDatumSize(new Integer(maxSize));\r
+ }\r
+ pcdData.setValue(value);\r
+ break;\r
+ }\r
+ }\r
+ while(cursor.toNextSibling());\r
+ }\r
+ cursor.dispose();\r
+ }\r
+ \r
+ /**Get original Pcd info from MSA & SPD files.\r
+ * @param mi ModuleIdentification from which MSA & SPD come\r
+ * @param cName PCD cName\r
+ * @param sa Results: HelpText, Original item type.\r
+ * @return\r
+ */\r
+ public boolean getPcdBuildDataInfo(ModuleIdentification mi, String cName, String[] sa) throws Exception{\r
+ try {\r
+ \r
+ ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(mi);\r
+ if (msa.getPcdCoded() == null) {\r
+ return false;\r
+ }\r
+ \r
+ Map<String, XmlObject> m = new HashMap<String, XmlObject>();\r
+ m.put("ModuleSurfaceArea", msa);\r
+ SurfaceAreaQuery.setDoc(m);\r
+ PackageIdentification[] depPkgs = SurfaceAreaQuery.getDependencePkg(null);\r
+ //\r
+ // First look through MSA pcd entries.\r
+ //\r
+ List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
+ ListIterator li = l.listIterator();\r
+ while(li.hasNext()) {\r
+ PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
+ if (!msaPcd.getCName().equals(cName)) {\r
+ continue;\r
+ }\r
+ PcdDeclarationsDocument.PcdDeclarations.PcdEntry spdPcd = LookupPcdDeclaration(msaPcd, depPkgs);\r
+ if (spdPcd == null) {\r
+ //\r
+ // ToDo Error \r
+ //\r
+ throw new PcdDeclNotFound(mi.getName() + " " + msaPcd.getCName());\r
+ }\r
+ //\r
+ // Get Pcd help text and original item type.\r
+ //\r
+ sa[0] = spdPcd.getHelpText() + msaPcd.getHelpText();\r
+ sa[1] = msaPcd.getPcdItemType()+"";\r
+ return true;\r
+ }\r
+ \r
+ \r
+ }\r
+ catch (Exception e){\r
+ e.printStackTrace();\r
+ throw e;\r
+ }\r
+ \r
+ return false;\r
+ }\r
+ \r
+ /**Remove PCDBuildDefinition entries from ModuleSA\r
+ * @param moduleKey identifier of ModuleSA.\r
+ * @param consumer where these entries come from.\r
+ */\r
+ public void removePcdData(String moduleKey, ModuleIdentification consumer) {\r
+ try {\r
+ ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = (ModuleSurfaceAreaDocument.ModuleSurfaceArea)GlobalData.getModuleXmlObject(consumer);\r
+ if (msa.getPcdCoded() == null) {\r
+ return;\r
+ }\r
+ \r
+ List<PcdCodedDocument.PcdCoded.PcdEntry> l = msa.getPcdCoded().getPcdEntryList();\r
+ ListIterator li = l.listIterator();\r
+ \r
+ while(li.hasNext()) {\r
+ PcdCodedDocument.PcdCoded.PcdEntry msaPcd = (PcdCodedDocument.PcdCoded.PcdEntry)li.next();\r
+ ModuleSADocument.ModuleSA moduleSA = getModuleSA(moduleKey);\r
+ XmlCursor cursor = moduleSA.getPcdBuildDefinition().newCursor();\r
+ if (cursor.toFirstChild()) {\r
+ PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
+ if (msaPcd.getCName().equals(pcdData.getCName()) && msaPcd.getTokenSpaceGuidCName().equals(pcdData.getTokenSpaceGuidCName())) {\r
+ \r
+ maintainDynPcdMap(pcdData.getCName()+" "+pcdData.getTokenSpaceGuidCName(), moduleKey);\r
+ cursor.removeXml();\r
+ break;\r
+ }\r
+ while (cursor.toNextSibling()) {\r
+ pcdData = (PcdBuildDefinitionDocument.PcdBuildDefinition.PcdData)cursor.getObject();\r
+ if (msaPcd.getCName().equals(pcdData.getCName()) && msaPcd.getTokenSpaceGuidCName().equals(pcdData.getTokenSpaceGuidCName())) {\r
+ maintainDynPcdMap(pcdData.getCName()+" "+pcdData.getTokenSpaceGuidCName(), moduleKey);\r
+ cursor.removeXml();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ cursor.dispose();\r
+ }\r
+ \r
+ }\r
+ catch (Exception e){\r
+ e.printStackTrace();\r
+ \r
+ }\r
+ }\r
//\r
// key for ModuleSA : "ModuleGuid ModuleVer PackageGuid PackageVer"\r
//\r
}\r
}\r
\r
- public void removeLibraryInstances(String key) {\r
+ public void removeLibraryInstance(String key, int i) {\r
ModuleSADocument.ModuleSA msa = getModuleSA(key);\r
if (msa == null || msa.getLibraries() == null){\r
return ;\r
}\r
\r
XmlCursor cursor = msa.getLibraries().newCursor();\r
- cursor.removeXml();\r
+ if (cursor.toFirstChild()) {\r
+ for (int j = 0; j < i; ++j) {\r
+ cursor.toNextSibling();\r
+ }\r
+ cursor.removeXml();\r
+ }\r
+ \r
cursor.dispose();\r
}\r
\r
// AddItem to ModuleSA PcdBuildDefinitions\r
//\r
String defaultVal = msaPcd.getDefaultValue() == null ? spdPcd.getDefaultValue() : msaPcd.getDefaultValue();\r
+ \r
genPcdData(msaPcd.getCName(), spdPcd.getToken(), msaPcd.getTokenSpaceGuidCName(), msaPcd.getPcdItemType().toString(), spdPcd.getDatumType()+"", defaultVal, moduleSa);\r
}\r
\r
}\r
}\r
\r
- private int setMaxSizeForPointer(String datum) throws PcdValueMalFormed{\r
+ public int setMaxSizeForPointer(String datum) throws PcdValueMalFormed{\r
if (datum == null) {\r
return 0;\r
}\r
}\r
}\r
\r
- private void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) \r
+ public void addDynamicPcdBuildData(String cName, Object token, String tsGuid, String itemType, String dataType, String defaultVal) \r
throws PcdValueMalFormed{\r
DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData dynPcdData = getfpdDynPcdBuildDefs().addNewPcdBuildData();\r
dynPcdData.setItemType(PcdItemTypes.Enum.forString(itemType));\r
}\r
}\r
\r
- private void removeDynamicPcdBuildData(String cName, String tsGuid) {\r
+ public void removeDynamicPcdBuildData(String cName, String tsGuid) {\r
XmlObject o = getfpdDynPcdBuildDefs();\r
\r
XmlCursor cursor = o.newCursor();\r
if (cursor.toFirstChild()) {\r
DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData pcdBuildData = \r
(DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
- while (!(pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid))) {\r
- cursor.toNextSibling();\r
+ if (pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
+ cursor.removeXml();\r
+ cursor.dispose();\r
+ return;\r
+ }\r
+ while (cursor.toNextSibling()) {\r
+ \r
pcdBuildData = (DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData)cursor.getObject();\r
+ if (pcdBuildData.getCName().equals(cName) && pcdBuildData.getTokenSpaceGuidCName().equals(tsGuid)) {\r
+ cursor.removeXml();\r
+ cursor.dispose();\r
+ return;\r
+ }\r
}\r
- \r
- cursor.removeXml();\r
}\r
cursor.dispose();\r
}\r
}\r
}\r
\r
- public void removePcdDataFromLibraryInstance(String moduleKey, String libInstanceKey){\r
- ModuleSADocument.ModuleSA moduleSa = getModuleSA(moduleKey);\r
- //\r
- // should better maintain pcd from lib instance only, but maintain all is acceptable now. \r
- //\r
- maintainDynPcdMap(moduleSa.getPcdBuildDefinition(), libInstanceKey);\r
- \r
- }\r
- \r
public BuildOptionsDocument.BuildOptions getfpdBuildOpts() {\r
if (fpdBuildOpts == null) {\r
fpdBuildOpts = fpdRoot.addNewBuildOptions();\r
return fdf.getStringValue();\r
}\r
\r
- \r
- \r
public void genFvImagesNameValue(String name, String value) {\r
\r
FvImagesDocument.FvImages fi = getfpdFlash().getFvImages();\r