]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/PcdTools/org/tianocore/pcd/entity/Token.java
Abstract the logic of Platform pcd preprocess according to FPD file to a class. And...
[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
eece174a 140 for (int index = 0; index < this.supportedPcdType.size(); index ++) {\r
141 if (supportedPcdType.get(index) == pcdType) {\r
142 return;\r
6ff7a41c 143 }\r
144 }\r
eece174a 145\r
146 //\r
147 // If not found, add the pcd type to member variable supportedPcdType\r
bc262841 148 //\r
eece174a 149 supportedPcdType.add(pcdType);\r
6ff7a41c 150 }\r
151\r
152 /**\r
153 Judge whether pcdType is belong to dynamic type. Dynamic type includes\r
154 DYNAMIC and DYNAMIC_EX.\r
bc262841 155\r
eece174a 156 @param pcdType the judged pcd type\r
bc262841 157\r
6ff7a41c 158 @return boolean\r
159 */\r
160 public static boolean isDynamic(PCD_TYPE pcdType) {\r
161 if ((pcdType == PCD_TYPE.DYNAMIC ) ||\r
162 (pcdType == PCD_TYPE.DYNAMIC_EX)) {\r
163 return true;\r
164 }\r
165\r
166 return false;\r
878ddf1f 167 }\r
168\r
58f1099f 169 public boolean isDynamicEx() {\r
58f1099f 170 for (int i = 0; i < supportedPcdType.size(); i++) {\r
171 if (supportedPcdType.get(i) == PCD_TYPE.DYNAMIC_EX) {\r
172 return true;\r
173 }\r
174 }\r
bc262841 175\r
58f1099f 176 return false;\r
177 }\r
178\r
878ddf1f 179 /**\r
180 Use "TokencName + "-" + SpaceTokenName" as primary key when adding token into database\r
bc262841 181\r
878ddf1f 182 @param cName Token name.\r
eece174a 183 @param tokenSpaceName The token space guid string defined in MSA or SPD\r
bc262841 184\r
eece174a 185 @retval primary key for this token in token database.\r
878ddf1f 186 **/\r
eece174a 187 public static String getPrimaryKeyString(String cName, String tokenSpaceName) {\r
8840ad58 188 if (tokenSpaceName == null) {\r
eece174a 189 return cName + "_nullTokenSpaceGuid";\r
878ddf1f 190 } else {\r
8840ad58 191 return cName + "_" + tokenSpaceName.toString().replace('-', '_');\r
878ddf1f 192 }\r
193 }\r
194\r
6ff7a41c 195 /**\r
196 If skudata list contains more than one data, then Sku mechanism is enable.\r
bc262841 197\r
eece174a 198 @retval boolean if the number of sku data exceed to 1\r
6ff7a41c 199 */\r
200 public boolean isSkuEnable() {\r
201 if (this.skuData.size() > 1) {\r
202 return true;\r
203 }\r
204 return false;\r
205 }\r
eece174a 206\r
207 /**\r
208 If Hii type for value of token\r
bc262841 209\r
eece174a 210 @return boolean\r
211 **/\r
58f1099f 212 public boolean isHiiEnable() {\r
213 if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
214 return true;\r
215 }\r
216 return false;\r
217 }\r
218\r
eece174a 219 /**\r
220 If Vpd type for value of token\r
bc262841 221\r
eece174a 222 @return boolean\r
223 **/\r
58f1099f 224 public boolean isVpdEnable() {\r
225 if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
226 return true;\r
227 }\r
228 return false;\r
229 }\r
6ff7a41c 230\r
8840ad58 231 /**\r
232 Get the token primary key in token database.\r
bc262841 233\r
8840ad58 234 @return String\r
235 */\r
32648c62 236 public String getPrimaryKeyString () {\r
8840ad58 237 return Token.getPrimaryKeyString(cName, tokenSpaceName);\r
32648c62 238 }\r
99d2c3c4 239\r
878ddf1f 240 /**\r
241 Judge datumType is valid\r
bc262841 242\r
878ddf1f 243 @param type The datumType want to be judged.\r
bc262841 244\r
878ddf1f 245 @retval TRUE - The type is valid.\r
246 @retval FALSE - The type is invalid.\r
247 **/\r
248 public static boolean isValiddatumType(DATUM_TYPE type) {\r
bc262841 249 if ((type.ordinal() < DATUM_TYPE.UINT8.ordinal() ) ||\r
878ddf1f 250 (type.ordinal() > DATUM_TYPE.POINTER.ordinal())) {\r
251 return false;\r
252 }\r
253 return true;\r
254 }\r
255\r
256 /**\r
257 Judge pcdType is valid\r
bc262841 258\r
878ddf1f 259 @param type The PCdType want to be judged.\r
bc262841 260\r
878ddf1f 261 @retval TRUE - The type is valid.\r
262 @retval FALSE - The type is invalid.\r
263 **/\r
264 public static boolean isValidpcdType(PCD_TYPE type) {\r
bc262841 265 if ((type.ordinal() < PCD_TYPE.FEATURE_FLAG.ordinal() ) ||\r
878ddf1f 266 (type.ordinal() > PCD_TYPE.DYNAMIC_EX.ordinal())) {\r
267 return false;\r
268 }\r
269 return true;\r
270 }\r
271\r
272 /**\r
273 Add an usage instance for token\r
bc262841 274\r
878ddf1f 275 @param usageInstance The usage instance\r
bc262841 276\r
878ddf1f 277 @retval TRUE - Success to add usage instance.\r
278 @retval FALSE - Fail to add usage instance\r
279 **/\r
eece174a 280 public boolean addUsageInstance(UsageInstance usageInstance) throws EntityException {\r
8840ad58 281 String exceptionStr;\r
282\r
d14ebb43 283 if (isUsageInstanceExist(usageInstance.usageId)) {\r
eece174a 284 exceptionStr = String.format("[PCD Collection Tool Exception] PCD %s for module %s has already exist in database, Please check all PCD build entries "+\r
285 "in modules %s in <ModuleSA> to make sure no duplicated definitions in FPD file!",\r
8840ad58 286 usageInstance.parentToken.cName,\r
d14ebb43 287 usageInstance.usageId.moduleName,\r
288 usageInstance.usageId.moduleName);\r
8840ad58 289 throw new EntityException(exceptionStr);\r
878ddf1f 290 }\r
291\r
eece174a 292 //\r
293 // Put usage instance into usage instance database of this PCD token.\r
bc262841 294 //\r
8840ad58 295 consumers.put(usageInstance.getPrimaryKey(), usageInstance);\r
eece174a 296\r
878ddf1f 297 return true;\r
298 }\r
299\r
300 /**\r
8840ad58 301 Judge whether exist an usage instance for this token\r
bc262841 302\r
d14ebb43 303 @param usageId The UsageInstance identification for usage instance\r
bc262841 304\r
8840ad58 305 @return boolean whether exist an usage instance for this token.\r
306 */\r
d14ebb43 307 public boolean isUsageInstanceExist(UsageIdentification usageId) {\r
308 String keyStr = UsageInstance.getPrimaryKey(usageId);\r
eece174a 309\r
8840ad58 310 return (consumers.get(keyStr) != null);\r
878ddf1f 311 }\r
312\r
313 /**\r
314 Get the PCD_TYPE according to the string of PCD_TYPE\r
bc262841 315\r
878ddf1f 316 @param pcdTypeStr The string of PCD_TYPE\r
bc262841 317\r
878ddf1f 318 @return PCD_TYPE\r
319 **/\r
320 public static PCD_TYPE getpcdTypeFromString(String pcdTypeStr) {\r
321 if (pcdTypeStr == null) {\r
322 return PCD_TYPE.UNKNOWN;\r
323 }\r
324\r
325 if (pcdTypeStr.equalsIgnoreCase("FEATURE_FLAG")) {\r
326 return PCD_TYPE.FEATURE_FLAG;\r
327 } else if (pcdTypeStr.equalsIgnoreCase("FIXED_AT_BUILD")) {\r
328 return PCD_TYPE.FIXED_AT_BUILD;\r
329 } else if (pcdTypeStr.equalsIgnoreCase("PATCHABLE_IN_MODULE")) {\r
330 return PCD_TYPE.PATCHABLE_IN_MODULE;\r
331 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC")) {\r
332 return PCD_TYPE.DYNAMIC;\r
333 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC_EX")) {\r
334 return PCD_TYPE.DYNAMIC_EX;\r
335 } else {\r
336 return PCD_TYPE.UNKNOWN;\r
337 }\r
338 }\r
339\r
340 /**\r
341 Get the string of given datumType. This string will be used for generating autogen files\r
bc262841 342\r
878ddf1f 343 @param datumType Given datumType\r
bc262841 344\r
878ddf1f 345 @return The string of datum type.\r
346 **/\r
347 public static String getStringOfdatumType(DATUM_TYPE datumType) {\r
348 switch (datumType) {\r
349 case UINT8:\r
350 return "UINT8";\r
351 case UINT16:\r
352 return "UINT16";\r
353 case UINT32:\r
354 return "UINT32";\r
355 case UINT64:\r
356 return "UINT64";\r
357 case POINTER:\r
358 return "POINTER";\r
359 case BOOLEAN:\r
360 return "BOOLEAN";\r
361 }\r
362 return "UNKNOWN";\r
363 }\r
364\r
365 /**\r
366 Get the datumType according to a string.\r
bc262841 367\r
878ddf1f 368 @param datumTypeStr The string of datumType\r
bc262841 369\r
878ddf1f 370 @return DATUM_TYPE\r
371 **/\r
372 public static DATUM_TYPE getdatumTypeFromString(String datumTypeStr) {\r
373 if (datumTypeStr.equalsIgnoreCase("UINT8")) {\r
374 return DATUM_TYPE.UINT8;\r
375 } else if (datumTypeStr.equalsIgnoreCase("UINT16")) {\r
376 return DATUM_TYPE.UINT16;\r
377 } else if (datumTypeStr.equalsIgnoreCase("UINT32")) {\r
378 return DATUM_TYPE.UINT32;\r
379 } else if (datumTypeStr.equalsIgnoreCase("UINT64")) {\r
380 return DATUM_TYPE.UINT64;\r
381 } else if (datumTypeStr.equalsIgnoreCase("VOID*")) {\r
382 return DATUM_TYPE.POINTER;\r
383 } else if (datumTypeStr.equalsIgnoreCase("BOOLEAN")) {\r
384 return DATUM_TYPE.BOOLEAN;\r
385 }\r
386 return DATUM_TYPE.UNKNOWN;\r
387 }\r
388\r
389 /**\r
390 Get string of given pcdType\r
bc262841 391\r
878ddf1f 392 @param pcdType The given PcdType\r
bc262841 393\r
878ddf1f 394 @return The string of PCD_TYPE.\r
395 **/\r
396 public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
397 switch (pcdType) {\r
398 case FEATURE_FLAG:\r
399 return "FEATURE_FLAG";\r
400 case FIXED_AT_BUILD:\r
401 return "FIXED_AT_BUILD";\r
402 case PATCHABLE_IN_MODULE:\r
403 return "PATCHABLE_IN_MODULE";\r
404 case DYNAMIC:\r
405 return "DYNAMIC";\r
406 case DYNAMIC_EX:\r
407 return "DYNAMIC_EX";\r
408 }\r
409 return "UNKNOWN";\r
410 }\r
411\r
412 /**\r
413 Get the PCD_USAGE according to a string\r
bc262841 414\r
878ddf1f 415 @param usageStr The string of PCD_USAGE\r
bc262841 416\r
878ddf1f 417 @return The PCD_USAGE\r
418 **/\r
419 public static PCD_USAGE getUsageFromString(String usageStr) {\r
420 if (usageStr == null) {\r
421 return PCD_USAGE.UNKNOWN;\r
422 }\r
423\r
424 if (usageStr.equalsIgnoreCase("ALWAYS_PRODUCED")) {\r
425 return PCD_USAGE.ALWAYS_PRODUCED;\r
426 } else if (usageStr.equalsIgnoreCase("SOMETIMES_PRODUCED")) {\r
427 return PCD_USAGE.SOMETIMES_PRODUCED;\r
428 } else if (usageStr.equalsIgnoreCase("ALWAYS_CONSUMED")) {\r
429 return PCD_USAGE.ALWAYS_CONSUMED;\r
430 } else if (usageStr.equalsIgnoreCase("SOMETIMES_CONSUMED")) {\r
431 return PCD_USAGE.SOMETIMES_CONSUMED;\r
432 }\r
433\r
434 return PCD_USAGE.UNKNOWN;\r
435 }\r
436\r
437 /**\r
438 Get the string of given PCD_USAGE\r
bc262841 439\r
878ddf1f 440 @param usage The given PCD_USAGE\r
bc262841 441\r
878ddf1f 442 @return The string of PDC_USAGE.\r
443 **/\r
444 public static String getStringOfUsage(PCD_USAGE usage) {\r
445 switch (usage) {\r
446 case ALWAYS_PRODUCED:\r
447 return "ALWAYS_PRODUCED";\r
448 case ALWAYS_CONSUMED:\r
449 return "ALWAYS_CONSUMED";\r
450 case SOMETIMES_PRODUCED:\r
451 return "SOMETIMES_PRODUCED";\r
452 case SOMETIMES_CONSUMED:\r
453 return "SOMETIMES_CONSUMED";\r
454 }\r
455 return "UNKNOWN";\r
456 }\r
457\r
458 /**\r
459 Get the Defined datumType string for autogen. The string is for generating some MACROs in Autogen.h\r
bc262841 460\r
878ddf1f 461 @param datumType The given datumType\r
462\r
463 @return string of datum type for autogen.\r
464 **/\r
465 public static String GetAutogenDefinedatumTypeString(DATUM_TYPE datumType) {\r
466 switch (datumType) {\r
bc262841 467\r
878ddf1f 468 case UINT8:\r
469 return "8";\r
470 case UINT16:\r
471 return "16";\r
472 case BOOLEAN:\r
473 return "BOOL";\r
474 case POINTER:\r
475 return "PTR";\r
476 case UINT32:\r
477 return "32";\r
478 case UINT64:\r
479 return "64";\r
480 default:\r
481 return null;\r
482 }\r
483 }\r
484\r
485 /**\r
486 Get the datumType String for Autogen. This string will be used for generating defintions of PCD token in autogen\r
bc262841 487\r
878ddf1f 488 @param datumType The given datumType\r
489\r
490 @return string of datum type.\r
491 **/\r
58f1099f 492\r
878ddf1f 493 public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
494 switch (datumType) {\r
495 case UINT8:\r
496 return "UINT8";\r
497 case UINT16:\r
498 return "UINT16";\r
499 case UINT32:\r
500 return "UINT32";\r
501 case UINT64:\r
502 return "UINT64";\r
503 case POINTER:\r
504 return "VOID*";\r
505 case BOOLEAN:\r
506 return "BOOLEAN";\r
507 }\r
508 return null;\r
509 }\r
510\r
511 /**\r
512 Get the datumType string for generating some MACROs in autogen file of Library\r
bc262841 513\r
878ddf1f 514 @param datumType The given datumType\r
515\r
516 @return String of datum for genrating bit charater.\r
517 **/\r
518 public static String getAutogenLibrarydatumTypeString(DATUM_TYPE datumType) {\r
519 switch (datumType) {\r
520 case UINT8:\r
521 return "8";\r
522 case UINT16:\r
523 return "16";\r
524 case BOOLEAN:\r
525 return "Bool";\r
526 case POINTER:\r
527 return "Ptr";\r
528 case UINT32:\r
529 return "32";\r
530 case UINT64:\r
531 return "64";\r
532 default:\r
533 return null;\r
534 }\r
535 }\r
536\r
537 /**\r
eece174a 538 Get the sku data who id is 0.\r
bc262841 539\r
eece174a 540 @retval DynamicTokenValue the value of this dyanmic token.\r
878ddf1f 541 **/\r
6ff7a41c 542 public DynamicTokenValue getDefaultSku() {\r
6ff7a41c 543 int index;\r
eece174a 544\r
6ff7a41c 545 for (index = 0; index < this.skuData.size(); index ++) {\r
546 if (skuData.get(index).id == 0) {\r
547 return skuData.get(index).value;\r
548 }\r
549 }\r
550\r
551 return null;\r
552 }\r
eece174a 553\r
554 /**\r
555 Get the number of Sku data for this token\r
bc262841 556\r
eece174a 557 @retval int the number of sku data\r
558 **/\r
58f1099f 559 public int getSkuIdCount () {\r
560 return this.skuData.size();\r
561 }\r
1de04b4f 562\r
eece174a 563 /**\r
564 Get the size of PCD value, this PCD is POINTER type.\r
bc262841 565\r
eece174a 566 @param str the string of the value\r
bc262841 567 @param al\r
eece174a 568 **/\r
1de04b4f 569 private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
570 if (isValidNullValue(str)) {\r
571 al.add(new Integer(0));\r
572 } else {\r
573 //\r
574 // isValidNullValue has already make sure that str here\r
575 // always contain a valid default value of the following 3\r
576 // cases:\r
577 // 1) "Hello world" //Assci string\r
578 // 2) L"Hello" //Unicode string\r
579 // 3) {0x01, 0x02, 0x03} //Byte stream\r
580 //\r
581 if (str.startsWith("\"")) {\r
582 al.add(new Integer(str.length() - 2));\r
583 } else if (str.startsWith("L\"")){\r
584 //\r
585 // Unicode is 2 bytes each.\r
586 //\r
587 al.add(new Integer((str.length() - 3) * 2));\r
588 } else if (str.startsWith("{")) {\r
589 //\r
590 // We count the number of "," in the string.\r
bc262841 591 // The number of byte is one plus the number of\r
1de04b4f 592 // comma.\r
593 //\r
594 String str2 = str;\r
bc262841 595\r
1de04b4f 596 int cnt = 0;\r
597 int pos = 0;\r
598 pos = str2.indexOf(",", 0);\r
599 while (pos != -1) {\r
600 cnt++;\r
601 pos++;\r
602 pos = str2.indexOf(",", pos);\r
603 }\r
604 cnt++;\r
605 al.add(new Integer(cnt));\r
606 }\r
607 }\r
608 }\r
eece174a 609\r
610 /**\r
611 This method can be used to get the MAX and current size\r
612 for pointer type dynamic(ex) PCD entry\r
bc262841 613 **/\r
1de04b4f 614 public ArrayList<Integer> getPointerTypeSize () {\r
615 ArrayList<Integer> al = new ArrayList<Integer>();\r
bc262841 616\r
1de04b4f 617 //\r
618 // For VPD_enabled and HII_enabled, we can only return the MAX size.\r
619 // For the default DATA type dynamic PCD entry, we will return\r
620 // the MAX size and current size for each SKU_ID.\r
621 //\r
622 al.add(new Integer(this.datumSize));\r
bc262841 623\r
1de04b4f 624 if (!this.isVpdEnable()) {\r
625 int idx;\r
626 if (this.isHiiEnable()){\r
627 for (idx = 0; idx < this.skuData.size(); idx++) {\r
628 String str = this.skuData.get(idx).value.hiiDefaultValue;\r
629 getCurrentSizeFromDefaultValue(str, al);\r
630 }\r
631 } else {\r
632 for (idx = 0; idx < this.skuData.size(); idx++) {\r
633 String str = this.skuData.get(idx).value.value;\r
634 getCurrentSizeFromDefaultValue(str, al);\r
635 }\r
636 }\r
637 }\r
bc262841 638\r
1de04b4f 639 return al;\r
640 }\r
f63ef4b2 641\r
642 /**\r
643 Get default value for a token, For HII type, HiiDefaultValue of default\r
644 SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
645 0 will be returned.\r
bc262841 646\r
f63ef4b2 647 @return String\r
648 */\r
649 public String getDynamicDefaultValue() {\r
650 DynamicTokenValue dynamicData = getDefaultSku();\r
651 if (hasDefaultValue()) {\r
652 switch (dynamicData.type) {\r
f63ef4b2 653 case DEFAULT_TYPE:\r
654 return dynamicData.value;\r
655 }\r
656 }\r
657\r
658 return null;\r
659 }\r
660\r
99d2c3c4 661 //\r
662 // BugBug: We need change this algorithm accordingly when schema is updated\r
663 // to support no default value.\r
664 //\r
665 public boolean hasDefaultValue () {\r
6ff7a41c 666 DynamicTokenValue dynamicValue = null;\r
667\r
58f1099f 668 if (isSkuEnable()) {\r
669 return true;\r
670 }\r
bc262841 671\r
6ff7a41c 672 if (this.isDynamicPCD) {\r
673 dynamicValue = getDefaultSku();\r
674 switch (dynamicValue.type) {\r
675 case HII_TYPE:\r
58f1099f 676 return true;\r
6ff7a41c 677 case VPD_TYPE:\r
58f1099f 678 return true;\r
6ff7a41c 679 case DEFAULT_TYPE:\r
6f7e61a0 680 return !isValidNullValue(dynamicValue.value);\r
681 }\r
682 }\r
683\r
684 return false;\r
685 }\r
6ff7a41c 686\r
eece174a 687 /**\r
688 Judge the value is NULL value. NULL value means the value is uninitialized value\r
bc262841 689\r
eece174a 690 @param judgedValue\r
bc262841 691\r
eece174a 692 @return boolean\r
693 */\r
6f7e61a0 694 public boolean isValidNullValue(String judgedValue) {\r
e59cdca8 695 String subStr;\r
6f7e61a0 696 BigInteger bigIntValue;\r
697\r
698 switch (datumType) {\r
699 case UINT8:\r
700 case UINT16:\r
701 case UINT32:\r
e59cdca8 702 if (judgedValue.length() > 2) {\r
bc262841 703 if ((judgedValue.charAt(0) == '0') &&\r
e59cdca8 704 ((judgedValue.charAt(1) == 'x') || (judgedValue.charAt(1) == 'X'))){\r
705 subStr = judgedValue.substring(2, judgedValue.length());\r
706 bigIntValue = new BigInteger(subStr, 16);\r
707 } else {\r
708 bigIntValue = new BigInteger(judgedValue);\r
709 }\r
710 } else {\r
711 bigIntValue = new BigInteger(judgedValue);\r
712 }\r
713 if (bigIntValue.bitCount() == 0) {\r
6f7e61a0 714 return true;\r
715 }\r
716 break;\r
717 case UINT64:\r
718 if (judgedValue.length() > 2){\r
bc262841 719 if ((judgedValue.charAt(0) == '0') &&\r
6f7e61a0 720 ((judgedValue.charAt(1) == 'x') ||\r
721 (judgedValue.charAt(1) == 'X'))) {\r
722 bigIntValue = new BigInteger(judgedValue.substring(2, judgedValue.length()), 16);\r
723 if (bigIntValue.bitCount() == 0) {\r
724 return true;\r
725 }\r
6ff7a41c 726 } else {\r
6f7e61a0 727 bigIntValue = new BigInteger(judgedValue);\r
728 if (bigIntValue.bitCount() == 0) {\r
729 return true;\r
730 }\r
731 }\r
732 } else {\r
733 bigIntValue = new BigInteger(judgedValue);\r
734 if (bigIntValue.bitCount() == 0) {\r
6ff7a41c 735 return true;\r
736 }\r
6f7e61a0 737 }\r
738 break;\r
739 case BOOLEAN:\r
740 if (judgedValue.equalsIgnoreCase("false")) {\r
741 return true;\r
742 }\r
743 break;\r
744 case POINTER:\r
745 if (judgedValue.equalsIgnoreCase("") ||\r
746 judgedValue.equalsIgnoreCase("\"\"") ||\r
747 judgedValue.equalsIgnoreCase("L\"\"") ||\r
748 (judgedValue.length() == 0) ||\r
ddb87685 749 judgedValue.equalsIgnoreCase("{0}")) {\r
6f7e61a0 750 return true;\r
6ff7a41c 751 }\r
32648c62 752 }\r
6ff7a41c 753 return false;\r
99d2c3c4 754 }\r
eece174a 755\r
756 /**\r
757 Is the string value in Unicode\r
bc262841 758\r
eece174a 759 @return boolean\r
760 **/\r
bb5545b6 761 public boolean isHiiDefaultValueUnicodeStringType() {\r
762 DynamicTokenValue dynamicData = getDefaultSku();\r
bc262841 763\r
bb5545b6 764 if (dynamicData == null)\r
765 return false;\r
bc262841 766\r
bb5545b6 767 return dynamicData.hiiDefaultValue.startsWith("L\"")\r
768 && dynamicData.hiiDefaultValue.endsWith("\"");\r
769 }\r
eece174a 770\r
771 /**\r
772 Is the string value in ANSCI\r
bc262841 773\r
eece174a 774 @return boolean\r
775 **/\r
bb5545b6 776 public boolean isHiiDefaultValueASCIIStringType() {\r
777 DynamicTokenValue dynamicData = getDefaultSku();\r
bc262841 778\r
bb5545b6 779 if (dynamicData == null)\r
780 return false;\r
bc262841 781\r
bb5545b6 782 return dynamicData.hiiDefaultValue.startsWith("\"")\r
783 && dynamicData.hiiDefaultValue.endsWith("\"");\r
784 }\r
bc262841 785\r
f63ef4b2 786 /**\r
787 Judege whether current value is UNICODE string type.\r
788 @return boolean\r
789 */\r
790 public boolean isUnicodeStringType () {\r
791 String str = getDynamicDefaultValue();\r
792\r
793 if (str == null) {\r
794 return false;\r
795 }\r
99d2c3c4 796\r
f63ef4b2 797 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 798 str.startsWith("L\"") &&\r
f63ef4b2 799 str.endsWith("\"")) {\r
32648c62 800 return true;\r
801 }\r
99d2c3c4 802\r
32648c62 803 return false;\r
804 }\r
bc262841 805\r
3534cbb7 806 public boolean isASCIIStringType () {\r
807 String str = getDynamicDefaultValue();\r
808\r
809 if (str == null) {\r
810 return false;\r
811 }\r
812\r
813 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 814 str.startsWith("\"") &&\r
3534cbb7 815 str.endsWith("\"")) {\r
816 return true;\r
817 }\r
818\r
819 return false;\r
820 }\r
821\r
4276d5da 822 public boolean isByteStreamType () {\r
823 String str = getDynamicDefaultValue();\r
824\r
825 if (str == null) {\r
826 return false;\r
827 }\r
828\r
829 if (datumType == Token.DATUM_TYPE.POINTER &&\r
bc262841 830 str.startsWith("{") &&\r
4276d5da 831 str.endsWith("}")) {\r
832 return true;\r
833 }\r
834\r
835 return false;\r
bc262841 836\r
4276d5da 837 }\r
99d2c3c4 838\r
bc262841 839 public String getStringTypeString () {\r
6ff7a41c 840 return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
32648c62 841 }\r
878ddf1f 842}\r
843\r
844\r
845\r
846\r