]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/PcdTools/org/tianocore/pcd/entity/Token.java
Fix EDKT140(CompressDll.dll does not build under cygwin gcc).
[mirror_edk2.git] / Tools / Source / PcdTools / org / tianocore / pcd / entity / Token.java
CommitLineData
878ddf1f 1/** @file\r
2 Token class.\r
3\r
4 This module contains all classes releted to PCD token.\r
bc262841 5\r
878ddf1f 6Copyright (c) 2006, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
bc262841 11\r
878ddf1f 12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
bc262841 15**/\r
d14ebb43 16package org.tianocore.pcd.entity;\r
878ddf1f 17\r
6f7e61a0 18import java.math.BigInteger;\r
878ddf1f 19import java.util.ArrayList;\r
6f7e61a0 20import java.util.HashMap;\r
878ddf1f 21import java.util.List;\r
8840ad58 22import java.util.Map;\r
878ddf1f 23\r
d14ebb43 24import org.tianocore.pcd.entity.UsageIdentification;\r
25import org.tianocore.pcd.exception.EntityException;\r
878ddf1f 26\r
bc262841 27/**\r
28 This class is to descript a PCD token object. The information of a token mainly\r
29 comes from MSA, SPD and setting produced by platform developer.\r
878ddf1f 30**/\r
31public class Token {\r
32 ///\r
33 /// Enumeration macro defintion for PCD type.\r
bc262841 34 ///\r
35 public enum PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC,\r
878ddf1f 36 DYNAMIC_EX, UNKNOWN}\r
37\r
38 ///\r
39 /// Enumeration macro definition for datum type. All type mainly comes from ProcessBind.h.\r
bc262841 40 /// Wizard maybe expand this type as "int, unsigned int, short, unsigned short etc" in\r
878ddf1f 41 /// prompt dialog.\r
42 ///\r
43 public enum DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
44\r
45 ///\r
46 /// Enumeration macor defintion for usage of PCD\r
47 ///\r
48 public enum PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
49 SOMETIMES_CONSUMED, UNKNOWN}\r
50\r
51 ///\r
52 /// cName is to identify a PCD entry and will be used for generating autogen.h/autogen.c.\r
53 /// cName will be defined in MSA, SPD and FPD, can be regarded as primary key with token space guid.\r
54 ///\r
55 public String cName;\r
56\r
57 ///\r
58 /// Token space name is the guid defined by token itself in package or module level. This\r
bc262841 59 /// name mainly for DynamicEx type. For other PCD type token, his token space name is the\r
878ddf1f 60 /// assignedtokenSpaceName as follows.\r
61 /// tokenSpaceName is defined in MSA, SPD, FPD, can be regarded as primary key with cName.\r
62 ///\r
eece174a 63 public String tokenSpaceName;\r
878ddf1f 64\r
65 ///\r
66 /// tokenNumber is allocated by platform. tokenNumber indicate an index for this token in\r
38ee8d9e 67 /// platform token space. For Dynamic, dynamicEx type, this number will be re-adjust by\r
68 /// PCD run-time database autogen tools.\r
878ddf1f 69 ///\r
eece174a 70 public long tokenNumber;\r
878ddf1f 71\r
38ee8d9e 72 ///\r
bc262841 73 /// This token number is retrieved from FPD file for DynamicEx type.\r
74 ///\r
eece174a 75 public long dynamicExTokenNumber;\r
38ee8d9e 76\r
878ddf1f 77 ///\r
6ff7a41c 78 /// All supported PCD type, this value can be retrieved from SPD\r
79 /// Currently, only record all PCD type for this token in FPD file.\r
bc262841 80 ///\r
6ff7a41c 81 public List<PCD_TYPE> supportedPcdType;\r
82\r
878ddf1f 83 ///\r
6ff7a41c 84 /// If the token's item type is Dynamic or DynamicEx type, isDynamicPCD\r
85 /// is true.\r
bc262841 86 ///\r
6ff7a41c 87 public boolean isDynamicPCD;\r
878ddf1f 88\r
878ddf1f 89 ///\r
bc262841 90 /// datumSize is to descript the fix size or max size for this token.\r
878ddf1f 91 /// datumSize is defined in SPD.\r
92 ///\r
93 public int datumSize;\r
94\r
95 ///\r
96 /// datum type is to descript what type can be expressed by a PCD token.\r
6ff7a41c 97 /// For same PCD used in different module, the datum type should be unique.\r
98 /// So it belong memeber to Token class.\r
878ddf1f 99 ///\r
100 public DATUM_TYPE datumType;\r
101\r
878ddf1f 102 ///\r
103 /// skuData contains all value for SkuNumber of token.\r
bc262841 104 /// This field is for Dynamic or DynamicEx type PCD,\r
878ddf1f 105 ///\r
106 public List<SkuInstance> skuData;\r
107\r
878ddf1f 108 ///\r
109 /// consumers array record all module private information who consume this PCD token.\r
110 ///\r
8840ad58 111 public Map<String, UsageInstance> consumers;\r
878ddf1f 112\r
eece174a 113 /**\r
114 Constructure function for Token class\r
bc262841 115\r
eece174a 116 @param cName The name of token\r
117 @param tokenSpaceName The name of token space, it is a guid string\r
118 **/\r
119 public Token(String cName, String tokenSpaceName) {\r
878ddf1f 120 this.cName = cName;\r
eece174a 121 this.tokenSpaceName = tokenSpaceName;\r
878ddf1f 122 this.tokenNumber = 0;\r
878ddf1f 123 this.datumType = DATUM_TYPE.UNKNOWN;\r
124 this.datumSize = -1;\r
878ddf1f 125 this.skuData = new ArrayList<SkuInstance>();\r
878ddf1f 126\r
8840ad58 127 this.consumers = new HashMap<String, UsageInstance>();\r
6ff7a41c 128 this.supportedPcdType = new ArrayList<PCD_TYPE>();\r
129 }\r
130\r
131 /**\r
132 updateSupportPcdType\r
bc262841 133\r
6ff7a41c 134 SupportPcdType should be gotten from SPD file actually, but now it just\r
135 record all PCD type for this token in FPD file.\r
bc262841 136\r
6ff7a41c 137 @param pcdType new PCD type found in FPD file for this token.\r
138 **/\r
139 public void updateSupportPcdType(PCD_TYPE pcdType) {\r
f28c0830 140 int size = supportedPcdType.size();\r
141 for (int index = 0; index < size; index++) {\r
eece174a 142 if (supportedPcdType.get(index) == pcdType) {\r
143 return;\r
6ff7a41c 144 }\r
145 }\r
eece174a 146\r
147 //\r
148 // If not found, add the pcd type to member variable supportedPcdType\r
bc262841 149 //\r
eece174a 150 supportedPcdType.add(pcdType);\r
6ff7a41c 151 }\r
152\r
153 /**\r
154 Judge whether pcdType is belong to dynamic type. Dynamic type includes\r
155 DYNAMIC and DYNAMIC_EX.\r
bc262841 156\r
eece174a 157 @param pcdType the judged pcd type\r
bc262841 158\r
6ff7a41c 159 @return boolean\r
f28c0830 160 **/\r
6ff7a41c 161 public static boolean isDynamic(PCD_TYPE pcdType) {\r
162 if ((pcdType == PCD_TYPE.DYNAMIC ) ||\r
163 (pcdType == PCD_TYPE.DYNAMIC_EX)) {\r
164 return true;\r
165 }\r
166\r
167 return false;\r
878ddf1f 168 }\r
169\r
f28c0830 170 /**\r
171 The pcd type is DynamicEx?\r
172 \r
173 @retval true Is DynamicEx type\r
174 @retval false not DynamicEx type\r
175 **/\r
58f1099f 176 public boolean isDynamicEx() {\r
f28c0830 177 int size = supportedPcdType.size();\r
178 for (int i = 0; i < size; i++) {\r
58f1099f 179 if (supportedPcdType.get(i) == PCD_TYPE.DYNAMIC_EX) {\r
180 return true;\r
181 }\r
182 }\r
bc262841 183\r
58f1099f 184 return false;\r
185 }\r
186\r
878ddf1f 187 /**\r
188 Use "TokencName + "-" + SpaceTokenName" as primary key when adding token into database\r
bc262841 189\r
878ddf1f 190 @param cName Token name.\r
eece174a 191 @param tokenSpaceName The token space guid string defined in MSA or SPD\r
bc262841 192\r
eece174a 193 @retval primary key for this token in token database.\r
878ddf1f 194 **/\r
eece174a 195 public static String getPrimaryKeyString(String cName, String tokenSpaceName) {\r
8840ad58 196 if (tokenSpaceName == null) {\r
eece174a 197 return cName + "_nullTokenSpaceGuid";\r
878ddf1f 198 } else {\r
8840ad58 199 return cName + "_" + tokenSpaceName.toString().replace('-', '_');\r
878ddf1f 200 }\r
201 }\r
202\r
6ff7a41c 203 /**\r
204 If skudata list contains more than one data, then Sku mechanism is enable.\r
bc262841 205\r
eece174a 206 @retval boolean if the number of sku data exceed to 1\r
f28c0830 207 **/\r
6ff7a41c 208 public boolean isSkuEnable() {\r
209 if (this.skuData.size() > 1) {\r
210 return true;\r
211 }\r
212 return false;\r
213 }\r
eece174a 214\r
215 /**\r
216 If Hii type for value of token\r
bc262841 217\r
eece174a 218 @return boolean\r
219 **/\r
58f1099f 220 public boolean isHiiEnable() {\r
221 if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
222 return true;\r
223 }\r
224 return false;\r
225 }\r
226\r
eece174a 227 /**\r
228 If Vpd type for value of token\r
bc262841 229\r
eece174a 230 @return boolean\r
231 **/\r
58f1099f 232 public boolean isVpdEnable() {\r
233 if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
234 return true;\r
235 }\r
236 return false;\r
237 }\r
6ff7a41c 238\r
8840ad58 239 /**\r
240 Get the token primary key in token database.\r
bc262841 241\r
8840ad58 242 @return String\r
f28c0830 243 **/\r
32648c62 244 public String getPrimaryKeyString () {\r
8840ad58 245 return Token.getPrimaryKeyString(cName, tokenSpaceName);\r
32648c62 246 }\r
99d2c3c4 247\r
878ddf1f 248 /**\r
249 Judge datumType is valid\r
bc262841 250\r
878ddf1f 251 @param type The datumType want to be judged.\r
bc262841 252\r
878ddf1f 253 @retval TRUE - The type is valid.\r
254 @retval FALSE - The type is invalid.\r
255 **/\r
256 public static boolean isValiddatumType(DATUM_TYPE type) {\r
bc262841 257 if ((type.ordinal() < DATUM_TYPE.UINT8.ordinal() ) ||\r
878ddf1f 258 (type.ordinal() > DATUM_TYPE.POINTER.ordinal())) {\r
259 return false;\r
260 }\r
261 return true;\r
262 }\r
263\r
264 /**\r
265 Judge pcdType is valid\r
bc262841 266\r
878ddf1f 267 @param type The PCdType want to be judged.\r
bc262841 268\r
878ddf1f 269 @retval TRUE - The type is valid.\r
270 @retval FALSE - The type is invalid.\r
271 **/\r
272 public static boolean isValidpcdType(PCD_TYPE type) {\r
bc262841 273 if ((type.ordinal() < PCD_TYPE.FEATURE_FLAG.ordinal() ) ||\r
878ddf1f 274 (type.ordinal() > PCD_TYPE.DYNAMIC_EX.ordinal())) {\r
275 return false;\r
276 }\r
277 return true;\r
278 }\r
279\r
280 /**\r
281 Add an usage instance for token\r
bc262841 282\r
878ddf1f 283 @param usageInstance The usage instance\r
bc262841 284\r
878ddf1f 285 @retval TRUE - Success to add usage instance.\r
286 @retval FALSE - Fail to add usage instance\r
287 **/\r
eece174a 288 public boolean addUsageInstance(UsageInstance usageInstance) throws EntityException {\r
8840ad58 289 String exceptionStr;\r
290\r
d14ebb43 291 if (isUsageInstanceExist(usageInstance.usageId)) {\r
eece174a 292 exceptionStr = String.format("[PCD Collection Tool Exception] PCD %s for module %s has already exist in database, Please check all PCD build entries "+\r
293 "in modules %s in <ModuleSA> to make sure no duplicated definitions in FPD file!",\r
8840ad58 294 usageInstance.parentToken.cName,\r
d14ebb43 295 usageInstance.usageId.moduleName,\r
296 usageInstance.usageId.moduleName);\r
8840ad58 297 throw new EntityException(exceptionStr);\r
878ddf1f 298 }\r
299\r
eece174a 300 //\r
301 // Put usage instance into usage instance database of this PCD token.\r
bc262841 302 //\r
8840ad58 303 consumers.put(usageInstance.getPrimaryKey(), usageInstance);\r
eece174a 304\r
878ddf1f 305 return true;\r
306 }\r
307\r
308 /**\r
8840ad58 309 Judge whether exist an usage instance for this token\r
bc262841 310\r
d14ebb43 311 @param usageId The UsageInstance identification for usage instance\r
bc262841 312\r
8840ad58 313 @return boolean whether exist an usage instance for this token.\r
f28c0830 314 **/\r
d14ebb43 315 public boolean isUsageInstanceExist(UsageIdentification usageId) {\r
316 String keyStr = UsageInstance.getPrimaryKey(usageId);\r
eece174a 317\r
8840ad58 318 return (consumers.get(keyStr) != null);\r
878ddf1f 319 }\r
320\r
321 /**\r
322 Get the PCD_TYPE according to the string of PCD_TYPE\r
bc262841 323\r
878ddf1f 324 @param pcdTypeStr The string of PCD_TYPE\r
bc262841 325\r
878ddf1f 326 @return PCD_TYPE\r
327 **/\r
f28c0830 328 public static PCD_TYPE getPcdTypeFromString(String pcdTypeStr) {\r
878ddf1f 329 if (pcdTypeStr == null) {\r
330 return PCD_TYPE.UNKNOWN;\r
331 }\r
332\r
333 if (pcdTypeStr.equalsIgnoreCase("FEATURE_FLAG")) {\r
334 return PCD_TYPE.FEATURE_FLAG;\r
335 } else if (pcdTypeStr.equalsIgnoreCase("FIXED_AT_BUILD")) {\r
336 return PCD_TYPE.FIXED_AT_BUILD;\r
337 } else if (pcdTypeStr.equalsIgnoreCase("PATCHABLE_IN_MODULE")) {\r
338 return PCD_TYPE.PATCHABLE_IN_MODULE;\r
339 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC")) {\r
340 return PCD_TYPE.DYNAMIC;\r
341 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC_EX")) {\r
342 return PCD_TYPE.DYNAMIC_EX;\r
343 } else {\r
344 return PCD_TYPE.UNKNOWN;\r
345 }\r
346 }\r
347\r
348 /**\r
349 Get the string of given datumType. This string will be used for generating autogen files\r
bc262841 350\r
878ddf1f 351 @param datumType Given datumType\r
bc262841 352\r
878ddf1f 353 @return The string of datum type.\r
354 **/\r
355 public static String getStringOfdatumType(DATUM_TYPE datumType) {\r
f28c0830 356 return datumType.toString();\r
878ddf1f 357 }\r
358\r
359 /**\r
360 Get the datumType according to a string.\r
bc262841 361\r
878ddf1f 362 @param datumTypeStr The string of datumType\r
bc262841 363\r
878ddf1f 364 @return DATUM_TYPE\r
365 **/\r
366 public static DATUM_TYPE getdatumTypeFromString(String datumTypeStr) {\r
367 if (datumTypeStr.equalsIgnoreCase("UINT8")) {\r
368 return DATUM_TYPE.UINT8;\r
369 } else if (datumTypeStr.equalsIgnoreCase("UINT16")) {\r
370 return DATUM_TYPE.UINT16;\r
371 } else if (datumTypeStr.equalsIgnoreCase("UINT32")) {\r
372 return DATUM_TYPE.UINT32;\r
373 } else if (datumTypeStr.equalsIgnoreCase("UINT64")) {\r
374 return DATUM_TYPE.UINT64;\r
375 } else if (datumTypeStr.equalsIgnoreCase("VOID*")) {\r
376 return DATUM_TYPE.POINTER;\r
377 } else if (datumTypeStr.equalsIgnoreCase("BOOLEAN")) {\r
378 return DATUM_TYPE.BOOLEAN;\r
379 }\r
380 return DATUM_TYPE.UNKNOWN;\r
381 }\r
382\r
383 /**\r
384 Get string of given pcdType\r
bc262841 385\r
878ddf1f 386 @param pcdType The given PcdType\r
bc262841 387\r
878ddf1f 388 @return The string of PCD_TYPE.\r
389 **/\r
390 public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
f28c0830 391 return pcdType.toString();\r
878ddf1f 392 }\r
393\r
394 /**\r
395 Get the PCD_USAGE according to a string\r
bc262841 396\r
878ddf1f 397 @param usageStr The string of PCD_USAGE\r
bc262841 398\r
878ddf1f 399 @return The PCD_USAGE\r
400 **/\r
401 public static PCD_USAGE getUsageFromString(String usageStr) {\r
402 if (usageStr == null) {\r
403 return PCD_USAGE.UNKNOWN;\r
404 }\r
405\r
406 if (usageStr.equalsIgnoreCase("ALWAYS_PRODUCED")) {\r
407 return PCD_USAGE.ALWAYS_PRODUCED;\r
408 } else if (usageStr.equalsIgnoreCase("SOMETIMES_PRODUCED")) {\r
409 return PCD_USAGE.SOMETIMES_PRODUCED;\r
410 } else if (usageStr.equalsIgnoreCase("ALWAYS_CONSUMED")) {\r
411 return PCD_USAGE.ALWAYS_CONSUMED;\r
412 } else if (usageStr.equalsIgnoreCase("SOMETIMES_CONSUMED")) {\r
413 return PCD_USAGE.SOMETIMES_CONSUMED;\r
414 }\r
415\r
416 return PCD_USAGE.UNKNOWN;\r
417 }\r
418\r
419 /**\r
420 Get the string of given PCD_USAGE\r
bc262841 421\r
878ddf1f 422 @param usage The given PCD_USAGE\r
bc262841 423\r
878ddf1f 424 @return The string of PDC_USAGE.\r
425 **/\r
426 public static String getStringOfUsage(PCD_USAGE usage) {\r
f28c0830 427 return usage.toString();\r
878ddf1f 428 }\r
429\r
430 /**\r
431 Get the Defined datumType string for autogen. The string is for generating some MACROs in Autogen.h\r
bc262841 432\r
878ddf1f 433 @param datumType The given datumType\r
434\r
435 @return string of datum type for autogen.\r
436 **/\r
437 public static String GetAutogenDefinedatumTypeString(DATUM_TYPE datumType) {\r
438 switch (datumType) {\r
bc262841 439\r
878ddf1f 440 case UINT8:\r
441 return "8";\r
442 case UINT16:\r
443 return "16";\r
444 case BOOLEAN:\r
445 return "BOOL";\r
446 case POINTER:\r
447 return "PTR";\r
448 case UINT32:\r
449 return "32";\r
450 case UINT64:\r
451 return "64";\r
452 default:\r
453 return null;\r
454 }\r
455 }\r
456\r
457 /**\r
458 Get the datumType String for Autogen. This string will be used for generating defintions of PCD token in autogen\r
bc262841 459\r
878ddf1f 460 @param datumType The given datumType\r
461\r
462 @return string of datum type.\r
463 **/\r
58f1099f 464\r
878ddf1f 465 public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
466 switch (datumType) {\r
467 case UINT8:\r
468 return "UINT8";\r
469 case UINT16:\r
470 return "UINT16";\r
471 case UINT32:\r
472 return "UINT32";\r
473 case UINT64:\r
474 return "UINT64";\r
475 case POINTER:\r
476 return "VOID*";\r
477 case BOOLEAN:\r
478 return "BOOLEAN";\r
479 }\r
480 return null;\r
481 }\r
482\r
483 /**\r
484 Get the datumType string for generating some MACROs in autogen file of Library\r
bc262841 485\r
878ddf1f 486 @param datumType The given datumType\r
487\r
488 @return String of datum for genrating bit charater.\r
489 **/\r
490 public static String getAutogenLibrarydatumTypeString(DATUM_TYPE datumType) {\r
491 switch (datumType) {\r
492 case UINT8:\r
493 return "8";\r
494 case UINT16:\r
495 return "16";\r
496 case BOOLEAN:\r
497 return "Bool";\r
498 case POINTER:\r
499 return "Ptr";\r
500 case UINT32:\r
501 return "32";\r
502 case UINT64:\r
503 return "64";\r
504 default:\r
505 return null;\r
506 }\r
507 }\r
508\r
509 /**\r
eece174a 510 Get the sku data who id is 0.\r
bc262841 511\r
eece174a 512 @retval DynamicTokenValue the value of this dyanmic token.\r
878ddf1f 513 **/\r
6ff7a41c 514 public DynamicTokenValue getDefaultSku() {\r
f28c0830 515 int index;\r
516 int size = skuData.size();\r
517 for (index = 0; index < size; index++) {\r
6ff7a41c 518 if (skuData.get(index).id == 0) {\r
519 return skuData.get(index).value;\r
520 }\r
521 }\r
522\r
523 return null;\r
524 }\r
eece174a 525\r
526 /**\r
527 Get the number of Sku data for this token\r
bc262841 528\r
eece174a 529 @retval int the number of sku data\r
530 **/\r
58f1099f 531 public int getSkuIdCount () {\r
532 return this.skuData.size();\r
533 }\r
1de04b4f 534\r
eece174a 535 /**\r
536 Get the size of PCD value, this PCD is POINTER type.\r
bc262841 537\r
eece174a 538 @param str the string of the value\r
f28c0830 539 @param al the array list for outer parameter.\r
eece174a 540 **/\r
1de04b4f 541 private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
542 if (isValidNullValue(str)) {\r
543 al.add(new Integer(0));\r
544 } else {\r
545 //\r
546 // isValidNullValue has already make sure that str here\r
547 // always contain a valid default value of the following 3\r
548 // cases:\r
549 // 1) "Hello world" //Assci string\r
550 // 2) L"Hello" //Unicode string\r
551 // 3) {0x01, 0x02, 0x03} //Byte stream\r
552 //\r
553 if (str.startsWith("\"")) {\r
554 al.add(new Integer(str.length() - 2));\r
555 } else if (str.startsWith("L\"")){\r
556 //\r
557 // Unicode is 2 bytes each.\r
558 //\r
559 al.add(new Integer((str.length() - 3) * 2));\r
560 } else if (str.startsWith("{")) {\r
561 //\r
562 // We count the number of "," in the string.\r
bc262841 563 // The number of byte is one plus the number of\r
1de04b4f 564 // comma.\r
565 //\r
566 String str2 = str;\r
bc262841 567\r
1de04b4f 568 int cnt = 0;\r
569 int pos = 0;\r
570 pos = str2.indexOf(",", 0);\r
571 while (pos != -1) {\r
572 cnt++;\r
573 pos++;\r
574 pos = str2.indexOf(",", pos);\r
575 }\r
576 cnt++;\r
577 al.add(new Integer(cnt));\r
578 }\r
579 }\r
580 }\r
eece174a 581\r
582 /**\r
583 This method can be used to get the MAX and current size\r
584 for pointer type dynamic(ex) PCD entry\r
bc262841 585 **/\r
1de04b4f 586 public ArrayList<Integer> getPointerTypeSize () {\r
587 ArrayList<Integer> al = new ArrayList<Integer>();\r
bc262841 588\r
1de04b4f 589 //\r
590 // For VPD_enabled and HII_enabled, we can only return the MAX size.\r
591 // For the default DATA type dynamic PCD entry, we will return\r
592 // the MAX size and current size for each SKU_ID.\r
593 //\r
594 al.add(new Integer(this.datumSize));\r
bc262841 595\r
1de04b4f 596 if (!this.isVpdEnable()) {\r
597 int idx;\r
598 if (this.isHiiEnable()){\r
599 for (idx = 0; idx < this.skuData.size(); idx++) {\r
600 String str = this.skuData.get(idx).value.hiiDefaultValue;\r
601 getCurrentSizeFromDefaultValue(str, al);\r
602 }\r
603 } else {\r
604 for (idx = 0; idx < this.skuData.size(); idx++) {\r
605 String str = this.skuData.get(idx).value.value;\r
606 getCurrentSizeFromDefaultValue(str, al);\r
607 }\r
608 }\r
609 }\r
bc262841 610\r
1de04b4f 611 return al;\r
612 }\r
f63ef4b2 613\r
614 /**\r
615 Get default value for a token, For HII type, HiiDefaultValue of default\r
616 SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
617 0 will be returned.\r
bc262841 618\r
f28c0830 619 @return String get the default value for a DYNAMIC type PCD.\r
620 **/\r
f63ef4b2 621 public String getDynamicDefaultValue() {\r
622 DynamicTokenValue dynamicData = getDefaultSku();\r
623 if (hasDefaultValue()) {\r
624 switch (dynamicData.type) {\r
f63ef4b2 625 case DEFAULT_TYPE:\r
626 return dynamicData.value;\r
627 }\r
628 }\r
629\r
630 return null;\r
631 }\r
632\r
f28c0830 633 /**\r
634 Judge whether a DYNAMIC PCD has default value. \r
635\r
636 @return whether a DYNAMIC PCD has default value.\r
637 **/\r
99d2c3c4 638 public boolean hasDefaultValue () {\r
6ff7a41c 639 DynamicTokenValue dynamicValue = null;\r
640\r
58f1099f 641 if (isSkuEnable()) {\r
642 return true;\r
643 }\r
bc262841 644\r
6ff7a41c 645 if (this.isDynamicPCD) {\r
646 dynamicValue = getDefaultSku();\r
647 switch (dynamicValue.type) {\r
648 case HII_TYPE:\r
58f1099f 649 return true;\r
6ff7a41c 650 case VPD_TYPE:\r
58f1099f 651 return true;\r
6ff7a41c 652 case DEFAULT_TYPE:\r
6f7e61a0 653 return !isValidNullValue(dynamicValue.value);\r
654 }\r
655 }\r
656\r
657 return false;\r
658 }\r
6ff7a41c 659\r
eece174a 660 /**\r
661 Judge the value is NULL value. NULL value means the value is uninitialized value\r
bc262841 662\r
f28c0830 663 @param judgedValue the want want to be judged\r
bc262841 664\r
f28c0830 665 @return boolean whether the value of PCD is NULL.\r
666 **/\r
6f7e61a0 667 public boolean isValidNullValue(String judgedValue) {\r
e59cdca8 668 String subStr;\r
6f7e61a0 669 BigInteger bigIntValue;\r
670\r
671 switch (datumType) {\r
672 case UINT8:\r
673 case UINT16:\r
674 case UINT32:\r
e59cdca8 675 if (judgedValue.length() > 2) {\r
bc262841 676 if ((judgedValue.charAt(0) == '0') &&\r
e59cdca8 677 ((judgedValue.charAt(1) == 'x') || (judgedValue.charAt(1) == 'X'))){\r
678 subStr = judgedValue.substring(2, judgedValue.length());\r
679 bigIntValue = new BigInteger(subStr, 16);\r
680 } else {\r
681 bigIntValue = new BigInteger(judgedValue);\r
682 }\r
683 } else {\r
684 bigIntValue = new BigInteger(judgedValue);\r
685 }\r
686 if (bigIntValue.bitCount() == 0) {\r
6f7e61a0 687 return true;\r
688 }\r
689 break;\r
690 case UINT64:\r
691 if (judgedValue.length() > 2){\r
bc262841 692 if ((judgedValue.charAt(0) == '0') &&\r
6f7e61a0 693 ((judgedValue.charAt(1) == 'x') ||\r
694 (judgedValue.charAt(1) == 'X'))) {\r
695 bigIntValue = new BigInteger(judgedValue.substring(2, judgedValue.length()), 16);\r
696 if (bigIntValue.bitCount() == 0) {\r
697 return true;\r
698 }\r
6ff7a41c 699 } else {\r
6f7e61a0 700 bigIntValue = new BigInteger(judgedValue);\r
701 if (bigIntValue.bitCount() == 0) {\r
702 return true;\r
703 }\r
704 }\r
705 } else {\r
706 bigIntValue = new BigInteger(judgedValue);\r
707 if (bigIntValue.bitCount() == 0) {\r
6ff7a41c 708 return true;\r
709 }\r
6f7e61a0 710 }\r
711 break;\r
712 case BOOLEAN:\r
713 if (judgedValue.equalsIgnoreCase("false")) {\r
714 return true;\r
715 }\r
716 break;\r
717 case POINTER:\r
f28c0830 718 if (judgedValue.equalsIgnoreCase("\"\"") ||\r
6f7e61a0 719 judgedValue.equalsIgnoreCase("L\"\"") ||\r
f28c0830 720 (judgedValue.length() == 0)) {\r
6f7e61a0 721 return true;\r
f28c0830 722 } else if (judgedValue.trim().charAt(0) == '{') {\r
723 int start = judgedValue.indexOf('{');\r
724 int end = judgedValue.lastIndexOf('}');\r
725 String[] strValueArray = judgedValue.substring(start + 1, end).split(",");\r
726 if (strValueArray.length > 1) {\r
727 return false;\r
728 } else {\r
729 if (strValueArray[0].matches("(0x)?(0X)?0*")) {\r
730 return true;\r
731 }\r
732 }\r
6ff7a41c 733 }\r
32648c62 734 }\r
6ff7a41c 735 return false;\r
99d2c3c4 736 }\r
eece174a 737\r
738 /**\r
739 Is the string value in Unicode\r
bc262841 740\r
f28c0830 741 @return boolean the string value is UNICODE type string.\r
eece174a 742 **/\r
bb5545b6 743 public boolean isHiiDefaultValueUnicodeStringType() {\r
744 DynamicTokenValue dynamicData = getDefaultSku();\r
bc262841 745\r
bb5545b6 746 if (dynamicData == null)\r
747 return false;\r
bc262841 748\r
bb5545b6 749 return dynamicData.hiiDefaultValue.startsWith("L\"")\r
750 && dynamicData.hiiDefaultValue.endsWith("\"");\r
751 }\r
eece174a 752\r
753 /**\r
754 Is the string value in ANSCI\r
bc262841 755\r
f28c0830 756 @return boolean whether the dfault value for HII case is string type.\r
eece174a 757 **/\r
bb5545b6 758 public boolean isHiiDefaultValueASCIIStringType() {\r
759 DynamicTokenValue dynamicData = getDefaultSku();\r
bc262841 760\r
bb5545b6 761 if (dynamicData == null)\r
762 return false;\r
bc262841 763\r
bb5545b6 764 return dynamicData.hiiDefaultValue.startsWith("\"")\r
765 && dynamicData.hiiDefaultValue.endsWith("\"");\r
766 }\r
bc262841 767\r
f63ef4b2 768 /**\r
769 Judege whether current value is UNICODE string type.\r
f28c0830 770\r
771 @return boolean whether the value is UNICODE string.\r
772 **/\r
f63ef4b2 773 public boolean isUnicodeStringType () {\r
774 String str = getDynamicDefaultValue();\r
775\r
776 if (str == null) {\r
777 return false;\r
778 }\r
99d2c3c4 779\r
f63ef4b2 780 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 781 str.startsWith("L\"") &&\r
f63ef4b2 782 str.endsWith("\"")) {\r
32648c62 783 return true;\r
784 }\r
99d2c3c4 785\r
32648c62 786 return false;\r
787 }\r
bc262841 788\r
f28c0830 789 /**\r
790 Judge whether the string type is ANSIC string.\r
791\r
792 @return boolean whether the string type is ANSIC string\r
793 **/\r
3534cbb7 794 public boolean isASCIIStringType () {\r
795 String str = getDynamicDefaultValue();\r
796\r
797 if (str == null) {\r
798 return false;\r
799 }\r
800\r
801 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 802 str.startsWith("\"") &&\r
3534cbb7 803 str.endsWith("\"")) {\r
804 return true;\r
805 }\r
806\r
807 return false;\r
808 }\r
809\r
f28c0830 810 /**\r
811 Judge whether the string value is byte array.\r
812\r
813 @return boolean whether the string value is byte array.\r
814\r
815 **/\r
4276d5da 816 public boolean isByteStreamType () {\r
817 String str = getDynamicDefaultValue();\r
818\r
819 if (str == null) {\r
820 return false;\r
821 }\r
822\r
823 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 824 str.startsWith("{") &&\r
4276d5da 825 str.endsWith("}")) {\r
826 return true;\r
827 }\r
828\r
829 return false;\r
bc262841 830\r
4276d5da 831 }\r
99d2c3c4 832\r
f28c0830 833 /**\r
834 Get string value for ANSIC string type\r
835 \r
836 @return String the string value\r
837 **/\r
bc262841 838 public String getStringTypeString () {\r
6ff7a41c 839 return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
32648c62 840 }\r
878ddf1f 841}\r
842\r
843\r
844\r
845\r