1 /** @file
2 
3   Vfr common library functions.
4 
5 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef _VFRUTILITYLIB_H_
17 #define _VFRUTILITYLIB_H_
18 
19 #include "string.h"
20 #include "Common/UefiBaseTypes.h"
21 #include "EfiVfr.h"
22 #include "VfrError.h"
23 
24 extern BOOLEAN  VfrCompatibleMode;
25 
26 #define MAX_NAME_LEN                       64
27 #define MAX_STRING_LEN                     0x100
28 #define DEFAULT_ALIGN                      1
29 #define DEFAULT_PACK_ALIGN                 0x8
30 #define DEFAULT_NAME_TABLE_ITEMS           1024
31 
32 #define EFI_BITS_SHIFT_PER_UINT32          0x5
33 #define EFI_BITS_PER_UINT32                (1 << EFI_BITS_SHIFT_PER_UINT32)
34 
35 #define BUFFER_SAFE_FREE(Buf)              do { if ((Buf) != NULL) { delete (Buf); } } while (0);
36 #define ARRAY_SAFE_FREE(Buf)               do { if ((Buf) != NULL) { delete[] (Buf); } } while (0);
37 
38 
39 class CVfrBinaryOutput {
40 public:
41   virtual VOID WriteLine (IN FILE *, IN UINT32, IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
42   virtual VOID WriteEnd (IN FILE *, IN UINT32, IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
43 };
44 
45 UINT32
46 _STR2U32 (
47   IN CHAR8 *Str
48   );
49 
50 struct SConfigInfo {
51   UINT16             mOffset;
52   UINT16             mWidth;
53   UINT8              *mValue;
54   SConfigInfo        *mNext;
55 
56   SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
57   ~SConfigInfo (VOID);
58 
59 private:
60   SConfigInfo (IN CONST SConfigInfo&);             // Prevent copy-construction
61   SConfigInfo& operator= (IN CONST SConfigInfo&);  // Prevent assignment
62 };
63 
64 struct SConfigItem {
65   CHAR8         *mName;         // varstore name
66   EFI_GUID      *mGuid;         // varstore guid, varstore name + guid deside one varstore
67   CHAR8         *mId;           // default ID
68   SConfigInfo   *mInfoStrList;  // list of Offset/Value in the varstore
69   SConfigItem   *mNext;
70 
71 public:
72   SConfigItem (IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *);
73   SConfigItem (IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
74   virtual ~SConfigItem ();
75 
76 private:
77   SConfigItem (IN CONST SConfigItem&);             // Prevent copy-construction
78   SConfigItem& operator= (IN CONST SConfigItem&);  // Prevent assignment
79 };
80 
81 class CVfrBufferConfig {
82 private:
83   SConfigItem *mItemListHead;
84   SConfigItem *mItemListTail;
85   SConfigItem *mItemListPos;
86 
87 public:
88   CVfrBufferConfig (VOID);
89   virtual ~CVfrBufferConfig (VOID);
90 
91   virtual UINT8   Register (IN CHAR8 *, IN EFI_GUID *,IN CHAR8 *Info = NULL);
92   virtual VOID    Open (VOID);
93   virtual BOOLEAN Eof(VOID);
94   virtual UINT8   Select (IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *Info = NULL);
95   virtual UINT8   Write (IN CONST CHAR8, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
96 #if 0
97   virtual UINT8   Read (OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **, OUT CHAR8 **);
98 #endif
99   virtual VOID    Close (VOID);
100   virtual VOID    OutputCFile (IN FILE *, IN CHAR8 *);
101 
102 private:
103   CVfrBufferConfig (IN CONST CVfrBufferConfig&);             // Prevent copy-construction
104   CVfrBufferConfig& operator= (IN CONST CVfrBufferConfig&);  // Prevent assignment
105 };
106 
107 extern CVfrBufferConfig gCVfrBufferConfig;
108 
109 #define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
110 #define INVALID_ARRAY_INDEX      0xFFFFFFFF
111 
112 struct SVfrDataType;
113 
114 struct SVfrDataField {
115   CHAR8                     mFieldName[MAX_NAME_LEN];
116   SVfrDataType              *mFieldType;
117   UINT32                    mOffset;
118   UINT32                    mArrayNum;
119   SVfrDataField             *mNext;
120 };
121 
122 struct SVfrDataType {
123   CHAR8                     mTypeName[MAX_NAME_LEN];
124   UINT8                     mType;
125   UINT32                    mAlign;
126   UINT32                    mTotalSize;
127   SVfrDataField             *mMembers;
128   SVfrDataType              *mNext;
129 };
130 
131 #define VFR_PACK_ASSIGN     0x01
132 #define VFR_PACK_SHOW       0x02
133 #define VFR_PACK_PUSH       0x04
134 #define VFR_PACK_POP        0x08
135 
136 #define PACKSTACK_MAX_SIZE  0x400
137 
138 struct SVfrPackStackNode {
139   CHAR8                     *mIdentifier;
140   UINT32                    mNumber;
141   SVfrPackStackNode         *mNext;
142 
SVfrPackStackNodeSVfrPackStackNode143   SVfrPackStackNode (IN CHAR8 *Identifier, IN UINT32 Number) {
144     mIdentifier = NULL;
145     mNumber     = Number;
146     mNext       = NULL;
147 
148     if (Identifier != NULL) {
149       mIdentifier = new CHAR8[strlen (Identifier) + 1];
150       strcpy (mIdentifier, Identifier);
151     }
152   }
153 
~SVfrPackStackNodeSVfrPackStackNode154   ~SVfrPackStackNode (VOID) {
155     if (mIdentifier != NULL) {
156       delete[] mIdentifier;
157     }
158     mNext = NULL;
159   }
160 
MatchSVfrPackStackNode161   bool Match (IN CHAR8 *Identifier) {
162     if (Identifier == NULL) {
163       return TRUE;
164     } else if (mIdentifier == NULL) {
165       return FALSE;
166     } else if (strcmp (Identifier, mIdentifier) == 0) {
167       return TRUE;
168     } else {
169       return FALSE;
170     }
171   }
172 
173 private:
174   SVfrPackStackNode (IN CONST SVfrPackStackNode&);             // Prevent copy-construction
175   SVfrPackStackNode& operator= (IN CONST SVfrPackStackNode&);  // Prevent assignment
176 };
177 
178 class CVfrVarDataTypeDB {
179 private:
180   UINT32                    mPackAlign;
181   SVfrPackStackNode         *mPackStack;
182 
183 public:
184   EFI_VFR_RETURN_CODE       Pack (IN UINT32, IN UINT8, IN CHAR8 *Identifier = NULL, IN UINT32 Number = DEFAULT_PACK_ALIGN);
185 
186 private:
187   SVfrDataType              *mDataTypeList;
188 
189   SVfrDataType              *mNewDataType;
190   SVfrDataType              *mCurrDataType;
191   SVfrDataField             *mCurrDataField;
192 
193   VOID InternalTypesListInit (VOID);
194   VOID RegisterNewType (IN SVfrDataType *);
195 
196   EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *);
197   EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType *, IN SVfrDataField *&);
198   EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
199   UINT8               GetFieldWidth (IN SVfrDataField *);
200   UINT32              GetFieldSize (IN SVfrDataField *, IN UINT32);
201 
202 public:
203   CVfrVarDataTypeDB (VOID);
204   ~CVfrVarDataTypeDB (VOID);
205 
206   VOID                DeclareDataTypeBegin (VOID);
207   EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
208   EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
209   VOID                DeclareDataTypeEnd (VOID);
210 
211   EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);
212   EFI_VFR_RETURN_CODE GetDataTypeSize (IN CHAR8 *, OUT UINT32 *);
213   EFI_VFR_RETURN_CODE GetDataTypeSize (IN UINT8, OUT UINT32 *);
214   EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
215 
216   EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *);
217   EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &);
218 
219   BOOLEAN             IsTypeNameDefined (IN CHAR8 *);
220 
221   VOID                Dump(IN FILE *);
222   //
223   // First the declared
224   //
225   CHAR8               *mFirstNewDataTypeName;
226 #ifdef CVFR_VARDATATYPEDB_DEBUG
227   VOID ParserDB ();
228 #endif
229 
230 private:
231   CVfrVarDataTypeDB (IN CONST CVfrVarDataTypeDB&);             // Prevent copy-construction
232   CVfrVarDataTypeDB& operator= (IN CONST CVfrVarDataTypeDB&);  // Prevent assignment
233 };
234 
235 extern CVfrVarDataTypeDB  gCVfrVarDataTypeDB;
236 
237 typedef enum {
238   EFI_VFR_VARSTORE_INVALID,
239   EFI_VFR_VARSTORE_BUFFER,
240   EFI_VFR_VARSTORE_EFI,
241   EFI_VFR_VARSTORE_NAME
242 } EFI_VFR_VARSTORE_TYPE;
243 
244 struct SVfrVarStorageNode {
245   EFI_GUID                  mGuid;
246   CHAR8                     *mVarStoreName;
247   EFI_VARSTORE_ID           mVarStoreId;
248   BOOLEAN                   mAssignedFlag; //Create varstore opcode
249   struct SVfrVarStorageNode *mNext;
250 
251   EFI_VFR_VARSTORE_TYPE     mVarStoreType;
252   union {
253     // EFI Variable
254     struct {
255       EFI_STRING_ID           mEfiVarName;
256       UINT32                  mEfiVarSize;
257     } mEfiVar;
258 
259     // Buffer Storage
260     SVfrDataType            *mDataType;
261 
262     // NameValue Storage
263 	struct {
264       EFI_STRING_ID         *mNameTable;
265       UINT32                mTableSize;
266     } mNameSpace;
267   } mStorageInfo;
268 
269 public:
270   SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
271   SVfrVarStorageNode (IN EFI_GUID *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *, IN BOOLEAN Flag = TRUE);
272   SVfrVarStorageNode (IN CHAR8 *, IN EFI_VARSTORE_ID);
273   ~SVfrVarStorageNode (VOID);
274 
275 private:
276   SVfrVarStorageNode (IN CONST SVfrVarStorageNode&);             // Prevent copy-construction
277   SVfrVarStorageNode& operator= (IN CONST SVfrVarStorageNode&);  // Prevent assignment
278 };
279 
280 struct EFI_VARSTORE_INFO {
281   EFI_VARSTORE_ID           mVarStoreId;
282   union {
283     EFI_STRING_ID           mVarName;
284     UINT16                  mVarOffset;
285   } mInfo;
286   UINT8                     mVarType;
287   UINT32                    mVarTotalSize;
288 
289   EFI_VARSTORE_INFO (VOID);
290   EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
291   EFI_VARSTORE_INFO& operator=(IN CONST EFI_VARSTORE_INFO &);
292   BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
293 };
294 
295 struct BufferVarStoreFieldInfoNode {
296   EFI_VARSTORE_INFO  mVarStoreInfo;
297   struct BufferVarStoreFieldInfoNode *mNext;
298 
299   BufferVarStoreFieldInfoNode( IN EFI_VARSTORE_INFO  *Info );
300   ~BufferVarStoreFieldInfoNode ();
301 };
302 
303 #define EFI_VARSTORE_ID_MAX              0xFFFF
304 #define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
305 
306 class CVfrDataStorage {
307 private:
308   UINT32                    mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
309 
310   struct SVfrVarStorageNode *mBufferVarStoreList;
311   struct SVfrVarStorageNode *mEfiVarStoreList;
312   struct SVfrVarStorageNode *mNameVarStoreList;
313 
314   struct SVfrVarStorageNode *mCurrVarStorageNode;
315   struct SVfrVarStorageNode *mNewVarStorageNode;
316   BufferVarStoreFieldInfoNode    *mBufferFieldInfoListHead;
317   BufferVarStoreFieldInfoNode    *mBufferFieldInfoListTail;
318 
319 private:
320 
321   EFI_VARSTORE_ID GetFreeVarStoreId (EFI_VFR_VARSTORE_TYPE VarType = EFI_VFR_VARSTORE_BUFFER);
322   BOOLEAN         ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
323   VOID            MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
324   VOID            MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
325   EFI_VARSTORE_ID CheckGuidField (IN SVfrVarStorageNode *,
326                                   IN EFI_GUID *,
327                                   IN BOOLEAN *,
328                                   OUT EFI_VFR_RETURN_CODE *);
329 
330 public:
331   CVfrDataStorage ();
332   ~CVfrDataStorage ();
333 
GetBufferVarStoreList()334   SVfrVarStorageNode * GetBufferVarStoreList () {
335     return mBufferVarStoreList;
336   }
GetEfiVarStoreList()337   SVfrVarStorageNode * GetEfiVarStoreList () {
338     return mEfiVarStoreList;
339   }
340   EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (CHAR8 *, EFI_VARSTORE_ID);
341   EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
342   EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
343 
344   EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN CHAR8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32, IN BOOLEAN Flag = TRUE);
345 
346   EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN CHAR8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN CHAR8 *, IN EFI_VARSTORE_ID, IN BOOLEAN Flag = TRUE);
347 
348   EFI_VFR_RETURN_CODE GetVarStoreId (IN CHAR8 *, OUT EFI_VARSTORE_ID *, IN EFI_GUID *VarGuid = NULL);
349   EFI_VFR_VARSTORE_TYPE GetVarStoreType (IN EFI_VARSTORE_ID);
350   EFI_GUID *          GetVarStoreGuid (IN  EFI_VARSTORE_ID);
351   EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT CHAR8 **);
352   EFI_VFR_RETURN_CODE GetVarStoreByDataType (IN CHAR8 *, OUT SVfrVarStorageNode **, IN EFI_GUID *VarGuid = NULL);
353 
354   EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN EFI_VARSTORE_ID, OUT CHAR8 **);
355   EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
356   EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
357   EFI_VFR_RETURN_CODE AddBufferVarStoreFieldInfo (IN EFI_VARSTORE_INFO *);
358   EFI_VFR_RETURN_CODE GetBufferVarStoreFieldInfo (IN OUT EFI_VARSTORE_INFO *);
359 
360 private:
361   CVfrDataStorage (IN CONST CVfrDataStorage&);             // Prevent copy-construction
362   CVfrDataStorage& operator= (IN CONST CVfrDataStorage&);  // Prevent assignment
363 };
364 
365 extern CVfrDataStorage gCVfrDataStorage;
366 
367 #define EFI_QUESTION_ID_MAX              0xFFFF
368 #define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
369 #define EFI_QUESTION_ID_INVALID          0x0
370 
371 #define DATE_YEAR_BITMASK                0x0000FFFF
372 #define DATE_MONTH_BITMASK               0x00FF0000
373 #define DATE_DAY_BITMASK                 0xFF000000
374 #define TIME_HOUR_BITMASK                0x000000FF
375 #define TIME_MINUTE_BITMASK              0x0000FF00
376 #define TIME_SECOND_BITMASK              0x00FF0000
377 
378 struct SVfrQuestionNode {
379   CHAR8                     *mName;
380   CHAR8                     *mVarIdStr;
381   EFI_QUESTION_ID           mQuestionId;
382   UINT32                    mBitMask;
383   SVfrQuestionNode          *mNext;
384   EFI_QUESION_TYPE          mQtype;
385 
386   SVfrQuestionNode (IN CHAR8 *, IN CHAR8 *, IN UINT32 BitMask = 0);
387   ~SVfrQuestionNode ();
388 
389 private:
390   SVfrQuestionNode (IN CONST SVfrQuestionNode&);             // Prevent copy-construction
391   SVfrQuestionNode& operator= (IN CONST SVfrQuestionNode&);  // Prevent assignment
392 };
393 
394 class CVfrQuestionDB {
395 private:
396   SVfrQuestionNode          *mQuestionList;
397   UINT32                    mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
398 
399 private:
400   EFI_QUESTION_ID GetFreeQuestionId (VOID);
401   BOOLEAN         ChekQuestionIdFree (IN EFI_QUESTION_ID);
402   VOID            MarkQuestionIdUsed (IN EFI_QUESTION_ID);
403   VOID            MarkQuestionIdUnused (IN EFI_QUESTION_ID);
404 
405 public:
406   CVfrQuestionDB ();
407   ~CVfrQuestionDB();
408 
409   EFI_VFR_RETURN_CODE RegisterQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
410   VOID                RegisterOldDateQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
411   VOID                RegisterNewDateQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
412   VOID                RegisterOldTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
413   VOID                RegisterNewTimeQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
414   VOID                RegisterRefQuestion (IN CHAR8 *, IN CHAR8 *, IN OUT EFI_QUESTION_ID &);
415   EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
416   VOID                GetQuestionId (IN CHAR8 *, IN CHAR8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &, OUT EFI_QUESION_TYPE *QType = NULL);
417   EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
418   EFI_VFR_RETURN_CODE FindQuestion (IN CHAR8 *);
419   VOID                PrintAllQuestion (IN VOID);
420   VOID                ResetInit (IN VOID);
421 
SetCompatibleMode(IN BOOLEAN Mode)422   VOID SetCompatibleMode (IN BOOLEAN Mode) {
423     VfrCompatibleMode = Mode;
424   }
425 
426 private:
427   CVfrQuestionDB (IN CONST CVfrQuestionDB&);             // Prevent copy-construction
428   CVfrQuestionDB& operator= (IN CONST CVfrQuestionDB&);  // Prevent assignment
429 };
430 
431 struct SVfrDefaultStoreNode {
432   EFI_IFR_DEFAULTSTORE      *mObjBinAddr;
433   CHAR8                     *mRefName;
434   EFI_STRING_ID             mDefaultStoreNameId;
435   UINT16                    mDefaultId;
436 
437   SVfrDefaultStoreNode      *mNext;
438 
439   SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
440   ~SVfrDefaultStoreNode();
441 
442 private:
443   SVfrDefaultStoreNode (IN CONST SVfrDefaultStoreNode&);             // Prevent copy-construction
444   SVfrDefaultStoreNode& operator= (IN CONST SVfrDefaultStoreNode&);  // Prevent assignment
445 };
446 
447 class CVfrDefaultStore {
448 private:
449   SVfrDefaultStoreNode      *mDefaultStoreList;
450 
451 public:
452   CVfrDefaultStore ();
453   ~CVfrDefaultStore ();
454 
455   EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN CHAR8 *, IN EFI_STRING_ID, IN UINT16);
456   EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN CHAR8 *, IN EFI_STRING_ID);
457   BOOLEAN             DefaultIdRegistered (IN UINT16);
458   EFI_VFR_RETURN_CODE GetDefaultId (IN CHAR8 *, OUT UINT16 *);
459   EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN CHAR8 *, IN EFI_GUID *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
460 
461 private:
462   CVfrDefaultStore (IN CONST CVfrDefaultStore&);             // Prevent copy-construction
463   CVfrDefaultStore& operator= (IN CONST CVfrDefaultStore&);  // Prevent assignment
464 };
465 
466 extern CVfrDefaultStore gCVfrDefaultStore;
467 
468 #define EFI_RULE_ID_START    0x01
469 #define EFI_RULE_ID_INVALID  0x00
470 
471 struct SVfrRuleNode {
472   UINT8                     mRuleId;
473   CHAR8                     *mRuleName;
474   SVfrRuleNode              *mNext;
475 
476   SVfrRuleNode(IN CHAR8 *, IN UINT8);
477   ~SVfrRuleNode();
478 
479 private:
480   SVfrRuleNode (IN CONST SVfrRuleNode&);             // Prevent copy-construction
481   SVfrRuleNode& operator= (IN CONST SVfrRuleNode&);  // Prevent assignment
482 };
483 
484 class CVfrRulesDB {
485 private:
486   SVfrRuleNode              *mRuleList;
487   UINT8                     mFreeRuleId;
488 
489 public:
490   CVfrRulesDB ();
491   ~CVfrRulesDB();
492 
493   VOID RegisterRule (IN CHAR8 *);
494   UINT8 GetRuleId (IN CHAR8 *);
495 
496 private:
497   CVfrRulesDB (IN CONST CVfrRulesDB&);             // Prevent copy-construction
498   CVfrRulesDB& operator= (IN CONST CVfrRulesDB&);  // Prevent assignment
499 };
500 
501 class CVfrStringDB {
502 private:
503   CHAR8   *mStringFileName;
504 
505   EFI_STATUS FindStringBlock (
506     IN  UINT8            *StringData,
507     IN  EFI_STRING_ID    StringId,
508     OUT UINT32           *StringTextOffset,
509     OUT UINT8            *BlockType
510     );
511 
512   UINT32 GetUnicodeStringTextSize (
513     IN  UINT8            *StringSrc
514     );
515 
516   BOOLEAN GetBestLanguage (
517     IN CONST CHAR8  *SupportedLanguages,
518     IN CHAR8        *Language
519     );
520 
521 public:
522   CVfrStringDB ();
523   ~CVfrStringDB ();
524 
525   VOID SetStringFileName (
526     IN CHAR8 *StringFileName
527     );
528 
529   CHAR8 * GetVarStoreNameFormStringId (
530     IN EFI_STRING_ID StringId
531     );
532 
533 private:
534   CVfrStringDB (IN CONST CVfrStringDB&);             // Prevent copy-construction
535   CVfrStringDB& operator= (IN CONST CVfrStringDB&);  // Prevent assignment
536 };
537 
538 #endif
539