4 This module contains all classes releted to PCD token.
6 Copyright (c) 2006, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 package org
.tianocore
.build
.pcd
.entity
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
20 import java
.util
.UUID
;
22 import java
.util
.HashMap
;
24 import org
.tianocore
.build
.pcd
.action
.ActionMessage
;
25 import org
.tianocore
.build
.pcd
.exception
.EntityException
;
27 /** This class is to descript a PCD token object. The information of a token mainly
28 comes from MSA, SPD and setting produced by platform developer.
32 /// Enumeration macro defintion for PCD type.
33 /// BUGBUG: Not use upcase charater is to facility for reading. It may be changed
35 public enum PCD_TYPE
{FEATURE_FLAG
, FIXED_AT_BUILD
, PATCHABLE_IN_MODULE
, DYNAMIC
,
39 /// Enumeration macro definition for datum type. All type mainly comes from ProcessBind.h.
40 /// Wizard maybe expand this type as "int, unsigned int, short, unsigned short etc" in
43 public enum DATUM_TYPE
{UINT8
, UINT16
, UINT32
, UINT64
, BOOLEAN
, POINTER
, UNKNOWN
}
46 /// Enumeration macor defintion for usage of PCD
48 public enum PCD_USAGE
{ALWAYS_PRODUCED
, ALWAYS_CONSUMED
, SOMETIMES_PRODUCED
,
49 SOMETIMES_CONSUMED
, UNKNOWN
}
52 /// cName is to identify a PCD entry and will be used for generating autogen.h/autogen.c.
53 /// cName will be defined in MSA, SPD and FPD, can be regarded as primary key with token space guid.
58 /// Token space name is the guid defined by token itself in package or module level. This
59 /// name mainly for DynamicEx type. For other PCD type token, his token space name is the
60 /// assignedtokenSpaceName as follows.
61 /// tokenSpaceName is defined in MSA, SPD, FPD, can be regarded as primary key with cName.
63 public UUID tokenSpaceName
;
66 /// tokenNumber is allocated by platform. tokenNumber indicate an index for this token in
67 /// platform token space.
68 /// tokenNumber is defined in SPD, FPD.
70 public int tokenNumber
;
73 /// All supported PCD type, this value can be retrieved from SPD
74 /// Currently, only record all PCD type for this token in FPD file.
76 public List
<PCD_TYPE
> supportedPcdType
;
79 /// If the token's item type is Dynamic or DynamicEx type, isDynamicPCD
82 public boolean isDynamicPCD
;
85 /// datumSize is to descript the fix size or max size for this token.
86 /// datumSize is defined in SPD.
91 /// datum type is to descript what type can be expressed by a PCD token.
92 /// For same PCD used in different module, the datum type should be unique.
93 /// So it belong memeber to Token class.
95 public DATUM_TYPE datumType
;
98 /// skuData contains all value for SkuNumber of token.
99 /// This field is for Dynamic or DynamicEx type PCD,
101 public List
<SkuInstance
> skuData
;
104 /// consumers array record all module private information who consume this PCD token.
106 public Map
<String
, UsageInstance
> consumers
;
108 public Token(String cName
, UUID tokenSpaceName
) {
109 UUID nullUUID
= new UUID(0, 0);
112 this.tokenSpaceName
= (tokenSpaceName
== null) ? nullUUID
: tokenSpaceName
;
113 this.tokenNumber
= 0;
114 this.datumType
= DATUM_TYPE
.UNKNOWN
;
116 this.skuData
= new ArrayList
<SkuInstance
>();
118 this.consumers
= new HashMap
<String
, UsageInstance
>();
119 this.supportedPcdType
= new ArrayList
<PCD_TYPE
>();
125 SupportPcdType should be gotten from SPD file actually, but now it just
126 record all PCD type for this token in FPD file.
128 @param pcdType new PCD type found in FPD file for this token.
130 public void updateSupportPcdType(PCD_TYPE pcdType
) {
132 boolean found
= false;
133 for (index
= 0; index
< this.supportedPcdType
.size(); index
++) {
134 if (this.supportedPcdType
.get(index
) == pcdType
) {
140 this.supportedPcdType
.add(pcdType
);
145 Judge whether pcdType is belong to dynamic type. Dynamic type includes
146 DYNAMIC and DYNAMIC_EX.
152 public static boolean isDynamic(PCD_TYPE pcdType
) {
153 if ((pcdType
== PCD_TYPE
.DYNAMIC
) ||
154 (pcdType
== PCD_TYPE
.DYNAMIC_EX
)) {
162 Use "TokencName + "-" + SpaceTokenName" as primary key when adding token into database
164 @param cName Token name.
165 @param tokenSpaceName The token space guid defined in MSA or SPD
166 @param platformtokenSpaceName The token space guid for current platform token space,
168 @return primary key for this token in token database.
170 public static String
getPrimaryKeyString(String cName
, UUID tokenSpaceName
) {
171 UUID nullUUID
= new UUID(0, 0);
173 if (tokenSpaceName
== null) {
174 return cName
+ "_" + nullUUID
.toString().replace('-', '_');
176 return cName
+ "_" + tokenSpaceName
.toString().replace('-', '_');
181 If skudata list contains more than one data, then Sku mechanism is enable.
185 public boolean isSkuEnable() {
186 if (this.skuData
.size() > 1) {
193 Get the token primary key in token database.
197 public String
getPrimaryKeyString () {
198 return Token
.getPrimaryKeyString(cName
, tokenSpaceName
);
202 Judge datumType is valid
204 @param type The datumType want to be judged.
206 @retval TRUE - The type is valid.
207 @retval FALSE - The type is invalid.
209 public static boolean isValiddatumType(DATUM_TYPE type
) {
210 if ((type
.ordinal() < DATUM_TYPE
.UINT8
.ordinal() ) ||
211 (type
.ordinal() > DATUM_TYPE
.POINTER
.ordinal())) {
218 Judge pcdType is valid
220 @param type The PCdType want to be judged.
222 @retval TRUE - The type is valid.
223 @retval FALSE - The type is invalid.
225 public static boolean isValidpcdType(PCD_TYPE type
) {
226 if ((type
.ordinal() < PCD_TYPE
.FEATURE_FLAG
.ordinal() ) ||
227 (type
.ordinal() > PCD_TYPE
.DYNAMIC_EX
.ordinal())) {
234 Add an usage instance for token
236 @param usageInstance The usage instance
238 @retval TRUE - Success to add usage instance.
239 @retval FALSE - Fail to add usage instance
241 public boolean addUsageInstance(UsageInstance usageInstance
)
242 throws EntityException
{
245 if (isUsageInstanceExist(usageInstance
.moduleName
,
246 usageInstance
.moduleGUID
,
247 usageInstance
.packageName
,
248 usageInstance
.packageGUID
,
250 usageInstance
.version
)) {
251 exceptionStr
= String
.format("PCD %s for module %s has already exist in database, Please check all PCD build entries "+
252 "in modules PcdPeim in <ModuleSA> to make sure no duplicated definitions!",
253 usageInstance
.parentToken
.cName
,
254 usageInstance
.moduleName
);
255 throw new EntityException(exceptionStr
);
258 consumers
.put(usageInstance
.getPrimaryKey(), usageInstance
);
263 Judge whether exist an usage instance for this token
265 @param moduleName the name of module
266 @param moduleGuid the GUID name of modules
267 @param packageName the name of package contains this module
268 @param packageGuid the GUID name of package contains this module
269 @param arch the architecture string
270 @param version the version string
272 @return boolean whether exist an usage instance for this token.
274 public boolean isUsageInstanceExist(String moduleName
,
280 String keyStr
= UsageInstance
.getPrimaryKey(moduleName
,
286 return (consumers
.get(keyStr
) != null);
290 Get the PCD_TYPE according to the string of PCD_TYPE
292 @param pcdTypeStr The string of PCD_TYPE
296 public static PCD_TYPE
getpcdTypeFromString(String pcdTypeStr
) {
297 if (pcdTypeStr
== null) {
298 return PCD_TYPE
.UNKNOWN
;
301 if (pcdTypeStr
.equalsIgnoreCase("FEATURE_FLAG")) {
302 return PCD_TYPE
.FEATURE_FLAG
;
303 } else if (pcdTypeStr
.equalsIgnoreCase("FIXED_AT_BUILD")) {
304 return PCD_TYPE
.FIXED_AT_BUILD
;
305 } else if (pcdTypeStr
.equalsIgnoreCase("PATCHABLE_IN_MODULE")) {
306 return PCD_TYPE
.PATCHABLE_IN_MODULE
;
307 } else if (pcdTypeStr
.equalsIgnoreCase("DYNAMIC")) {
308 return PCD_TYPE
.DYNAMIC
;
309 } else if (pcdTypeStr
.equalsIgnoreCase("DYNAMIC_EX")) {
310 return PCD_TYPE
.DYNAMIC_EX
;
312 return PCD_TYPE
.UNKNOWN
;
317 Get the string of given datumType. This string will be used for generating autogen files
319 @param datumType Given datumType
321 @return The string of datum type.
323 public static String
getStringOfdatumType(DATUM_TYPE datumType
) {
342 Get the datumType according to a string.
344 @param datumTypeStr The string of datumType
348 public static DATUM_TYPE
getdatumTypeFromString(String datumTypeStr
) {
349 if (datumTypeStr
.equalsIgnoreCase("UINT8")) {
350 return DATUM_TYPE
.UINT8
;
351 } else if (datumTypeStr
.equalsIgnoreCase("UINT16")) {
352 return DATUM_TYPE
.UINT16
;
353 } else if (datumTypeStr
.equalsIgnoreCase("UINT32")) {
354 return DATUM_TYPE
.UINT32
;
355 } else if (datumTypeStr
.equalsIgnoreCase("UINT64")) {
356 return DATUM_TYPE
.UINT64
;
357 } else if (datumTypeStr
.equalsIgnoreCase("VOID*")) {
358 return DATUM_TYPE
.POINTER
;
359 } else if (datumTypeStr
.equalsIgnoreCase("BOOLEAN")) {
360 return DATUM_TYPE
.BOOLEAN
;
362 return DATUM_TYPE
.UNKNOWN
;
366 Get string of given pcdType
368 @param pcdType The given PcdType
370 @return The string of PCD_TYPE.
372 public static String
getStringOfpcdType(PCD_TYPE pcdType
) {
375 return "FEATURE_FLAG";
377 return "FIXED_AT_BUILD";
378 case PATCHABLE_IN_MODULE
:
379 return "PATCHABLE_IN_MODULE";
389 Get the PCD_USAGE according to a string
391 @param usageStr The string of PCD_USAGE
393 @return The PCD_USAGE
395 public static PCD_USAGE
getUsageFromString(String usageStr
) {
396 if (usageStr
== null) {
397 return PCD_USAGE
.UNKNOWN
;
400 if (usageStr
.equalsIgnoreCase("ALWAYS_PRODUCED")) {
401 return PCD_USAGE
.ALWAYS_PRODUCED
;
402 } else if (usageStr
.equalsIgnoreCase("SOMETIMES_PRODUCED")) {
403 return PCD_USAGE
.SOMETIMES_PRODUCED
;
404 } else if (usageStr
.equalsIgnoreCase("ALWAYS_CONSUMED")) {
405 return PCD_USAGE
.ALWAYS_CONSUMED
;
406 } else if (usageStr
.equalsIgnoreCase("SOMETIMES_CONSUMED")) {
407 return PCD_USAGE
.SOMETIMES_CONSUMED
;
410 return PCD_USAGE
.UNKNOWN
;
414 Get the string of given PCD_USAGE
416 @param usage The given PCD_USAGE
418 @return The string of PDC_USAGE.
420 public static String
getStringOfUsage(PCD_USAGE usage
) {
422 case ALWAYS_PRODUCED
:
423 return "ALWAYS_PRODUCED";
424 case ALWAYS_CONSUMED
:
425 return "ALWAYS_CONSUMED";
426 case SOMETIMES_PRODUCED
:
427 return "SOMETIMES_PRODUCED";
428 case SOMETIMES_CONSUMED
:
429 return "SOMETIMES_CONSUMED";
435 Get the Defined datumType string for autogen. The string is for generating some MACROs in Autogen.h
437 @param datumType The given datumType
439 @return string of datum type for autogen.
441 public static String
GetAutogenDefinedatumTypeString(DATUM_TYPE datumType
) {
462 Get the datumType String for Autogen. This string will be used for generating defintions of PCD token in autogen
464 @param datumType The given datumType
466 @return string of datum type.
468 public static String
getAutogendatumTypeString(DATUM_TYPE datumType
) {
487 Get the datumType string for generating some MACROs in autogen file of Library
489 @param datumType The given datumType
491 @return String of datum for genrating bit charater.
493 public static String
getAutogenLibrarydatumTypeString(DATUM_TYPE datumType
) {
513 UUID defined in Schems is object, this function is to tranlate this object
516 @param uuidObj The object comes from schema.
518 @return The traslated UUID instance.
520 public static UUID
getGUIDFromSchemaObject(Object uuidObj
) {
522 if (uuidObj
.toString().equalsIgnoreCase("0")) {
523 uuid
= new UUID(0,0);
525 uuid
= UUID
.fromString(uuidObj
.toString());
531 public DynamicTokenValue
getDefaultSku() {
532 DynamicTokenValue dynamicData
;
534 for (index
= 0; index
< this.skuData
.size(); index
++) {
535 if (skuData
.get(index
).id
== 0) {
536 return skuData
.get(index
).value
;
543 // BugBug: We need change this algorithm accordingly when schema is updated
544 // to support no default value.
546 public boolean hasDefaultValue () {
548 boolean isInteger
= true;
549 DynamicTokenValue dynamicValue
= null;
551 if (this.isDynamicPCD
) {
552 dynamicValue
= getDefaultSku();
553 switch (dynamicValue
.type
) {
556 value
= Integer
.decode(dynamicValue
.hiiDefaultValue
);
557 } catch (NumberFormatException nfEx
) {
561 if (isInteger
&& (value
== 0)) {
572 value
= Integer
.decode(dynamicValue
.value
);
573 } catch (NumberFormatException nfEx
) {
577 if (isInteger
&& (value
== 0)) {
590 // TODO: Need scott's confirmation
592 public boolean isStringType () {
593 String str
= getDefaultSku().value
;
595 if (datumType
== Token
.DATUM_TYPE
.POINTER
&&
596 str
.startsWith("L\"") &&
597 str
.endsWith("\"")) {
604 public String
getStringTypeString () {
605 return getDefaultSku().value
.substring(2, getDefaultSku().value
.length() - 1);