]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrUtilityLib.cpp
CommitLineData
5b19df7f
LG
1/*++\r
2\r
4b1e1121
HT
3Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials\r
5b19df7f
LG
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14VfrUtilityLib.cpp\r
15\r
16Abstract:\r
17\r
18--*/\r
19\r
95d675b5 20#include "stdio.h"\r
21#include "stdlib.h"\r
22#include "VfrUtilityLib.h"\r
23#include "VfrFormPkg.h"\r
24\r
25VOID\r
26CVfrBinaryOutput::WriteLine (\r
27 IN FILE *pFile,\r
28 IN UINT32 LineBytes,\r
29 IN INT8 *LineHeader,\r
30 IN INT8 *BlkBuf,\r
31 IN UINT32 BlkSize\r
32 )\r
33{\r
34 UINT32 Index;\r
35\r
36 if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
37 return;\r
38 }\r
39\r
40 for (Index = 0; Index < BlkSize; Index++) {\r
41 if ((Index % LineBytes) == 0) {\r
42 fprintf (pFile, "\n%s", LineHeader);\r
43 }\r
44 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
45 }\r
46}\r
47\r
48VOID\r
49CVfrBinaryOutput::WriteEnd (\r
50 IN FILE *pFile,\r
51 IN UINT32 LineBytes,\r
52 IN INT8 *LineHeader,\r
53 IN INT8 *BlkBuf,\r
54 IN UINT32 BlkSize\r
55 )\r
56{\r
57 UINT32 Index;\r
58\r
59 if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
60 return;\r
61 }\r
62\r
63 for (Index = 0; Index < BlkSize - 1; Index++) {\r
64 if ((Index % LineBytes) == 0) {\r
65 fprintf (pFile, "\n%s", LineHeader);\r
66 }\r
67 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
68 }\r
69\r
70 if ((Index % LineBytes) == 0) {\r
71 fprintf (pFile, "\n%s", LineHeader);\r
72 }\r
73 fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);\r
74}\r
75\r
76SConfigInfo::SConfigInfo (\r
77 IN UINT8 Type, \r
78 IN UINT16 Offset, \r
79 IN UINT32 Width, \r
80 IN EFI_IFR_TYPE_VALUE Value\r
81 )\r
82{\r
83 mOffset = Offset;\r
84 mWidth = (UINT16)Width;\r
85 mValue = new UINT8[mWidth];\r
86 if (mValue == NULL) {\r
87 return;\r
88 }\r
89\r
90 switch (Type) {\r
91 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
92 memcpy (mValue, &Value.u8, mWidth);\r
93 break;\r
94 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
95 memcpy (mValue, &Value.u16, mWidth);\r
96 break;\r
97 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
98 memcpy (mValue, &Value.u32, mWidth);\r
99 break;\r
100 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
101 memcpy (mValue, &Value.u64, mWidth);\r
102 break;\r
103 case EFI_IFR_TYPE_BOOLEAN :\r
104 memcpy (mValue, &Value.b, mWidth);\r
105 break;\r
106 case EFI_IFR_TYPE_TIME :\r
107 memcpy (mValue, &Value.time, mWidth);\r
108 break;\r
109 case EFI_IFR_TYPE_DATE :\r
110 memcpy (mValue, &Value.date, mWidth);\r
111 break;\r
112 case EFI_IFR_TYPE_STRING :\r
113 memcpy (mValue, &Value.string, mWidth);\r
114 break;\r
115 case EFI_IFR_TYPE_OTHER :\r
116 return;\r
117 }\r
118}\r
119\r
120SConfigInfo::~SConfigInfo (\r
121 VOID\r
122 )\r
123{\r
124 BUFFER_SAFE_FREE (mValue);\r
125}\r
126\r
127SConfigItem::SConfigItem (\r
128 IN INT8 *Id, \r
129 IN INT8 *Info\r
130 )\r
131{\r
132 mId = NULL;\r
133 mInfo = NULL;\r
134 mInfoStrList = NULL;\r
135 mNext = NULL;\r
136\r
137 if (Id != NULL) {\r
138 if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
139 strcpy (mId, Id);\r
140 }\r
141 }\r
142\r
143 if (Info != NULL) {\r
144 if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
145 strcpy (mInfo, Info);\r
146 }\r
147 }\r
148}\r
149\r
150SConfigItem::SConfigItem (\r
151 IN INT8 *Id, \r
152 IN INT8 *Info,\r
153 IN UINT8 Type,\r
154 IN UINT16 Offset,\r
155 IN UINT16 Width,\r
156 IN EFI_IFR_TYPE_VALUE Value\r
157 )\r
158{\r
159 mId = NULL;\r
160 mInfo = NULL;\r
161 mInfoStrList = NULL;\r
162 mNext = NULL;\r
163\r
164 if (Id != NULL) {\r
165 if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
166 strcpy (mId, Id);\r
167 }\r
168 }\r
169\r
170 if (Info != NULL) {\r
171 if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
172 strcpy (mInfo, Info);\r
173 }\r
174 }\r
175\r
176 mInfoStrList = new SConfigInfo(Type, Offset, Width, Value);\r
177}\r
178\r
179SConfigItem::~SConfigItem (\r
180 VOID\r
181 )\r
182{\r
183 SConfigInfo *Info;\r
184\r
185 BUFFER_SAFE_FREE (mId);\r
186 BUFFER_SAFE_FREE (mInfo);\r
187 while (mInfoStrList != NULL) {\r
188 Info = mInfoStrList;\r
189 mInfoStrList = mInfoStrList->mNext;\r
190\r
191 BUFFER_SAFE_FREE (Info);\r
192 }\r
193}\r
194\r
195UINT8\r
196CVfrBufferConfig::Register (\r
197 IN INT8 *Id, \r
198 IN INT8 *Info\r
199 )\r
200{\r
201 SConfigItem *pNew;\r
202\r
203 if (Select (Id) == 0) {\r
204 return 1;\r
205 }\r
206\r
207 if ((pNew = new SConfigItem (Id, Info)) == NULL) {\r
208 return 2;\r
209 }\r
210 if (mItemListHead == NULL) {\r
211 mItemListHead = pNew;\r
212 mItemListTail = pNew;\r
213 } else {\r
214 mItemListTail->mNext = pNew;\r
215 mItemListTail = pNew;\r
216 }\r
217 mItemListPos = pNew;\r
218\r
219 return 0;\r
220}\r
221\r
222VOID\r
223CVfrBufferConfig::Open (\r
224 VOID\r
225 )\r
226{\r
227 mItemListPos = mItemListHead;\r
228}\r
229\r
230BOOLEAN\r
231CVfrBufferConfig::Eof(\r
232 VOID\r
233 )\r
234{\r
235 return (mItemListPos == NULL) ? TRUE : FALSE;\r
236}\r
237\r
238UINT8\r
239CVfrBufferConfig::Select (\r
240 IN INT8 *Id,\r
241 IN INT8 *Info\r
242 )\r
243{\r
244 SConfigItem *p;\r
245\r
246 if (Id == NULL) {\r
247 mItemListPos = mItemListHead;\r
248 return 0;\r
249 } else {\r
250 for (p = mItemListHead; p != NULL; p = p->mNext) {\r
251 if (strcmp (p->mId, Id) != 0) {\r
252 continue;\r
253 }\r
254\r
255 if ((p->mInfo != NULL) && (Info != NULL)) {\r
256 if (strcmp (p->mInfo, Info) != 0) {\r
257 continue;\r
258 }\r
259 }\r
260\r
261 mItemListPos = p;\r
262 return 0;\r
263 }\r
264 }\r
265\r
266 return 1;\r
267}\r
268\r
269UINT8\r
270CVfrBufferConfig::Write (\r
271 IN CONST CHAR8 Mode,\r
272 IN INT8 *Id, \r
273 IN INT8 *Info,\r
274 IN UINT8 Type,\r
275 IN UINT16 Offset,\r
276 IN UINT32 Width,\r
277 IN EFI_IFR_TYPE_VALUE Value\r
278 )\r
279{\r
280 UINT8 Ret;\r
281 SConfigItem *pItem;\r
282 SConfigInfo *pInfo;\r
283\r
284 switch (Mode) {\r
285 case 'a' : // add\r
286 if (Select (Id) == 0) {\r
287 if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {\r
288 return 2;\r
289 }\r
290 pInfo->mNext = mItemListPos->mInfoStrList;\r
291 mItemListPos->mInfoStrList = pInfo;\r
292 } else {\r
293 if ((pItem = new SConfigItem (Id, Info, Type, Offset, Width, Value)) == NULL) {\r
294 return 2;\r
295 }\r
296 if (mItemListHead == NULL) {\r
297 mItemListHead = pItem;\r
298 mItemListTail = pItem;\r
299 } else {\r
300 mItemListTail->mNext = pItem;\r
301 mItemListTail = pItem;\r
302 }\r
303 mItemListPos = pItem;\r
304 }\r
305 break;\r
306\r
307 case 'd' : // delete\r
308 if ((Ret = Select (Id)) != 0) {\r
309 return Ret;\r
310 }\r
311\r
312 if (mItemListHead == mItemListPos) {\r
313 mItemListHead = mItemListPos->mNext;\r
314 delete mItemListPos;\r
315 break;\r
316 }\r
317\r
318 for (pItem = mItemListHead; pItem->mNext != mItemListPos; pItem = pItem->mNext)\r
319 ;\r
320\r
321 pItem->mNext = mItemListPos->mNext;\r
322 if (mItemListTail == mItemListPos) {\r
323 mItemListTail = pItem;\r
324 }\r
325 delete mItemListPos;\r
326 mItemListPos = pItem->mNext;\r
327 break;\r
328\r
329 case 'i' : // set info\r
330 if ((Ret = Select (Id)) != 0) {\r
331 return Ret;\r
332 }\r
333 if (mItemListPos->mInfo != NULL) {\r
334 delete mItemListPos->mInfo;\r
335 }\r
336 mItemListPos->mInfo = NULL;\r
337 if (Info != NULL) {\r
338 if ((mItemListPos->mInfo = new INT8[strlen (Info) + 1]) == NULL) {\r
339 return 2;\r
340 }\r
341 strcpy (mItemListPos->mInfo, Info);\r
342 }\r
343 break;\r
344\r
345 default :\r
346 return 1;\r
347 }\r
348\r
349 return 0;\r
350}\r
351\r
352#if 0\r
353UINT8\r
354CVfrBufferConfig::ReadId (\r
355 OUT INT8 **Id, \r
356 OUT INT8 **Info\r
357 )\r
358{\r
359 if (mInfoStrItemListPos == NULL) {\r
360 return 1; // end read or some error occur\r
361 }\r
362\r
363 if (Id != NULL) {\r
364 *Id = new INT8 (strlen (mInfoStrItemListPos->mId + 1));\r
365 strcpy (*Id, mInfoStrItemListPos->mId);\r
366 }\r
367 if (Info != NULL) {\r
368 *Info = new INT8 (strlen (mInfoStrItemListPos->mInfo + 1));\r
369 strcpy (*Info, mInfoStrItemListPos->mInfo);\r
370 }\r
371\r
372 return 0;\r
373}\r
374\r
375UINT8\r
376CVfrBufferConfig::ReadInfo (\r
377 IN INT8 *Id, \r
378 IN UINT32 Index,\r
379 IN OUT UINT32 &Number,\r
380 OUT INT8 *Offset,\r
381 OUT INT8 *Width,\r
382 OUT INT8 *Value\r
383 )\r
384{\r
385 UINT8 ret;\r
386 SConfigInfo *p;\r
387 UINT32 idx;\r
388 UINT32 num;\r
389\r
390 if (Id != NULL) {\r
391 if ((ret = Select (Id)) != 0) {\r
392 return ret;\r
393 }\r
394 }\r
395\r
396 if (mInfoStrItemListPos == NULL) {\r
397 return 1; // end read or some error occur\r
398 }\r
399\r
400 p = mInfoStrItemListPos->mInfoStrList;\r
401 for (idx = 0; (idx < Index) && (p != NULL); idx++) {\r
402 p = p->mNext;\r
403 }\r
404 if (p == NULL) {\r
405 return 1;\r
406 }\r
407\r
408 if (Offset != NULL) {\r
409 Offset[0] = '\0';\r
410 }\r
411 if (Width != NULL) {\r
412 Width[0] = '\0';\r
413 }\r
414 if (Value != NULL) {\r
415 Value[0] = '\0';\r
416 }\r
417\r
418 while (num < Number) {\r
419 if (Offset != NULL) {\r
420 strcat (Offset, p->mOffset);\r
421 }\r
422 if (Width != NULL) {\r
423 strcat (Width, p->mWidth);\r
424 }\r
425 if (Value != NULL) {\r
426 strcat (Value, p->mValue);\r
427 }\r
428\r
429 num++;\r
430 if ((p = p->mNext) == NULL) {\r
431 break;\r
432 }\r
433 }\r
434 Number = num;\r
435\r
436 return 0;\r
437}\r
438\r
439VOID\r
440CVfrBufferConfig::ReadNext (\r
441 VOID\r
442 )\r
443{\r
444 if (mItemListPos != NULL) {\r
445 mItemListPos = mItemListPos->mNext;\r
446 }\r
447}\r
448#endif\r
449\r
450VOID\r
451CVfrBufferConfig::Close (\r
452 VOID\r
453 )\r
454{\r
455 mItemListPos = NULL;\r
456}\r
457\r
458#define BYTES_PRE_LINE 0x10\r
459\r
460VOID\r
461CVfrBufferConfig::OutputCFile (\r
462 IN FILE *pFile,\r
463 IN INT8 *BaseName\r
464 )\r
465{\r
466 CVfrBinaryOutput Output;\r
467 SConfigItem *Item;\r
468 SConfigInfo *Info;\r
469 UINT32 TotalLen;\r
470\r
471 if (pFile == NULL) {\r
472 return;\r
473 }\r
474\r
475 for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
476 if (Item->mInfoStrList != NULL) {\r
477 fprintf (pFile, "\nunsigned char %s%sDefault%04x[] = {", BaseName, Item->mId, Item->mInfo);\r
478\r
479 TotalLen = sizeof (UINT32);\r
480 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
481 TotalLen += Info->mWidth + sizeof (UINT16) * 2;\r
482 }\r
483 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&TotalLen, sizeof (UINT32));\r
484\r
485 for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
486 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
487 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
488 if (Info->mNext == NULL) {\r
489 Output.WriteEnd (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
490 } else {\r
491 Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
492 }\r
493 fprintf (pFile, "\n"); \r
494 }\r
495 fprintf (pFile, "};\n"); \r
496 }\r
497 }\r
498}\r
499\r
500CVfrBufferConfig::CVfrBufferConfig (\r
501 VOID\r
502 )\r
503{\r
504 mItemListHead = NULL;\r
505 mItemListTail = NULL;\r
506 mItemListPos = NULL;\r
507}\r
508\r
509CVfrBufferConfig::~CVfrBufferConfig (\r
510 VOID\r
511 )\r
512{\r
513 SConfigItem *p;\r
514\r
515 while (mItemListHead != NULL) {\r
516 p = mItemListHead;\r
517 mItemListHead = mItemListHead->mNext;\r
518 delete p;\r
519 }\r
520\r
521 mItemListHead = NULL;\r
522 mItemListTail = NULL;\r
523 mItemListPos = NULL;\r
524}\r
525\r
526CVfrBufferConfig gCVfrBufferConfig;\r
527\r
528static struct {\r
529 INT8 *mTypeName;\r
530 UINT8 mType;\r
531 UINT32 mSize;\r
532 UINT32 mAlign;\r
533} gInternalTypesTable [] = {\r
534 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64, sizeof (UINT64), sizeof (UINT64)},\r
535 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32, sizeof (UINT32), sizeof (UINT32)},\r
536 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16, sizeof (UINT16), sizeof (UINT16)},\r
537 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8, sizeof (UINT8), sizeof (UINT8)},\r
538 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN, sizeof (BOOLEAN), sizeof (BOOLEAN)},\r
539 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE, sizeof (EFI_HII_DATE), sizeof (UINT8)},\r
540 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING, sizeof (EFI_STRING_ID),sizeof (EFI_STRING_ID)},\r
541 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME, sizeof (EFI_HII_TIME), sizeof (UINT8)},\r
542 {NULL, EFI_IFR_TYPE_OTHER, 0, 0}\r
543};\r
544\r
545STATIC\r
546BOOLEAN\r
547_IS_INTERNAL_TYPE (\r
548 IN INT8 *TypeName\r
549 )\r
550{\r
551 UINT32 Index;\r
552\r
553 if (TypeName == NULL) {\r
554 return FALSE;\r
555 }\r
556\r
557 for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
558 if (strcmp (TypeName, gInternalTypesTable[Index].mTypeName) == 0) {\r
559 return TRUE;\r
560 }\r
561 }\r
562\r
563 return FALSE;\r
564}\r
565\r
566STATIC\r
567INT8 *\r
568TrimHex (\r
569 IN INT8 *Str,\r
570 OUT bool *IsHex\r
571 )\r
572{\r
573 *IsHex = FALSE;\r
574\r
575 while (*Str && *Str == ' ') {\r
576 Str++;\r
577 }\r
578 while (*Str && *Str == '0') {\r
579 Str++;\r
580 }\r
581 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
582 Str++;\r
583 *IsHex = TRUE;\r
584 }\r
585\r
586 return Str;\r
587}\r
588\r
589UINT32\r
590_STR2U32 (\r
591 IN INT8 *Str\r
592 )\r
593{\r
594 bool IsHex;\r
595 UINT32 Value;\r
596 INT8 c;\r
597\r
598 Str = TrimHex (Str, &IsHex);\r
599 for (Value = 0; (c = *Str) != '\0'; Str++) {\r
600 //\r
601 // BUG: does not handle overflow here\r
602 //\r
603 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
604\r
605 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
606 Value += (c - 'a' + 10);\r
607 }\r
608 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
609 Value += (c - 'A' + 10);\r
610 }\r
611 if (c >= '0' && c <= '9') {\r
612 Value += (c - '0');\r
613 } \r
614 }\r
615\r
616 return Value;\r
617}\r
618\r
619VOID\r
620CVfrVarDataTypeDB::RegisterNewType (\r
621 IN SVfrDataType *New\r
622 )\r
623{\r
624 New->mNext = mDataTypeList;\r
625 mDataTypeList = New;\r
626}\r
627\r
628EFI_VFR_RETURN_CODE\r
629CVfrVarDataTypeDB::ExtractStructTypeName (\r
630 IN INT8 *&VarStr, \r
631 OUT INT8 *TName\r
632 )\r
633{\r
634 if (TName == NULL) {\r
635 return VFR_RETURN_FATAL_ERROR;\r
636 }\r
637\r
638 while((*VarStr != '\0') && (*VarStr != '.')) {\r
639 *TName = *VarStr;\r
640 VarStr++;\r
641 TName++;\r
642 }\r
643 *TName = '\0';\r
644 if (*VarStr == '.') {\r
645 VarStr++;\r
646 }\r
647\r
648 return VFR_RETURN_SUCCESS;\r
649}\r
650\r
651EFI_VFR_RETURN_CODE\r
652CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
653 IN INT8 *&VarStr, \r
654 IN INT8 *FName,\r
655 OUT UINT32 &ArrayIdx\r
656 )\r
657{\r
658 UINT32 Idx;\r
659 INT8 ArrayStr[MAX_NAME_LEN + 1];\r
660\r
661 ArrayIdx = INVALID_ARRAY_INDEX; \r
662\r
663 if (FName == NULL) {\r
664 return VFR_RETURN_FATAL_ERROR;\r
665 }\r
666\r
667 while((*VarStr != '\0') &&\r
668 (*VarStr != '.') && \r
669 (*VarStr != '[') && \r
670 (*VarStr != ']')) {\r
671 *FName = *VarStr;\r
672 VarStr++;\r
673 FName++;\r
674 }\r
675 *FName = '\0';\r
676\r
677 switch (*VarStr) {\r
678 case '.' :\r
679 VarStr++;\r
680 case '\0':\r
681 return VFR_RETURN_SUCCESS;\r
682 case '[' :\r
683 VarStr++;\r
684 for (Idx = 0; (Idx < MAX_NAME_LEN) && (*VarStr != '\0') && (*VarStr != ']'); VarStr++, Idx++) {\r
685 ArrayStr[Idx] = *VarStr;\r
686 }\r
687 ArrayStr[Idx] = '\0';\r
688\r
689 if ((*VarStr != ']') && (ArrayStr[0] == '\0')) {\r
690 return VFR_RETURN_DATA_STRING_ERROR;\r
691 }\r
692 ArrayIdx = _STR2U32 (ArrayStr);\r
693 if (*VarStr == ']') {\r
694 VarStr++;\r
695 }\r
696 return VFR_RETURN_SUCCESS;\r
697 case ']':\r
698 return VFR_RETURN_DATA_STRING_ERROR;\r
699 }\r
700\r
701 return VFR_RETURN_SUCCESS;\r
702}\r
703\r
704EFI_VFR_RETURN_CODE\r
705CVfrVarDataTypeDB::GetTypeField (\r
706 IN INT8 *FName, \r
707 IN SVfrDataType *Type, \r
708 OUT SVfrDataField *&Field\r
709 )\r
710{\r
711 SVfrDataField *pField = NULL;\r
712\r
713 if ((FName == NULL) && (Type == NULL)) {\r
714 return VFR_RETURN_FATAL_ERROR;\r
715 }\r
716\r
717 for (pField = Type->mMembers; pField != NULL; pField = pField->mNext) {\r
718 if (strcmp (pField->mFieldName, FName) == 0) {\r
719 Field = pField;\r
720 return VFR_RETURN_SUCCESS;\r
721 }\r
722 }\r
723\r
724 return VFR_RETURN_UNDEFINED;\r
725}\r
726\r
727EFI_VFR_RETURN_CODE\r
728CVfrVarDataTypeDB::GetFieldOffset (\r
729 IN SVfrDataField *Field, \r
730 IN UINT32 ArrayIdx,\r
731 OUT UINT32 &Offset\r
732 )\r
733{\r
734 if (Field == NULL) {\r
735 return VFR_RETURN_FATAL_ERROR;\r
736 }\r
737\r
738 if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {\r
739 return VFR_RETURN_ERROR_ARRARY_NUM;\r
740 }\r
741\r
742 Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
743 return VFR_RETURN_SUCCESS;\r
744}\r
745\r
746UINT8\r
747CVfrVarDataTypeDB::GetFieldWidth (\r
748 IN SVfrDataField *Field\r
749 )\r
750{\r
751 if (Field == NULL) {\r
752 return 0;\r
753 }\r
754\r
755 return Field->mFieldType->mType;\r
756}\r
757\r
758UINT32\r
759CVfrVarDataTypeDB::GetFieldSize (\r
760 IN SVfrDataField *Field,\r
761 IN UINT32 ArrayIdx\r
762 )\r
763{\r
764 if (Field == NULL) {\r
765 return VFR_RETURN_FATAL_ERROR;\r
766 }\r
767\r
768 if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {\r
769 return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
770 } else {\r
771 return Field->mFieldType->mTotalSize;\r
772 }\r
773}\r
774\r
775VOID\r
776CVfrVarDataTypeDB::InternalTypesListInit (\r
777 VOID\r
778 )\r
779{\r
780 SVfrDataType *New = NULL;\r
781 UINT32 Index;\r
782\r
783 for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
784 New = new SVfrDataType;\r
785 if (New != NULL) {\r
786 strcpy (New->mTypeName, gInternalTypesTable[Index].mTypeName);\r
787 New->mType = gInternalTypesTable[Index].mType;\r
788 New->mAlign = gInternalTypesTable[Index].mAlign;\r
789 New->mTotalSize = gInternalTypesTable[Index].mSize;\r
790 if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_DATE") == 0) {\r
791 SVfrDataField *pYearField = new SVfrDataField;\r
792 SVfrDataField *pMonthField = new SVfrDataField;\r
793 SVfrDataField *pDayField = new SVfrDataField;\r
794\r
795 strcpy (pYearField->mFieldName, "Year");\r
796 GetDataType ("UINT8", &pYearField->mFieldType);\r
797 pYearField->mOffset = 0;\r
798 pYearField->mNext = pMonthField;\r
799 pYearField->mArrayNum = 0;\r
800\r
801 strcpy (pMonthField->mFieldName, "Month");\r
802 GetDataType ("UINT8", &pMonthField->mFieldType);\r
803 pMonthField->mOffset = 1;\r
804 pMonthField->mNext = pDayField;\r
805 pMonthField->mArrayNum = 0;\r
806\r
807 strcpy (pDayField->mFieldName, "Day");\r
808 GetDataType ("UINT8", &pDayField->mFieldType);\r
809 pDayField->mOffset = 2;\r
810 pDayField->mNext = NULL;\r
811 pDayField->mArrayNum = 0;\r
812\r
813 New->mMembers = pYearField;\r
814 } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {\r
815 SVfrDataField *pHoursField = new SVfrDataField;\r
816 SVfrDataField *pMinutesField = new SVfrDataField;\r
817 SVfrDataField *pSecondsField = new SVfrDataField;\r
818\r
819 strcpy (pHoursField->mFieldName, "Hours");\r
820 GetDataType ("UINT8", &pHoursField->mFieldType);\r
821 pHoursField->mOffset = 0;\r
822 pHoursField->mNext = pMinutesField;\r
823 pHoursField->mArrayNum = 0;\r
824\r
825 strcpy (pMinutesField->mFieldName, "Minutes");\r
826 GetDataType ("UINT8", &pMinutesField->mFieldType);\r
827 pMinutesField->mOffset = 1;\r
828 pMinutesField->mNext = pSecondsField;\r
829 pMinutesField->mArrayNum = 0;\r
830\r
831 strcpy (pSecondsField->mFieldName, "Seconds");\r
832 GetDataType ("UINT8", &pSecondsField->mFieldType);\r
833 pSecondsField->mOffset = 2;\r
834 pSecondsField->mNext = NULL;\r
835 pSecondsField->mArrayNum = 0;\r
836\r
837 New->mMembers = pHoursField; \r
838 } else {\r
839 New->mMembers = NULL;\r
840 }\r
841 New->mNext = NULL;\r
842 RegisterNewType (New);\r
843 New = NULL;\r
844 }\r
845 }\r
846}\r
847\r
848CVfrVarDataTypeDB::CVfrVarDataTypeDB (\r
849 VOID\r
850 )\r
851{\r
852 mDataTypeList = NULL;\r
853 mNewDataType = NULL;\r
854 mCurrDataField = NULL;\r
855 mPackAlign = DEFAULT_PACK_ALIGN;\r
856\r
857 InternalTypesListInit ();\r
858}\r
859\r
860CVfrVarDataTypeDB::~CVfrVarDataTypeDB (\r
861 VOID\r
862 )\r
863{\r
864 SVfrDataType *pType;\r
865 SVfrDataField *pField;\r
866\r
867 if (mNewDataType != NULL) {\r
868 delete mNewDataType;\r
869 }\r
870\r
871 while (mDataTypeList != NULL) {\r
872 pType = mDataTypeList;\r
873 mDataTypeList = mDataTypeList->mNext;\r
874 while(pType->mMembers != NULL) {\r
875 pField = pType->mMembers;\r
876 pType->mMembers = pType->mMembers->mNext;\r
877 delete pField;\r
878 }\r
879 delete pType;\r
880 }\r
881\r
882}\r
883\r
884EFI_VFR_RETURN_CODE\r
885CVfrVarDataTypeDB::Pack (\r
886 IN UINT32 Align\r
887 )\r
888{\r
889 if (Align == 0) {\r
890 return VFR_RETURN_INVALID_PARAMETER;\r
891 } else if (Align > 1) {\r
892 mPackAlign = Align + Align % 2;\r
893 } else {\r
894 mPackAlign = Align;\r
895 }\r
896\r
897 return VFR_RETURN_SUCCESS;\r
898}\r
899\r
900VOID\r
901CVfrVarDataTypeDB::UnPack (\r
902 VOID\r
903 )\r
904{\r
905 mPackAlign = DEFAULT_PACK_ALIGN;\r
906}\r
907\r
908VOID\r
909CVfrVarDataTypeDB::DeclareDataTypeBegin (\r
910 VOID\r
911 )\r
912{\r
913 SVfrDataType *pNewType = NULL;\r
914\r
915 pNewType = new SVfrDataType;\r
916 pNewType->mTypeName[0] = '\0';\r
917 pNewType->mType = EFI_IFR_TYPE_OTHER;\r
918 pNewType->mAlign = DEFAULT_ALIGN;\r
919 pNewType->mTotalSize = 0;\r
920 pNewType->mMembers = NULL;\r
921 pNewType->mNext = NULL;\r
922\r
923 mNewDataType = pNewType;\r
924}\r
925\r
926EFI_VFR_RETURN_CODE\r
927CVfrVarDataTypeDB::SetNewTypeName (\r
928 IN INT8 *TypeName\r
929 )\r
930{\r
931 SVfrDataType *pType;\r
932\r
933 if (mNewDataType == NULL) {\r
934 return VFR_RETURN_ERROR_SKIPED;\r
935 }\r
936 if (TypeName == NULL) {\r
937 return VFR_RETURN_FATAL_ERROR;\r
938 }\r
939 if (strlen(TypeName) >= MAX_NAME_LEN) {\r
940 return VFR_RETURN_INVALID_PARAMETER;\r
941 }\r
942\r
943 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
944 if (strcmp(pType->mTypeName, TypeName) == 0) {\r
945 return VFR_RETURN_REDEFINED;\r
946 }\r
947 }\r
948\r
949 strcpy(mNewDataType->mTypeName, TypeName);\r
950 return VFR_RETURN_SUCCESS;\r
951}\r
952\r
953EFI_VFR_RETURN_CODE\r
954CVfrVarDataTypeDB::DataTypeAddField (\r
955 IN INT8 *FieldName, \r
956 IN INT8 *TypeName, \r
957 IN UINT32 ArrayNum\r
958 )\r
959{\r
960 SVfrDataField *pNewField = NULL;\r
961 SVfrDataType *pFieldType = NULL;\r
962 SVfrDataField *pTmp;\r
963 UINT32 Align;\r
964\r
965 CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
966\r
967 if (strlen (FieldName) >= MAX_NAME_LEN) {\r
968 return VFR_RETURN_INVALID_PARAMETER;\r
969 }\r
970\r
971 for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {\r
972 if (strcmp (pTmp->mFieldName, FieldName) == 0) {\r
973 return VFR_RETURN_REDEFINED;\r
974 }\r
975 }\r
976\r
977 Align = MIN (mPackAlign, pFieldType->mAlign);\r
978\r
979 if ((pNewField = new SVfrDataField) == NULL) {\r
980 return VFR_RETURN_OUT_FOR_RESOURCES;\r
981 }\r
982 strcpy (pNewField->mFieldName, FieldName);\r
983 pNewField->mFieldType = pFieldType;\r
984 pNewField->mArrayNum = ArrayNum;\r
985 if ((mNewDataType->mTotalSize % Align) == 0) {\r
986 pNewField->mOffset = mNewDataType->mTotalSize;\r
987 } else {\r
988 pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);\r
989 }\r
990 if (mNewDataType->mMembers == NULL) {\r
991 mNewDataType->mMembers = pNewField;\r
992 pNewField->mNext = NULL;\r
993 } else {\r
994 for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext) \r
995 ;\r
996 pTmp->mNext = pNewField;\r
997 pNewField->mNext = NULL;\r
998 }\r
999\r
1000 mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
1001 mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
1002\r
1003 return VFR_RETURN_SUCCESS;\r
1004}\r
1005\r
1006VOID\r
1007CVfrVarDataTypeDB::DeclareDataTypeEnd (\r
1008 VOID\r
1009 )\r
1010{\r
1011 if (mNewDataType->mTypeName[0] == '\0') {\r
1012 return;\r
1013 }\r
1014\r
1015 if ((mNewDataType->mTotalSize % mNewDataType->mAlign) !=0) {\r
1016 mNewDataType->mTotalSize += ALIGN_STUFF (mNewDataType->mTotalSize, mNewDataType->mAlign);\r
1017 }\r
1018\r
1019 RegisterNewType (mNewDataType);\r
1020 mNewDataType = NULL;\r
1021}\r
1022\r
1023EFI_VFR_RETURN_CODE\r
1024CVfrVarDataTypeDB::GetDataType (\r
1025 IN INT8 *TypeName,\r
1026 OUT SVfrDataType **DataType\r
1027\r
1028 )\r
1029{\r
1030 SVfrDataType *pDataType = NULL;\r
1031\r
1032 if (TypeName == NULL) {\r
1033 return VFR_RETURN_ERROR_SKIPED;\r
1034 }\r
1035\r
1036 if (DataType == NULL) {\r
1037 return VFR_RETURN_FATAL_ERROR;\r
1038 }\r
1039\r
1040 *DataType = NULL;\r
1041\r
1042 for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
1043 if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
1044 *DataType = pDataType;\r
1045 return VFR_RETURN_SUCCESS;\r
1046 }\r
1047 }\r
1048\r
1049 return VFR_RETURN_UNDEFINED;\r
1050}\r
1051\r
1052EFI_VFR_RETURN_CODE\r
1053CVfrVarDataTypeDB::GetDataTypeSize (\r
1054 IN INT8 *TypeName,\r
1055 OUT UINT32 *Size\r
1056 )\r
1057{\r
1058 SVfrDataType *pDataType = NULL;\r
1059\r
1060 if (Size == NULL) {\r
1061 return VFR_RETURN_FATAL_ERROR;\r
1062 }\r
1063\r
1064 *Size = 0;\r
1065\r
1066 for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
1067 if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
1068 *Size = pDataType->mTotalSize;\r
1069 return VFR_RETURN_SUCCESS;\r
1070 }\r
1071 }\r
1072\r
1073 return VFR_RETURN_UNDEFINED;\r
1074}\r
1075\r
1076EFI_VFR_RETURN_CODE\r
1077CVfrVarDataTypeDB::GetDataFieldInfo (\r
1078 IN INT8 *VarStr, \r
1079 OUT UINT16 &Offset, \r
1080 OUT UINT8 &Type, \r
1081 OUT UINT32 &Size\r
1082 )\r
1083{\r
1084 INT8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];\r
1085 UINT32 ArrayIdx, Tmp;\r
1086 SVfrDataType *pType = NULL;\r
1087 SVfrDataField *pField = NULL;\r
1088\r
1089 Offset = 0;\r
1090 Type = EFI_IFR_TYPE_OTHER;\r
1091 Size = 0;\r
1092\r
1093 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
1094 CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
1095\r
1096 //\r
1097 // if it is not struct data type\r
1098 //\r
1099 Type = pType->mType;\r
1100 Size = pType->mTotalSize;\r
1101\r
1102 while (*VarStr != '\0') {\r
1103 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
1104 CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
1105 pType = pField->mFieldType;\r
1106 CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);\r
1107 Offset += Tmp;\r
1108 Type = GetFieldWidth (pField);\r
1109 Size = GetFieldSize (pField, ArrayIdx);\r
1110 }\r
1111 return VFR_RETURN_SUCCESS;\r
1112}\r
1113\r
1114EFI_VFR_RETURN_CODE\r
1115CVfrVarDataTypeDB::GetUserDefinedTypeNameList (\r
1116 OUT INT8 ***NameList, \r
1117 OUT UINT32 *ListSize\r
1118 )\r
1119{\r
1120 UINT32 Index;\r
1121 SVfrDataType *pType;\r
1122\r
1123 if ((NameList == NULL) || (ListSize == NULL)) {\r
1124 return VFR_RETURN_FATAL_ERROR;\r
1125 }\r
1126\r
1127 *NameList = NULL;\r
1128 *ListSize = 0;\r
1129\r
1130 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
1131 if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
1132 (*ListSize)++;\r
1133 }\r
1134 }\r
1135\r
1136 if (*ListSize == 0) {\r
1137 return VFR_RETURN_SUCCESS;\r
1138 }\r
1139\r
1140 if ((*NameList = new INT8*[*ListSize]) == NULL) {\r
1141 *ListSize = 0;\r
1142 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1143 }\r
1144\r
1145 for (Index = 0, pType = mDataTypeList; pType != NULL; pType = pType->mNext, Index++) {\r
1146 if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
1147 (*NameList)[Index] = pType->mTypeName;\r
1148 }\r
1149 }\r
1150 return VFR_RETURN_SUCCESS;\r
1151}\r
1152\r
1153BOOLEAN\r
1154CVfrVarDataTypeDB::IsTypeNameDefined (\r
1155 IN INT8 *TypeName\r
1156 )\r
1157{\r
1158 SVfrDataType *pType;\r
1159\r
1160 if (TypeName == NULL) {\r
1161 return FALSE;\r
1162 }\r
1163\r
1164 for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
1165 if (strcmp (pType->mTypeName, TypeName) == 0) {\r
1166 return TRUE;\r
1167 }\r
1168 }\r
1169\r
1170 return FALSE;\r
1171}\r
1172\r
1173#ifdef CVFR_VARDATATYPEDB_DEBUG\r
1174VOID\r
1175CVfrVarDataTypeDB::ParserDB (\r
1176 VOID\r
1177 )\r
1178{\r
1179 SVfrDataType *pTNode;\r
1180 SVfrDataField *pFNode;\r
1181\r
1182 printf ("***************************************************************\n");\r
1183 printf ("\t\tmPackAlign = %x\n", mPackAlign);\r
1184 for (pTNode = mDataTypeList; pTNode != NULL; pTNode = pTNode->mNext) {\r
1185 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode->mTypeName, pTNode->mAlign, pTNode->mTotalSize);\r
1186 printf ("\t\tstruct %s {\n", pTNode->mTypeName);\r
1187 for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) {\r
1188 printf ("\t\t\t%s\t%s\n", pFNode->mFieldType->mTypeName, pFNode->mFieldName);\r
1189 }\r
1190 printf ("\t\t};\n");\r
1191 printf ("---------------------------------------------------------------\n");\r
1192 }\r
1193 printf ("***************************************************************\n");\r
1194}\r
1195#endif\r
1196\r
1197SVfrVarStorageNode::SVfrVarStorageNode (\r
1198 IN EFI_GUID *Guid,\r
1199 IN INT8 *StoreName,\r
1200 IN EFI_VARSTORE_ID VarStoreId,\r
1201 IN EFI_STRING_ID VarName,\r
1202 IN UINT32 VarSize\r
1203 )\r
1204{\r
1205 if (Guid != NULL) {\r
1206 mGuid = *Guid;\r
1207 } else {\r
1208 memset (&Guid, 0, sizeof (EFI_GUID));\r
1209 }\r
1210 if (StoreName != NULL) {\r
1211 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1212 strcpy (mVarStoreName, StoreName);\r
1213 } else {\r
1214 mVarStoreName = NULL;\r
1215 }\r
1216 mNext = NULL;\r
1217 mVarStoreId = VarStoreId;\r
1218 mVarStoreType = EFI_VFR_VARSTORE_EFI;\r
1219 mStorageInfo.mEfiVar.mEfiVarName = VarName;\r
1220 mStorageInfo.mEfiVar.mEfiVarSize = VarSize;\r
1221}\r
1222\r
1223SVfrVarStorageNode::SVfrVarStorageNode (\r
1224 IN EFI_GUID *Guid,\r
1225 IN INT8 *StoreName,\r
1226 IN EFI_VARSTORE_ID VarStoreId,\r
1227 IN SVfrDataType *DataType\r
1228 )\r
1229{\r
1230 if (Guid != NULL) {\r
1231 mGuid = *Guid;\r
1232 } else {\r
1233 memset (&Guid, 0, sizeof (EFI_GUID));\r
1234 }\r
1235 if (StoreName != NULL) {\r
1236 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1237 strcpy (mVarStoreName, StoreName);\r
1238 } else {\r
1239 mVarStoreName = NULL;\r
1240 }\r
1241 mNext = NULL;\r
1242 mVarStoreId = VarStoreId;\r
1243 mVarStoreType = EFI_VFR_VARSTORE_BUFFER;\r
1244 mStorageInfo.mDataType = DataType;\r
1245}\r
1246\r
1247SVfrVarStorageNode::SVfrVarStorageNode (\r
1248 IN INT8 *StoreName,\r
1249 IN EFI_VARSTORE_ID VarStoreId\r
1250 )\r
1251{\r
1252 if (StoreName != NULL) {\r
1253 mVarStoreName = new INT8[strlen(StoreName) + 1];\r
1254 strcpy (mVarStoreName, StoreName);\r
1255 } else {\r
1256 mVarStoreName = NULL;\r
1257 }\r
1258 mNext = NULL;\r
1259 mVarStoreId = VarStoreId;\r
1260 mVarStoreType = EFI_VFR_VARSTORE_NAME;\r
1261 mStorageInfo.mNameSpace.mNameTable = new EFI_VARSTORE_ID[DEFAULT_NAME_TABLE_ITEMS];\r
1262 mStorageInfo.mNameSpace.mTableSize = 0;\r
1263}\r
1264\r
1265SVfrVarStorageNode::~SVfrVarStorageNode (\r
1266 VOID\r
1267 )\r
1268{\r
1269 if (mVarStoreName != NULL) {\r
1270 delete mVarStoreName;\r
1271 }\r
1272\r
1273 if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {\r
1274 delete mStorageInfo.mNameSpace.mNameTable;\r
1275 }\r
1276}\r
1277\r
1278CVfrDataStorage::CVfrDataStorage (\r
1279 VOID\r
1280 )\r
1281{\r
1282 UINT32 Index;\r
1283\r
1284 for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
1285 mFreeVarStoreIdBitMap[Index] = 0;\r
1286 }\r
1287\r
1288 // Question ID 0 is reserved.\r
1289 mFreeVarStoreIdBitMap[0] = 0x80000000;\r
1290\r
1291 mBufferVarStoreList = NULL;\r
1292 mEfiVarStoreList = NULL;\r
1293 mNameVarStoreList = NULL;\r
1294 mCurrVarStorageNode = NULL;\r
1295 mNewVarStorageNode = NULL;\r
1296}\r
1297\r
1298CVfrDataStorage::~CVfrDataStorage (\r
1299 VOID\r
1300 )\r
1301{\r
1302 SVfrVarStorageNode *pNode;\r
1303\r
1304 while (mBufferVarStoreList != NULL) {\r
1305 pNode = mBufferVarStoreList;\r
1306 mBufferVarStoreList = mBufferVarStoreList->mNext;\r
1307 delete pNode;\r
1308 }\r
1309 while (mEfiVarStoreList != NULL) {\r
1310 pNode = mEfiVarStoreList;\r
1311 mEfiVarStoreList = mEfiVarStoreList->mNext;\r
1312 delete pNode;\r
1313 }\r
1314 while (mNameVarStoreList != NULL) {\r
1315 pNode = mNameVarStoreList;\r
1316 mNameVarStoreList = mNameVarStoreList->mNext;\r
1317 delete pNode;\r
1318 }\r
1319 if (mNewVarStorageNode != NULL) {\r
1320 delete mNewVarStorageNode;\r
1321 }\r
1322}\r
1323\r
1324EFI_VARSTORE_ID\r
1325CVfrDataStorage::GetFreeVarStoreId (\r
1326 VOID\r
1327 )\r
1328{\r
1329 UINT32 Index, Mask, Offset;\r
1330\r
1331 for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
1332 if (mFreeVarStoreIdBitMap[Index] != 0xFFFFFFFF) {\r
1333 break;\r
1334 }\r
1335 }\r
1336\r
1337 for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
1338 if ((mFreeVarStoreIdBitMap[Index] & Mask) == 0) {\r
1339 mFreeVarStoreIdBitMap[Index] |= Mask;\r
1340 return (EFI_VARSTORE_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
1341 }\r
1342 }\r
1343\r
1344 return EFI_VARSTORE_ID_INVALID;\r
1345}\r
1346\r
1347BOOLEAN\r
1348CVfrDataStorage::ChekVarStoreIdFree (\r
1349 IN EFI_VARSTORE_ID VarStoreId\r
1350 )\r
1351{\r
1352 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1353 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1354\r
1355 return (mFreeVarStoreIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
1356}\r
1357\r
1358VOID\r
1359CVfrDataStorage::MarkVarStoreIdUsed (\r
1360 IN EFI_VARSTORE_ID VarStoreId\r
1361 )\r
1362{\r
1363 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1364 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1365\r
1366 mFreeVarStoreIdBitMap[Index] |= (0x80000000 >> Offset);\r
1367}\r
1368\r
1369VOID\r
1370CVfrDataStorage::MarkVarStoreIdUnused (\r
1371 IN EFI_VARSTORE_ID VarStoreId\r
1372 )\r
1373{\r
1374 UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
1375 UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
1376\r
1377 mFreeVarStoreIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
1378}\r
1379\r
1380EFI_VFR_RETURN_CODE\r
1381CVfrDataStorage::DeclareNameVarStoreBegin (\r
1382 IN INT8 *StoreName\r
1383 )\r
1384{\r
1385 SVfrVarStorageNode *pNode = NULL;\r
1386 EFI_VARSTORE_ID VarStoreId;\r
1387\r
1388 if (StoreName == NULL) {\r
1389 return VFR_RETURN_FATAL_ERROR;\r
1390 }\r
1391\r
1392 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1393 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1394 return VFR_RETURN_REDEFINED;\r
1395 }\r
1396 }\r
1397\r
1398 VarStoreId = GetFreeVarStoreId ();\r
1399 if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {\r
1400 return VFR_RETURN_UNDEFINED;\r
1401 }\r
1402\r
1403 mNewVarStorageNode = pNode;\r
1404\r
1405 return VFR_RETURN_SUCCESS;\r
1406}\r
1407\r
1408EFI_VFR_RETURN_CODE\r
1409CVfrDataStorage::NameTableAddItem (\r
1410 IN EFI_STRING_ID Item\r
1411 )\r
1412{\r
1413 EFI_VARSTORE_ID *NewTable, *OldTable;\r
1414 UINT32 TableSize;\r
1415\r
1416 OldTable = mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable;\r
1417 TableSize = mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize;\r
1418\r
1419 if ((TableSize != 0) && ((TableSize % DEFAULT_NAME_TABLE_ITEMS) == 0)) {\r
1420 if ((NewTable = new EFI_VARSTORE_ID[TableSize + DEFAULT_NAME_TABLE_ITEMS]) == NULL) {\r
1421 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1422 }\r
1423 memcpy (NewTable, OldTable, TableSize);\r
1424 mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable = NewTable;\r
1425 }\r
1426\r
1427 mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable[TableSize++] = Item;\r
1428 mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize = TableSize;\r
1429\r
1430 return VFR_RETURN_SUCCESS;\r
1431}\r
1432\r
1433EFI_VFR_RETURN_CODE\r
1434CVfrDataStorage::DeclareNameVarStoreEnd (\r
1435 IN EFI_GUID *Guid\r
1436 )\r
1437{\r
1438 mNewVarStorageNode->mGuid = *Guid;\r
1439 mNewVarStorageNode->mNext = mNameVarStoreList;\r
1440 mNameVarStoreList = mNewVarStorageNode;\r
1441\r
1442 mNewVarStorageNode = NULL;\r
1443\r
1444 return VFR_RETURN_SUCCESS;\r
1445}\r
1446\r
1447EFI_VFR_RETURN_CODE \r
1448CVfrDataStorage::DeclareEfiVarStore (\r
1449 IN INT8 *StoreName, \r
1450 IN EFI_GUID *Guid, \r
1451 IN EFI_STRING_ID NameStrId,\r
1452 IN UINT32 VarSize\r
1453 )\r
1454{\r
1455 SVfrVarStorageNode *pNode;\r
1456 EFI_VARSTORE_ID VarStoreId;\r
1457\r
1458 if ((StoreName == NULL) || (Guid == NULL)) {\r
1459 return VFR_RETURN_FATAL_ERROR;\r
1460 }\r
1461\r
1462 if (VarSize > sizeof (UINT64)) {\r
1463 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR;\r
1464 }\r
1465\r
1466 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1467 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1468 return VFR_RETURN_REDEFINED;\r
1469 }\r
1470 }\r
1471\r
1472 VarStoreId = GetFreeVarStoreId ();\r
1473 if ((pNode = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, NameStrId, VarSize)) == NULL) {\r
1474 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1475 }\r
1476\r
1477 pNode->mNext = mNameVarStoreList;\r
1478 mNameVarStoreList = pNode;\r
1479\r
1480 return VFR_RETURN_SUCCESS;\r
1481}\r
1482\r
1483EFI_VFR_RETURN_CODE \r
1484CVfrDataStorage::DeclareBufferVarStore (\r
1485 IN INT8 *StoreName, \r
1486 IN EFI_GUID *Guid, \r
1487 IN CVfrVarDataTypeDB *DataTypeDB,\r
1488 IN INT8 *TypeName,\r
1489 IN EFI_VARSTORE_ID VarStoreId\r
1490 )\r
1491{\r
1492 SVfrVarStorageNode *pNew = NULL;\r
1493 SVfrDataType *pDataType = NULL;\r
1494\r
1495 if ((StoreName == NULL) || (Guid == NULL) || (DataTypeDB == NULL)) {\r
1496 return VFR_RETURN_FATAL_ERROR;\r
1497 }\r
1498\r
1499 CHECK_ERROR_RETURN(DataTypeDB->GetDataType (TypeName, &pDataType), VFR_RETURN_SUCCESS);\r
1500\r
1501 if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
1502 VarStoreId = GetFreeVarStoreId ();\r
1503 } else {\r
1504 if (ChekVarStoreIdFree (VarStoreId) == FALSE) {\r
1505 return VFR_RETURN_VARSTOREID_REDEFINED;\r
1506 }\r
1507 MarkVarStoreIdUsed (VarStoreId);\r
1508 }\r
1509\r
1510 if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType)) == NULL) {\r
1511 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1512 }\r
1513\r
1514 pNew->mNext = mBufferVarStoreList;\r
1515 mBufferVarStoreList = pNew;\r
1516\r
1517 if (gCVfrBufferConfig.Register(StoreName) != 0) {\r
1518 return VFR_RETURN_FATAL_ERROR;\r
1519 }\r
1520\r
1521 return VFR_RETURN_SUCCESS;\r
1522}\r
1523\r
1524EFI_VFR_RETURN_CODE \r
1525CVfrDataStorage::GetVarStoreId (\r
1526 IN INT8 *StoreName,\r
1527 OUT EFI_VARSTORE_ID *VarStoreId\r
1528 )\r
1529{\r
1530 SVfrVarStorageNode *pNode;\r
1531\r
1532 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1533 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1534 mCurrVarStorageNode = pNode;\r
1535 *VarStoreId = pNode->mVarStoreId;\r
1536 return VFR_RETURN_SUCCESS;\r
1537 }\r
1538 }\r
1539\r
1540 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1541 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1542 mCurrVarStorageNode = pNode;\r
1543 *VarStoreId = pNode->mVarStoreId;\r
1544 return VFR_RETURN_SUCCESS;\r
1545 }\r
1546 }\r
1547\r
1548 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1549 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1550 mCurrVarStorageNode = pNode;\r
1551 *VarStoreId = pNode->mVarStoreId;\r
1552 return VFR_RETURN_SUCCESS;\r
1553 }\r
1554 }\r
1555\r
1556 mCurrVarStorageNode = NULL;\r
1557 *VarStoreId = EFI_VARSTORE_ID_INVALID;\r
1558 return VFR_RETURN_UNDEFINED;\r
1559}\r
1560\r
1561EFI_VFR_RETURN_CODE\r
1562CVfrDataStorage::GetBufferVarStoreDataTypeName (\r
1563 IN INT8 *StoreName,\r
1564 OUT INT8 **DataTypeName\r
1565 )\r
1566{\r
1567 SVfrVarStorageNode *pNode;\r
1568\r
1569 if ((StoreName == NULL) || (DataTypeName == NULL)) {\r
1570 return VFR_RETURN_FATAL_ERROR;\r
1571 }\r
1572\r
1573 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1574 if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
1575 break;\r
1576 }\r
1577 }\r
1578\r
1579 if (pNode == NULL) {\r
1580 return VFR_RETURN_UNDEFINED;\r
1581 }\r
1582\r
1583 if (pNode->mStorageInfo.mDataType == NULL) {\r
1584 return VFR_RETURN_FATAL_ERROR;\r
1585 }\r
1586\r
1587 *DataTypeName = pNode->mStorageInfo.mDataType->mTypeName;\r
1588 return VFR_RETURN_SUCCESS;\r
1589}\r
1590\r
1591EFI_VFR_RETURN_CODE\r
1592CVfrDataStorage::GetVarStoreType (\r
1593 IN INT8 *StoreName,\r
1594 OUT EFI_VFR_VARSTORE_TYPE &VarStoreType\r
1595 )\r
1596{\r
1597 SVfrVarStorageNode *pNode;\r
1598\r
1599 if (StoreName == NULL) {\r
1600 return VFR_RETURN_FATAL_ERROR;\r
1601 }\r
1602\r
1603 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1604 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1605 VarStoreType = pNode->mVarStoreType;\r
1606 return VFR_RETURN_SUCCESS;\r
1607 }\r
1608 }\r
1609\r
1610 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1611 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1612 VarStoreType = pNode->mVarStoreType;\r
1613 return VFR_RETURN_SUCCESS;\r
1614 }\r
1615 }\r
1616\r
1617 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1618 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1619 VarStoreType = pNode->mVarStoreType;\r
1620 return VFR_RETURN_SUCCESS;\r
1621 }\r
1622 }\r
1623\r
1624 VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
1625 return VFR_RETURN_UNDEFINED;\r
1626}\r
1627\r
1628EFI_VFR_RETURN_CODE\r
1629CVfrDataStorage::GetVarStoreName (\r
1630 IN EFI_VARSTORE_ID VarStoreId, \r
1631 OUT INT8 **VarStoreName\r
1632 )\r
1633{\r
1634 SVfrVarStorageNode *pNode;\r
1635\r
1636 if (VarStoreName == NULL) {\r
1637 return VFR_RETURN_FATAL_ERROR;\r
1638 }\r
1639\r
1640 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1641 if (pNode->mVarStoreId == VarStoreId) {\r
1642 *VarStoreName = pNode->mVarStoreName;\r
1643 return VFR_RETURN_SUCCESS;\r
1644 }\r
1645 }\r
1646\r
1647 for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1648 if (pNode->mVarStoreId == VarStoreId) {\r
1649 *VarStoreName = pNode->mVarStoreName;\r
1650 return VFR_RETURN_SUCCESS;\r
1651 }\r
1652 }\r
1653\r
1654 for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1655 if (pNode->mVarStoreId == VarStoreId) {\r
1656 *VarStoreName = pNode->mVarStoreName;\r
1657 return VFR_RETURN_SUCCESS;\r
1658 }\r
1659 }\r
1660\r
1661 *VarStoreName = NULL;\r
1662 return VFR_RETURN_UNDEFINED;\r
1663}\r
1664\r
1665EFI_VFR_RETURN_CODE\r
1666CVfrDataStorage::GetEfiVarStoreInfo (\r
1667 IN OUT EFI_VARSTORE_INFO *Info\r
1668 )\r
1669{\r
1670 if (Info == NULL) {\r
1671 return VFR_RETURN_FATAL_ERROR;\r
1672 }\r
1673\r
1674 if (mCurrVarStorageNode == NULL) {\r
1675 return VFR_RETURN_GET_EFIVARSTORE_ERROR;\r
1676 }\r
1677\r
1678 Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarName;\r
1679 Info->mVarTotalSize = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarSize;\r
1680 switch (Info->mVarTotalSize) {\r
1681 case 1:\r
1682 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
1683 break;\r
1684 case 2:\r
1685 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_16;\r
1686 break;\r
1687 case 4:\r
1688 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_32;\r
1689 break;\r
1690 case 8:\r
1691 Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_64;\r
1692 break;\r
1693 default :\r
1694 return VFR_RETURN_FATAL_ERROR;\r
1695 }\r
1696\r
1697 return VFR_RETURN_SUCCESS;\r
1698}\r
1699\r
1700EFI_VFR_RETURN_CODE\r
1701CVfrDataStorage::GetNameVarStoreInfo (\r
1702 OUT EFI_VARSTORE_INFO *Info,\r
1703 IN UINT32 Index\r
1704 )\r
1705{\r
1706 if (Info == NULL) {\r
1707 return VFR_RETURN_FATAL_ERROR;\r
1708 }\r
1709\r
1710 if (mCurrVarStorageNode == NULL) {\r
1711 return VFR_RETURN_GET_NVVARSTORE_ERROR;\r
1712 }\r
1713\r
1714 Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mNameSpace.mNameTable[Index];\r
1715\r
1716 return VFR_RETURN_SUCCESS;\r
1717}\r
1718\r
1719EFI_VFR_RETURN_CODE\r
1720CVfrDataStorage::BufferVarStoreRequestElementAdd (\r
1721 IN INT8 *StoreName,\r
1722 IN EFI_VARSTORE_INFO &Info\r
1723 )\r
1724{\r
1725 INT8 NewReqElt[128] = {'\0',};\r
1726 INT8 *OldReqElt = NULL;\r
1727 SVfrVarStorageNode *pNode = NULL;\r
1728 EFI_IFR_TYPE_VALUE Value;\r
1729\r
1730 for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1731 if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
1732 break;\r
1733 }\r
1734 }\r
1735\r
1736 if (pNode == NULL) {\r
1737 return VFR_RETURN_UNDEFINED;\r
1738 }\r
1739\r
1740 gCVfrBufferConfig.Open ();\r
1741 Value.u8 = 0;\r
1742 if (gCVfrBufferConfig.Write ('a', StoreName, NULL, EFI_IFR_TYPE_NUM_SIZE_8, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
1743 return VFR_RETURN_FATAL_ERROR;\r
1744 }\r
1745 gCVfrBufferConfig.Close ();\r
1746\r
1747 return VFR_RETURN_SUCCESS;\r
1748}\r
1749\r
1750SVfrDefaultStoreNode::SVfrDefaultStoreNode (\r
1751 IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,\r
1752 IN INT8 *RefName, \r
1753 IN EFI_STRING_ID DefaultStoreNameId, \r
1754 IN UINT16 DefaultId\r
1755 )\r
1756{\r
1757 mObjBinAddr = ObjBinAddr;\r
1758\r
1759 if (RefName != NULL) {\r
1760 mRefName = new INT8[strlen (RefName) + 1];\r
1761 strcpy (mRefName, RefName);\r
1762 } else {\r
1763 mRefName = NULL;\r
1764 }\r
1765\r
1766 mNext = NULL;\r
1767 mDefaultId = DefaultId;\r
1768 mDefaultStoreNameId = DefaultStoreNameId;\r
1769}\r
1770\r
1771SVfrDefaultStoreNode::~SVfrDefaultStoreNode (\r
1772 VOID\r
1773 )\r
1774{\r
1775 if (mRefName != NULL) {\r
1776 delete mRefName;\r
1777 }\r
1778}\r
1779\r
1780CVfrDefaultStore::CVfrDefaultStore (\r
1781 VOID\r
1782 )\r
1783{\r
1784 mDefaultStoreList = NULL;\r
1785}\r
1786\r
1787CVfrDefaultStore::~CVfrDefaultStore (\r
1788 VOID\r
1789 )\r
1790{\r
1791 SVfrDefaultStoreNode *pTmp = NULL;\r
1792\r
1793 while (mDefaultStoreList != NULL) {\r
1794 pTmp = mDefaultStoreList;\r
1795 mDefaultStoreList = mDefaultStoreList->mNext;\r
1796 delete pTmp;\r
1797 }\r
1798}\r
1799\r
1800EFI_VFR_RETURN_CODE\r
1801CVfrDefaultStore::RegisterDefaultStore (\r
1802 IN CHAR8 *ObjBinAddr,\r
1803 IN INT8 *RefName,\r
1804 IN EFI_STRING_ID DefaultStoreNameId,\r
1805 IN UINT16 DefaultId\r
1806 )\r
1807{\r
1808 SVfrDefaultStoreNode *pNode = NULL;\r
1809\r
1810 if (RefName == NULL) {\r
1811 return VFR_RETURN_FATAL_ERROR;\r
1812 }\r
1813\r
1814 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1815 if (strcmp (pNode->mRefName, RefName) == 0) {\r
1816 return VFR_RETURN_REDEFINED;\r
1817 }\r
1818 }\r
1819\r
1820 if ((pNode = new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE *)ObjBinAddr, RefName, DefaultStoreNameId, DefaultId)) == NULL) {\r
1821 return VFR_RETURN_OUT_FOR_RESOURCES;\r
1822 }\r
1823\r
1824 pNode->mNext = mDefaultStoreList;\r
1825 mDefaultStoreList = pNode;\r
1826\r
1827 return VFR_RETURN_SUCCESS;\r
1828}\r
1829\r
1830/*\r
1831 * assign new reference name or new default store name id only if \r
1832 * the original is invalid\r
1833 */\r
1834EFI_VFR_RETURN_CODE\r
1835CVfrDefaultStore::ReRegisterDefaultStoreById (\r
1836 IN UINT16 DefaultId,\r
1837 IN INT8 *RefName,\r
1838 IN EFI_STRING_ID DefaultStoreNameId\r
1839 )\r
1840{\r
1841 SVfrDefaultStoreNode *pNode = NULL;\r
1842\r
1843 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1844 if (pNode->mDefaultId == DefaultId) {\r
1845 break;\r
1846 }\r
1847 }\r
1848\r
1849 if (pNode == NULL) {\r
1850 return VFR_RETURN_UNDEFINED;\r
1851 } else {\r
1852 if (pNode->mDefaultStoreNameId == EFI_STRING_ID_INVALID) {\r
1853 pNode->mDefaultStoreNameId = DefaultStoreNameId;\r
1854 if (pNode->mObjBinAddr != NULL) {\r
1855 pNode->mObjBinAddr->DefaultName = DefaultStoreNameId;\r
1856 }\r
1857 } else {\r
1858 return VFR_RETURN_REDEFINED;\r
1859 }\r
1860\r
1861 if (RefName != NULL) {\r
1862 delete pNode->mRefName;\r
1863 pNode->mRefName = new INT8[strlen (RefName) + 1];\r
1864 if (pNode->mRefName != NULL) {\r
1865 strcpy (pNode->mRefName, RefName);\r
1866 }\r
1867 }\r
1868 }\r
1869\r
1870 return VFR_RETURN_SUCCESS;\r
1871}\r
1872\r
1873BOOLEAN\r
1874CVfrDefaultStore::DefaultIdRegistered (\r
1875 IN UINT16 DefaultId\r
1876 )\r
1877{\r
1878 SVfrDefaultStoreNode *pNode = NULL;\r
1879\r
1880 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
1881 if (pNode->mDefaultId == DefaultId) {\r
1882 return TRUE;\r
1883 }\r
1884 }\r
1885\r
1886 return FALSE;\r
1887}\r
1888\r
1889EFI_VFR_RETURN_CODE\r
1890CVfrDefaultStore::GetDefaultId (\r
1891 IN INT8 *RefName,\r
1892 OUT UINT16 *DefaultId\r
1893 )\r
1894{\r
1895 SVfrDefaultStoreNode *pTmp = NULL;\r
1896\r
1897 if (DefaultId == NULL) {\r
1898 return VFR_RETURN_FATAL_ERROR;\r
1899 }\r
1900\r
1901 for (pTmp = mDefaultStoreList; pTmp != NULL; pTmp = pTmp->mNext) {\r
1902 if (strcmp (pTmp->mRefName, RefName) == 0) {\r
1903 *DefaultId = pTmp->mDefaultId;\r
1904 return VFR_RETURN_SUCCESS;\r
1905 }\r
1906 }\r
1907\r
1908 return VFR_RETURN_UNDEFINED;\r
1909}\r
1910\r
1911STATIC\r
1912EFI_VFR_RETURN_CODE\r
1913AltCfgItemPrintToBuffer (\r
1914 IN INT8 *NewAltCfg, \r
1915 IN EFI_VARSTORE_INFO Info, \r
1916 IN UINT8 Type,\r
1917 IN EFI_IFR_TYPE_VALUE Value\r
1918 )\r
1919{\r
1920 UINT32 Index;\r
1921 UINT8 *BufChar = NULL;\r
1922 UINT32 Count = 0;\r
1923\r
1924 if (NewAltCfg != NULL) {\r
1925 Count = sprintf (\r
1926 NewAltCfg, \r
1927 "&OFFSET=%x&WIDTH=%x&VALUE=", \r
1928 Info.mInfo.mVarOffset, \r
1929 Info.mVarTotalSize\r
1930 );\r
1931 NewAltCfg += Count;\r
1932\r
1933 switch (Type) {\r
1934 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
1935 Count = sprintf (NewAltCfg, "%x", Value.u8);\r
1936 NewAltCfg += Count;\r
1937 break;\r
1938 case EFI_IFR_TYPE_NUM_SIZE_16 :\r
1939 Count = sprintf (NewAltCfg, "%x", Value.u16);\r
1940 NewAltCfg += Count;\r
1941 break;\r
1942 case EFI_IFR_TYPE_NUM_SIZE_32 :\r
1943 Count = sprintf (NewAltCfg, "%x", Value.u32);\r
1944 NewAltCfg += Count;\r
1945 break;\r
1946 case EFI_IFR_TYPE_NUM_SIZE_64 :\r
1947 Count = sprintf (NewAltCfg, "%x", Value.u64);\r
1948 NewAltCfg += Count;\r
1949 break;\r
1950 case EFI_IFR_TYPE_BOOLEAN :\r
1951 Count = sprintf (NewAltCfg, "%x", Value.b);\r
1952 NewAltCfg += Count;\r
1953 break;\r
1954 case EFI_IFR_TYPE_TIME :\r
1955#if 1\r
1956 Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.time)));\r
1957 NewAltCfg += Count;\r
1958#else\r
1959 BufChar = (UINT8 *)&Value.time;\r
1960 for (Index = 0; Index < sizeof(EFI_HII_TIME); Index++) {\r
1961 Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
1962 NewAltCfg += Count;\r
1963 }\r
1964#endif\r
1965 break;\r
1966 case EFI_IFR_TYPE_DATE :\r
1967#if 1\r
1968 Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.date)));\r
1969 NewAltCfg += Count;\r
1970#else\r
1971 BufChar = (UINT8 *)&Value.date;\r
1972 for (Index = 0; Index < sizeof(EFI_HII_DATE); Index++) {\r
1973 Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
1974 NewAltCfg += Count;\r
1975 }\r
1976#endif\r
1977 break;\r
1978 case EFI_IFR_TYPE_STRING :\r
1979 Count = sprintf (NewAltCfg, "%x", Value.string);\r
1980 NewAltCfg += Count;\r
1981 break;\r
1982 case EFI_IFR_TYPE_OTHER :\r
1983 return VFR_RETURN_UNSUPPORTED;\r
1984 }\r
1985 }\r
1986\r
1987 return VFR_RETURN_FATAL_ERROR; \r
1988}\r
1989\r
1990EFI_VFR_RETURN_CODE\r
1991CVfrDefaultStore::BufferVarStoreAltConfigAdd (\r
1992 IN EFI_VARSTORE_ID DefaultId,\r
1993 IN EFI_VARSTORE_INFO &Info,\r
1994 IN INT8 *VarStoreName,\r
1995 IN UINT8 Type,\r
1996 IN EFI_IFR_TYPE_VALUE Value\r
1997 )\r
1998{\r
1999 SVfrDefaultStoreNode *pNode = NULL;\r
2000 INT8 NewAltCfg[2 * 2 * sizeof (UINT16) + 1] = {0,};\r
2001\r
2002 if (VarStoreName == NULL) {\r
2003 return VFR_RETURN_FATAL_ERROR;\r
2004 }\r
2005\r
2006 for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
2007 if (pNode->mDefaultId == DefaultId) {\r
2008 break;\r
2009 }\r
2010 }\r
2011\r
2012 if (pNode == NULL) {\r
2013 return VFR_RETURN_UNDEFINED;\r
2014 }\r
2015\r
2016 gCVfrBufferConfig.Open ();\r
2017\r
2018 sprintf (NewAltCfg, "%04x", pNode->mDefaultId);\r
2019 if ((gCVfrBufferConfig.Select(VarStoreName) == 0) && \r
2020 (gCVfrBufferConfig.Select(VarStoreName, NewAltCfg) != 0)) {\r
2021 if (gCVfrBufferConfig.Write ('i', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
2022 goto WriteError;\r
2023 }\r
2024 }\r
2025\r
2026 if (gCVfrBufferConfig.Write ('a', VarStoreName, NULL, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
2027 goto WriteError;\r
2028 }\r
2029\r
2030 gCVfrBufferConfig.Close ();\r
2031\r
2032 return VFR_RETURN_SUCCESS;\r
2033\r
2034WriteError:\r
2035 gCVfrBufferConfig.Close ();\r
2036 return VFR_RETURN_FATAL_ERROR;\r
2037}\r
2038\r
2039SVfrRuleNode::SVfrRuleNode (\r
2040 IN INT8 *RuleName, \r
2041 IN UINT8 RuleId\r
2042 )\r
2043{\r
2044 if (RuleName != NULL) {\r
2045 mRuleName = new INT8[strlen (RuleName) + 1];\r
2046 strcpy (mRuleName, RuleName);\r
2047 } else {\r
2048 mRuleName = NULL;\r
2049 }\r
2050\r
2051 mNext = NULL;\r
2052 mRuleId = RuleId;\r
2053}\r
2054\r
2055SVfrRuleNode::~SVfrRuleNode (\r
2056 VOID\r
2057 )\r
2058{\r
2059 if (mRuleName != NULL) {\r
2060 delete mRuleName;\r
2061 }\r
2062}\r
2063\r
2064CVfrRulesDB::CVfrRulesDB ()\r
2065{\r
2066 mRuleList = NULL;\r
2067 mFreeRuleId = EFI_VARSTORE_ID_START;\r
2068}\r
2069\r
2070CVfrRulesDB::~CVfrRulesDB ()\r
2071{\r
2072 SVfrRuleNode *pNode;\r
2073\r
2074 while(mRuleList != NULL) {\r
2075 pNode = mRuleList;\r
2076 mRuleList = mRuleList->mNext;\r
2077 delete pNode;\r
2078 }\r
2079}\r
2080\r
2081VOID\r
2082CVfrRulesDB::RegisterRule (\r
2083 IN INT8 *RuleName\r
2084 )\r
2085{\r
2086 SVfrRuleNode *pNew;\r
2087\r
2088 if (RuleName == NULL) {\r
2089 return ;\r
2090 }\r
2091\r
2092 if ((pNew = new SVfrRuleNode (RuleName, mFreeRuleId)) == NULL) {\r
2093 return ;\r
2094 }\r
2095\r
2096 mFreeRuleId++;\r
2097\r
2098 pNew->mNext = mRuleList;\r
2099 mRuleList = pNew;\r
2100}\r
2101\r
2102UINT8\r
2103CVfrRulesDB::GetRuleId (\r
2104 IN INT8 *RuleName\r
2105 )\r
2106{\r
2107 SVfrRuleNode *pNode;\r
2108\r
2109 if (RuleName == NULL) {\r
2110 return EFI_RULE_ID_INVALID;\r
2111 }\r
2112\r
2113 for (pNode = mRuleList; pNode != NULL; pNode = pNode->mNext) {\r
2114 if (strcmp (pNode->mRuleName, RuleName) == 0) {\r
2115 return pNode->mRuleId;\r
2116 }\r
2117 }\r
2118\r
2119 return EFI_RULE_ID_INVALID;\r
2120}\r
2121\r
2122CVfrRulesDB gCVfrRulesDB;\r
2123\r
2124EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
2125 VOID\r
2126 )\r
2127{\r
2128 mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
2129 mInfo.mVarName = EFI_STRING_ID_INVALID;\r
2130 mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
2131 mVarType = EFI_IFR_TYPE_OTHER;\r
2132 mVarTotalSize = 0;\r
2133}\r
2134\r
2135EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
2136 IN EFI_VARSTORE_INFO &Info\r
2137 )\r
2138{\r
2139 mVarStoreId = Info.mVarStoreId;\r
2140 mInfo.mVarName = Info.mInfo.mVarName;\r
2141 mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
2142 mVarType = Info.mVarType;\r
2143 mVarTotalSize = Info.mVarTotalSize;\r
2144}\r
2145\r
2146BOOLEAN \r
2147EFI_VARSTORE_INFO::operator == (\r
2148 IN EFI_VARSTORE_INFO *Info\r
2149 )\r
2150{\r
2151 if ((mVarStoreId == Info->mVarStoreId) &&\r
2152 (mInfo.mVarName == Info->mInfo.mVarName) &&\r
2153 (mInfo.mVarOffset == Info->mInfo.mVarOffset) &&\r
2154 (mVarType == Info->mVarType) &&\r
2155 (mVarTotalSize == Info->mVarTotalSize)) {\r
2156 return TRUE;\r
2157 }\r
2158\r
2159 return FALSE;\r
2160}\r
2161\r
2162static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;\r
2163\r
2164EFI_QUESTION_ID\r
2165CVfrQuestionDB::GetFreeQuestionId (\r
2166 VOID\r
2167 )\r
2168{\r
2169 UINT32 Index, Mask, Offset;\r
2170\r
2171 for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
2172 if (mFreeQIdBitMap[Index] != 0xFFFFFFFF) {\r
2173 break;\r
2174 }\r
2175 }\r
2176\r
2177 for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
2178 if ((mFreeQIdBitMap[Index] & Mask) == 0) {\r
2179 mFreeQIdBitMap[Index] |= Mask;\r
2180 return (EFI_QUESTION_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
2181 }\r
2182 }\r
2183\r
2184 return EFI_QUESTION_ID_INVALID;\r
2185}\r
2186\r
2187BOOLEAN\r
2188CVfrQuestionDB::ChekQuestionIdFree (\r
2189 IN EFI_QUESTION_ID QId\r
2190 )\r
2191{\r
2192 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2193 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2194\r
2195 return (mFreeQIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
2196}\r
2197\r
2198VOID \r
2199CVfrQuestionDB::MarkQuestionIdUsed (\r
2200 IN EFI_QUESTION_ID QId\r
2201 )\r
2202{\r
2203 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2204 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2205\r
2206 mFreeQIdBitMap[Index] |= (0x80000000 >> Offset);\r
2207}\r
2208\r
2209VOID \r
2210CVfrQuestionDB::MarkQuestionIdUnused (\r
2211 IN EFI_QUESTION_ID QId\r
2212 )\r
2213{\r
2214 UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
2215 UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
2216\r
2217 mFreeQIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
2218}\r
2219\r
2220SVfrQuestionNode::SVfrQuestionNode (\r
2221 IN INT8 *Name,\r
2222 IN INT8 *VarIdStr,\r
2223 IN UINT32 BitMask\r
2224 )\r
2225{\r
2226 mName = NULL;\r
2227 mVarIdStr = NULL;\r
2228 mQuestionId = EFI_QUESTION_ID_INVALID;\r
2229 mBitMask = BitMask;\r
2230 mNext = NULL;\r
2231\r
2232 if (Name == NULL) {\r
2233 mName = new INT8[strlen ("$DEFAULT") + 1];\r
2234 strcpy (mName, "$DEFAULT");\r
2235 } else {\r
2236 mName = new INT8[strlen (Name) + 1];\r
2237 strcpy (mName, Name);\r
2238 }\r
2239\r
2240 if (VarIdStr != NULL) {\r
2241 mVarIdStr = new INT8[strlen (VarIdStr) + 1];\r
2242 strcpy (mVarIdStr, VarIdStr);\r
2243 } else {\r
2244 mVarIdStr = new INT8[strlen ("$") + 1];\r
2245 strcpy (mVarIdStr, "$");\r
2246 }\r
2247}\r
2248\r
2249SVfrQuestionNode::~SVfrQuestionNode (\r
2250 VOID\r
2251 )\r
2252{\r
2253 if (mName != NULL) {\r
2254 delete mName;\r
2255 }\r
2256\r
2257 if (mVarIdStr != NULL) {\r
2258 delete mVarIdStr;\r
2259 }\r
2260}\r
2261\r
2262CVfrQuestionDB::CVfrQuestionDB ()\r
2263{\r
2264 UINT32 Index;\r
2265\r
2266 for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
2267 mFreeQIdBitMap[Index] = 0;\r
2268 }\r
2269\r
2270 // Question ID 0 is reserved.\r
2271 mFreeQIdBitMap[0] = 0x80000000;\r
2272 mQuestionList = NULL;\r
2273}\r
2274\r
2275CVfrQuestionDB::~CVfrQuestionDB ()\r
2276{\r
2277 SVfrQuestionNode *pNode;\r
2278\r
2279 while (mQuestionList != NULL) {\r
2280 pNode = mQuestionList;\r
2281 mQuestionList = mQuestionList->mNext;\r
2282 delete pNode;\r
2283 }\r
2284}\r
2285\r
2286EFI_VFR_RETURN_CODE\r
2287CVfrQuestionDB::RegisterQuestion (\r
2288 IN INT8 *Name,\r
2289 IN INT8 *VarIdStr,\r
2290 IN OUT EFI_QUESTION_ID &QuestionId\r
2291 )\r
2292{\r
2293 SVfrQuestionNode *pNode = NULL;\r
2294\r
2295 if ((Name != NULL) && (FindQuestion(Name) == VFR_RETURN_SUCCESS)) {\r
2296 return VFR_RETURN_REDEFINED;\r
2297 }\r
2298\r
2299 if ((pNode = new SVfrQuestionNode (Name, VarIdStr)) == NULL) {\r
2300 return VFR_RETURN_OUT_FOR_RESOURCES;\r
2301 }\r
2302\r
2303 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2304 QuestionId = GetFreeQuestionId ();\r
2305 } else {\r
2306 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2307 delete pNode;\r
2308 return VFR_RETURN_QUESTIONID_REDEFINED;\r
2309 }\r
2310 MarkQuestionIdUsed (QuestionId);\r
2311 }\r
2312 pNode->mQuestionId = QuestionId;\r
2313\r
2314 pNode->mNext = mQuestionList;\r
2315 mQuestionList = pNode;\r
2316\r
2317 gCFormPkg.DoPendingAssign (VarIdStr, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2318\r
2319 return VFR_RETURN_SUCCESS;\r
2320}\r
2321\r
2322VOID\r
2323CVfrQuestionDB::RegisterOldDateQuestion (\r
2324 IN INT8 *YearVarId, \r
2325 IN INT8 *MonthVarId, \r
2326 IN INT8 *DayVarId, \r
2327 IN OUT EFI_QUESTION_ID &QuestionId\r
2328 )\r
2329{\r
2330 SVfrQuestionNode *pNode[3] = {NULL, };\r
2331 UINT32 Index;\r
2332\r
2333 if ((YearVarId == NULL) || (MonthVarId == NULL) || (DayVarId == NULL)) {\r
2334 return;\r
2335 }\r
2336\r
2337 if ((pNode[0] = new SVfrQuestionNode (NULL, YearVarId, DATE_YEAR_BITMASK)) == NULL) {\r
2338 goto Err;\r
2339 }\r
2340 if ((pNode[1] = new SVfrQuestionNode (NULL, MonthVarId, DATE_MONTH_BITMASK)) == NULL) {\r
2341 goto Err;\r
2342 }\r
2343 if ((pNode[2] = new SVfrQuestionNode (NULL, DayVarId, DATE_DAY_BITMASK)) == NULL) {\r
2344 goto Err;\r
2345 }\r
2346\r
2347 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2348 QuestionId = GetFreeQuestionId ();\r
2349 } else {\r
2350 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2351 goto Err;\r
2352 }\r
2353 MarkQuestionIdUsed (QuestionId);\r
2354 }\r
2355\r
2356 pNode[0]->mQuestionId = QuestionId;\r
2357 pNode[1]->mQuestionId = QuestionId;\r
2358 pNode[2]->mQuestionId = QuestionId;\r
2359 pNode[0]->mNext = pNode[1];\r
2360 pNode[1]->mNext = pNode[2];\r
2361 pNode[2]->mNext = mQuestionList;\r
2362 mQuestionList = pNode[0];\r
2363\r
2364 gCFormPkg.DoPendingAssign (YearVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2365 gCFormPkg.DoPendingAssign (MonthVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2366 gCFormPkg.DoPendingAssign (DayVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2367\r
2368 return;\r
2369\r
2370Err:\r
2371 for (Index = 0; Index < 3; Index++) {\r
2372 if (pNode[Index] != NULL) {\r
2373 delete pNode[Index];\r
2374 }\r
2375 }\r
2376 QuestionId = EFI_QUESTION_ID_INVALID;\r
2377}\r
2378\r
2379VOID\r
2380CVfrQuestionDB::RegisterNewDateQuestion (\r
2381 IN INT8 *Name,\r
2382 IN INT8 *BaseVarId, \r
2383 IN OUT EFI_QUESTION_ID &QuestionId\r
2384 )\r
2385{\r
2386 SVfrQuestionNode *pNode[3] = {NULL, };\r
2387 UINT32 Len;\r
2388 INT8 *VarIdStr[3] = {NULL, };\r
2389 INT8 Index;\r
2390\r
2391 if (BaseVarId == NULL) {\r
2392 return;\r
2393 }\r
2394\r
2395 Len = strlen (BaseVarId);\r
2396\r
2397 VarIdStr[0] = new INT8[Len + strlen (".Year") + 1];\r
2398 if (VarIdStr[0] != NULL) {\r
2399 strcpy (VarIdStr[0], BaseVarId);\r
2400 strcat (VarIdStr[0], ".Year");\r
2401 }\r
2402 VarIdStr[1] = new INT8[Len + strlen (".Month") + 1];\r
2403 if (VarIdStr[1] != NULL) {\r
2404 strcpy (VarIdStr[1], BaseVarId);\r
2405 strcat (VarIdStr[1], ".Month");\r
2406 }\r
2407 VarIdStr[2] = new INT8[Len + strlen (".Day") + 1];\r
2408 if (VarIdStr[2] != NULL) {\r
2409 strcpy (VarIdStr[2], BaseVarId);\r
2410 strcat (VarIdStr[2], ".Day");\r
2411 }\r
2412\r
2413 if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], DATE_YEAR_BITMASK)) == NULL) {\r
2414 goto Err;\r
2415 }\r
2416 if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], DATE_MONTH_BITMASK)) == NULL) {\r
2417 goto Err;\r
2418 }\r
2419 if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], DATE_DAY_BITMASK)) == NULL) {\r
2420 goto Err;\r
2421 }\r
2422\r
2423 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2424 QuestionId = GetFreeQuestionId ();\r
2425 } else {\r
2426 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2427 goto Err;\r
2428 }\r
2429 MarkQuestionIdUsed (QuestionId);\r
2430 }\r
2431\r
2432 pNode[0]->mQuestionId = QuestionId;\r
2433 pNode[1]->mQuestionId = QuestionId;\r
2434 pNode[2]->mQuestionId = QuestionId;\r
2435 pNode[0]->mNext = pNode[1];\r
2436 pNode[1]->mNext = pNode[2];\r
2437 pNode[2]->mNext = mQuestionList;\r
2438 mQuestionList = pNode[0];\r
2439\r
2440 for (Index = 0; Index < 3; Index++) {\r
2441 if (VarIdStr[Index] != NULL) {\r
2442 delete VarIdStr[Index];\r
2443 }\r
2444 }\r
2445\r
2446 gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2447 gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2448 gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2449\r
2450 return;\r
2451\r
2452Err:\r
2453 for (Index = 0; Index < 3; Index++) {\r
2454 if (pNode[Index] != NULL) {\r
2455 delete pNode[Index];\r
2456 }\r
2457\r
2458 if (VarIdStr[Index] != NULL) {\r
2459 delete VarIdStr[Index];\r
2460 }\r
2461 }\r
2462}\r
2463\r
2464VOID\r
2465CVfrQuestionDB::RegisterOldTimeQuestion (\r
2466 IN INT8 *HourVarId, \r
2467 IN INT8 *MinuteVarId, \r
2468 IN INT8 *SecondVarId, \r
2469 IN OUT EFI_QUESTION_ID &QuestionId\r
2470 )\r
2471{\r
2472 SVfrQuestionNode *pNode[3] = {NULL, };\r
2473 UINT32 Index;\r
2474\r
2475 if ((HourVarId == NULL) || (MinuteVarId == NULL) || (SecondVarId == NULL)) {\r
2476 return;\r
2477 }\r
2478\r
2479 if ((pNode[0] = new SVfrQuestionNode (NULL, HourVarId, TIME_HOUR_BITMASK)) == NULL) {\r
2480 goto Err;\r
2481 }\r
2482 if ((pNode[1] = new SVfrQuestionNode (NULL, MinuteVarId, TIME_MINUTE_BITMASK)) == NULL) {\r
2483 goto Err;\r
2484 }\r
2485 if ((pNode[2] = new SVfrQuestionNode (NULL, SecondVarId, TIME_SECOND_BITMASK)) == NULL) {\r
2486 goto Err;\r
2487 }\r
2488\r
2489 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2490 QuestionId = GetFreeQuestionId ();\r
2491 } else {\r
2492 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2493 goto Err;\r
2494 }\r
2495 MarkQuestionIdUsed (QuestionId);\r
2496 }\r
2497\r
2498 pNode[0]->mQuestionId = QuestionId;\r
2499 pNode[1]->mQuestionId = QuestionId;\r
2500 pNode[2]->mQuestionId = QuestionId;\r
2501 pNode[0]->mNext = pNode[1];\r
2502 pNode[1]->mNext = pNode[2];\r
2503 pNode[2]->mNext = mQuestionList;\r
2504 mQuestionList = pNode[0];\r
2505\r
2506 gCFormPkg.DoPendingAssign (HourVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2507 gCFormPkg.DoPendingAssign (MinuteVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2508 gCFormPkg.DoPendingAssign (SecondVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2509\r
2510 return;\r
2511\r
2512Err:\r
2513 for (Index = 0; Index < 3; Index++) {\r
2514 if (pNode[Index] != NULL) {\r
2515 delete pNode[Index];\r
2516 }\r
2517 }\r
2518 QuestionId = EFI_QUESTION_ID_INVALID;\r
2519}\r
2520\r
2521VOID\r
2522CVfrQuestionDB::RegisterNewTimeQuestion (\r
2523 IN INT8 *Name,\r
2524 IN INT8 *BaseVarId,\r
2525 IN OUT EFI_QUESTION_ID &QuestionId\r
2526 )\r
2527{\r
2528 SVfrQuestionNode *pNode[3] = {NULL, };\r
2529 UINT32 Len;\r
2530 INT8 *VarIdStr[3] = {NULL, };\r
2531 INT8 Index;\r
2532\r
2533 if (BaseVarId == NULL) {\r
2534 return;\r
2535 }\r
2536\r
2537 Len = strlen (BaseVarId);\r
2538\r
2539 VarIdStr[0] = new INT8[Len + strlen (".Hour") + 1];\r
2540 if (VarIdStr[0] != NULL) {\r
2541 strcpy (VarIdStr[0], BaseVarId);\r
2542 strcat (VarIdStr[0], ".Hour");\r
2543 }\r
2544 VarIdStr[1] = new INT8[Len + strlen (".Minute") + 1];\r
2545 if (VarIdStr[1] != NULL) {\r
2546 strcpy (VarIdStr[1], BaseVarId);\r
2547 strcat (VarIdStr[1], ".Minute");\r
2548 }\r
2549 VarIdStr[2] = new INT8[Len + strlen (".Second") + 1];\r
2550 if (VarIdStr[2] != NULL) {\r
2551 strcpy (VarIdStr[2], BaseVarId);\r
2552 strcat (VarIdStr[2], ".Second");\r
2553 }\r
2554\r
2555 if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], TIME_HOUR_BITMASK)) == NULL) {\r
2556 goto Err;\r
2557 }\r
2558 if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], TIME_MINUTE_BITMASK)) == NULL) {\r
2559 goto Err;\r
2560 }\r
2561 if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], TIME_SECOND_BITMASK)) == NULL) {\r
2562 goto Err;\r
2563 }\r
2564\r
2565 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2566 QuestionId = GetFreeQuestionId ();\r
2567 } else {\r
2568 if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
2569 goto Err;\r
2570 }\r
2571 MarkQuestionIdUsed (QuestionId);\r
2572 }\r
2573\r
2574 pNode[0]->mQuestionId = QuestionId;\r
2575 pNode[1]->mQuestionId = QuestionId;\r
2576 pNode[2]->mQuestionId = QuestionId;\r
2577 pNode[0]->mNext = pNode[1];\r
2578 pNode[1]->mNext = pNode[2];\r
2579 pNode[2]->mNext = mQuestionList;\r
2580 mQuestionList = pNode[0];\r
2581\r
2582 for (Index = 0; Index < 3; Index++) {\r
2583 if (VarIdStr[Index] != NULL) {\r
2584 delete VarIdStr[Index];\r
2585 }\r
2586 }\r
2587\r
2588 gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2589 gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2590 gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
2591\r
2592 return;\r
2593\r
2594Err:\r
2595 for (Index = 0; Index < 3; Index++) {\r
2596 if (pNode[Index] != NULL) {\r
2597 delete pNode[Index];\r
2598 }\r
2599\r
2600 if (VarIdStr[Index] != NULL) {\r
2601 delete VarIdStr[Index];\r
2602 }\r
2603 }\r
2604}\r
2605\r
2606EFI_VFR_RETURN_CODE\r
2607CVfrQuestionDB::UpdateQuestionId (\r
2608 IN EFI_QUESTION_ID QId,\r
2609 IN EFI_QUESTION_ID NewQId\r
2610 )\r
2611{\r
2612 SVfrQuestionNode *pNode = NULL;\r
2613\r
2614 if (ChekQuestionIdFree (NewQId) == FALSE) {\r
2615 return VFR_RETURN_REDEFINED;\r
2616 }\r
2617\r
2618 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2619 if (pNode->mQuestionId == QId) {\r
2620 break;\r
2621 }\r
2622 }\r
2623\r
2624 if (pNode == NULL) {\r
2625 return VFR_RETURN_UNDEFINED;\r
2626 }\r
2627\r
2628 MarkQuestionIdUnused (QId);\r
2629 pNode->mQuestionId = NewQId;\r
2630 MarkQuestionIdUsed (NewQId);\r
2631\r
2632 gCFormPkg.DoPendingAssign (pNode->mVarIdStr, (VOID *)&NewQId, sizeof(EFI_QUESTION_ID));\r
2633\r
2634 return VFR_RETURN_SUCCESS;\r
2635}\r
2636\r
2637VOID \r
2638CVfrQuestionDB::GetQuestionId (\r
2639 IN INT8 *Name,\r
2640 IN INT8 *VarIdStr,\r
2641 OUT EFI_QUESTION_ID &QuestionId,\r
2642 OUT UINT32 &BitMask\r
2643 )\r
2644{\r
2645 SVfrQuestionNode *pNode;\r
2646\r
2647 QuestionId = EFI_QUESTION_ID_INVALID;\r
2648 BitMask = 0x00000000;\r
2649\r
2650 if ((Name == NULL) && (VarIdStr == NULL)) {\r
2651 return ;\r
2652 }\r
2653\r
2654 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2655 if (Name != NULL) {\r
2656 if (strcmp (pNode->mName, Name) != 0) {\r
2657 continue;\r
2658 }\r
2659 }\r
2660\r
2661 if (VarIdStr != NULL) {\r
2662 if (strcmp (pNode->mVarIdStr, VarIdStr) != 0) {\r
2663 continue;\r
2664 }\r
2665 }\r
2666\r
2667 QuestionId = pNode->mQuestionId;\r
2668 BitMask = pNode->mBitMask;\r
2669 break;\r
2670 }\r
2671\r
2672 return ;\r
2673}\r
2674\r
2675EFI_VFR_RETURN_CODE \r
2676CVfrQuestionDB::FindQuestion (\r
2677 IN EFI_QUESTION_ID QuestionId\r
2678 )\r
2679{\r
2680 SVfrQuestionNode *pNode;\r
2681\r
2682 if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
2683 return VFR_RETURN_INVALID_PARAMETER;\r
2684 }\r
2685\r
2686 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2687 if (pNode->mQuestionId == QuestionId) {\r
2688 return VFR_RETURN_SUCCESS;\r
2689 }\r
2690 }\r
2691\r
2692 return VFR_RETURN_UNDEFINED;\r
2693}\r
2694\r
2695EFI_VFR_RETURN_CODE \r
2696CVfrQuestionDB::FindQuestion (\r
2697 IN INT8 *Name\r
2698 )\r
2699{\r
2700 SVfrQuestionNode *pNode;\r
2701\r
2702 if (Name == NULL) {\r
2703 return VFR_RETURN_FATAL_ERROR;\r
2704 }\r
2705\r
2706 for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
2707 if (strcmp (pNode->mName, Name) == 0) {\r
2708 return VFR_RETURN_SUCCESS;\r
2709 }\r
2710 }\r
2711\r
2712 return VFR_RETURN_UNDEFINED;\r
2713}\r
2714\r