]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/Token.java
Add in support for MaxSize and CurrentSize for PCD entry.
[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
282 "in modules PcdPeim in <ModuleSA> to make sure no duplicated definitions!",\r
283 usageInstance.parentToken.cName,\r
284 usageInstance.moduleName);\r
285 throw new EntityException(exceptionStr);\r
878ddf1f 286 }\r
287\r
8840ad58 288 consumers.put(usageInstance.getPrimaryKey(), usageInstance);\r
878ddf1f 289 return true;\r
290 }\r
291\r
292 /**\r
8840ad58 293 Judge whether exist an usage instance for this token\r
294 \r
295 @param moduleName the name of module\r
296 @param moduleGuid the GUID name of modules\r
297 @param packageName the name of package contains this module\r
298 @param packageGuid the GUID name of package contains this module\r
299 @param arch the architecture string\r
300 @param version the version string\r
301 \r
302 @return boolean whether exist an usage instance for this token.\r
303 */\r
304 public boolean isUsageInstanceExist(String moduleName,\r
305 UUID moduleGuid,\r
306 String packageName,\r
307 UUID packageGuid,\r
308 String arch,\r
309 String version) {\r
310 String keyStr = UsageInstance.getPrimaryKey(moduleName, \r
311 moduleGuid, \r
312 packageName, \r
313 packageGuid, \r
314 arch, \r
315 version);\r
316 return (consumers.get(keyStr) != null);\r
878ddf1f 317 }\r
318\r
319 /**\r
320 Get the PCD_TYPE according to the string of PCD_TYPE\r
321 \r
322 @param pcdTypeStr The string of PCD_TYPE\r
323 \r
324 @return PCD_TYPE\r
325 **/\r
326 public static PCD_TYPE getpcdTypeFromString(String pcdTypeStr) {\r
327 if (pcdTypeStr == null) {\r
328 return PCD_TYPE.UNKNOWN;\r
329 }\r
330\r
331 if (pcdTypeStr.equalsIgnoreCase("FEATURE_FLAG")) {\r
332 return PCD_TYPE.FEATURE_FLAG;\r
333 } else if (pcdTypeStr.equalsIgnoreCase("FIXED_AT_BUILD")) {\r
334 return PCD_TYPE.FIXED_AT_BUILD;\r
335 } else if (pcdTypeStr.equalsIgnoreCase("PATCHABLE_IN_MODULE")) {\r
336 return PCD_TYPE.PATCHABLE_IN_MODULE;\r
337 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC")) {\r
338 return PCD_TYPE.DYNAMIC;\r
339 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC_EX")) {\r
340 return PCD_TYPE.DYNAMIC_EX;\r
341 } else {\r
342 return PCD_TYPE.UNKNOWN;\r
343 }\r
344 }\r
345\r
346 /**\r
347 Get the string of given datumType. This string will be used for generating autogen files\r
348 \r
349 @param datumType Given datumType\r
350 \r
351 @return The string of datum type.\r
352 **/\r
353 public static String getStringOfdatumType(DATUM_TYPE datumType) {\r
354 switch (datumType) {\r
355 case UINT8:\r
356 return "UINT8";\r
357 case UINT16:\r
358 return "UINT16";\r
359 case UINT32:\r
360 return "UINT32";\r
361 case UINT64:\r
362 return "UINT64";\r
363 case POINTER:\r
364 return "POINTER";\r
365 case BOOLEAN:\r
366 return "BOOLEAN";\r
367 }\r
368 return "UNKNOWN";\r
369 }\r
370\r
371 /**\r
372 Get the datumType according to a string.\r
373 \r
374 @param datumTypeStr The string of datumType\r
375 \r
376 @return DATUM_TYPE\r
377 **/\r
378 public static DATUM_TYPE getdatumTypeFromString(String datumTypeStr) {\r
379 if (datumTypeStr.equalsIgnoreCase("UINT8")) {\r
380 return DATUM_TYPE.UINT8;\r
381 } else if (datumTypeStr.equalsIgnoreCase("UINT16")) {\r
382 return DATUM_TYPE.UINT16;\r
383 } else if (datumTypeStr.equalsIgnoreCase("UINT32")) {\r
384 return DATUM_TYPE.UINT32;\r
385 } else if (datumTypeStr.equalsIgnoreCase("UINT64")) {\r
386 return DATUM_TYPE.UINT64;\r
387 } else if (datumTypeStr.equalsIgnoreCase("VOID*")) {\r
388 return DATUM_TYPE.POINTER;\r
389 } else if (datumTypeStr.equalsIgnoreCase("BOOLEAN")) {\r
390 return DATUM_TYPE.BOOLEAN;\r
391 }\r
392 return DATUM_TYPE.UNKNOWN;\r
393 }\r
394\r
395 /**\r
396 Get string of given pcdType\r
397 \r
398 @param pcdType The given PcdType\r
399 \r
400 @return The string of PCD_TYPE.\r
401 **/\r
402 public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
403 switch (pcdType) {\r
404 case FEATURE_FLAG:\r
405 return "FEATURE_FLAG";\r
406 case FIXED_AT_BUILD:\r
407 return "FIXED_AT_BUILD";\r
408 case PATCHABLE_IN_MODULE:\r
409 return "PATCHABLE_IN_MODULE";\r
410 case DYNAMIC:\r
411 return "DYNAMIC";\r
412 case DYNAMIC_EX:\r
413 return "DYNAMIC_EX";\r
414 }\r
415 return "UNKNOWN";\r
416 }\r
417\r
418 /**\r
419 Get the PCD_USAGE according to a string\r
420 \r
421 @param usageStr The string of PCD_USAGE\r
422 \r
423 @return The PCD_USAGE\r
424 **/\r
425 public static PCD_USAGE getUsageFromString(String usageStr) {\r
426 if (usageStr == null) {\r
427 return PCD_USAGE.UNKNOWN;\r
428 }\r
429\r
430 if (usageStr.equalsIgnoreCase("ALWAYS_PRODUCED")) {\r
431 return PCD_USAGE.ALWAYS_PRODUCED;\r
432 } else if (usageStr.equalsIgnoreCase("SOMETIMES_PRODUCED")) {\r
433 return PCD_USAGE.SOMETIMES_PRODUCED;\r
434 } else if (usageStr.equalsIgnoreCase("ALWAYS_CONSUMED")) {\r
435 return PCD_USAGE.ALWAYS_CONSUMED;\r
436 } else if (usageStr.equalsIgnoreCase("SOMETIMES_CONSUMED")) {\r
437 return PCD_USAGE.SOMETIMES_CONSUMED;\r
438 }\r
439\r
440 return PCD_USAGE.UNKNOWN;\r
441 }\r
442\r
443 /**\r
444 Get the string of given PCD_USAGE\r
445 \r
446 @param usage The given PCD_USAGE\r
447 \r
448 @return The string of PDC_USAGE.\r
449 **/\r
450 public static String getStringOfUsage(PCD_USAGE usage) {\r
451 switch (usage) {\r
452 case ALWAYS_PRODUCED:\r
453 return "ALWAYS_PRODUCED";\r
454 case ALWAYS_CONSUMED:\r
455 return "ALWAYS_CONSUMED";\r
456 case SOMETIMES_PRODUCED:\r
457 return "SOMETIMES_PRODUCED";\r
458 case SOMETIMES_CONSUMED:\r
459 return "SOMETIMES_CONSUMED";\r
460 }\r
461 return "UNKNOWN";\r
462 }\r
463\r
464 /**\r
465 Get the Defined datumType string for autogen. The string is for generating some MACROs in Autogen.h\r
466 \r
467 @param datumType The given datumType\r
468\r
469 @return string of datum type for autogen.\r
470 **/\r
471 public static String GetAutogenDefinedatumTypeString(DATUM_TYPE datumType) {\r
472 switch (datumType) {\r
473 \r
474 case UINT8:\r
475 return "8";\r
476 case UINT16:\r
477 return "16";\r
478 case BOOLEAN:\r
479 return "BOOL";\r
480 case POINTER:\r
481 return "PTR";\r
482 case UINT32:\r
483 return "32";\r
484 case UINT64:\r
485 return "64";\r
486 default:\r
487 return null;\r
488 }\r
489 }\r
490\r
491 /**\r
492 Get the datumType String for Autogen. This string will be used for generating defintions of PCD token in autogen\r
493 \r
494 @param datumType The given datumType\r
495\r
496 @return string of datum type.\r
497 **/\r
58f1099f 498\r
878ddf1f 499 public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
500 switch (datumType) {\r
501 case UINT8:\r
502 return "UINT8";\r
503 case UINT16:\r
504 return "UINT16";\r
505 case UINT32:\r
506 return "UINT32";\r
507 case UINT64:\r
508 return "UINT64";\r
509 case POINTER:\r
510 return "VOID*";\r
511 case BOOLEAN:\r
512 return "BOOLEAN";\r
513 }\r
514 return null;\r
515 }\r
516\r
517 /**\r
518 Get the datumType string for generating some MACROs in autogen file of Library\r
519 \r
520 @param datumType The given datumType\r
521\r
522 @return String of datum for genrating bit charater.\r
523 **/\r
524 public static String getAutogenLibrarydatumTypeString(DATUM_TYPE datumType) {\r
525 switch (datumType) {\r
526 case UINT8:\r
527 return "8";\r
528 case UINT16:\r
529 return "16";\r
530 case BOOLEAN:\r
531 return "Bool";\r
532 case POINTER:\r
533 return "Ptr";\r
534 case UINT32:\r
535 return "32";\r
536 case UINT64:\r
537 return "64";\r
538 default:\r
539 return null;\r
540 }\r
541 }\r
542\r
543 /**\r
544 UUID defined in Schems is object, this function is to tranlate this object \r
545 to UUID data.\r
546 \r
547 @param uuidObj The object comes from schema.\r
548 \r
549 @return The traslated UUID instance.\r
550 **/\r
551 public static UUID getGUIDFromSchemaObject(Object uuidObj) {\r
552 UUID uuid;\r
553 if (uuidObj.toString().equalsIgnoreCase("0")) {\r
554 uuid = new UUID(0,0);\r
555 } else {\r
556 uuid = UUID.fromString(uuidObj.toString());\r
557 }\r
558\r
559 return uuid;\r
560 }\r
99d2c3c4 561\r
6ff7a41c 562 public DynamicTokenValue getDefaultSku() {\r
563 DynamicTokenValue dynamicData;\r
564 int index;\r
565 for (index = 0; index < this.skuData.size(); index ++) {\r
566 if (skuData.get(index).id == 0) {\r
567 return skuData.get(index).value;\r
568 }\r
569 }\r
570\r
571 return null;\r
572 }\r
58f1099f 573 \r
574 public int getSkuIdCount () {\r
575 return this.skuData.size();\r
576 }\r
1de04b4f 577\r
578 private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
579 if (isValidNullValue(str)) {\r
580 al.add(new Integer(0));\r
581 } else {\r
582 //\r
583 // isValidNullValue has already make sure that str here\r
584 // always contain a valid default value of the following 3\r
585 // cases:\r
586 // 1) "Hello world" //Assci string\r
587 // 2) L"Hello" //Unicode string\r
588 // 3) {0x01, 0x02, 0x03} //Byte stream\r
589 //\r
590 if (str.startsWith("\"")) {\r
591 al.add(new Integer(str.length() - 2));\r
592 } else if (str.startsWith("L\"")){\r
593 //\r
594 // Unicode is 2 bytes each.\r
595 //\r
596 al.add(new Integer((str.length() - 3) * 2));\r
597 } else if (str.startsWith("{")) {\r
598 //\r
599 // We count the number of "," in the string.\r
600 // The number of byte is one plus the number of \r
601 // comma.\r
602 //\r
603 String str2 = str;\r
604 \r
605 int cnt = 0;\r
606 int pos = 0;\r
607 pos = str2.indexOf(",", 0);\r
608 while (pos != -1) {\r
609 cnt++;\r
610 pos++;\r
611 pos = str2.indexOf(",", pos);\r
612 }\r
613 cnt++;\r
614 al.add(new Integer(cnt));\r
615 }\r
616 }\r
617 }\r
618 //\r
619 // This method can be used to get the MAX and current size\r
620 // for pointer type dynamic(ex) PCD entry\r
621 //\r
622 public ArrayList<Integer> getPointerTypeSize () {\r
623 ArrayList<Integer> al = new ArrayList<Integer>();\r
624 \r
625 //\r
626 // For VPD_enabled and HII_enabled, we can only return the MAX size.\r
627 // For the default DATA type dynamic PCD entry, we will return\r
628 // the MAX size and current size for each SKU_ID.\r
629 //\r
630 al.add(new Integer(this.datumSize));\r
631 \r
632 if (!this.isVpdEnable()) {\r
633 int idx;\r
634 if (this.isHiiEnable()){\r
635 for (idx = 0; idx < this.skuData.size(); idx++) {\r
636 String str = this.skuData.get(idx).value.hiiDefaultValue;\r
637 getCurrentSizeFromDefaultValue(str, al);\r
638 }\r
639 } else {\r
640 for (idx = 0; idx < this.skuData.size(); idx++) {\r
641 String str = this.skuData.get(idx).value.value;\r
642 getCurrentSizeFromDefaultValue(str, al);\r
643 }\r
644 }\r
645 }\r
646 \r
647 return al;\r
648 }\r
f63ef4b2 649\r
650 /**\r
651 Get default value for a token, For HII type, HiiDefaultValue of default\r
652 SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
653 0 will be returned.\r
654 \r
655 @return String\r
656 */\r
657 public String getDynamicDefaultValue() {\r
658 DynamicTokenValue dynamicData = getDefaultSku();\r
659 if (hasDefaultValue()) {\r
660 switch (dynamicData.type) {\r
f63ef4b2 661 case DEFAULT_TYPE:\r
662 return dynamicData.value;\r
663 }\r
664 }\r
665\r
666 return null;\r
667 }\r
668\r
99d2c3c4 669 //\r
670 // BugBug: We need change this algorithm accordingly when schema is updated\r
671 // to support no default value.\r
672 //\r
673 public boolean hasDefaultValue () {\r
6ff7a41c 674 int value = 0;\r
675 boolean isInteger = true;\r
676 DynamicTokenValue dynamicValue = null;\r
677\r
58f1099f 678 if (isSkuEnable()) {\r
679 return true;\r
680 }\r
681 \r
6ff7a41c 682 if (this.isDynamicPCD) {\r
683 dynamicValue = getDefaultSku();\r
684 switch (dynamicValue.type) {\r
685 case HII_TYPE:\r
58f1099f 686 return true;\r
6ff7a41c 687 case VPD_TYPE:\r
58f1099f 688 return true;\r
6ff7a41c 689 case DEFAULT_TYPE:\r
6f7e61a0 690 return !isValidNullValue(dynamicValue.value);\r
691 }\r
692 }\r
693\r
694 return false;\r
695 }\r
6ff7a41c 696\r
6f7e61a0 697 public boolean isValidNullValue(String judgedValue) {\r
e59cdca8 698 String subStr;\r
6f7e61a0 699 BigInteger bigIntValue;\r
700\r
701 switch (datumType) {\r
702 case UINT8:\r
703 case UINT16:\r
704 case UINT32:\r
e59cdca8 705 if (judgedValue.length() > 2) {\r
706 if ((judgedValue.charAt(0) == '0') && \r
707 ((judgedValue.charAt(1) == 'x') || (judgedValue.charAt(1) == 'X'))){\r
708 subStr = judgedValue.substring(2, judgedValue.length());\r
709 bigIntValue = new BigInteger(subStr, 16);\r
710 } else {\r
711 bigIntValue = new BigInteger(judgedValue);\r
712 }\r
713 } else {\r
714 bigIntValue = new BigInteger(judgedValue);\r
715 }\r
716 if (bigIntValue.bitCount() == 0) {\r
6f7e61a0 717 return true;\r
718 }\r
719 break;\r
720 case UINT64:\r
721 if (judgedValue.length() > 2){\r
722 if ((judgedValue.charAt(0) == '0') && \r
723 ((judgedValue.charAt(1) == 'x') ||\r
724 (judgedValue.charAt(1) == 'X'))) {\r
725 bigIntValue = new BigInteger(judgedValue.substring(2, judgedValue.length()), 16);\r
726 if (bigIntValue.bitCount() == 0) {\r
727 return true;\r
728 }\r
6ff7a41c 729 } else {\r
6f7e61a0 730 bigIntValue = new BigInteger(judgedValue);\r
731 if (bigIntValue.bitCount() == 0) {\r
732 return true;\r
733 }\r
734 }\r
735 } else {\r
736 bigIntValue = new BigInteger(judgedValue);\r
737 if (bigIntValue.bitCount() == 0) {\r
6ff7a41c 738 return true;\r
739 }\r
6f7e61a0 740 }\r
741 break;\r
742 case BOOLEAN:\r
743 if (judgedValue.equalsIgnoreCase("false")) {\r
744 return true;\r
745 }\r
746 break;\r
747 case POINTER:\r
748 if (judgedValue.equalsIgnoreCase("") ||\r
749 judgedValue.equalsIgnoreCase("\"\"") ||\r
750 judgedValue.equalsIgnoreCase("L\"\"") ||\r
751 (judgedValue.length() == 0) ||\r
752 judgedValue.equalsIgnoreCase("{}")) {\r
753 return true;\r
6ff7a41c 754 }\r
32648c62 755 }\r
6ff7a41c 756 return false;\r
99d2c3c4 757 }\r
bb5545b6 758 \r
759 public boolean isHiiDefaultValueUnicodeStringType() {\r
760 DynamicTokenValue dynamicData = getDefaultSku();\r
761 \r
762 if (dynamicData == null)\r
763 return false;\r
764 \r
765 return dynamicData.hiiDefaultValue.startsWith("L\"")\r
766 && dynamicData.hiiDefaultValue.endsWith("\"");\r
767 }\r
768 \r
769 public boolean isHiiDefaultValueASCIIStringType() {\r
770 DynamicTokenValue dynamicData = getDefaultSku();\r
771 \r
772 if (dynamicData == null)\r
773 return false;\r
774 \r
775 return dynamicData.hiiDefaultValue.startsWith("\"")\r
776 && dynamicData.hiiDefaultValue.endsWith("\"");\r
777 }\r
778 \r
f63ef4b2 779 /**\r
780 Judege whether current value is UNICODE string type.\r
781 @return boolean\r
782 */\r
783 public boolean isUnicodeStringType () {\r
784 String str = getDynamicDefaultValue();\r
785\r
786 if (str == null) {\r
787 return false;\r
788 }\r
99d2c3c4 789\r
f63ef4b2 790 if (datumType == Token.DATUM_TYPE.POINTER &&\r
791 str.startsWith("L\"") && \r
792 str.endsWith("\"")) {\r
32648c62 793 return true;\r
794 }\r
99d2c3c4 795\r
32648c62 796 return false;\r
797 }\r
4276d5da 798 \r
3534cbb7 799 public boolean isASCIIStringType () {\r
800 String str = getDynamicDefaultValue();\r
801\r
802 if (str == null) {\r
803 return false;\r
804 }\r
805\r
806 if (datumType == Token.DATUM_TYPE.POINTER &&\r
807 str.startsWith("\"") && \r
808 str.endsWith("\"")) {\r
809 return true;\r
810 }\r
811\r
812 return false;\r
813 }\r
814\r
4276d5da 815 public boolean isByteStreamType () {\r
816 String str = getDynamicDefaultValue();\r
817\r
818 if (str == null) {\r
819 return false;\r
820 }\r
821\r
822 if (datumType == Token.DATUM_TYPE.POINTER &&\r
823 str.startsWith("{") && \r
824 str.endsWith("}")) {\r
825 return true;\r
826 }\r
827\r
828 return false;\r
829 \r
830 }\r
99d2c3c4 831\r
32648c62 832 public String getStringTypeString () { \r
6ff7a41c 833 return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
32648c62 834 }\r
878ddf1f 835}\r
836\r
837\r
838\r
839\r