import java.util.List;\r
import java.util.Map;\r
\r
-import org.tianocore.pcd.entity.UsageIdentification;\r
-import org.tianocore.pcd.exception.EntityException;\r
-\r
/**\r
This class is to descript a PCD token object. The information of a token mainly\r
comes from MSA, SPD and setting produced by platform developer.\r
///\r
/// Enumeration macro defintion for PCD type.\r
///\r
- public enum PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC,\r
+ public static enum PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC,\r
DYNAMIC_EX, UNKNOWN}\r
\r
///\r
/// Wizard maybe expand this type as "int, unsigned int, short, unsigned short etc" in\r
/// prompt dialog.\r
///\r
- public enum DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
+ public static enum DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
\r
///\r
/// Enumeration macor defintion for usage of PCD\r
///\r
- public enum PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
+ public static enum PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
SOMETIMES_CONSUMED, UNKNOWN}\r
\r
///\r
@param pcdType new PCD type found in FPD file for this token.\r
**/\r
public void updateSupportPcdType(PCD_TYPE pcdType) {\r
- for (int index = 0; index < this.supportedPcdType.size(); index ++) {\r
+ int size = supportedPcdType.size();\r
+ for (int index = 0; index < size; index++) {\r
if (supportedPcdType.get(index) == pcdType) {\r
return;\r
}\r
@param pcdType the judged pcd type\r
\r
@return boolean\r
- */\r
+ **/\r
public static boolean isDynamic(PCD_TYPE pcdType) {\r
if ((pcdType == PCD_TYPE.DYNAMIC ) ||\r
(pcdType == PCD_TYPE.DYNAMIC_EX)) {\r
return false;\r
}\r
\r
+ /**\r
+ The pcd type is DynamicEx?\r
+\r
+ @retval true Is DynamicEx type\r
+ @retval false not DynamicEx type\r
+ **/\r
public boolean isDynamicEx() {\r
- for (int i = 0; i < supportedPcdType.size(); i++) {\r
+ int size = supportedPcdType.size();\r
+ for (int i = 0; i < size; i++) {\r
if (supportedPcdType.get(i) == PCD_TYPE.DYNAMIC_EX) {\r
return true;\r
}\r
if (tokenSpaceName == null) {\r
return cName + "_nullTokenSpaceGuid";\r
} else {\r
- return cName + "_" + tokenSpaceName.toString().replace('-', '_');\r
+ return cName + "_" + tokenSpaceName.toString().replace('-', '_').toLowerCase();\r
}\r
}\r
\r
If skudata list contains more than one data, then Sku mechanism is enable.\r
\r
@retval boolean if the number of sku data exceed to 1\r
- */\r
+ **/\r
public boolean isSkuEnable() {\r
if (this.skuData.size() > 1) {\r
return true;\r
Get the token primary key in token database.\r
\r
@return String\r
- */\r
+ **/\r
public String getPrimaryKeyString () {\r
return Token.getPrimaryKeyString(cName, tokenSpaceName);\r
}\r
@retval TRUE - Success to add usage instance.\r
@retval FALSE - Fail to add usage instance\r
**/\r
- public boolean addUsageInstance(UsageInstance usageInstance) throws EntityException {\r
- String exceptionStr;\r
-\r
+ public boolean addUsageInstance(UsageInstance usageInstance) {\r
if (isUsageInstanceExist(usageInstance.usageId)) {\r
- exceptionStr = String.format("[PCD Collection Tool Exception] PCD %s for module %s has already exist in database, Please check all PCD build entries "+\r
- "in modules %s in <ModuleSA> to make sure no duplicated definitions in FPD file!",\r
- usageInstance.parentToken.cName,\r
- usageInstance.usageId.moduleName,\r
- usageInstance.usageId.moduleName);\r
- throw new EntityException(exceptionStr);\r
+ return false;\r
}\r
\r
//\r
@param usageId The UsageInstance identification for usage instance\r
\r
@return boolean whether exist an usage instance for this token.\r
- */\r
+ **/\r
public boolean isUsageInstanceExist(UsageIdentification usageId) {\r
String keyStr = UsageInstance.getPrimaryKey(usageId);\r
\r
\r
@return PCD_TYPE\r
**/\r
- public static PCD_TYPE getpcdTypeFromString(String pcdTypeStr) {\r
+ public static PCD_TYPE getPcdTypeFromString(String pcdTypeStr) {\r
if (pcdTypeStr == null) {\r
return PCD_TYPE.UNKNOWN;\r
}\r
@return The string of datum type.\r
**/\r
public static String getStringOfdatumType(DATUM_TYPE datumType) {\r
- switch (datumType) {\r
- case UINT8:\r
- return "UINT8";\r
- case UINT16:\r
- return "UINT16";\r
- case UINT32:\r
- return "UINT32";\r
- case UINT64:\r
- return "UINT64";\r
- case POINTER:\r
- return "POINTER";\r
- case BOOLEAN:\r
- return "BOOLEAN";\r
- }\r
- return "UNKNOWN";\r
+ return datumType.toString();\r
}\r
\r
/**\r
@return The string of PCD_TYPE.\r
**/\r
public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
- switch (pcdType) {\r
- case FEATURE_FLAG:\r
- return "FEATURE_FLAG";\r
- case FIXED_AT_BUILD:\r
- return "FIXED_AT_BUILD";\r
- case PATCHABLE_IN_MODULE:\r
- return "PATCHABLE_IN_MODULE";\r
- case DYNAMIC:\r
- return "DYNAMIC";\r
- case DYNAMIC_EX:\r
- return "DYNAMIC_EX";\r
- }\r
- return "UNKNOWN";\r
+ return pcdType.toString();\r
}\r
\r
/**\r
@return The string of PDC_USAGE.\r
**/\r
public static String getStringOfUsage(PCD_USAGE usage) {\r
- switch (usage) {\r
- case ALWAYS_PRODUCED:\r
- return "ALWAYS_PRODUCED";\r
- case ALWAYS_CONSUMED:\r
- return "ALWAYS_CONSUMED";\r
- case SOMETIMES_PRODUCED:\r
- return "SOMETIMES_PRODUCED";\r
- case SOMETIMES_CONSUMED:\r
- return "SOMETIMES_CONSUMED";\r
- }\r
- return "UNKNOWN";\r
+ return usage.toString();\r
}\r
\r
/**\r
@retval DynamicTokenValue the value of this dyanmic token.\r
**/\r
public DynamicTokenValue getDefaultSku() {\r
- int index;\r
-\r
- for (index = 0; index < this.skuData.size(); index ++) {\r
+ int index;\r
+ int size = skuData.size();\r
+ for (index = 0; index < size; index++) {\r
if (skuData.get(index).id == 0) {\r
return skuData.get(index).value;\r
}\r
Get the size of PCD value, this PCD is POINTER type.\r
\r
@param str the string of the value\r
- @param al\r
+ @param al the array list for outer parameter.\r
**/\r
private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
if (isValidNullValue(str)) {\r
SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
0 will be returned.\r
\r
- @return String\r
- */\r
+ @return String get the default value for a DYNAMIC type PCD.\r
+ **/\r
public String getDynamicDefaultValue() {\r
DynamicTokenValue dynamicData = getDefaultSku();\r
if (hasDefaultValue()) {\r
return null;\r
}\r
\r
- //\r
- // BugBug: We need change this algorithm accordingly when schema is updated\r
- // to support no default value.\r
- //\r
+ /**\r
+ Judge whether a DYNAMIC PCD has default value.\r
+\r
+ @return whether a DYNAMIC PCD has default value.\r
+ **/\r
public boolean hasDefaultValue () {\r
DynamicTokenValue dynamicValue = null;\r
\r
/**\r
Judge the value is NULL value. NULL value means the value is uninitialized value\r
\r
- @param judgedValue\r
+ @param judgedValue the want want to be judged\r
\r
- @return boolean\r
- */\r
+ @return boolean whether the value of PCD is NULL.\r
+ **/\r
public boolean isValidNullValue(String judgedValue) {\r
String subStr;\r
BigInteger bigIntValue;\r
}\r
break;\r
case POINTER:\r
- if (judgedValue.equalsIgnoreCase("") ||\r
- judgedValue.equalsIgnoreCase("\"\"") ||\r
+ if (judgedValue.equalsIgnoreCase("\"\"") ||\r
judgedValue.equalsIgnoreCase("L\"\"") ||\r
- (judgedValue.length() == 0) ||\r
- judgedValue.equalsIgnoreCase("{0}")) {\r
+ (judgedValue.length() == 0)) {\r
return true;\r
+ } else if (judgedValue.trim().charAt(0) == '{') {\r
+ int start = judgedValue.indexOf('{');\r
+ int end = judgedValue.lastIndexOf('}');\r
+ String[] strValueArray = judgedValue.substring(start + 1, end).split(",");\r
+ if (strValueArray.length > 1) {\r
+ return false;\r
+ } else {\r
+ if (strValueArray[0].matches("(0x)?(0X)?0*")) {\r
+ return true;\r
+ }\r
+ }\r
}\r
}\r
return false;\r
/**\r
Is the string value in Unicode\r
\r
- @return boolean\r
+ @return boolean the string value is UNICODE type string.\r
**/\r
public boolean isHiiDefaultValueUnicodeStringType() {\r
DynamicTokenValue dynamicData = getDefaultSku();\r
/**\r
Is the string value in ANSCI\r
\r
- @return boolean\r
+ @return boolean whether the dfault value for HII case is string type.\r
**/\r
public boolean isHiiDefaultValueASCIIStringType() {\r
DynamicTokenValue dynamicData = getDefaultSku();\r
\r
/**\r
Judege whether current value is UNICODE string type.\r
- @return boolean\r
- */\r
+\r
+ @return boolean whether the value is UNICODE string.\r
+ **/\r
public boolean isUnicodeStringType () {\r
String str = getDynamicDefaultValue();\r
\r
return false;\r
}\r
\r
+ /**\r
+ Judge whether the string type is ANSIC string.\r
+\r
+ @return boolean whether the string type is ANSIC string\r
+ **/\r
public boolean isASCIIStringType () {\r
String str = getDynamicDefaultValue();\r
\r
return false;\r
}\r
\r
+ /**\r
+ Judge whether the string value is byte array.\r
+\r
+ @return boolean whether the string value is byte array.\r
+\r
+ **/\r
public boolean isByteStreamType () {\r
String str = getDynamicDefaultValue();\r
\r
\r
}\r
\r
+ /**\r
+ Get string value for ANSIC string type\r
+\r
+ @return String the string value\r
+ **/\r
public String getStringTypeString () {\r
return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
}\r
+\r
+ /**\r
+ Judge whether a datum string is byte array.\r
+ \r
+ @param datum datum string\r
+ \r
+ @return boolean true - is byte array, false - not byte array\r
+ **/\r
+ public static boolean isByteArrayDatum(String datum) {\r
+ if (datum == null) {\r
+ return false;\r
+ }\r
+\r
+ String trimedStr = datum.trim();\r
+\r
+ if (trimedStr.length() == 0) {\r
+ return false;\r
+ }\r
+\r
+ if (trimedStr.startsWith("{") && \r
+ trimedStr.endsWith("}")) {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ Judge whether a datum string is unicode.\r
+ \r
+ @param datum datum string\r
+ \r
+ @return boolean true - is unicode, false - not unicode\r
+ **/\r
+ public static boolean isUnicodeDatum(String datum) {\r
+ if (datum == null) {\r
+ return false;\r
+ }\r
+\r
+ String trimedStr = datum.trim();\r
+ if (trimedStr.length() == 0) {\r
+ return false;\r
+ }\r
+\r
+ if (trimedStr.startsWith("L") &&\r
+ trimedStr.charAt(1) == '"' &&\r
+ trimedStr.endsWith("\"")) {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ Judge whether a datum string is ANSCI string.\r
+ \r
+ @param datum datum string\r
+ \r
+ @return boolean true - is ANSIC, false - not ANSIC\r
+ **/\r
+ public static boolean isAnsciDatum(String datum) {\r
+ if (datum == null) {\r
+ return false;\r
+ }\r
+\r
+ String trimedStr = datum.trim();\r
+\r
+ if (trimedStr.length() == 0) {\r
+ return false;\r
+ }\r
+\r
+ if (datum.startsWith("\"") &&\r
+ datum.endsWith("\"")) {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ Get byte array string for POINTER type Datum.\r
+ \r
+ @param datum the datum whose type is POINTER\r
+ \r
+ @return String the byte array string\r
+ **/\r
+ public String getByteArrayForPointerDatum(String datum) {\r
+ String byteArray = "{";\r
+\r
+ if (datumType != Token.DATUM_TYPE.POINTER) {\r
+ return null;\r
+ }\r
+\r
+ if (Token.isAnsciDatum(datum)) {\r
+ String trimedStr = datum.trim();\r
+ trimedStr = trimedStr.substring(1, trimedStr.length() - 1);\r
+ char charArray[] = trimedStr.toCharArray();\r
+ for (int index = 0; index < charArray.length; index++) {\r
+ byteArray += String.format("0x%02x ", (byte)charArray[index]);\r
+ if (index != (charArray.length - 1)) {\r
+ byteArray += ",";\r
+ }\r
+ }\r
+ } else if (Token.isUnicodeDatum(datum)) {\r
+ String trimedStr = datum.trim();\r
+ trimedStr = trimedStr.substring(2, trimedStr.length() - 1);\r
+ for (int index = 0; index < trimedStr.length(); index++) {\r
+ short unicodeVal = (short)trimedStr.codePointAt(index);\r
+ byteArray += String.format("0x%02x, 0x%02x", \r
+ (byte)unicodeVal,\r
+ (byte)((unicodeVal & 0xFF00) >> 8));\r
+ if (index != (trimedStr.length() - 1)) {\r
+ byteArray += " ,";\r
+ }\r
+ }\r
+ } else if (Token.isByteArrayDatum(datum)){\r
+ return datum;\r
+ } else {\r
+ return null;\r
+ }\r
+\r
+ byteArray += "}";\r
+\r
+ return byteArray;\r
+ }\r
}\r
\r
\r