2 CollectPCDAction class.
4 This action class is to collect PCD information from MSA, SPD, FPD xml file.
5 This class will be used for wizard and build tools, So it can *not* inherit
6 from buildAction or wizardAction.
8 Copyright (c) 2006, Intel Corporation
9 All rights reserved. This program and the accompanying materials
10 are licensed and made available under the terms and conditions of the BSD License
11 which accompanies this distribution. The full text of the license may be found at
12 http://opensource.org/licenses/bsd-license.php
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
15 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 package org
.tianocore
.build
.pcd
.action
;
20 import java
.io
.BufferedReader
;
22 import java
.io
.FileReader
;
23 import java
.io
.IOException
;
24 import java
.math
.BigInteger
;
25 import java
.util
.ArrayList
;
26 import java
.util
.Collections
;
27 import java
.util
.Comparator
;
28 import java
.util
.HashMap
;
29 import java
.util
.Iterator
;
30 import java
.util
.List
;
33 import java
.util
.UUID
;
34 import java
.util
.regex
.Matcher
;
35 import java
.util
.regex
.Pattern
;
37 import org
.apache
.xmlbeans
.XmlException
;
38 import org
.apache
.xmlbeans
.XmlObject
;
39 import org
.tianocore
.DynamicPcdBuildDefinitionsDocument
;
40 import org
.tianocore
.DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
;
41 import org
.tianocore
.DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
;
42 import org
.tianocore
.DynamicPcdBuildDefinitionsDocument
.DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo
;
43 import org
.tianocore
.FrameworkModulesDocument
;
44 import org
.tianocore
.PcdDeclarationsDocument
;
45 import org
.tianocore
.PlatformSurfaceAreaDocument
;
46 import org
.tianocore
.PcdBuildDefinitionDocument
;
47 import org
.tianocore
.PlatformSurfaceAreaDocument
.PlatformSurfaceArea
;
48 import org
.tianocore
.ModuleSADocument
;
49 import org
.tianocore
.ModuleSADocument
.ModuleSA
;
50 import org
.tianocore
.PackageSurfaceAreaDocument
;
51 import org
.tianocore
.PcdBuildDefinitionDocument
.PcdBuildDefinition
;
52 import org
.tianocore
.build
.autogen
.CommonDefinition
;
53 import org
.tianocore
.build
.global
.GlobalData
;
54 import org
.tianocore
.build
.global
.SurfaceAreaQuery
;
55 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
56 import org
.tianocore
.build
.pcd
.action
.ActionMessage
;
57 import org
.tianocore
.build
.pcd
.entity
.DynamicTokenValue
;
58 import org
.tianocore
.build
.pcd
.entity
.MemoryDatabaseManager
;
59 import org
.tianocore
.build
.pcd
.entity
.SkuInstance
;
60 import org
.tianocore
.build
.pcd
.entity
.Token
;
61 import org
.tianocore
.build
.pcd
.entity
.UsageInstance
;
62 import org
.tianocore
.build
.pcd
.exception
.EntityException
;
63 import org
.tianocore
.logger
.EdkLog
;
64 import org
.tianocore
.ModuleTypeDef
;
66 class CStructTypeDeclaration
{
72 public CStructTypeDeclaration (String key
, int alignmentSize
, String cCode
, boolean initTable
) {
74 this.alignmentSize
= alignmentSize
;
76 this.initTable
= initTable
;
81 private ArrayList
<String
> al
;
82 private ArrayList
<String
> alComments
;
86 public StringTable (String phase
) {
88 al
= new ArrayList
<String
>();
89 alComments
= new ArrayList
<String
>();
93 public String
getSizeMacro () {
94 return String
.format(PcdDatabase
.StringTableSizeMacro
, phase
, getSize());
97 private int getSize () {
99 // We have at least one Unicode Character in the table.
101 return len
== 0 ?
1 : len
;
104 public int getTableLen () {
105 return al
.size() == 0 ?
1 : al
.size();
108 public String
getExistanceMacro () {
109 return String
.format(PcdDatabase
.StringTableExistenceMacro
, phase
, (al
.size() == 0)?
"TRUE":"FALSE");
112 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
) {
113 final String stringTable
= "StringTable";
114 final String tab
= "\t";
115 final String newLine
= "\r\n";
116 final String commaNewLine
= ",\r\n";
118 CStructTypeDeclaration decl
;
120 String cDeclCode
= "";
121 String cInstCode
= "";
124 // If we have a empty StringTable
126 if (al
.size() == 0) {
127 cDeclCode
+= String
.format("%-20s%s[1]; /* StringTable is empty */", "UINT16", stringTable
) + newLine
;
128 decl
= new CStructTypeDeclaration (
136 cInstCode
= String
.format("/* %s */", stringTable
) + newLine
+ tab
+ "{ 0 }";
137 instTable
.put(stringTable
, cInstCode
);
141 // If there is any String in the StringTable
143 for (int i
= 0; i
< al
.size(); i
++) {
144 String str
= al
.get(i
);
145 String stringTableName
;
149 // StringTable is a well-known name in the PCD DXE driver
151 stringTableName
= stringTable
;
154 stringTableName
= String
.format("%s_%d", stringTable
, i
);
157 cDeclCode
+= String
.format("%-20s%s[%d]; /* %s */", "UINT16", stringTableName
, str
.length() + 1, alComments
.get(i
)) + newLine
;
160 cInstCode
= "/* StringTable */" + newLine
;
162 cInstCode
+= tab
+ String
.format("L\"%s\" /* %s */", al
.get(i
), alComments
.get(i
));
163 if (i
!= al
.size() - 1) {
164 cInstCode
+= commaNewLine
;
168 decl
= new CStructTypeDeclaration (
176 instTable
.put(stringTable
, cInstCode
);
180 public String
getTypeDeclaration () {
184 final String stringTable
= "StringTable";
185 final String tab
= "\t";
186 final String newLine
= ";\r\n";
188 output
= "/* StringTable */\r\n";
190 if (al
.size() == 0) {
191 output
+= tab
+ String
.format("UINT16 %s[1] /* StringTable is Empty */", stringTable
) + newLine
;
194 for (int i
= 0; i
< al
.size(); i
++) {
195 String str
= al
.get(i
);
199 // StringTable is a well-known name in the PCD DXE driver
201 output
+= tab
+ String
.format("UINT16 %s[%d] /* %s */", stringTable
, str
.length() + 1, alComments
.get(i
)) + newLine
;
203 output
+= tab
+ String
.format("UINT16 %s_%d[%d] /* %s */", stringTable
, i
, str
.length() + 1, alComments
.get(i
)) + newLine
;
211 public ArrayList
<String
> getInstantiation () {
212 ArrayList
<String
> output
= new ArrayList
<String
>();
214 output
.add("/* StringTable */");
216 if (al
.size() == 0) {
221 for (int i
= 0; i
< al
.size(); i
++) {
222 str
= String
.format("L\"%s\" /* %s */", al
.get(i
), alComments
.get(i
));
223 if (i
!= al
.size() - 1) {
233 public int add (String inputStr
, Token token
) {
237 String str
= inputStr
;
240 // The input can be two types:
241 // "L\"Bootmode\"" or "Bootmode".
242 // We drop the L\" and \" for the first type.
243 if (str
.startsWith("L\"") && str
.endsWith("\"")) {
244 str
= str
.substring(2, str
.length() - 1);
247 // Check if StringTable has this String already.
248 // If so, return the current pos.
250 for (i
= 0, pos
= 0; i
< al
.size(); i
++) {
251 String s
= al
.get(i
);;
256 pos
= s
.length() + 1;
262 // Include the NULL character at the end of String
264 len
+= str
.length() + 1;
266 alComments
.add(token
.getPrimaryKeyString());
273 private ArrayList
<Integer
> al
;
274 private ArrayList
<String
> alComments
;
275 private String phase
;
278 public SizeTable (String phase
) {
280 al
= new ArrayList
<Integer
>();
281 alComments
= new ArrayList
<String
>();
285 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) {
286 final String name
= "SizeTable";
288 CStructTypeDeclaration decl
;
291 cCode
= String
.format(PcdDatabase
.SizeTableDeclaration
, phase
);
292 decl
= new CStructTypeDeclaration (
301 cCode
= PcdDatabase
.genInstantiationStr(getInstantiation());
302 instTable
.put(name
, cCode
);
305 public String
getTypeDeclaration () {
306 return String
.format(PcdDatabase
.SizeTableDeclaration
, phase
);
309 public ArrayList
<String
> getInstantiation () {
310 ArrayList
<String
> Output
= new ArrayList
<String
>();
312 Output
.add("/* SizeTable */");
314 if (al
.size() == 0) {
317 for (int index
= 0; index
< al
.size(); index
++) {
318 Integer n
= al
.get(index
);
319 String str
= "\t" + n
.toString();
321 if (index
!= (al
.size() - 1)) {
325 str
+= " /* " + alComments
.get(index
) + " */";
335 public int add (Token token
) {
339 al
.add(token
.datumSize
);
340 alComments
.add(token
.getPrimaryKeyString());
345 public int getTableLen () {
346 return al
.size() == 0 ?
1 : al
.size();
352 private ArrayList
<UUID
> al
;
353 private ArrayList
<String
> alComments
;
354 private String phase
;
356 private int bodyLineNum
;
358 public GuidTable (String phase
) {
360 al
= new ArrayList
<UUID
>();
361 alComments
= new ArrayList
<String
>();
366 public String
getSizeMacro () {
367 return String
.format(PcdDatabase
.GuidTableSizeMacro
, phase
, getSize());
370 private int getSize () {
371 return (al
.size() == 0)?
1 : al
.size();
374 public String
getExistanceMacro () {
375 return String
.format(PcdDatabase
.GuidTableExistenceMacro
, phase
, (al
.size() == 0)?
"TRUE":"FALSE");
378 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) {
379 final String name
= "GuidTable";
381 CStructTypeDeclaration decl
;
384 cCode
+= String
.format(PcdDatabase
.GuidTableDeclaration
, phase
);
385 decl
= new CStructTypeDeclaration (
394 cCode
= PcdDatabase
.genInstantiationStr(getInstantiation());
395 instTable
.put(name
, cCode
);
398 public String
getTypeDeclaration () {
399 return String
.format(PcdDatabase
.GuidTableDeclaration
, phase
);
402 private String
getUuidCString (UUID uuid
) {
403 String
[] guidStrArray
;
405 guidStrArray
=(uuid
.toString()).split("-");
407 return String
.format("{0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",
411 (guidStrArray
[3].substring(0, 2)),
412 (guidStrArray
[3].substring(2, 4)),
413 (guidStrArray
[4].substring(0, 2)),
414 (guidStrArray
[4].substring(2, 4)),
415 (guidStrArray
[4].substring(4, 6)),
416 (guidStrArray
[4].substring(6, 8)),
417 (guidStrArray
[4].substring(8, 10)),
418 (guidStrArray
[4].substring(10, 12))
422 public ArrayList
<String
> getInstantiation () {
423 ArrayList
<String
> Output
= new ArrayList
<String
>();
425 Output
.add("/* GuidTable */");
428 if (al
.size() == 0) {
429 Output
.add("\t" + getUuidCString(new UUID(0, 0)));
432 for (int i
= 0; i
< al
.size(); i
++) {
433 String str
= "\t" + getUuidCString(al
.get(i
));
435 str
+= "/* " + alComments
.get(i
) + " */";
436 if (i
!= (al
.size() - 1)) {
448 public int add (UUID uuid
, String name
) {
450 // Check if GuidTable has this entry already.
451 // If so, return the GuidTable index.
453 for (int i
= 0; i
< al
.size(); i
++) {
454 if (al
.get(i
).equals(uuid
)) {
461 alComments
.add(name
);
464 // Return the previous Table Index
469 public int getTableLen () {
470 return al
.size() == 0 ?
0 : al
.size();
476 private ArrayList
<Integer
[]> al
;
477 private ArrayList
<String
> alComment
;
478 private String phase
;
481 public SkuIdTable (String phase
) {
483 al
= new ArrayList
<Integer
[]>();
484 alComment
= new ArrayList
<String
>();
488 public String
getSizeMacro () {
489 return String
.format(PcdDatabase
.SkuIdTableSizeMacro
, phase
, getSize());
492 private int getSize () {
493 return (len
== 0)?
1 : len
;
496 public String
getExistanceMacro () {
497 return String
.format(PcdDatabase
.SkuTableExistenceMacro
, phase
, (al
.size() == 0)?
"TRUE":"FALSE");
500 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) {
501 final String name
= "SkuIdTable";
503 CStructTypeDeclaration decl
;
506 cCode
+= String
.format(PcdDatabase
.SkuIdTableDeclaration
, phase
);
507 decl
= new CStructTypeDeclaration (
516 cCode
= PcdDatabase
.genInstantiationStr(getInstantiation());
517 instTable
.put(name
, cCode
);
520 // SystemSkuId is in PEI phase PCD Database
522 if (phase
.equalsIgnoreCase("PEI")) {
523 decl
= new CStructTypeDeclaration (
526 String
.format("%-20sSystemSkuId;\r\n", "SKU_ID"),
531 instTable
.put("SystemSkuId", "0");
536 public String
getTypeDeclaration () {
537 return String
.format(PcdDatabase
.SkuIdTableDeclaration
, phase
);
540 public ArrayList
<String
> getInstantiation () {
541 ArrayList
<String
> Output
= new ArrayList
<String
> ();
543 Output
.add("/* SkuIdTable */");
546 if (al
.size() == 0) {
550 for (int index
= 0; index
< al
.size(); index
++) {
553 str
= "/* " + alComment
.get(index
) + "*/ ";
554 str
+= "/* MaxSku */ ";
557 Integer
[] ia
= al
.get(index
);
559 str
+= "\t" + ia
[0].toString() + ", ";
560 for (int index2
= 1; index2
< ia
.length
; index2
++) {
561 str
+= ia
[index2
].toString();
562 if (!((index2
== ia
.length
- 1) && (index
== al
.size() - 1))) {
576 public int add (Token token
) {
582 // Check if this SKU_ID Array is already in the table
586 Integer
[] s
= (Integer
[]) o
;
587 boolean different
= false;
588 if (s
[0] == token
.getSkuIdCount()) {
589 for (index
= 1; index
< s
.length
; index
++) {
590 if (s
[index
] != token
.skuData
.get(index
-1).id
) {
605 Integer
[] skuIds
= new Integer
[token
.skuData
.size() + 1];
606 skuIds
[0] = new Integer(token
.skuData
.size());
607 for (index
= 1; index
< skuIds
.length
; index
++) {
608 skuIds
[index
] = new Integer(token
.skuData
.get(index
- 1).id
);
613 len
+= skuIds
.length
;
615 alComment
.add(token
.getPrimaryKeyString());
620 public int getTableLen () {
621 return al
.size() == 0 ?
1 : al
.size();
626 class LocalTokenNumberTable
{
627 private ArrayList
<String
> al
;
628 private ArrayList
<String
> alComment
;
629 private String phase
;
632 public LocalTokenNumberTable (String phase
) {
634 al
= new ArrayList
<String
>();
635 alComment
= new ArrayList
<String
>();
640 public String
getSizeMacro () {
641 return String
.format(PcdDatabase
.LocalTokenNumberTableSizeMacro
, phase
, getSize())
642 + String
.format(PcdDatabase
.LocalTokenNumberSizeMacro
, phase
, al
.size());
645 public int getSize () {
646 return (al
.size() == 0)?
1 : al
.size();
649 public String
getExistanceMacro () {
650 return String
.format(PcdDatabase
.DatabaseExistenceMacro
, phase
, (al
.size() == 0)?
"TRUE":"FALSE");
653 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) {
654 final String name
= "LocalTokenNumberTable";
656 CStructTypeDeclaration decl
;
659 cCode
+= String
.format(PcdDatabase
.LocalTokenNumberTableDeclaration
, phase
);
660 decl
= new CStructTypeDeclaration (
668 cCode
= PcdDatabase
.genInstantiationStr(getInstantiation());
669 instTable
.put(name
, cCode
);
672 public String
getTypeDeclaration () {
673 return String
.format(PcdDatabase
.LocalTokenNumberTableDeclaration
, phase
);
676 public ArrayList
<String
> getInstantiation () {
677 ArrayList
<String
> output
= new ArrayList
<String
>();
679 output
.add("/* LocalTokenNumberTable */");
682 if (al
.size() == 0) {
686 for (int index
= 0; index
< al
.size(); index
++) {
689 str
= "\t" + (String
)al
.get(index
);
691 str
+= " /* " + alComment
.get(index
) + " */ ";
694 if (index
!= (al
.size() - 1)) {
707 public int add (Token token
) {
713 str
= String
.format(PcdDatabase
.offsetOfStrTemplate
, phase
, token
.hasDefaultValue() ?
"Init" : "Uninit", token
.getPrimaryKeyString());
715 if (token
.isUnicodeStringType()) {
716 str
+= " | PCD_TYPE_STRING";
719 if (token
.isSkuEnable()) {
720 str
+= " | PCD_TYPE_SKU_ENABLED";
723 if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.HII_TYPE
) {
724 str
+= " | PCD_TYPE_HII";
727 if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.VPD_TYPE
) {
728 str
+= " | PCD_TYPE_VPD";
732 alComment
.add(token
.getPrimaryKeyString());
741 public Integer guidTableIdx
;
742 public Long exTokenNumber
;
743 public Long localTokenIdx
;
745 public ExTriplet (int guidTableIdx
, long exTokenNumber
, long localTokenIdx
) {
746 this.guidTableIdx
= new Integer(guidTableIdx
);
747 this.exTokenNumber
= new Long(exTokenNumber
);
748 this.localTokenIdx
= new Long(localTokenIdx
);
752 private ArrayList
<ExTriplet
> al
;
753 private ArrayList
<String
> alComment
;
754 private String phase
;
756 private int bodyLineNum
;
758 public ExMapTable (String phase
) {
760 al
= new ArrayList
<ExTriplet
>();
761 alComment
= new ArrayList
<String
>();
766 public String
getSizeMacro () {
767 return String
.format(PcdDatabase
.ExMapTableSizeMacro
, phase
, getTableLen())
768 + String
.format(PcdDatabase
.ExTokenNumber
, phase
, al
.size());
771 public String
getExistanceMacro () {
772 return String
.format(PcdDatabase
.ExMapTableExistenceMacro
, phase
, (al
.size() == 0)?
"TRUE":"FALSE");
775 public void genCodeNew (ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) {
776 final String exMapTableName
= "ExMapTable";
780 CStructTypeDeclaration decl
;
783 cCode
+= String
.format(PcdDatabase
.ExMapTableDeclaration
, phase
);
784 decl
= new CStructTypeDeclaration (
793 cCode
= PcdDatabase
.genInstantiationStr(getInstantiation());
794 instTable
.put(exMapTableName
, cCode
);
797 public String
getTypeDeclaration () {
798 return String
.format(PcdDatabase
.ExMapTableDeclaration
, phase
);
801 public ArrayList
<String
> getInstantiation () {
802 ArrayList
<String
> Output
= new ArrayList
<String
>();
804 Output
.add("/* ExMapTable */");
806 if (al
.size() == 0) {
807 Output
.add("\t{0, 0, 0}");
811 for (index
= 0; index
< al
.size(); index
++) {
814 ExTriplet e
= (ExTriplet
)al
.get(index
);
816 str
= "\t" + "{ " + String
.format("0x%08X", e
.exTokenNumber
) + ", ";
817 str
+= e
.localTokenIdx
.toString() + ", ";
818 str
+= e
.guidTableIdx
.toString();
820 str
+= "}" + " /* " + alComment
.get(index
) + " */" ;
822 if (index
!= al
.size() - 1) {
836 public int add (int localTokenIdx
, long exTokenNum
, int guidTableIdx
, String name
) {
840 al
.add(new ExTriplet(guidTableIdx
, exTokenNum
, localTokenIdx
));
846 public int getTableLen () {
847 return al
.size() == 0 ?
1 : al
.size();
851 // To simplify the algorithm for GetNextToken and GetNextTokenSpace in
852 // PCD PEIM/Driver, we need to sort the ExMapTable according to the
857 class ExTripletComp
implements Comparator
<ExTriplet
> {
858 public int compare (ExTriplet a
, ExTriplet b
) {
859 if (a
.guidTableIdx
== b
.guidTableIdx
) {
860 if (a
.exTokenNumber
> b
.exTokenNumber
) {
862 } else if (a
.exTokenNumber
> b
.exTokenNumber
) {
869 return a
.guidTableIdx
- b
.guidTableIdx
;
873 private void sortTable () {
874 java
.util
.Comparator
<ExTriplet
> comparator
= new ExTripletComp();
875 java
.util
.Collections
.sort(al
, comparator
);
881 private final static int SkuHeadAlignmentSize
= 4;
882 private final String newLine
= "\r\n";
883 private final String commaNewLine
= ",\r\n";
884 private final String tab
= "\t";
885 public final static String ExMapTableDeclaration
= "DYNAMICEX_MAPPING ExMapTable[%s_EXMAPPING_TABLE_SIZE];\r\n";
886 public final static String GuidTableDeclaration
= "EFI_GUID GuidTable[%s_GUID_TABLE_SIZE];\r\n";
887 public final static String LocalTokenNumberTableDeclaration
= "UINT32 LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";
888 public final static String StringTableDeclaration
= "UINT16 StringTable[%s_STRING_TABLE_SIZE];\r\n";
889 public final static String SizeTableDeclaration
= "UINT16 SizeTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";
890 public final static String SkuIdTableDeclaration
= "UINT8 SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";
893 public final static String ExMapTableSizeMacro
= "#define %s_EXMAPPING_TABLE_SIZE %d\r\n";
894 public final static String ExTokenNumber
= "#define %s_EX_TOKEN_NUMBER %d\r\n";
895 public final static String GuidTableSizeMacro
= "#define %s_GUID_TABLE_SIZE %d\r\n";
896 public final static String LocalTokenNumberTableSizeMacro
= "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE %d\r\n";
897 public final static String LocalTokenNumberSizeMacro
= "#define %s_LOCAL_TOKEN_NUMBER %d\r\n";
898 public final static String StringTableSizeMacro
= "#define %s_STRING_TABLE_SIZE %d\r\n";
899 public final static String SkuIdTableSizeMacro
= "#define %s_SKUID_TABLE_SIZE %d\r\n";
902 public final static String ExMapTableExistenceMacro
= "#define %s_EXMAP_TABLE_EMPTY %s\r\n";
903 public final static String GuidTableExistenceMacro
= "#define %s_GUID_TABLE_EMPTY %s\r\n";
904 public final static String DatabaseExistenceMacro
= "#define %s_DATABASE_EMPTY %s\r\n";
905 public final static String StringTableExistenceMacro
= "#define %s_STRING_TABLE_EMPTY %s\r\n";
906 public final static String SkuTableExistenceMacro
= "#define %s_SKUID_TABLE_EMPTY %s\r\n";
908 public final static String offsetOfSkuHeadStrTemplate
= "offsetof(%s_PCD_DATABASE, %s.%s_SkuDataTable)";
909 public final static String offsetOfVariableEnabledDefault
= "offsetof(%s_PCD_DATABASE, %s.%s_VariableDefault_%d)";
910 public final static String offsetOfStrTemplate
= "offsetof(%s_PCD_DATABASE, %s.%s)";
912 private final static String skuDataTableTemplate
= "SkuDataTable";
915 private StringTable stringTable
;
916 private GuidTable guidTable
;
917 private LocalTokenNumberTable localTokenNumberTable
;
918 private SkuIdTable skuIdTable
;
919 private SizeTable sizeTable
;
920 private ExMapTable exMapTable
;
922 private ArrayList
<Token
> alTokens
;
923 private String phase
;
924 private int assignedTokenNumber
;
927 // Use two class global variable to store
930 private String privateGlobalName
;
931 private String privateGlobalCCode
;
933 // After Major changes done to the PCD
934 // database generation class PcdDatabase
935 // Please increment the version and please
936 // also update the version number in PCD
937 // service PEIM and DXE driver accordingly.
939 private final int version
= 2;
941 private String hString
;
942 private String cString
;
945 class AlignmentSizeComp
implements Comparator
<Token
> {
946 public int compare (Token a
, Token b
) {
947 return getAlignmentSize(b
)
948 - getAlignmentSize(a
);
952 public PcdDatabase (ArrayList
<Token
> alTokens
, String exePhase
, int startLen
) {
955 stringTable
= new StringTable(phase
);
956 guidTable
= new GuidTable(phase
);
957 localTokenNumberTable
= new LocalTokenNumberTable(phase
);
958 skuIdTable
= new SkuIdTable(phase
);
959 sizeTable
= new SizeTable(phase
);
960 exMapTable
= new ExMapTable(phase
);
962 assignedTokenNumber
= startLen
+ 1;
963 this.alTokens
= alTokens
;
966 private void getNonExAndExTokens (ArrayList
<Token
> alTokens
, List
<Token
> nexTokens
, List
<Token
> exTokens
) {
967 for (int i
= 0; i
< alTokens
.size(); i
++) {
968 Token t
= (Token
)alTokens
.get(i
);
969 if (t
.isDynamicEx()) {
979 private void getTwoGroupsOfTokens (ArrayList
<Token
> alTokens
, List
<Token
> initTokens
, List
<Token
> uninitTokens
) {
980 for (int i
= 0; i
< alTokens
.size(); i
++) {
981 Token t
= (Token
)alTokens
.get(i
);
982 if (t
.hasDefaultValue()) {
992 private int getDataTypeAlignmentSize (Token token
) {
993 switch (token
.datumType
) {
1011 private int getHiiPtrTypeAlignmentSize(Token token
) {
1012 switch (token
.datumType
) {
1022 if (token
.isHiiEnable()) {
1023 if (token
.isHiiDefaultValueUnicodeStringType()) {
1035 private int getAlignmentSize (Token token
) {
1036 if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.HII_TYPE
) {
1040 if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.VPD_TYPE
) {
1044 if (token
.isUnicodeStringType()) {
1048 return getDataTypeAlignmentSize(token
);
1051 public String
getCString () {
1055 public String
getHString () {
1059 private void genCodeWorker(Token t
,
1060 ArrayList
<CStructTypeDeclaration
> declaList
,
1061 HashMap
<String
, String
> instTable
, String phase
)
1062 throws EntityException
{
1064 CStructTypeDeclaration decl
;
1067 // Insert SKU_HEAD if isSkuEnable is true
1069 if (t
.isSkuEnable()) {
1071 tableIdx
= skuIdTable
.add(t
);
1072 decl
= new CStructTypeDeclaration(t
.getPrimaryKeyString(),
1073 SkuHeadAlignmentSize
, getSkuEnabledTypeDeclaration(t
), true);
1074 declaList
.add(decl
);
1075 instTable
.put(t
.getPrimaryKeyString(),
1076 getSkuEnabledTypeInstantiaion(t
, tableIdx
));
1080 // Insert PCD_ENTRY declaration and instantiation
1082 getCDeclarationString(t
);
1084 decl
= new CStructTypeDeclaration(privateGlobalName
,
1085 getAlignmentSize(t
), privateGlobalCCode
, t
.hasDefaultValue());
1086 declaList
.add(decl
);
1088 if (t
.hasDefaultValue()) {
1089 instTable
.put(privateGlobalName
,
1090 getTypeInstantiation(t
, declaList
, instTable
, phase
)
1096 private void ProcessTokensNew (List
<Token
> tokens
,
1097 ArrayList
<CStructTypeDeclaration
> cStructDeclList
,
1098 HashMap
<String
, String
> cStructInstTable
,
1101 throws EntityException
{
1103 for (int idx
= 0; idx
< tokens
.size(); idx
++) {
1104 Token t
= tokens
.get(idx
);
1106 genCodeWorker (t
, cStructDeclList
, cStructInstTable
, phase
);
1109 localTokenNumberTable
.add(t
);
1110 t
.tokenNumber
= assignedTokenNumber
++;
1113 // Add a mapping if this dynamic PCD entry is a EX type
1115 if (t
.isDynamicEx()) {
1116 exMapTable
.add((int)t
.tokenNumber
,
1117 t
.dynamicExTokenNumber
,
1118 guidTable
.add(t
.tokenSpaceName
, t
.getPrimaryKeyString()),
1119 t
.getPrimaryKeyString()
1126 public void genCodeNew () throws EntityException
{
1128 ArrayList
<CStructTypeDeclaration
> cStructDeclList
= new ArrayList
<CStructTypeDeclaration
>();
1129 HashMap
<String
, String
> cStructInstTable
= new HashMap
<String
, String
>();
1131 List
<Token
> nexTokens
= new ArrayList
<Token
> ();
1132 List
<Token
> exTokens
= new ArrayList
<Token
> ();
1134 getNonExAndExTokens (alTokens
, nexTokens
, exTokens
);
1137 // We have to process Non-Ex type PCD entry first. The reason is
1138 // that our optimization assumes that the Token Number of Non-Ex
1139 // PCD entry start from 1 (for PEI phase) and grows continously upwards.
1141 // EX type token number starts from the last Non-EX PCD entry and
1142 // grows continously upwards.
1144 ProcessTokensNew (nexTokens
, cStructDeclList
, cStructInstTable
, phase
);
1145 ProcessTokensNew (exTokens
, cStructDeclList
, cStructInstTable
, phase
);
1147 stringTable
.genCodeNew(cStructDeclList
, cStructInstTable
);
1148 skuIdTable
.genCodeNew(cStructDeclList
, cStructInstTable
, phase
);
1149 exMapTable
.genCodeNew(cStructDeclList
, cStructInstTable
, phase
);
1150 localTokenNumberTable
.genCodeNew(cStructDeclList
, cStructInstTable
, phase
);
1151 sizeTable
.genCodeNew(cStructDeclList
, cStructInstTable
, phase
);
1152 guidTable
.genCodeNew(cStructDeclList
, cStructInstTable
, phase
);
1154 hString
= genCMacroCode ();
1156 HashMap
<String
, String
> result
;
1158 result
= genCStructCode(cStructDeclList
,
1163 hString
+= result
.get("initDeclStr");
1164 hString
+= result
.get("uninitDeclStr");
1166 hString
+= String
.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase
, version
);
1168 cString
= newLine
+ newLine
+ result
.get("initInstStr");
1172 private String
genCMacroCode () {
1173 String macroStr
= "";
1176 // Generate size info Macro for all Tables
1178 macroStr
+= guidTable
.getSizeMacro();
1179 macroStr
+= stringTable
.getSizeMacro();
1180 macroStr
+= skuIdTable
.getSizeMacro();
1181 macroStr
+= localTokenNumberTable
.getSizeMacro();
1182 macroStr
+= exMapTable
.getSizeMacro();
1185 // Generate existance info Macro for all Tables
1187 macroStr
+= guidTable
.getExistanceMacro();
1188 macroStr
+= stringTable
.getExistanceMacro();
1189 macroStr
+= skuIdTable
.getExistanceMacro();
1190 macroStr
+= localTokenNumberTable
.getExistanceMacro();
1191 macroStr
+= exMapTable
.getExistanceMacro();
1193 macroStr
+= newLine
;
1198 private HashMap
<String
, String
> genCStructCode(
1199 ArrayList
<CStructTypeDeclaration
> declaList
,
1200 HashMap
<String
, String
> instTable
,
1205 HashMap
<String
, String
> result
= new HashMap
<String
, String
>();
1206 HashMap
<Integer
, ArrayList
<String
>> alignmentInitDecl
= new HashMap
<Integer
, ArrayList
<String
>>();
1207 HashMap
<Integer
, ArrayList
<String
>> alignmentUninitDecl
= new HashMap
<Integer
, ArrayList
<String
>>();
1208 HashMap
<Integer
, ArrayList
<String
>> alignmentInitInst
= new HashMap
<Integer
, ArrayList
<String
>>();
1211 // Initialize the storage for each alignment
1213 for (i
= 8; i
> 0; i
>>=1) {
1214 alignmentInitDecl
.put(new Integer(i
), new ArrayList
<String
>());
1215 alignmentInitInst
.put(new Integer(i
), new ArrayList
<String
>());
1216 alignmentUninitDecl
.put(new Integer(i
), new ArrayList
<String
>());
1219 String initDeclStr
= "typedef struct {" + newLine
;
1220 String initInstStr
= String
.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase
.toUpperCase(), phase
.toUpperCase()) + newLine
;
1221 String uninitDeclStr
= "typedef struct {" + newLine
;
1224 // Sort all C declaration and instantiation base on Alignment Size
1226 for (Object d
: declaList
) {
1227 CStructTypeDeclaration decl
= (CStructTypeDeclaration
) d
;
1229 if (decl
.initTable
) {
1230 alignmentInitDecl
.get(new Integer(decl
.alignmentSize
)).add(decl
.cCode
);
1231 alignmentInitInst
.get(new Integer(decl
.alignmentSize
)).add(instTable
.get(decl
.key
));
1233 alignmentUninitDecl
.get(new Integer(decl
.alignmentSize
)).add(decl
.cCode
);
1238 // Generate code for every alignment size
1240 boolean uinitDatabaseEmpty
= true;
1241 for (int align
= 8; align
> 0; align
>>= 1) {
1242 ArrayList
<String
> declaListBasedOnAlignment
= alignmentInitDecl
.get(new Integer(align
));
1243 ArrayList
<String
> instListBasedOnAlignment
= alignmentInitInst
.get(new Integer(align
));
1244 for (i
= 0; i
< declaListBasedOnAlignment
.size(); i
++) {
1245 initDeclStr
+= tab
+ declaListBasedOnAlignment
.get(i
);
1246 initInstStr
+= tab
+ instListBasedOnAlignment
.get(i
);
1249 // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE
1250 // has a least one data memember with alignment size of 1. So we can
1251 // remove the last "," in the C structure instantiation string. Luckily,
1252 // this is true as both data structure has SKUID_TABLE anyway.
1254 if ((align
== 1) && (i
== declaListBasedOnAlignment
.size() - 1)) {
1255 initInstStr
+= newLine
;
1257 initInstStr
+= commaNewLine
;
1261 declaListBasedOnAlignment
= alignmentUninitDecl
.get(new Integer(align
));
1263 if (declaListBasedOnAlignment
.size() != 0) {
1264 uinitDatabaseEmpty
= false;
1267 for (Object d
: declaListBasedOnAlignment
) {
1268 String s
= (String
)d
;
1269 uninitDeclStr
+= tab
+ s
;
1273 if (uinitDatabaseEmpty
) {
1274 uninitDeclStr
+= tab
+ String
.format("%-20sdummy; /* PCD_DATABASE_UNINIT is emptry */\r\n", "UINT8");
1277 initDeclStr
+= String
.format("} %s_PCD_DATABASE_INIT;", phase
) + newLine
+ newLine
;
1278 initInstStr
+= "};" + newLine
;
1279 uninitDeclStr
+= String
.format("} %s_PCD_DATABASE_UNINIT;", phase
) + newLine
+ newLine
;
1281 result
.put("initDeclStr", initDeclStr
);
1282 result
.put("initInstStr", initInstStr
);
1283 result
.put("uninitDeclStr", uninitDeclStr
);
1288 public void genCode ()
1289 throws EntityException
{
1291 final String newLine
= "\r\n";
1292 final String declNewLine
= ";\r\n";
1293 final String tab
= "\t";
1294 final String commaNewLine
= ", \r\n";
1297 ArrayList
<String
> decla
;
1298 ArrayList
<String
> inst
;
1300 String macroStr
= "";
1301 String initDeclStr
= "";
1302 String initInstStr
= "";
1303 String uninitDeclStr
= "";
1305 List
<Token
> initTokens
= new ArrayList
<Token
> ();
1306 List
<Token
> uninitTokens
= new ArrayList
<Token
> ();
1308 HashMap
<String
, ArrayList
<String
>> initCode
= new HashMap
<String
, ArrayList
<String
>> ();
1309 HashMap
<String
, ArrayList
<String
>> uninitCode
= new HashMap
<String
, ArrayList
<String
>> ();
1311 getTwoGroupsOfTokens (alTokens
, initTokens
, uninitTokens
);
1314 // Generate Structure Declaration for PcdTokens without Default Value
1315 // PEI_PCD_DATABASE_INIT
1317 java
.util
.Comparator
<Token
> comparator
= new AlignmentSizeComp();
1318 java
.util
.Collections
.sort(initTokens
, comparator
);
1319 initCode
= processTokens(initTokens
);
1322 // Generate Structure Declaration for PcdTokens without Default Value
1323 // PEI_PCD_DATABASE_UNINIT
1325 java
.util
.Collections
.sort(uninitTokens
, comparator
);
1326 uninitCode
= processTokens(uninitTokens
);
1329 // Generate size info Macro for all Tables
1331 macroStr
+= guidTable
.getSizeMacro();
1332 macroStr
+= stringTable
.getSizeMacro();
1333 macroStr
+= skuIdTable
.getSizeMacro();
1334 macroStr
+= localTokenNumberTable
.getSizeMacro();
1335 macroStr
+= exMapTable
.getSizeMacro();
1338 // Generate existance info Macro for all Tables
1340 macroStr
+= guidTable
.getExistanceMacro();
1341 macroStr
+= stringTable
.getExistanceMacro();
1342 macroStr
+= skuIdTable
.getExistanceMacro();
1343 macroStr
+= localTokenNumberTable
.getExistanceMacro();
1344 macroStr
+= exMapTable
.getExistanceMacro();
1347 // Generate Structure Declaration for PcdTokens with Default Value
1348 // for example PEI_PCD_DATABASE_INIT
1350 initDeclStr
+= "typedef struct {" + newLine
;
1352 initDeclStr
+= tab
+ exMapTable
.getTypeDeclaration();
1353 initDeclStr
+= tab
+ guidTable
.getTypeDeclaration();
1354 initDeclStr
+= tab
+ localTokenNumberTable
.getTypeDeclaration();
1355 initDeclStr
+= tab
+ stringTable
.getTypeDeclaration();
1356 initDeclStr
+= tab
+ sizeTable
.getTypeDeclaration();
1357 initDeclStr
+= tab
+ skuIdTable
.getTypeDeclaration();
1358 if (phase
.equalsIgnoreCase("PEI")) {
1359 initDeclStr
+= tab
+ "SKU_ID SystemSkuId;" + newLine
;
1362 decla
= initCode
.get(new String("Declaration"));
1363 for (i
= 0; i
< decla
.size(); i
++) {
1364 initDeclStr
+= tab
+ decla
.get(i
) + declNewLine
;
1368 // Generate Structure Declaration for PcdToken with SkuEnabled
1370 decla
= initCode
.get("DeclarationForSku");
1372 for (i
= 0; i
< decla
.size(); i
++) {
1373 initDeclStr
+= tab
+ decla
.get(i
) + declNewLine
;
1376 initDeclStr
+= String
.format("} %s_PCD_DATABASE_INIT;\r\n\r\n", phase
);
1379 // Generate MACRO for structure intialization of PCDTokens with Default Value
1380 // The sequence must match the sequence of declaration of the memembers in the structure
1381 String tmp
= String
.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase
.toUpperCase(), phase
.toUpperCase());
1382 initInstStr
+= tmp
+ newLine
;
1383 initInstStr
+= tab
+ genInstantiationStr(exMapTable
.getInstantiation()) + commaNewLine
;
1384 initInstStr
+= tab
+ genInstantiationStr(guidTable
.getInstantiation()) + commaNewLine
;
1385 initInstStr
+= tab
+ genInstantiationStr(localTokenNumberTable
.getInstantiation()) + commaNewLine
;
1386 initInstStr
+= tab
+ genInstantiationStr(stringTable
.getInstantiation()) + commaNewLine
;
1387 initInstStr
+= tab
+ genInstantiationStr(sizeTable
.getInstantiation()) + commaNewLine
;
1388 initInstStr
+= tab
+ genInstantiationStr(skuIdTable
.getInstantiation()) + commaNewLine
;
1392 if (phase
.equalsIgnoreCase("PEI")) {
1393 initInstStr
+= tab
+ "0" + tab
+ "/* SystemSkuId */" + commaNewLine
;
1396 inst
= initCode
.get("Instantiation");
1397 for (i
= 0; i
< inst
.size(); i
++) {
1398 initInstStr
+= tab
+ inst
.get(i
) + commaNewLine
;
1401 inst
= initCode
.get("InstantiationForSku");
1402 for (i
= 0; i
< inst
.size(); i
++) {
1403 initInstStr
+= tab
+ inst
.get(i
);
1404 if (i
!= inst
.size() - 1) {
1405 initInstStr
+= commaNewLine
;
1409 initInstStr
+= "};";
1411 uninitDeclStr
+= "typedef struct {" + newLine
;
1413 decla
= uninitCode
.get("Declaration");
1414 if (decla
.size() == 0) {
1415 uninitDeclStr
+= "UINT8 dummy /* The UINT struct is empty */" + declNewLine
;
1418 for (i
= 0; i
< decla
.size(); i
++) {
1419 uninitDeclStr
+= tab
+ decla
.get(i
) + declNewLine
;
1422 decla
= uninitCode
.get("DeclarationForSku");
1424 for (i
= 0; i
< decla
.size(); i
++) {
1425 uninitDeclStr
+= tab
+ decla
.get(i
) + declNewLine
;
1429 uninitDeclStr
+= String
.format("} %s_PCD_DATABASE_UNINIT;\r\n\r\n", phase
);
1431 cString
= initInstStr
+ newLine
;
1432 hString
= macroStr
+ newLine
1433 + initDeclStr
+ newLine
1434 + uninitDeclStr
+ newLine
1437 hString
+= String
.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase
, version
);
1441 public static String
genInstantiationStr (ArrayList
<String
> alStr
) {
1443 for (int i
= 0; i
< alStr
.size(); i
++) {
1447 str
+= alStr
.get(i
);
1448 if (i
!= alStr
.size() - 1) {
1456 private HashMap
<String
, ArrayList
<String
>> processTokens (List
<Token
> alToken
)
1457 throws EntityException
{
1459 HashMap
<String
, ArrayList
<String
>> map
= new HashMap
<String
, ArrayList
<String
>>();
1461 ArrayList
<String
> decl
= new ArrayList
<String
>();
1462 ArrayList
<String
> declForSkuEnableType
= new ArrayList
<String
>();
1463 ArrayList
<String
> inst
= new ArrayList
<String
>();
1464 ArrayList
<String
> instForSkuEnableType
= new ArrayList
<String
>();
1466 for (int index
= 0; index
< alToken
.size(); index
++) {
1467 Token token
= alToken
.get(index
);
1469 if (token
.isSkuEnable()) {
1471 // BugBug: Schema only support Data type now
1475 tableIdx
= skuIdTable
.add(token
);
1477 decl
.add(getSkuEnabledTypeDeclaration(token
));
1478 if (token
.hasDefaultValue()) {
1479 inst
.add(getSkuEnabledTypeInstantiaion(token
, tableIdx
));
1482 declForSkuEnableType
.add(getDataTypeDeclarationForSkuEnabled(token
));
1483 if (token
.hasDefaultValue()) {
1484 instForSkuEnableType
.add(getDataTypeInstantiationForSkuEnabled(token
));
1488 if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.HII_TYPE
) {
1489 decl
.add(getVariableEnableTypeDeclaration(token
));
1490 inst
.add(getVariableEnableInstantiation(token
));
1491 } else if (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.VPD_TYPE
) {
1492 decl
.add(getVpdEnableTypeDeclaration(token
));
1493 inst
.add(getVpdEnableTypeInstantiation(token
));
1494 } else if (token
.isUnicodeStringType()) {
1495 decl
.add(getStringTypeDeclaration(token
));
1496 inst
.add(getStringTypeInstantiation(stringTable
.add(token
.getStringTypeString(), token
), token
));
1499 decl
.add(getDataTypeDeclaration(token
));
1500 if (token
.hasDefaultValue()) {
1501 inst
.add(getDataTypeInstantiation(token
));
1506 sizeTable
.add(token
);
1507 localTokenNumberTable
.add(token
);
1508 token
.tokenNumber
= assignedTokenNumber
++;
1512 map
.put("Declaration", decl
);
1513 map
.put("DeclarationForSku", declForSkuEnableType
);
1514 map
.put("Instantiation", inst
);
1515 map
.put("InstantiationForSku", instForSkuEnableType
);
1520 private String
getSkuEnabledTypeDeclaration (Token token
) {
1521 return String
.format("%-20s%s;\r\n", "SKU_HEAD", token
.getPrimaryKeyString());
1524 private String
getSkuEnabledTypeInstantiaion (Token token
, int SkuTableIdx
) {
1526 String offsetof
= String
.format(PcdDatabase
.offsetOfSkuHeadStrTemplate
, phase
, token
.hasDefaultValue()?
"Init" : "Uninit", token
.getPrimaryKeyString());
1527 return String
.format("{ %s, %d } /* SKU_ENABLED: %s */", offsetof
, SkuTableIdx
, token
.getPrimaryKeyString());
1530 private String
getDataTypeDeclarationForSkuEnabled (Token token
) {
1531 String typeStr
= "";
1533 if (token
.datumType
== Token
.DATUM_TYPE
.UINT8
) {
1534 typeStr
= "UINT8 %s_%s[%d];\r\n";
1535 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT16
) {
1536 typeStr
= "UINT16 %s_%s[%d];\r\n";
1537 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT32
) {
1538 typeStr
= "UINT32 %s_%s[%d];\r\n";
1539 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT64
) {
1540 typeStr
= "UINT64 %s_%s[%d];\r\n";
1541 } else if (token
.datumType
== Token
.DATUM_TYPE
.BOOLEAN
) {
1542 typeStr
= "BOOLEAN %s_%s[%d];\r\n";
1543 } else if (token
.datumType
== Token
.DATUM_TYPE
.POINTER
) {
1544 return String
.format("UINT8 %s_%s[%d];\r\n", token
.getPrimaryKeyString(), "SkuDataTable", token
.datumSize
* token
.skuData
.size());
1547 return String
.format(typeStr
, token
.getPrimaryKeyString(), "SkuDataTable", token
.skuData
.size());
1551 private String
getDataTypeInstantiationForSkuEnabled (Token token
) {
1554 if (token
.datumType
== Token
.DATUM_TYPE
.POINTER
) {
1555 return String
.format("UINT8 %s_%s[%d]", token
.getPrimaryKeyString(), "SkuDataTable", token
.datumSize
* token
.skuData
.size());
1558 for (int idx
= 0; idx
< token
.skuData
.size(); idx
++) {
1559 str
+= token
.skuData
.get(idx
).toString();
1560 if (idx
!= token
.skuData
.size() - 1) {
1571 private String
getDataTypeInstantiationForVariableDefault_new (Token token
, String cName
, int skuId
) {
1572 return String
.format("%s /* %s */", token
.skuData
.get(skuId
).value
.hiiDefaultValue
, cName
);
1575 private String
getDataTypeInstantiation (Token token
) {
1577 if (token
.datumType
== Token
.DATUM_TYPE
.POINTER
) {
1578 return String
.format("%s /* %s */", token
.getDefaultSku().value
, token
.getPrimaryKeyString());
1580 return String
.format("%s /* %s */", token
.getDefaultSku().value
, token
.getPrimaryKeyString());
1584 private String
getCType (Token t
)
1585 throws EntityException
{
1587 if (t
.isHiiEnable()) {
1588 return "VARIABLE_HEAD";
1591 if (t
.isVpdEnable()) {
1595 if (t
.isUnicodeStringType()) {
1596 return "STRING_HEAD";
1599 switch (t
.datumType
) {
1613 throw new EntityException("Unknown type in getDataTypeCDeclaration");
1617 private void getCDeclarationString(Token t
)
1618 throws EntityException
{
1620 if (t
.isSkuEnable()) {
1621 privateGlobalName
= String
.format("%s_%s", t
.getPrimaryKeyString(), skuDataTableTemplate
);
1623 privateGlobalName
= t
.getPrimaryKeyString();
1626 String type
= getCType(t
);
1627 if ((t
.datumType
== Token
.DATUM_TYPE
.POINTER
) && (!t
.isHiiEnable())) {
1629 if (t
.isASCIIStringType()) {
1631 // Build tool will add a NULL string at the end of the ASCII string
1633 bufferSize
= t
.datumSize
+ 1;
1635 bufferSize
= t
.datumSize
;
1637 privateGlobalCCode
= String
.format("%-20s%s[%d][%d];\r\n", type
, privateGlobalName
, t
.getSkuIdCount(), bufferSize
);
1639 privateGlobalCCode
= String
.format("%-20s%s[%d];\r\n", type
, privateGlobalName
, t
.getSkuIdCount());
1643 private String
getDataTypeDeclarationForVariableDefault_new (Token token
, String cName
, int skuId
)
1644 throws EntityException
{
1648 if (token
.datumType
== Token
.DATUM_TYPE
.UINT8
) {
1650 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT16
) {
1652 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT32
) {
1654 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT64
) {
1656 } else if (token
.datumType
== Token
.DATUM_TYPE
.BOOLEAN
) {
1657 typeStr
= "BOOLEAN";
1658 } else if (token
.datumType
== Token
.DATUM_TYPE
.POINTER
) {
1660 if (token
.isHiiDefaultValueUnicodeStringType()) {
1663 // Include the NULL charactor
1665 size
= token
.datumSize
/ 2 + 1;
1668 if (token
.isHiiDefaultValueASCIIStringType()) {
1670 // Include the NULL charactor
1672 size
= token
.datumSize
+ 1;
1674 size
= token
.datumSize
;
1677 return String
.format("%-20s%s[%d];\r\n", typeStr
, cName
, size
);
1679 throw new EntityException("Unknown DATUM_TYPE type in when generating code for VARIABLE_ENABLED PCD entry");
1682 return String
.format("%-20s%s;\r\n", typeStr
, cName
);
1685 private String
getDataTypeDeclaration (Token token
) {
1687 String typeStr
= "";
1689 if (token
.datumType
== Token
.DATUM_TYPE
.UINT8
) {
1691 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT16
) {
1693 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT32
) {
1695 } else if (token
.datumType
== Token
.DATUM_TYPE
.UINT64
) {
1697 } else if (token
.datumType
== Token
.DATUM_TYPE
.BOOLEAN
) {
1698 typeStr
= "BOOLEAN";
1699 } else if (token
.datumType
== Token
.DATUM_TYPE
.POINTER
) {
1700 return String
.format("UINT8 %s[%d]", token
.getPrimaryKeyString(), token
.datumSize
);
1704 return String
.format("%s %s", typeStr
, token
.getPrimaryKeyString());
1707 private String
getVpdEnableTypeDeclaration (Token token
) {
1708 return String
.format("VPD_HEAD %s", token
.getPrimaryKeyString());
1711 private String
getTypeInstantiation (Token t
, ArrayList
<CStructTypeDeclaration
> declaList
, HashMap
<String
, String
> instTable
, String phase
) throws EntityException
{
1716 s
= String
.format("/* %s */", t
.getPrimaryKeyString()) + newLine
;
1717 s
+= tab
+ "{" + newLine
;
1719 for (i
= 0; i
< t
.skuData
.size(); i
++) {
1720 if (t
.isUnicodeStringType()) {
1721 s
+= tab
+ tab
+ String
.format("{ %d }", stringTable
.add(t
.skuData
.get(i
).value
.value
, t
));
1722 } else if (t
.isHiiEnable()) {
1723 /* VPD_HEAD definition
1725 UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.
1726 UINT16 StringIndex; // Offset in String Table in units of UINT16.
1727 UINT16 Offset; // Offset in Variable
1728 UINT16 DefaultValueOffset; // Offset of the Default Value
1731 String variableDefaultName
= String
.format("%s_VariableDefault_%d", t
.getPrimaryKeyString(), i
);
1733 s
+= tab
+ tab
+ String
.format("{ %d, %d, %s, %s }", guidTable
.add(t
.skuData
.get(i
).value
.variableGuid
, t
.getPrimaryKeyString()),
1734 stringTable
.add(t
.skuData
.get(i
).value
.getStringOfVariableName(), t
),
1735 t
.skuData
.get(i
).value
.variableOffset
,
1736 String
.format("offsetof(%s_PCD_DATABASE, Init.%s)", phase
, variableDefaultName
)
1739 // We need to support the default value, so we add the declaration and
1740 // the instantiation for the default value.
1742 CStructTypeDeclaration decl
= new CStructTypeDeclaration (variableDefaultName
,
1743 getHiiPtrTypeAlignmentSize(t
),
1744 getDataTypeDeclarationForVariableDefault_new(t
, variableDefaultName
, i
),
1747 declaList
.add(decl
);
1748 instTable
.put(variableDefaultName
, getDataTypeInstantiationForVariableDefault_new (t
, variableDefaultName
, i
));
1749 } else if (t
.isVpdEnable()) {
1754 s
+= tab
+ tab
+ String
.format("{ %s }", t
.skuData
.get(i
).value
.vpdOffset
);
1756 if (t
.isByteStreamType()) {
1758 // Byte stream type input has their own "{" "}", so we won't help to insert.
1760 s
+= tab
+ tab
+ String
.format(" %s ", t
.skuData
.get(i
).value
.value
);
1762 s
+= tab
+ tab
+ String
.format("{ %s }", t
.skuData
.get(i
).value
.value
);
1766 if (i
!= t
.skuData
.size() - 1) {
1779 private String
getVpdEnableTypeInstantiation (Token token
) {
1780 return String
.format("{ %s } /* %s */", token
.getDefaultSku().vpdOffset
,
1781 token
.getPrimaryKeyString());
1784 private String
getStringTypeDeclaration (Token token
) {
1785 return String
.format("UINT16 %s", token
.getPrimaryKeyString());
1788 private String
getStringTypeInstantiation (int StringTableIdx
, Token token
) {
1789 return String
.format ("%d /* %s */", StringTableIdx
,
1790 token
.getPrimaryKeyString());
1794 private String
getVariableEnableTypeDeclaration (Token token
) {
1795 return String
.format("VARIABLE_HEAD %s", token
.getPrimaryKeyString());
1798 private String
getVariableEnableInstantiation (Token token
)
1799 throws EntityException
{
1803 return String
.format("{ %d, %d, %s } /* %s */", guidTable
.add(token
.getDefaultSku().variableGuid
, token
.getPrimaryKeyString()),
1804 stringTable
.add(token
.getDefaultSku().getStringOfVariableName(), token
),
1805 token
.getDefaultSku().variableOffset
,
1806 token
.getPrimaryKeyString());
1809 public int getTotalTokenNumber () {
1810 return sizeTable
.getTableLen();
1813 public static String
getPcdDatabaseCommonDefinitions ()
1814 throws EntityException
{
1818 File file
= new File(GlobalData
.getWorkspacePath() + File
.separator
+
1819 "Tools" + File
.separator
+
1820 "Conf" + File
.separator
+
1821 "Pcd" + File
.separator
+
1822 "PcdDatabaseCommonDefinitions.sample");
1823 FileReader reader
= new FileReader(file
);
1824 BufferedReader in
= new BufferedReader(reader
);
1826 while ((str
= in
.readLine()) != null) {
1827 retStr
= retStr
+"\r\n" + str
;
1829 } catch (Exception ex
) {
1830 throw new EntityException("Fatal error when generating PcdDatabase Common Definitions");
1836 public static String
getPcdDxeDatabaseDefinitions ()
1837 throws EntityException
{
1841 File file
= new File(GlobalData
.getWorkspacePath() + File
.separator
+
1842 "Tools" + File
.separator
+
1843 "Conf" + File
.separator
+
1844 "Pcd" + File
.separator
+
1845 "PcdDatabaseDxeDefinitions.sample");
1846 FileReader reader
= new FileReader(file
);
1847 BufferedReader in
= new BufferedReader(reader
);
1849 while ((str
= in
.readLine()) != null) {
1850 retStr
= retStr
+"\r\n" + str
;
1852 } catch (Exception ex
) {
1853 throw new EntityException("Fatal error when generating PcdDatabase Dxe Definitions");
1859 public static String
getPcdPeiDatabaseDefinitions ()
1860 throws EntityException
{
1864 File file
= new File(GlobalData
.getWorkspacePath() + File
.separator
+
1865 "Tools" + File
.separator
+
1866 "Conf" + File
.separator
+
1867 "Pcd" + File
.separator
+
1868 "PcdDatabasePeiDefinitions.sample");
1869 FileReader reader
= new FileReader(file
);
1870 BufferedReader in
= new BufferedReader(reader
);
1872 while ((str
= in
.readLine()) != null) {
1873 retStr
= retStr
+"\r\n" + str
;
1875 } catch (Exception ex
) {
1876 throw new EntityException("Fatal error when generating PcdDatabase Pei Definitions");
1885 private String type
;
1886 private FpdModuleIdentification moduleId
;
1887 private PcdBuildDefinitionDocument
.PcdBuildDefinition pcdBuildDef
;
1891 public ModuleInfo (FpdModuleIdentification moduleId
, String type
, XmlObject pcdDef
) {
1892 this.moduleId
= moduleId
;
1894 this.pcdBuildDef
= ((PcdBuildDefinitionDocument
)pcdDef
).getPcdBuildDefinition();
1896 public String
getModuleType (){
1899 public FpdModuleIdentification
getModuleId (){
1900 return this.moduleId
;
1902 public PcdBuildDefinitionDocument
.PcdBuildDefinition
getPcdBuildDef(){
1903 return this.pcdBuildDef
;
1907 /** This action class is to collect PCD information from MSA, SPD, FPD xml file.
1908 This class will be used for wizard and build tools, So it can *not* inherit
1909 from buildAction or UIAction.
1911 public class CollectPCDAction
{
1912 /// memoryDatabase hold all PCD information collected from SPD, MSA, FPD.
1913 private MemoryDatabaseManager dbManager
;
1915 /// Workspacepath hold the workspace information.
1916 private String workspacePath
;
1918 /// FPD file is the root file.
1919 private String fpdFilePath
;
1921 /// Message level for CollectPCDAction.
1922 private int originalMessageLevel
;
1924 /// Cache the fpd docment instance for private usage.
1925 private PlatformSurfaceAreaDocument fpdDocInstance
;
1928 private static String xmlObjectName
= "PcdBuildDefinition";
1931 Set WorkspacePath parameter for this action class.
1933 @param workspacePath parameter for this action
1935 public void setWorkspacePath(String workspacePath
) {
1936 this.workspacePath
= workspacePath
;
1940 Set action message level for CollectPcdAction tool.
1942 The message should be restored when this action exit.
1944 @param actionMessageLevel parameter for this action
1946 public void setActionMessageLevel(int actionMessageLevel
) {
1947 originalMessageLevel
= ActionMessage
.messageLevel
;
1948 ActionMessage
.messageLevel
= actionMessageLevel
;
1952 Set FPDFileName parameter for this action class.
1954 @param fpdFilePath fpd file path
1956 public void setFPDFilePath(String fpdFilePath
) {
1957 this.fpdFilePath
= fpdFilePath
;
1961 Common function interface for outer.
1963 @param workspacePath The path of workspace of current build or analysis.
1964 @param fpdFilePath The fpd file path of current build or analysis.
1965 @param messageLevel The message level for this Action.
1967 @throws Exception The exception of this function. Because it can *not* be predict
1968 where the action class will be used. So only Exception can be throw.
1971 public void perform(String workspacePath
, String fpdFilePath
,
1972 int messageLevel
) throws Exception
{
1973 setWorkspacePath(workspacePath
);
1974 setFPDFilePath(fpdFilePath
);
1975 setActionMessageLevel(messageLevel
);
1978 ActionMessage
.messageLevel
= originalMessageLevel
;
1982 Core execution function for this action class.
1984 This function work flows will be:
1985 1) Collect and prepocess PCD information from FPD file, all PCD
1986 information will be stored into memory database.
1987 2) Generate 3 strings for
1988 a) All modules using Dynamic(Ex) PCD entry.(Token Number)
1989 b) PEI PCDDatabase (C Structure) for PCD Service PEIM.
1990 c) DXE PCD Database (C structure) for PCD Service DXE.
1993 @throws EntityException Exception indicate failed to execute this action.
1996 public void execute() throws EntityException
{
1998 // Get memoryDatabaseManager instance from GlobalData.
1999 // The memoryDatabaseManager should be initialized for whatever build
2000 // tools or wizard tools
2002 if((dbManager
= GlobalData
.getPCDMemoryDBManager()) == null) {
2003 throw new EntityException("The instance of PCD memory database manager is null");
2007 // Collect all PCD information defined in FPD file.
2008 // Evenry token defind in FPD will be created as an token into
2011 createTokenInDBFromFPD();
2014 // Call Private function genPcdDatabaseSourceCode (void); ComponentTypeBsDriver
2015 // 1) Generate for PEI, DXE PCD DATABASE's definition and initialization.
2017 genPcdDatabaseSourceCode ();
2022 This function generates source code for PCD Database.
2025 @throws EntityException If the token does *not* exist in memory database.
2028 private void genPcdDatabaseSourceCode()
2029 throws EntityException
{
2030 String PcdCommonHeaderString
= PcdDatabase
.getPcdDatabaseCommonDefinitions ();
2032 ArrayList
<Token
> alPei
= new ArrayList
<Token
> ();
2033 ArrayList
<Token
> alDxe
= new ArrayList
<Token
> ();
2035 dbManager
.getTwoPhaseDynamicRecordArray(alPei
, alDxe
);
2036 PcdDatabase pcdPeiDatabase
= new PcdDatabase (alPei
, "PEI", 0);
2037 pcdPeiDatabase
.genCodeNew();
2038 MemoryDatabaseManager
.PcdPeimHString
= PcdCommonHeaderString
+ pcdPeiDatabase
.getHString()
2039 + PcdDatabase
.getPcdPeiDatabaseDefinitions();
2040 MemoryDatabaseManager
.PcdPeimCString
= pcdPeiDatabase
.getCString();
2042 PcdDatabase pcdDxeDatabase
= new PcdDatabase (alDxe
,
2046 pcdDxeDatabase
.genCodeNew();
2047 MemoryDatabaseManager
.PcdDxeHString
= MemoryDatabaseManager
.PcdPeimHString
+ pcdDxeDatabase
.getHString()
2048 + PcdDatabase
.getPcdDxeDatabaseDefinitions();
2049 MemoryDatabaseManager
.PcdDxeCString
= pcdDxeDatabase
.getCString();
2053 Get component array from FPD.
2055 This function maybe provided by some Global class.
2057 @return List<ModuleInfo> the component array.
2060 private List
<ModuleInfo
> getComponentsFromFPD()
2061 throws EntityException
{
2062 List
<ModuleInfo
> allModules
= new ArrayList
<ModuleInfo
>();
2063 ModuleInfo current
= null;
2065 FrameworkModulesDocument
.FrameworkModules fModules
= null;
2066 ModuleSADocument
.ModuleSA
[] modules
= null;
2067 HashMap
<String
, XmlObject
> map
= new HashMap
<String
, XmlObject
>();
2069 if (fpdDocInstance
== null) {
2071 fpdDocInstance
= (PlatformSurfaceAreaDocument
)XmlObject
.Factory
.parse(new File(fpdFilePath
));
2072 } catch(IOException ioE
) {
2073 throw new EntityException("File IO error for xml file:" + fpdFilePath
+ "\n" + ioE
.getMessage());
2074 } catch(XmlException xmlE
) {
2075 throw new EntityException("Can't parse the FPD xml fle:" + fpdFilePath
+ "\n" + xmlE
.getMessage());
2080 Map
<FpdModuleIdentification
,XmlObject
>pcdBuildDef
= GlobalData
.getFpdModuleSaXmlObject(CollectPCDAction
.xmlObjectName
);
2081 Set
<FpdModuleIdentification
> pcdBuildKeySet
= pcdBuildDef
.keySet();
2082 Iterator item
= pcdBuildKeySet
.iterator();
2083 while (item
.hasNext()){
2084 FpdModuleIdentification id
= (FpdModuleIdentification
)item
.next();
2085 allModules
.add(new ModuleInfo(id
, id
.getModule().getModuleType(),pcdBuildDef
.get(id
)));
2092 Create token instance object into memory database, the token information
2093 comes for FPD file. Normally, FPD file will contain all token platform
2096 @return FrameworkPlatformDescriptionDocument The FPD document instance for furture usage.
2098 @throws EntityException Failed to parse FPD xml file.
2101 private void createTokenInDBFromFPD()
2102 throws EntityException
{
2106 List
<PcdBuildDefinition
.PcdData
> pcdBuildDataArray
= new ArrayList
<PcdBuildDefinition
.PcdData
>();
2107 PcdBuildDefinition
.PcdData pcdBuildData
= null;
2109 SkuInstance skuInstance
= null;
2111 List
<ModuleInfo
> modules
= null;
2112 String primaryKey
= null;
2113 String exceptionString
= null;
2114 UsageInstance usageInstance
= null;
2115 String primaryKey1
= null;
2116 String primaryKey2
= null;
2117 boolean isDuplicate
= false;
2118 Token
.PCD_TYPE pcdType
= Token
.PCD_TYPE
.UNKNOWN
;
2119 Token
.DATUM_TYPE datumType
= Token
.DATUM_TYPE
.UNKNOWN
;
2120 long tokenNumber
= 0;
2121 String moduleName
= null;
2122 String datum
= null;
2123 int maxDatumSize
= 0;
2124 String
[] tokenSpaceStrRet
= null;
2127 // ----------------------------------------------
2128 // 1), Get all <ModuleSA> from FPD file.
2129 // ----------------------------------------------
2131 modules
= getComponentsFromFPD();
2133 if (modules
== null) {
2134 throw new EntityException("[FPD file error] No modules in FPD file, Please check whether there are elements in <FrameworkModules> in FPD file!");
2138 // -------------------------------------------------------------------
2139 // 2), Loop all modules to process <PcdBuildDeclarations> for each module.
2140 // -------------------------------------------------------------------
2142 for (index
= 0; index
< modules
.size(); index
++) {
2143 isDuplicate
= false;
2144 for (index2
= 0; index2
< index
; index2
++) {
2146 // BUGBUG: For transition schema, we can *not* get module's version from
2147 // <ModuleSAs>, It is work around code.
2149 primaryKey1
= UsageInstance
.getPrimaryKey(modules
.get(index
).getModuleId().getModule().getName(),
2153 modules
.get(index
).getModuleId().getArch(),
2155 primaryKey2
= UsageInstance
.getPrimaryKey(modules
.get(index2
).getModuleId().getModule().getName(),
2159 modules
.get(index2
).getModuleId().getArch(),
2161 if (primaryKey1
.equalsIgnoreCase(primaryKey2
)) {
2172 // It is legal for a module does not contains ANY pcd build definitions.
2174 if (modules
.get(index
).getPcdBuildDef() == null) {
2178 pcdBuildDataArray
= modules
.get(index
).getPcdBuildDef().getPcdDataList();
2180 moduleName
= modules
.get(index
).getModuleId().getModule().getName();
2183 // ----------------------------------------------------------------------
2184 // 2.1), Loop all Pcd entry for a module and add it into memory database.
2185 // ----------------------------------------------------------------------
2187 for (pcdIndex
= 0; pcdIndex
< pcdBuildDataArray
.size(); pcdIndex
++) {
2188 pcdBuildData
= pcdBuildDataArray
.get(pcdIndex
);
2191 tokenSpaceStrRet
= GlobalData
.getGuidInfoFromCname(pcdBuildData
.getTokenSpaceGuidCName());
2192 } catch ( Exception e
) {
2193 throw new EntityException ("Faile get Guid for token " + pcdBuildData
.getCName() + ":" + e
.getMessage());
2196 if (tokenSpaceStrRet
== null) {
2197 throw new EntityException ("Fail to get Token space guid for token" + pcdBuildData
.getCName());
2200 primaryKey
= Token
.getPrimaryKeyString(pcdBuildData
.getCName(),
2201 translateSchemaStringToUUID(tokenSpaceStrRet
[1]));
2202 pcdType
= Token
.getpcdTypeFromString(pcdBuildData
.getItemType().toString());
2203 datumType
= Token
.getdatumTypeFromString(pcdBuildData
.getDatumType().toString());
2204 tokenNumber
= Long
.decode(pcdBuildData
.getToken().toString());
2205 if (pcdBuildData
.getValue() != null) {
2206 datum
= pcdBuildData
.getValue().toString();
2210 maxDatumSize
= pcdBuildData
.getMaxDatumSize();
2212 if ((pcdType
== Token
.PCD_TYPE
.FEATURE_FLAG
) &&
2213 (datumType
!= Token
.DATUM_TYPE
.BOOLEAN
)){
2214 exceptionString
= String
.format("[FPD file error] For PCD %s in module %s, the PCD type is FEATRUE_FLAG but "+
2215 "datum type of this PCD entry is not BOOLEAN!",
2216 pcdBuildData
.getCName(),
2218 throw new EntityException(exceptionString
);
2222 // -------------------------------------------------------------------------------------------
2223 // 2.1.1), Do some necessary checking work for FixedAtBuild, FeatureFlag and PatchableInModule
2224 // -------------------------------------------------------------------------------------------
2226 if (!Token
.isDynamic(pcdType
)) {
2228 // Value is required.
2230 if (datum
== null) {
2231 exceptionString
= String
.format("[FPD file error] There is no value for PCD entry %s in module %s!",
2232 pcdBuildData
.getCName(),
2234 throw new EntityException(exceptionString
);
2238 // Check whether the datum size is matched datum type.
2240 if ((exceptionString
= verifyDatum(pcdBuildData
.getCName(),
2244 maxDatumSize
)) != null) {
2245 throw new EntityException(exceptionString
);
2250 // ---------------------------------------------------------------------------------
2251 // 2.1.2), Create token or update token information for current anaylized PCD data.
2252 // ---------------------------------------------------------------------------------
2254 if (dbManager
.isTokenInDatabase(primaryKey
)) {
2256 // If the token is already exist in database, do some necessary checking
2257 // and add a usage instance into this token in database
2259 token
= dbManager
.getTokenByKey(primaryKey
);
2262 // checking for DatumType, DatumType should be unique for one PCD used in different
2265 if (token
.datumType
!= datumType
) {
2266 exceptionString
= String
.format("[FPD file error] The datum type of PCD entry %s is %s, which is different with %s defined in before!",
2267 pcdBuildData
.getCName(),
2268 pcdBuildData
.getDatumType().toString(),
2269 Token
.getStringOfdatumType(token
.datumType
));
2270 throw new EntityException(exceptionString
);
2274 // Check token number is valid
2276 if (tokenNumber
!= token
.tokenNumber
) {
2277 exceptionString
= String
.format("[FPD file error] The token number of PCD entry %s in module %s is different with same PCD entry in other modules!",
2278 pcdBuildData
.getCName(),
2280 throw new EntityException(exceptionString
);
2284 // For same PCD used in different modules, the PCD type should all be dynamic or non-dynamic.
2286 if (token
.isDynamicPCD
!= Token
.isDynamic(pcdType
)) {
2287 exceptionString
= String
.format("[FPD file error] For PCD entry %s in module %s, you define dynamic or non-dynamic PCD type which"+
2288 "is different with others module's",
2291 throw new EntityException(exceptionString
);
2294 if (token
.isDynamicPCD
) {
2296 // Check datum is equal the datum in dynamic information.
2297 // For dynamic PCD, you can do not write <Value> in sperated every <PcdBuildDefinition> in different <ModuleSA>,
2298 // But if you write, the <Value> must be same as the value in <DynamicPcdBuildDefinitions>.
2300 if (!token
.isSkuEnable() &&
2301 (token
.getDefaultSku().type
== DynamicTokenValue
.VALUE_TYPE
.DEFAULT_TYPE
) &&
2303 if (!datum
.equalsIgnoreCase(token
.getDefaultSku().value
)) {
2304 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in module %s, the datum in <ModuleSA> is "+
2305 "not equal to the datum in <DynamicPcdBuildDefinitions>, it is "+
2306 "illega! You could no set <Value> in <ModuleSA> for a dynamic PCD!",
2309 throw new EntityException(exceptionString
);
2313 if ((maxDatumSize
!= 0) &&
2314 (maxDatumSize
!= token
.datumSize
)){
2315 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in module %s, the max datum size is %d which "+
2316 "is different with <MaxDatumSize> %d defined in <DynamicPcdBuildDefinitions>!",
2321 throw new EntityException(exceptionString
);
2327 // If the token is not in database, create a new token instance and add
2328 // a usage instance into this token in database.
2331 tokenSpaceStrRet
= GlobalData
.getGuidInfoFromCname(pcdBuildData
.getTokenSpaceGuidCName());
2332 } catch (Exception e
) {
2333 throw new EntityException("Fail to get token space guid for token " + token
.cName
);
2336 if (tokenSpaceStrRet
== null) {
2337 throw new EntityException("Fail to get token space guid for token " + token
.cName
);
2340 token
= new Token(pcdBuildData
.getCName(),
2341 translateSchemaStringToUUID(tokenSpaceStrRet
[1]));
2343 token
.datumType
= datumType
;
2344 token
.tokenNumber
= tokenNumber
;
2345 token
.isDynamicPCD
= Token
.isDynamic(pcdType
);
2346 token
.datumSize
= maxDatumSize
;
2348 if (token
.isDynamicPCD
) {
2350 // For Dynamic and Dynamic Ex type, need find the dynamic information
2351 // in <DynamicPcdBuildDefinition> section in FPD file.
2353 updateDynamicInformation(moduleName
,
2359 dbManager
.addTokenToDatabase(primaryKey
, token
);
2363 // -----------------------------------------------------------------------------------
2364 // 2.1.3), Add the PcdType in current module into this Pcd token's supported PCD type.
2365 // -----------------------------------------------------------------------------------
2367 token
.updateSupportPcdType(pcdType
);
2370 // ------------------------------------------------
2371 // 2.1.4), Create an usage instance for this token.
2372 // ------------------------------------------------
2374 usageInstance
= new UsageInstance(token
,
2379 CommonDefinition
.getModuleType(modules
.get(index
).getModuleType()),
2381 modules
.get(index
).getModuleId().getArch(),
2385 token
.addUsageInstance(usageInstance
);
2391 Verify the datum value according its datum size and datum type, this
2392 function maybe moved to FPD verification tools in future.
2403 public String
verifyDatum(String cName
,
2406 Token
.DATUM_TYPE datumType
,
2408 String exceptionString
= null;
2414 if (moduleName
== null) {
2415 moduleName
= "section <DynamicPcdBuildDefinitions>";
2417 moduleName
= "module " + moduleName
;
2420 if (maxDatumSize
== 0) {
2421 exceptionString
= String
.format("[FPD file error] You maybe miss <MaxDatumSize> for PCD %s in %s",
2424 return exceptionString
;
2427 switch (datumType
) {
2429 if (maxDatumSize
!= 1) {
2430 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2431 "is UINT8, but datum size is %d, they are not matched!",
2435 return exceptionString
;
2438 if (datum
!= null) {
2440 value
= Integer
.decode(datum
);
2441 } catch (NumberFormatException nfeExp
) {
2442 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is not valid "+
2443 "digital format of UINT8",
2446 return exceptionString
;
2449 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is %s exceed"+
2450 " the max size of UINT8 - 0xFF",
2454 return exceptionString
;
2459 if (maxDatumSize
!= 2) {
2460 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2461 "is UINT16, but datum size is %d, they are not matched!",
2465 return exceptionString
;
2467 if (datum
!= null) {
2469 value
= Integer
.decode(datum
);
2470 } catch (NumberFormatException nfeExp
) {
2471 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is "+
2472 "not valid digital of UINT16",
2475 return exceptionString
;
2477 if (value
> 0xFFFF) {
2478 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is %s "+
2479 "which exceed the range of UINT16 - 0xFFFF",
2483 return exceptionString
;
2488 if (maxDatumSize
!= 4) {
2489 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2490 "is UINT32, but datum size is %d, they are not matched!",
2494 return exceptionString
;
2497 if (datum
!= null) {
2499 if (datum
.length() > 2) {
2500 if ((datum
.charAt(0) == '0') &&
2501 ((datum
.charAt(1) == 'x') || (datum
.charAt(1) == 'X'))){
2502 subStr
= datum
.substring(2, datum
.length());
2503 value64
= new BigInteger(subStr
, 16);
2505 value64
= new BigInteger(datum
);
2508 value64
= new BigInteger(datum
);
2510 } catch (NumberFormatException nfeExp
) {
2511 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is not "+
2512 "valid digital of UINT32",
2515 return exceptionString
;
2518 if (value64
.bitLength() > 32) {
2519 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is %s which "+
2520 "exceed the range of UINT32 - 0xFFFFFFFF",
2524 return exceptionString
;
2529 if (maxDatumSize
!= 8) {
2530 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2531 "is UINT64, but datum size is %d, they are not matched!",
2535 return exceptionString
;
2538 if (datum
!= null) {
2540 if (datum
.length() > 2) {
2541 if ((datum
.charAt(0) == '0') &&
2542 ((datum
.charAt(1) == 'x') || (datum
.charAt(1) == 'X'))){
2543 subStr
= datum
.substring(2, datum
.length());
2544 value64
= new BigInteger(subStr
, 16);
2546 value64
= new BigInteger(datum
);
2549 value64
= new BigInteger(datum
);
2551 } catch (NumberFormatException nfeExp
) {
2552 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is not valid"+
2553 " digital of UINT64",
2556 return exceptionString
;
2559 if (value64
.bitLength() > 64) {
2560 exceptionString
= String
.format("[FPD file error] The datum for PCD %s in %s is %s "+
2561 "exceed the range of UINT64 - 0xFFFFFFFFFFFFFFFF",
2565 return exceptionString
;
2570 if (maxDatumSize
!= 1) {
2571 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2572 "is BOOLEAN, but datum size is %d, they are not matched!",
2576 return exceptionString
;
2579 if (datum
!= null) {
2580 if (!(datum
.equalsIgnoreCase("TRUE") ||
2581 datum
.equalsIgnoreCase("FALSE"))) {
2582 exceptionString
= String
.format("[FPD file error] The datum type of PCD data %s in %s "+
2583 "is BOOELAN, but value is not 'true'/'TRUE' or 'FALSE'/'false'",
2586 return exceptionString
;
2592 if (datum
== null) {
2596 char ch
= datum
.charAt(0);
2600 // For void* type PCD, only three datum is support:
2601 // 1) Unicode: string with start char is "L"
2602 // 2) Ansci: String start char is ""
2603 // 3) byte array: String start char "{"
2606 start
= datum
.indexOf('\"');
2607 end
= datum
.lastIndexOf('\"');
2608 if ((start
> end
) ||
2609 (end
> datum
.length())||
2610 ((start
== end
) && (datum
.length() > 0))) {
2611 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID* and datum is "+
2612 "a UNICODE string because start with L\", but format maybe"+
2613 "is not right, correct UNICODE string is L\"...\"!",
2616 return exceptionString
;
2619 strValue
= datum
.substring(start
+ 1, end
);
2620 if ((strValue
.length() * 2) > maxDatumSize
) {
2621 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is "+
2622 "a UNICODE string, but the datum size is %d exceed to <MaxDatumSize> : %d",
2625 strValue
.length() * 2,
2627 return exceptionString
;
2629 } else if (ch
== '\"'){
2630 start
= datum
.indexOf('\"');
2631 end
= datum
.lastIndexOf('\"');
2632 if ((start
> end
) ||
2633 (end
> datum
.length())||
2634 ((start
== end
) && (datum
.length() > 0))) {
2635 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID* and datum is "+
2636 "a ANSCII string because start with \", but format maybe"+
2637 "is not right, correct ANSIC string is \"...\"!",
2640 return exceptionString
;
2642 strValue
= datum
.substring(start
+ 1, end
);
2643 if ((strValue
.length()) > maxDatumSize
) {
2644 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is "+
2645 "a ANSCI string, but the datum size is %d which exceed to <MaxDatumSize> : %d",
2650 return exceptionString
;
2652 } else if (ch
=='{') {
2653 String
[] strValueArray
;
2655 start
= datum
.indexOf('{');
2656 end
= datum
.lastIndexOf('}');
2657 strValue
= datum
.substring(start
+ 1, end
);
2658 strValue
= strValue
.trim();
2659 if (strValue
.length() == 0) {
2662 strValueArray
= strValue
.split(",");
2663 for (index
= 0; index
< strValueArray
.length
; index
++) {
2665 value
= Integer
.decode(strValueArray
[index
].trim());
2666 } catch (NumberFormatException nfeEx
) {
2667 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and "+
2668 "it is byte array in fact. For every byte in array should be a valid"+
2669 "byte digital, but element %s is not a valid byte digital!",
2672 strValueArray
[index
]);
2673 return exceptionString
;
2676 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*, "+
2677 "it is byte array in fact. But the element of %s exceed the byte range",
2680 strValueArray
[index
]);
2681 return exceptionString
;
2685 if (strValueArray
.length
> maxDatumSize
) {
2686 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is byte"+
2687 "array, but the number of bytes is %d which exceed to <MaxDatumSzie> : %d!",
2690 strValueArray
.length
,
2692 return exceptionString
;
2695 exceptionString
= String
.format("[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+
2696 "1) UNICODE string: like L\"xxxx\";\r\n"+
2697 "2) ANSIC string: like \"xxx\";\r\n"+
2698 "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+
2699 "But the datum in seems does not following above format!",
2702 return exceptionString
;
2706 exceptionString
= String
.format("[FPD file error] For PCD entry %s in %s, datum type is unknown, it should be one of "+
2707 "UINT8, UINT16, UINT32, UINT64, VOID*, BOOLEAN",
2710 return exceptionString
;
2716 Get dynamic information for a dynamic PCD from <DynamicPcdBuildDefinition> seciton in FPD file.
2718 This function should be implemented in GlobalData in future.
2720 @param token The token instance which has hold module's PCD information
2721 @param moduleName The name of module who will use this Dynamic PCD.
2723 @return DynamicPcdBuildDefinitions.PcdBuildData
2726 private DynamicPcdBuildDefinitions
.PcdBuildData
getDynamicInfoFromFPD(Token token
,
2728 throws EntityException
{
2730 String exceptionString
= null;
2731 String dynamicPrimaryKey
= null;
2732 DynamicPcdBuildDefinitions dynamicPcdBuildDefinitions
= null;
2733 List
<DynamicPcdBuildDefinitions
.PcdBuildData
> dynamicPcdBuildDataArray
= null;
2734 String
[] tokenSpaceStrRet
= null;
2737 // If FPD document is not be opened, open and initialize it.
2739 if (fpdDocInstance
== null) {
2741 fpdDocInstance
= (PlatformSurfaceAreaDocument
)XmlObject
.Factory
.parse(new File(fpdFilePath
));
2742 } catch(IOException ioE
) {
2743 throw new EntityException("File IO error for xml file:" + fpdFilePath
+ "\n" + ioE
.getMessage());
2744 } catch(XmlException xmlE
) {
2745 throw new EntityException("Can't parse the FPD xml fle:" + fpdFilePath
+ "\n" + xmlE
.getMessage());
2749 dynamicPcdBuildDefinitions
= fpdDocInstance
.getPlatformSurfaceArea().getDynamicPcdBuildDefinitions();
2750 if (dynamicPcdBuildDefinitions
== null) {
2751 exceptionString
= String
.format("[FPD file error] There are no <PcdDynamicBuildDescriptions> in FPD file but contains Dynamic type "+
2752 "PCD entry %s in module %s!",
2755 throw new EntityException(exceptionString
);
2758 dynamicPcdBuildDataArray
= dynamicPcdBuildDefinitions
.getPcdBuildDataList();
2759 for (index
= 0; index
< dynamicPcdBuildDataArray
.size(); index
++) {
2760 //String tokenSpaceGuidString = GlobalData.getGuidInfoFromCname(dynamicPcdBuildDataArray.get(index).getTokenSpaceGuidCName())[1];
2761 String tokenSpaceGuidString
= null;
2763 tokenSpaceStrRet
= GlobalData
.getGuidInfoFromCname(dynamicPcdBuildDataArray
.get(index
).getTokenSpaceGuidCName());
2764 } catch (Exception e
) {
2765 throw new EntityException ("Fail to get token space guid for token " + dynamicPcdBuildDataArray
.get(index
).getCName());
2768 if (tokenSpaceStrRet
== null) {
2769 throw new EntityException ("Fail to get token space guid for token " + dynamicPcdBuildDataArray
.get(index
).getCName());
2772 dynamicPrimaryKey
= Token
.getPrimaryKeyString(dynamicPcdBuildDataArray
.get(index
).getCName(),
2773 translateSchemaStringToUUID(tokenSpaceStrRet
[1]));
2774 if (dynamicPrimaryKey
.equalsIgnoreCase(token
.getPrimaryKeyString())) {
2775 return dynamicPcdBuildDataArray
.get(index
);
2783 Update dynamic information for PCD entry.
2785 Dynamic information is retrieved from <PcdDynamicBuildDeclarations> in
2788 @param moduleName The name of the module who use this PCD
2789 @param token The token instance
2790 @param datum The <datum> in module's PCD information
2791 @param maxDatumSize The <maxDatumSize> in module's PCD information
2795 private Token
updateDynamicInformation(String moduleName
,
2799 throws EntityException
{
2802 String exceptionString
= null;
2803 DynamicTokenValue dynamicValue
;
2804 SkuInstance skuInstance
= null;
2806 boolean hasSkuId0
= false;
2807 Token
.PCD_TYPE pcdType
= Token
.PCD_TYPE
.UNKNOWN
;
2808 long tokenNumber
= 0;
2809 String hiiDefaultValue
= null;
2810 String
[] variableGuidString
= null;
2812 List
<DynamicPcdBuildDefinitions
.PcdBuildData
.SkuInfo
> skuInfoList
= null;
2813 DynamicPcdBuildDefinitions
.PcdBuildData dynamicInfo
= null;
2815 dynamicInfo
= getDynamicInfoFromFPD(token
, moduleName
);
2816 if (dynamicInfo
== null) {
2817 exceptionString
= String
.format("[FPD file error] For Dynamic PCD %s used by module %s, "+
2818 "there is no dynamic information in <DynamicPcdBuildDefinitions> "+
2819 "in FPD file, but it is required!",
2822 throw new EntityException(exceptionString
);
2825 token
.datumSize
= dynamicInfo
.getMaxDatumSize();
2827 exceptionString
= verifyDatum(token
.cName
,
2832 if (exceptionString
!= null) {
2833 throw new EntityException(exceptionString
);
2836 if ((maxDatumSize
!= 0) &&
2837 (maxDatumSize
!= token
.datumSize
)) {
2838 exceptionString
= String
.format("FPD file error] For dynamic PCD %s, the datum size in module %s is %d, but "+
2839 "the datum size in <DynamicPcdBuildDefinitions> is %d, they are not match!",
2843 dynamicInfo
.getMaxDatumSize());
2844 throw new EntityException(exceptionString
);
2846 tokenNumber
= Long
.decode(dynamicInfo
.getToken().toString());
2847 if (tokenNumber
!= token
.tokenNumber
) {
2848 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s, the token number in module %s is 0x%x, but"+
2849 "in <DynamicPcdBuildDefinictions>, the token number is 0x%x, they are not match!",
2854 throw new EntityException(exceptionString
);
2857 pcdType
= Token
.getpcdTypeFromString(dynamicInfo
.getItemType().toString());
2858 if (pcdType
== Token
.PCD_TYPE
.DYNAMIC_EX
) {
2859 token
.dynamicExTokenNumber
= tokenNumber
;
2862 skuInfoList
= dynamicInfo
.getSkuInfoList();
2865 // Loop all sku data
2867 for (index
= 0; index
< skuInfoList
.size(); index
++) {
2868 skuInstance
= new SkuInstance();
2870 // Although SkuId in schema is BigInteger, but in fact, sku id is 32 bit value.
2872 temp
= skuInfoList
.get(index
).getSkuId().toString();
2873 skuInstance
.id
= Integer
.decode(temp
);
2874 if (skuInstance
.id
== 0) {
2878 // Judge whether is DefaultGroup at first, because most case is DefautlGroup.
2880 if (skuInfoList
.get(index
).getValue() != null) {
2881 skuInstance
.value
.setValue(skuInfoList
.get(index
).getValue().toString());
2882 if ((exceptionString
= verifyDatum(token
.cName
,
2884 skuInfoList
.get(index
).getValue().toString(),
2886 token
.datumSize
)) != null) {
2887 throw new EntityException(exceptionString
);
2890 token
.skuData
.add(skuInstance
);
2893 // Judege wether is same of datum between module's information
2894 // and dynamic information.
2896 if (datum
!= null) {
2897 if ((skuInstance
.id
== 0) &&
2898 !datum
.toString().equalsIgnoreCase(skuInfoList
.get(index
).getValue().toString())) {
2899 exceptionString
= "[FPD file error] For dynamic PCD " + token
.cName
+ ", the value in module " + moduleName
+ " is " + datum
.toString() + " but the "+
2900 "value of sku 0 data in <DynamicPcdBuildDefinition> is " + skuInstance
.value
.value
+ ". They are must be same!"+
2901 " or you could not define value for a dynamic PCD in every <ModuleSA>!";
2902 throw new EntityException(exceptionString
);
2909 // Judge whether is HII group case.
2911 if (skuInfoList
.get(index
).getVariableName() != null) {
2912 exceptionString
= null;
2913 if (skuInfoList
.get(index
).getVariableGuid() == null) {
2914 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in <DynamicPcdBuildDefinitions> section in FPD "+
2915 "file, who use HII, but there is no <VariableGuid> defined for Sku %d data!",
2918 if (exceptionString
!= null) {
2919 throw new EntityException(exceptionString
);
2923 if (skuInfoList
.get(index
).getVariableOffset() == null) {
2924 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in <DynamicPcdBuildDefinitions> section in FPD "+
2925 "file, who use HII, but there is no <VariableOffset> defined for Sku %d data!",
2928 if (exceptionString
!= null) {
2929 throw new EntityException(exceptionString
);
2933 if (skuInfoList
.get(index
).getHiiDefaultValue() == null) {
2934 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in <DynamicPcdBuildDefinitions> section in FPD "+
2935 "file, who use HII, but there is no <HiiDefaultValue> defined for Sku %d data!",
2938 if (exceptionString
!= null) {
2939 throw new EntityException(exceptionString
);
2943 if (skuInfoList
.get(index
).getHiiDefaultValue() != null) {
2944 hiiDefaultValue
= skuInfoList
.get(index
).getHiiDefaultValue().toString();
2946 hiiDefaultValue
= null;
2949 if ((exceptionString
= verifyDatum(token
.cName
,
2953 token
.datumSize
)) != null) {
2954 throw new EntityException(exceptionString
);
2957 offset
= Integer
.decode(skuInfoList
.get(index
).getVariableOffset());
2958 if (offset
> 0xFFFF) {
2959 throw new EntityException(String
.format("[FPD file error] For dynamic PCD %s , the variable offset defined in sku %d data "+
2960 "exceed 64K, it is not allowed!",
2966 // Get variable guid string according to the name of guid which will be mapped into a GUID in SPD file.
2968 variableGuidString
= GlobalData
.getGuidInfoFromCname(skuInfoList
.get(index
).getVariableGuid().toString());
2969 if (variableGuidString
== null) {
2970 throw new EntityException(String
.format("[GUID Error] For dynamic PCD %s, the variable guid %s can be found in all SPD file!",
2972 skuInfoList
.get(index
).getVariableGuid().toString()));
2974 String variableStr
= skuInfoList
.get(index
).getVariableName();
2975 Pattern pattern
= Pattern
.compile("0x([a-fA-F0-9]){4}");
2976 Matcher matcher
= pattern
.matcher(variableStr
);
2977 List
<String
> varNameList
= new ArrayList
<String
>();
2978 while (matcher
.find()){
2979 String str
= variableStr
.substring(matcher
.start(),matcher
.end());
2980 varNameList
.add(str
);
2983 skuInstance
.value
.setHiiData(varNameList
,
2984 translateSchemaStringToUUID(variableGuidString
[1]),
2985 skuInfoList
.get(index
).getVariableOffset(),
2986 skuInfoList
.get(index
).getHiiDefaultValue().toString());
2987 token
.skuData
.add(skuInstance
);
2991 if (skuInfoList
.get(index
).getVpdOffset() != null) {
2992 skuInstance
.value
.setVpdData(skuInfoList
.get(index
).getVpdOffset());
2993 token
.skuData
.add(skuInstance
);
2997 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s, the dynamic info must "+
2998 "be one of 'DefaultGroup', 'HIIGroup', 'VpdGroup'.",
3000 throw new EntityException(exceptionString
);
3004 exceptionString
= String
.format("[FPD file error] For dynamic PCD %s in <DynamicPcdBuildDefinitions>, there are "+
3005 "no sku id = 0 data, which is required for every dynamic PCD",
3007 throw new EntityException(exceptionString
);
3014 Translate the schema string to UUID instance.
3016 In schema, the string of UUID is defined as following two types string:
3017 1) GuidArrayType: pattern = 0x[a-fA-F0-9]{1,8},( )*0x[a-fA-F0-9]{1,4},(
3018 )*0x[a-fA-F0-9]{1,4}(,( )*\{)?(,?( )*0x[a-fA-F0-9]{1,2}){8}( )*(\})?
3020 2) GuidNamingConvention: pattern =
3021 [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
3023 This function will convert string and create uuid instance.
3025 @param uuidString UUID string in XML file
3027 @return UUID UUID instance
3029 private UUID
translateSchemaStringToUUID(String uuidString
)
3030 throws EntityException
{
3032 String
[] splitStringArray
;
3037 if (uuidString
== null) {
3041 if (uuidString
.length() == 0) {
3045 if (uuidString
.equals("0") ||
3046 uuidString
.equalsIgnoreCase("0x0")) {
3047 return new UUID(0, 0);
3050 uuidString
= uuidString
.replaceAll("\\{", "");
3051 uuidString
= uuidString
.replaceAll("\\}", "");
3054 // If the UUID schema string is GuidArrayType type then need translate
3055 // to GuidNamingConvention type at first.
3057 if ((uuidString
.charAt(0) == '0') && ((uuidString
.charAt(1) == 'x') || (uuidString
.charAt(1) == 'X'))) {
3058 splitStringArray
= uuidString
.split("," );
3059 if (splitStringArray
.length
!= 11) {
3060 throw new EntityException ("[FPD file error] Wrong format for UUID string: " + uuidString
);
3064 // Remove blank space from these string and remove header string "0x"
3066 for (index
= 0; index
< 11; index
++) {
3067 splitStringArray
[index
] = splitStringArray
[index
].trim();
3068 splitStringArray
[index
] = splitStringArray
[index
].substring(2, splitStringArray
[index
].length());
3072 // Add heading '0' to normalize the string length
3074 for (index
= 3; index
< 11; index
++) {
3075 chLen
= splitStringArray
[index
].length();
3076 for (chIndex
= 0; chIndex
< 2 - chLen
; chIndex
++) {
3077 splitStringArray
[index
] = "0" + splitStringArray
[index
];
3082 // construct the final GuidNamingConvention string
3084 temp
= String
.format("%s-%s-%s-%s%s-%s%s%s%s%s%s",
3085 splitStringArray
[0],
3086 splitStringArray
[1],
3087 splitStringArray
[2],
3088 splitStringArray
[3],
3089 splitStringArray
[4],
3090 splitStringArray
[5],
3091 splitStringArray
[6],
3092 splitStringArray
[7],
3093 splitStringArray
[8],
3094 splitStringArray
[9],
3095 splitStringArray
[10]);
3099 return UUID
.fromString(uuidString
);
3103 check parameter for this action.
3105 @throws EntityException Bad parameter.
3107 private void checkParameter() throws EntityException
{
3110 if((fpdFilePath
== null) ||(workspacePath
== null)) {
3111 throw new EntityException("WorkspacePath and FPDFileName should be blank for CollectPCDAtion!");
3114 if(fpdFilePath
.length() == 0 || workspacePath
.length() == 0) {
3115 throw new EntityException("WorkspacePath and FPDFileName should be blank for CollectPCDAtion!");
3118 file
= new File(workspacePath
);
3119 if(!file
.exists()) {
3120 throw new EntityException("WorkpacePath " + workspacePath
+ " does not exist!");
3123 file
= new File(fpdFilePath
);
3125 if(!file
.exists()) {
3126 throw new EntityException("FPD File " + fpdFilePath
+ " does not exist!");
3133 @param argv parameter from command line
3135 public static void main(String argv
[]) throws EntityException
{
3136 CollectPCDAction ca
= new CollectPCDAction();
3137 ca
.setWorkspacePath("m:/tianocore/edk2");
3138 ca
.setFPDFilePath("m:/tianocore/edk2/EdkNt32Pkg/Nt32.fpd");
3139 ca
.setActionMessageLevel(ActionMessage
.MAX_MESSAGE_LEVEL
);
3140 // GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",
3141 // "m:/tianocore/edk2");