/** @file | |
UsageInstance class. | |
This class indicate an usage instance for a PCD token. This instance maybe a module | |
or platform setting. When a module produce or cosume a PCD token, then this module | |
is an usage instance for this PCD token. | |
Copyright (c) 2006, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
package org.tianocore.build.pcd.entity; | |
import java.util.UUID; | |
import org.tianocore.build.autogen.CommonDefinition; | |
import org.tianocore.build.pcd.action.ActionMessage; | |
import org.tianocore.build.pcd.exception.EntityException; | |
/** | |
This class indicate an usage instance for a PCD token. This instance maybe a module | |
or platform setting. When a module produce or cosume a PCD token, then this module | |
is an usage instance for this PCD token. | |
**/ | |
public class UsageInstance { | |
/// | |
/// The module type of usage instance. | |
/// | |
public enum MODULE_TYPE {SEC, PEI_CORE, PEIM, DXE_CORE, DXE_DRIVERS, OTHER_COMPONENTS} | |
/// | |
/// This parent that this usage instance belongs to. | |
/// | |
public Token parentToken; | |
/// | |
/// The name of the module who contains this PCD. | |
/// | |
public String moduleName; | |
/// | |
/// The GUID of the module who contains this PCD. | |
/// | |
public UUID moduleGUID; | |
/// | |
/// The name of the package whose module contains this PCD. | |
/// | |
public String packageName; | |
/// | |
/// The GUID of the package whose module contains this PCD. | |
/// | |
public UUID packageGUID; | |
/// | |
/// The PCD type defined for module | |
/// | |
public Token.PCD_TYPE modulePcdType; | |
/// | |
/// The arch string of module contains this PCD | |
/// | |
public String arch; | |
/// | |
/// The version of module contains this PCD | |
/// | |
public String version; | |
/// | |
/// The module type for this usage instance. | |
/// | |
public MODULE_TYPE moduleType; | |
/// | |
/// The value of the PCD in this usage instance. | |
/// | |
public Object datum; | |
/// | |
/// Autogen string for header file. | |
/// | |
public String hAutogenStr; | |
/** | |
* Auotgen string for C code file. | |
*/ | |
public String cAutogenStr; | |
/** | |
Constructure function | |
@param parentToken Member variable. | |
@param pcdType Member variable. | |
@param moduleName Member variable. | |
@param moduleGUID Member variable. | |
@param packageName Member variable. | |
@param packageGUID Member variable. | |
@param moduleType Member variable. | |
@param modulePcdType Member variable. | |
@param arch Member variable. | |
@param version Member variable. | |
@param value Member variable. | |
**/ | |
public UsageInstance (Token parentToken, | |
Token.PCD_TYPE pcdType, | |
String moduleName, | |
UUID moduleGUID, | |
String packageName, | |
UUID packageGUID, | |
MODULE_TYPE moduleType, | |
Token.PCD_TYPE modulePcdType, | |
String arch, | |
String version, | |
Object value) { | |
this.parentToken = parentToken; | |
this.moduleName = moduleName; | |
this.moduleGUID = moduleGUID; | |
this.packageName = packageName; | |
this.packageGUID = packageGUID; | |
this.moduleType = moduleType; | |
this.modulePcdType = modulePcdType; | |
this.arch = arch; | |
this.version = version; | |
this.datum = value; | |
this.modulePcdType = pcdType; | |
} | |
/** | |
Get the primary key for usage instance array for every token. | |
@param moduleName the name of module | |
@param moduleGUID the GUID name of module | |
@param packageName the name of package who contains this module | |
@param packageGUID the GUID name of package | |
@param arch the archtecture string | |
@param version the version of this module | |
@return String primary key | |
*/ | |
public static String getPrimaryKey(String moduleName, | |
UUID moduleGUID, | |
String packageName, | |
UUID packageGUID, | |
String arch, | |
String version) { | |
// | |
// Because currently transition schema not require write moduleGuid, package Name, Packge GUID in | |
// <ModuleSA> section, So currently no expect all paramter must be valid. | |
return (moduleName + "_" + | |
((moduleGUID != null) ? moduleGUID.toString() : "NullModuleGuid") + "_" + | |
((packageName != null) ? packageName : "NullPackageName") + "_" + | |
((packageGUID != null) ? packageGUID.toString() : "NullPackageGuid") + "_" + | |
((arch != null) ? arch : "NullArch") + "_" + | |
((version != null) ? version : "NullVersion")); | |
} | |
/** | |
Get primary key string for this usage instance | |
@return String primary key string | |
**/ | |
public String getPrimaryKey() { | |
return UsageInstance.getPrimaryKey(moduleName, moduleGUID, packageName, packageGUID, arch, version); | |
} | |
/** | |
Judget whether current module is PEI driver | |
@return boolean | |
*/ | |
public boolean isPeiPhaseComponent() { | |
if ((moduleType == MODULE_TYPE.PEI_CORE) || | |
(moduleType == MODULE_TYPE.PEIM)) { | |
return true; | |
} | |
return false; | |
} | |
/** | |
Generate autogen string for header file and C code file. | |
@throws EntityException Fail to generate. | |
@param isBuildUsedLibrary whether the autogen is for library. | |
*/ | |
public void generateAutoGen(boolean isBuildUsedLibrary) | |
throws EntityException { | |
hAutogenStr = ""; | |
cAutogenStr = ""; | |
hAutogenStr += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n", | |
parentToken.cName, parentToken.tokenNumber); | |
switch(modulePcdType) { | |
case FEATURE_FLAG: | |
if(isBuildUsedLibrary) { | |
hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n", | |
parentToken.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} else { | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", | |
parentToken.cName); | |
cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const BOOLEAN _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n", | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} | |
break; | |
case FIXED_AT_BUILD: | |
if(isBuildUsedLibrary) { | |
hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} else { | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const %s _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} | |
break; | |
case PATCHABLE_IN_MODULE: | |
if(isBuildUsedLibrary) { | |
hAutogenStr += String.format("extern %s _gPcd_BinaryPatch_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} else { | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern %s _gPcd_BinaryPatch_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED %s _gPcd_BinaryPatch_%s = _PCD_VALUE_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} | |
break; | |
case DYNAMIC: | |
switch(parentToken.pcdType) { | |
case FEATURE_FLAG: | |
if(isBuildUsedLibrary) { | |
hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} else { | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", | |
parentToken.cName); | |
cAutogenStr += String.format("const BOOLEAN _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n", | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} | |
break; | |
case FIXED_AT_BUILD: | |
if(isBuildUsedLibrary) { | |
hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} else { | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
cAutogenStr += String.format("const %s _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
} | |
break; | |
case PATCHABLE_IN_MODULE: | |
hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n", | |
parentToken.cName, | |
datum.toString()); | |
hAutogenStr += String.format("extern %s _gPcd_BinaryPatch_%s;\r\n", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
cAutogenStr += String.format("%s _gPcd_BinaryPatch_%s = _PCD_VALUE_%s;", | |
Token.getAutogendatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
parentToken.cName); | |
break; | |
case DYNAMIC: | |
hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_TOKEN_%s)\r\n", | |
Token.GetAutogenDefinedatumTypeString(parentToken.datumType), | |
parentToken.cName, | |
Token.getAutogenLibrarydatumTypeString(parentToken.datumType), | |
parentToken.cName); | |
break; | |
default: | |
throw new EntityException ("The PCD type is unknown"); | |
} | |
break; | |
case DYNAMIC_EX: | |
break; | |
} | |
} | |
/** | |
Get the autogen string for header file. | |
@return The string of header file. | |
**/ | |
public String getHAutogenStr() { | |
return hAutogenStr; | |
} | |
/** | |
Get the autogen string for C code file. | |
@return The string of C Code file. | |
**/ | |
public String getCAutogenStr() { | |
return cAutogenStr; | |
} | |
} | |