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