/** Allows a program to determine the primary languages that are supported on a given handle. This routine is intended to be used by drivers to query the interface database for supported languages. This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle. @param This A pointer to the EFI_HII_PROTOCOL instance. @param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() in the Packages section. @param LanguageString A string allocated by GetPrimaryLanguages() that contains a list of all primary languages registered on the handle. The routine will not return the three-spaces language identifier used in other functions to indicate non-language-specific strings. @retval EFI_SUCCESS LanguageString was correctly returned. @retval EFI_INVALID_PARAMETER The Handle was unknown. **/ EFI_STATUS EFIAPI HiiGetPrimaryLanguages ( IN EFI_HII_PROTOCOL *This, IN FRAMEWORK_EFI_HII_HANDLE Handle, OUT EFI_STRING *LanguageString ) { HII_THUNK_PRIVATE_DATA *Private; EFI_HII_HANDLE UefiHiiHandle; CHAR8 *LangCodes4646; CHAR16 *UnicodeLangCodes639; CHAR8 *LangCodes639; EFI_STATUS Status; Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle); if (UefiHiiHandle == NULL) { return EFI_INVALID_PARAMETER; } LangCodes4646 = HiiGetSupportedLanguages (UefiHiiHandle); if (LangCodes4646 == NULL) { return EFI_INVALID_PARAMETER; } LangCodes639 = ConvertLanguagesRfc4646ToIso639 (LangCodes4646); if (LangCodes639 == NULL) { Status = EFI_INVALID_PARAMETER; goto Done; } UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16)); if (UnicodeLangCodes639 == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Done; } // // The language returned is in RFC 639-2 format. // AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639); *LanguageString = UnicodeLangCodes639; Status = EFI_SUCCESS; Done: FreePool (LangCodes4646); if (LangCodes639 != NULL) { FreePool (LangCodes639); } return Status; }
/** This notification function is invoked when an instance of the EFI_UNICODE_COLLATION_PROTOCOL2 is produced. It installs another instance of the EFI_UNICODE_COLLATION_PROTOCOL on the same handle. @param Event The event that occured @param Context Context of event. Not used in this nofication function. **/ VOID EFIAPI Uc2NotificationEvent ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; UINTN BufferSize; EFI_HANDLE Handle; UC_PRIVATE_DATA *Private; EFI_UNICODE_COLLATION_PROTOCOL *Uc2; while (TRUE) { BufferSize = sizeof (Handle); Status = gBS->LocateHandle ( ByRegisterNotify, &gEfiUnicodeCollation2ProtocolGuid, mUcRegistration, &BufferSize, &Handle ); if (EFI_ERROR (Status)) { // // Exit Path of While Loop.... // break; } // // Skip this handle if the Firmware Volume Protocol is already installed // Status = gBS->HandleProtocol ( Handle, &gEfiUnicodeCollationProtocolGuid, (VOID **)&Uc2 ); if (!EFI_ERROR (Status)) { continue; } // // Allocate private data structure // Private = AllocateCopyPool (sizeof (UC_PRIVATE_DATA), &gUCPrivateDataTemplate); if (Private == NULL) { continue; } // // Retrieve the UC Protocol // Status = gBS->HandleProtocol ( Handle, &gEfiUnicodeCollation2ProtocolGuid, (VOID **)&Private->Uc2 ); ASSERT_EFI_ERROR (Status); // // Fill in rest of private data structure // Private->Uc.SupportedLanguages = ConvertLanguagesRfc4646ToIso639 (Private->Uc2->SupportedLanguages); if (Private->Uc.SupportedLanguages != NULL) { // // Install Firmware Volume Protocol onto same handle // Status = gBS->InstallMultipleProtocolInterfaces ( &Handle, &gEfiUnicodeCollationProtocolGuid, &Private->Uc, NULL ); ASSERT_EFI_ERROR (Status); } } }