/** This notification function will be called when a Package List is registered using UEFI HII interface. The Package List registered need to be recorded in Framework Thunk module as Thunk Module may need to look for String Package in the package registered. If the Package List registered is not either Sting Package or IFR package, then ASSERT. If the NotifyType is not ADD_PACK or NEW_PACK, then ASSERT. Both cases means UEFI HII Database itself is buggy. @param PackageType The Package Type. @param PackageGuid The Package GUID. @param Package The Package Header. @param Handle The HII Handle of this Package List. @param NotifyType The reason of the notification. @retval EFI_SUCCESS The notification function is successful. **/ EFI_STATUS EFIAPI NewOrAddPackNotify ( IN UINT8 PackageType, IN CONST EFI_GUID *PackageGuid, IN CONST EFI_HII_PACKAGE_HEADER *Package, IN EFI_HII_HANDLE Handle, IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType ) { EFI_STATUS Status; HII_THUNK_PRIVATE_DATA *Private; HII_THUNK_CONTEXT *ThunkContext; ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS || PackageType == EFI_HII_PACKAGE_FORMS); ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK || NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK); Status = EFI_SUCCESS; Private = mHiiThunkPrivateData; if (mInFrameworkHiiNewPack || mInFrameworkUpdatePakcage) { return EFI_SUCCESS; } // // We will create a ThunkContext to log the package list only if the // package is not registered with by Framework HII Thunk module yet. // ThunkContext = UefiHiiHandleToThunkContext (Private, Handle); if (ThunkContext == NULL) { ThunkContext = CreateThunkContextForUefiHiiHandle (Handle); ASSERT (ThunkContext != NULL); InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link); } if (PackageType == EFI_HII_PACKAGE_FORMS) { if (ThunkContext->FormSet != NULL) { DestroyFormSet (ThunkContext->FormSet); } // // Reparse the FormSet. // ThunkContext->FormSet = ParseFormSet (ThunkContext->UefiHiiHandle); } return Status; }
/** This routine initializes the HII Database. @param ImageHandle Image handle for PCD DXE driver. @param SystemTable Pointer to SystemTable. @retval EFI_SUCCESS The entry point alwasy return successfully. **/ EFI_STATUS EFIAPI InitializeHiiDatabase ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { HII_THUNK_PRIVATE_DATA *Private; EFI_HANDLE Handle; EFI_STATUS Status; UINTN BufferLength; EFI_HII_HANDLE *Buffer; UINTN Index; HII_THUNK_CONTEXT *ThunkContext; ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiCompatibilityProtocolGuid); ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiFormBrowserCompatibilityProtocolGuid); Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate); ASSERT (Private != NULL); InitializeListHead (&Private->ThunkContextListHead); InitHiiHandleDatabase (); mHiiThunkPrivateData = Private; Status = gBS->LocateProtocol ( &gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabase ); ASSERT_EFI_ERROR (Status); Status = gBS->LocateProtocol ( &gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProtocol ); ASSERT_EFI_ERROR (Status); Status = gBS->LocateProtocol ( &gEfiHiiFontProtocolGuid, NULL, (VOID **) &mHiiFontProtocol ); ASSERT_EFI_ERROR (Status); Status = gBS->LocateProtocol ( &gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &mHiiConfigRoutingProtocol ); ASSERT_EFI_ERROR (Status); Status = gBS->LocateProtocol ( &gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mFormBrowser2Protocol ); ASSERT_EFI_ERROR (Status); // // Install protocol interface // Status = gBS->InstallProtocolInterface ( &Private->Handle, &gEfiHiiCompatibilityProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *) &Private->Hii ); ASSERT_EFI_ERROR (Status); Status = ListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer); if (Status == EFI_SUCCESS) { ASSERT (Buffer != NULL); for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) { ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]); ASSERT (ThunkContext!= NULL); InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link); } FreePool (Buffer); } Status = mHiiDatabase->RegisterPackageNotify ( mHiiDatabase, EFI_HII_PACKAGE_STRINGS, NULL, NewOrAddPackNotify, EFI_HII_DATABASE_NOTIFY_NEW_PACK, &Handle ); ASSERT_EFI_ERROR (Status); Status = mHiiDatabase->RegisterPackageNotify ( mHiiDatabase, EFI_HII_PACKAGE_STRINGS, NULL, NewOrAddPackNotify, EFI_HII_DATABASE_NOTIFY_ADD_PACK, &Handle ); ASSERT_EFI_ERROR (Status); Status = mHiiDatabase->RegisterPackageNotify ( mHiiDatabase, EFI_HII_PACKAGE_FORMS, NULL, NewOrAddPackNotify, EFI_HII_DATABASE_NOTIFY_NEW_PACK, &Handle ); ASSERT_EFI_ERROR (Status); Status = mHiiDatabase->RegisterPackageNotify ( mHiiDatabase, EFI_HII_PACKAGE_FORMS, NULL, NewOrAddPackNotify, EFI_HII_DATABASE_NOTIFY_ADD_PACK, &Handle ); ASSERT_EFI_ERROR (Status); Status = mHiiDatabase->RegisterPackageNotify ( mHiiDatabase, EFI_HII_PACKAGE_STRINGS, NULL, RemovePackNotify, EFI_HII_DATABASE_NOTIFY_REMOVE_PACK, &Handle ); ASSERT_EFI_ERROR (Status); InitSetBrowserStrings (); mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private; Status = gBS->InstallProtocolInterface ( &mBrowserThunkPrivateDataTemplate.Handle, &gEfiFormBrowserCompatibilityProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser ); ASSERT_EFI_ERROR (Status); return Status; }