]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
Framework code may call PreparePacckage with NULL GUID and both IFR and String Packages.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Package.c
CommitLineData
4259256b 1/**@file\r
0368663f 2 Implement protocol interface related to package registrations.\r
4259256b 3\r
4Copyright (c) 2006 - 2008, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15\r
16#include "HiiDatabase.h"\r
d4775f2a 17#include "HiiHandle.h"\r
4259256b 18\r
19\r
0368663f 20STATIC BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
21STATIC BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
22BOOLEAN mInFrameworkUpdatePakcage = FALSE;\r
63dd6a96 23\r
24\r
4259256b 25EFI_STATUS\r
0368663f 26GetPackageCount (\r
4259256b 27 IN CONST EFI_HII_PACKAGES *Packages,\r
0368663f 28 UINTN *IfrPackageCount,\r
29 UINTN *StringPackageCount\r
4259256b 30 )\r
31{\r
32 UINTN Index;\r
33 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
34\r
35 ASSERT (Packages != NULL);\r
0368663f 36 ASSERT (IfrPackageCount != NULL);\r
37 ASSERT (StringPackageCount != NULL);\r
4259256b 38\r
0368663f 39 *IfrPackageCount = 0;\r
40 *StringPackageCount = 0;\r
4259256b 41\r
42 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
0368663f 43 \r
4259256b 44 for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
45 //\r
a3318eaf 46 // The current UEFI HII build tool generate a binary in the format defined by \r
4259256b 47 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
0368663f 48 // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
4259256b 49 // may not be the exact number of valid package number in the binary generated \r
50 // by HII Build tool.\r
51 //\r
52 switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
53 case EFI_HII_PACKAGE_FORM:\r
0368663f 54 *IfrPackageCount += 1;\r
4259256b 55 break;\r
56 case EFI_HII_PACKAGE_STRINGS:\r
0368663f 57 *StringPackageCount += 1;\r
4259256b 58 break;\r
59\r
60 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
61 break;\r
62\r
63 //\r
64 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
65 //\r
66 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
67 case EFI_HII_PACKAGE_FONTS:\r
68 case EFI_HII_PACKAGE_IMAGES:\r
69 default:\r
70 ASSERT (FALSE);\r
71 return EFI_INVALID_PARAMETER;\r
72 break;\r
73 }\r
74 }\r
75\r
76 return EFI_SUCCESS;\r
77}\r
78\r
59930165 79VOID\r
80UpdatePackListWithOnlyIfrPack (\r
0368663f 81 IN HII_THUNK_PRIVATE_DATA *Private,\r
82 IN HII_THUNK_CONTEXT *StringPackageThunkContext,\r
4259256b 83 IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
84 )\r
85{\r
86 EFI_STATUS Status;\r
0368663f 87 LIST_ENTRY *Link;\r
88 HII_THUNK_CONTEXT *ThunkContext;\r
89\r
90 Link = GetFirstNode (&Private->ThunkContextListHead);\r
91 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
92\r
93 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
94\r
95 if (StringPackageThunkContext != ThunkContext) {\r
96 //\r
97 // Skip the String Package Thunk Entry itself.\r
98 //\r
99 \r
100 if (CompareGuid (&StringPackageListHeader->PackageListGuid, &ThunkContext->TagGuid)) {\r
101\r
102 ASSERT (ThunkContext->StringPackageCount == 0 && ThunkContext->IfrPackageCount == 1);\r
103\r
104 ThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
105 \r
106 Status = mHiiDatabase->UpdatePackageList (\r
107 mHiiDatabase,\r
108 ThunkContext->UefiHiiHandle,\r
109 StringPackageListHeader\r
110 );\r
59930165 111 ASSERT_EFI_ERROR (Status);\r
0368663f 112 \r
0368663f 113 }\r
4259256b 114 }\r
0368663f 115 \r
116 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
4259256b 117 }\r
118 \r
4259256b 119}\r
0368663f 120\r
121\r
4259256b 122EFI_HII_PACKAGE_LIST_HEADER *\r
123PrepareUefiPackageListFromFrameworkHiiPackages (\r
124 IN CONST EFI_HII_PACKAGES *Packages,\r
63dd6a96 125 IN CONST EFI_GUID *PackageListGuid\r
4259256b 126 )\r
127{\r
128 UINTN NumberOfPackages;\r
129 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
130 UINT8 *PackageListData;\r
131 UINT32 PackageListLength;\r
132 UINT32 PackageLength;\r
133 EFI_HII_PACKAGE_HEADER PackageHeader;\r
134 UINTN Index;\r
135 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
136\r
63dd6a96 137 ASSERT (Packages != NULL);\r
138 ASSERT (PackageListGuid != NULL);\r
139\r
4259256b 140 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) ((UINT8 *) &Packages->GuidId + sizeof (Packages->GuidId));\r
141 NumberOfPackages = Packages->NumberOfPackages;\r
142\r
143 PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
144\r
145 for (Index = 0; Index < NumberOfPackages; Index++) {\r
146 CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32));\r
99a83b4c 147 //\r
148 //TIANO_AUTOGEN_PACKAGES_HEADER.BinaryLength include the BinaryLength itself.\r
149 //\r
150 PackageListLength += (PackageLength - sizeof(UINT32)); \r
4259256b 151 }\r
152\r
153 //\r
154 // Include the lenght of EFI_HII_PACKAGE_END\r
155 //\r
156 PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
157 PackageListHeader = AllocateZeroPool (PackageListLength);\r
158 ASSERT (PackageListHeader != NULL);\r
63dd6a96 159\r
160 CopyMem (&PackageListHeader->PackageListGuid, PackageListGuid, sizeof (EFI_GUID));\r
4259256b 161 PackageListHeader->PackageLength = PackageListLength;\r
162\r
163 PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
164\r
165 for (Index = 0; Index < NumberOfPackages; Index++) {\r
166 CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->BinaryLength), sizeof (UINT32));\r
167 PackageLength -= sizeof (UINT32);\r
168 CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);\r
169 PackageListData += PackageLength;\r
170 }\r
171\r
172 //\r
173 // Append EFI_HII_PACKAGE_END\r
174 //\r
175 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
176 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
177 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
178\r
179 return PackageListHeader; \r
180}\r
181\r
59336178 182VOID\r
59930165 183GenerateRandomGuid (\r
184 OUT EFI_GUID * Guid\r
4259256b 185 )\r
186{\r
138f2f82 187 EFI_GUID GuidBase = { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e }};\r
188 static UINT64 Count = 0;\r
4259256b 189\r
59930165 190 CopyGuid (Guid, &GuidBase);\r
138f2f82 191\r
192 Count++; \r
193 *((UINT64 *) Guid) = *((UINT64 *) Guid) + Count;\r
4259256b 194}\r
195\r
196EFI_STATUS\r
59930165 197FindStringPackAndUpdatePackListWithOnlyIfrPack (\r
0368663f 198 IN HII_THUNK_PRIVATE_DATA *Private,\r
199 IN HII_THUNK_CONTEXT *IfrThunkContext\r
4259256b 200 )\r
201{\r
0368663f 202 EFI_STATUS Status;\r
203 LIST_ENTRY *Link;\r
204 EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
205 UINTN Size;\r
206 HII_THUNK_CONTEXT *ThunkContext;\r
4259256b 207\r
0368663f 208 \r
209 Link = GetFirstNode (&Private->ThunkContextListHead);\r
210\r
211 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
212\r
213 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
214\r
215 if (ThunkContext != IfrThunkContext) {\r
216 if (CompareGuid (&IfrThunkContext->TagGuid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount == 0)) {\r
217 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &StringPackageListHeader, &Size);\r
218 ASSERT_EFI_ERROR (Status);\r
219\r
220 IfrThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
221 //\r
222 // Add Function to only get only String Packages from the Package List\r
223 //\r
224 Status = mHiiDatabase->UpdatePackageList (\r
225 mHiiDatabase,\r
226 IfrThunkContext->UefiHiiHandle,\r
227 StringPackageListHeader\r
228 );\r
229 ASSERT_EFI_ERROR (Status);\r
230 \r
231 FreePool (StringPackageListHeader);\r
232 return EFI_SUCCESS;\r
59930165 233\r
0368663f 234 }\r
235 }\r
4259256b 236\r
0368663f 237 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
238 }\r
239\r
59930165 240 ASSERT (FALSE);\r
0368663f 241 return EFI_NOT_FOUND;\r
59930165 242 \r
0368663f 243}\r
244\r
0368663f 245\r
59930165 246//\r
247// \r
248//\r
4259256b 249EFI_STATUS\r
250UefiRegisterPackageList(\r
8ea58c07 251 IN EFI_HII_PROTOCOL *This,\r
0368663f 252 IN HII_THUNK_PRIVATE_DATA *Private,\r
253 IN EFI_HII_PACKAGES *Packages,\r
254 OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
4259256b 255 )\r
256{\r
257 EFI_STATUS Status;\r
0368663f 258 UINTN StringPackageCount;\r
259 UINTN IfrPackageCount;\r
260 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
59930165 261 HII_THUNK_CONTEXT *ThunkContext;\r
bc226416 262 HII_THUNK_CONTEXT *ThunkContextToRemove;\r
59336178 263 EFI_GUID GuidId;\r
bc226416 264 EFI_HII_PACKAGE_HEADER *IfrPackage;\r
4259256b 265\r
0368663f 266 PackageListHeader = NULL;\r
4259256b 267\r
0368663f 268 Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount);\r
4259256b 269 ASSERT_EFI_ERROR (Status);\r
0368663f 270 \r
271 if (IfrPackageCount > 1) {\r
272 //\r
273 // HII Thunk only handle package with 0 or 1 IFR package. \r
274 //\r
59930165 275 ASSERT (FALSE);\r
59336178 276 return EFI_UNSUPPORTED;\r
277 }\r
4259256b 278\r
bc226416 279 ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
280 if (ThunkContext == NULL) {\r
281 return EFI_OUT_OF_RESOURCES;\r
282 }\r
283 ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
284 \r
59336178 285 if (Packages->GuidId == NULL) {\r
0368663f 286 //\r
287 // UEFI HII Database require Package List GUID must be unique.\r
288 //\r
289 // If Packages->GuidId is NULL, the caller of FramworkHii->NewPack is registering\r
290 // packages with at least 1 StringPack and 1 IfrPack. Therefore, Packages->GuidId is\r
291 // not used as the name of the package list. A GUID is generated as a Package List\r
292 // GUID.\r
293 //\r
294 ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
bc226416 295 IfrPackage = GetIfrPackage (Packages);\r
296 GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);\r
63dd6a96 297 } else {\r
bc226416 298 ThunkContextToRemove = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
8ea58c07 299 \r
300 if (IfrPackageCount > 0 && \r
301 StringPackageCount > 0 && \r
bc226416 302 (ThunkContextToRemove!= NULL)) {\r
8ea58c07 303 DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
304 DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
bc226416 305 HiiRemovePack (This, ThunkContextToRemove->FwHiiHandle);\r
8ea58c07 306 }\r
bc226416 307 CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
59336178 308 }\r
4259256b 309\r
0368663f 310 //\r
bc226416 311 // UEFI HII database does not allow two package list with the same GUID.\r
312 // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
313 // a PackageList with only IFR to a Package list the with String package.\r
0368663f 314 //\r
bc226416 315 GenerateRandomGuid (&GuidId);\r
4259256b 316\r
317 //\r
318 // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
5391c4f1 319 // that Setup Utility can load the Buffer Storage using this protocol.\r
4259256b 320 //\r
0368663f 321 if (IfrPackageCount != 0) {\r
322 InstallDefaultConfigAccessProtocol (Packages, ThunkContext);\r
4259256b 323 }\r
0368663f 324 PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
59336178 325 Status = mHiiDatabase->NewPackageList (\r
326 mHiiDatabase,\r
0368663f 327 PackageListHeader, \r
328 ThunkContext->UefiHiiDriverHandle,\r
329 &ThunkContext->UefiHiiHandle\r
4259256b 330 );\r
0368663f 331\r
332 //\r
333 // BUGBUG: Remove when development is done\r
334 //\r
4259256b 335 ASSERT_EFI_ERROR (Status);\r
336 if (EFI_ERROR (Status)) {\r
337 goto Done;\r
338 }\r
339 \r
0368663f 340 if (IfrPackageCount == 0) {\r
341 if (StringPackageCount != 0) {\r
4259256b 342 //\r
59930165 343 // Look for a Package List with only IFR Package with the same GUID name.\r
344 // If found one, add the String Packages to it.\r
4259256b 345 //\r
59930165 346 UpdatePackListWithOnlyIfrPack (\r
347 Private,\r
348 ThunkContext,\r
349 PackageListHeader\r
350 );\r
4259256b 351 }\r
352 } else {\r
0368663f 353 CreateQuestionIdMap (ThunkContext);\r
354 \r
355 if (StringPackageCount == 0) {\r
4259256b 356 //\r
357 // Register the Package List to UEFI HII first.\r
358 //\r
59930165 359 Status = FindStringPackAndUpdatePackListWithOnlyIfrPack (\r
4259256b 360 Private,\r
0368663f 361 ThunkContext\r
4259256b 362 );\r
59930165 363\r
364 if (EFI_ERROR (Status)) {\r
365 goto Done;\r
366 }\r
4259256b 367 }\r
368 }\r
369\r
4259256b 370Done:\r
371 if (EFI_ERROR (Status)) {\r
d4775f2a 372 DestroyThunkContext (ThunkContext);\r
4259256b 373 } else {\r
0368663f 374 InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
375 *Handle = ThunkContext->FwHiiHandle;\r
4259256b 376 }\r
377\r
0368663f 378 SafeFreePool (PackageListHeader);\r
4259256b 379 \r
380 return Status;\r
381}\r
382\r
ea58467b 383\r
4259256b 384EFI_STATUS\r
385EFIAPI\r
386HiiNewPack (\r
387 IN EFI_HII_PROTOCOL *This,\r
388 IN EFI_HII_PACKAGES *Packages,\r
389 OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
390 )\r
391/*++\r
392\r
393Routine Description:\r
394\r
395 Extracts the various packs from a package list.\r
396\r
397Arguments:\r
398\r
399 This - Pointer of HII protocol.\r
400 Packages - Pointer of HII packages.\r
401 Handle - Handle value to be returned.\r
402\r
403Returns:\r
404\r
405 EFI_SUCCESS - Pacakges has added to HII database successfully.\r
406 EFI_INVALID_PARAMETER - Invalid parameter.\r
407\r
408--*/\r
409{\r
410 EFI_STATUS Status;\r
0368663f 411 HII_THUNK_PRIVATE_DATA *Private;\r
63dd6a96 412 EFI_TPL OldTpl;\r
4259256b 413\r
414 if (Handle == NULL) {\r
415 return EFI_INVALID_PARAMETER;\r
416 }\r
417\r
418 if (Packages == NULL) {\r
419 return EFI_INVALID_PARAMETER;\r
420 }\r
421\r
63dd6a96 422 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
423 \r
ea58467b 424 //\r
425 // We use a simple Global variable to inform NewPackNotify\r
426 // that the package list registered here is already registered\r
427 // in the HII Thunk Layer. So NewPackNotify does not need to\r
428 // call RegisterUefiHiiHandle () to registered it.\r
429 //\r
430 mInFrameworkHiiNewPack = TRUE;\r
431\r
0368663f 432 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
4259256b 433\r
434 Status = UefiRegisterPackageList (\r
8ea58c07 435 This,\r
4259256b 436 Private,\r
437 Packages,\r
438 Handle\r
439 );\r
440\r
ea58467b 441 mInFrameworkHiiNewPack = FALSE;\r
442\r
63dd6a96 443 gBS->RestoreTPL (OldTpl);\r
444\r
4259256b 445 return Status;\r
446}\r
447\r
448EFI_STATUS\r
449EFIAPI\r
450HiiRemovePack (\r
451 IN EFI_HII_PROTOCOL *This,\r
452 IN FRAMEWORK_EFI_HII_HANDLE Handle\r
453 )\r
454/*++\r
455\r
456Routine Description:\r
457 Removes the various packs from a Handle\r
458\r
459Arguments:\r
460\r
461Returns:\r
462\r
463--*/\r
464{\r
465 EFI_STATUS Status;\r
0368663f 466 HII_THUNK_PRIVATE_DATA *Private;\r
467 HII_THUNK_CONTEXT *ThunkContext;\r
63dd6a96 468 EFI_TPL OldTpl;\r
63dd6a96 469\r
470 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
471\r
472 mInFrameworkHiiRemovePack = TRUE;\r
4259256b 473\r
0368663f 474 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
4259256b 475\r
0368663f 476 ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
4259256b 477\r
0368663f 478 if (ThunkContext != NULL) {\r
59336178 479 Status = mHiiDatabase->RemovePackageList (\r
480 mHiiDatabase,\r
0368663f 481 ThunkContext->UefiHiiHandle\r
99a83b4c 482 );\r
483 ASSERT_EFI_ERROR (Status);\r
484\r
0368663f 485 if (ThunkContext->IfrPackageCount != 0) {\r
486 UninstallDefaultConfigAccessProtocol (ThunkContext);\r
4259256b 487 }\r
99a83b4c 488\r
d4775f2a 489 DestroyThunkContext (ThunkContext);\r
63dd6a96 490 }else {\r
491 Status = EFI_NOT_FOUND;\r
4259256b 492 }\r
493\r
63dd6a96 494 mInFrameworkHiiRemovePack = FALSE;\r
63dd6a96 495 gBS->RestoreTPL (OldTpl);\r
496\r
497 return Status;\r
4259256b 498}\r
0368663f 499\r
500EFI_STATUS\r
501EFIAPI\r
502NewOrAddPackNotify (\r
503 IN UINT8 PackageType,\r
504 IN CONST EFI_GUID *PackageGuid,\r
505 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
506 IN EFI_HII_HANDLE Handle,\r
507 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
508 )\r
509{\r
510 EFI_STATUS Status;\r
511 HII_THUNK_PRIVATE_DATA *Private;\r
512 HII_THUNK_CONTEXT *ThunkContext;\r
513\r
514 ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS || PackageType == EFI_HII_PACKAGE_FORM);\r
515 ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK || NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
516\r
517 Status = EFI_SUCCESS;\r
518 Private = mHiiThunkPrivateData;\r
519\r
520 if (mInFrameworkHiiNewPack || mInFrameworkUpdatePakcage) {\r
521 return EFI_SUCCESS;\r
522 }\r
523\r
524 //\r
525 // We only create a ThunkContext if the Uefi Hii Handle is only already registered\r
526 // by the HII Thunk Layer.\r
527 //\r
528 ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
529 if (ThunkContext == NULL) {\r
d4775f2a 530 ThunkContext = CreateThunkContextForUefiHiiHandle (Handle);\r
0368663f 531 ASSERT (ThunkContext != NULL);\r
d4775f2a 532\r
533 InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
0368663f 534 } \r
535\r
0368663f 536 if (PackageType == EFI_HII_PACKAGE_FORM) {\r
59930165 537 GetAttributesOfFirstFormSet (ThunkContext);\r
0368663f 538 }\r
539\r
540 return Status; \r
541}\r
542\r
59930165 543//\r
0368663f 544// Framework HII module may cache a GUID as the name of the package list.\r
545// Then search for the Framework HII handle database for the handle matching\r
546// this GUID\r
547\r
548EFI_STATUS\r
549EFIAPI\r
550RemovePackNotify (\r
551 IN UINT8 PackageType,\r
552 IN CONST EFI_GUID *PackageGuid,\r
553 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
554 IN EFI_HII_HANDLE Handle,\r
555 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
556 )\r
557{\r
59930165 558 EFI_STATUS Status;\r
559 HII_THUNK_PRIVATE_DATA *Private;\r
560 HII_THUNK_CONTEXT *ThunkContext;\r
561 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
562 UINTN BufferSize;\r
0368663f 563\r
564 Status = EFI_SUCCESS;\r
565\r
566 ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
567 ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
568\r
569 if (mInFrameworkHiiRemovePack || mInFrameworkUpdatePakcage) {\r
570 return EFI_SUCCESS;\r
571 }\r
572\r
573 Private = mHiiThunkPrivateData;\r
574\r
575 ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
576\r
f38360fb 577 //\r
578 // BugBug: Change to ASSERT if HII Database fix the bug and to also invoke \r
579 // NEW_PACK_NOTIFY for package (String Package) created internally.\r
580 //\r
581 if (ThunkContext != NULL) {\r
582 if (!ThunkContext->ByFrameworkHiiNewPack) {\r
583 Status = HiiLibExportPackageLists (Handle, &HiiPackageList, &BufferSize);\r
584 ASSERT_EFI_ERROR (Status);\r
59930165 585\r
f38360fb 586 if (GetPackageCountByType (HiiPackageList, EFI_HII_PACKAGE_STRINGS) == 1) {\r
587 //\r
588 // If the string package will be removed is the last string package\r
589 // in the package list, we will remove the HII Thunk entry from the\r
590 // database.\r
591 //\r
592 DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
593 }\r
59930165 594\r
f38360fb 595 FreePool (HiiPackageList);\r
596 }\r
0368663f 597 }\r
598\r
f38360fb 599 \r
0368663f 600 return Status;\r
601}\r
602\r
603\r
604\r