2 HII Library implementation that uses DXE protocols and services.
4 Copyright (c) 2006, Intel Corporation<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "InternalHiiLib.h"
20 IN EFI_HII_HANDLE PackageList
,
21 OUT EFI_STRING_ID
*StringId
,
22 IN CONST EFI_STRING String
28 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
30 ASSERT (String
!= NULL
);
31 ASSERT (StringId
!= NULL
);
35 Languages
= HiiLibGetSupportedLanguages (PackageList
);
37 LangStrings
= Languages
;
38 while (*LangStrings
!= 0) {
39 HiiLibGetNextLanguage (&LangStrings
, Lang
);
41 Status
= mHiiStringProt
->NewString (
50 if (EFI_ERROR (Status
)) {
64 IN EFI_HII_HANDLE PackageList
,
65 IN EFI_STRING_ID StringId
,
66 IN CONST EFI_STRING String
72 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
74 ASSERT (IsHiiHandleRegistered (PackageList
));
78 Languages
= HiiLibGetSupportedLanguages (PackageList
);
79 ASSERT (Languages
!= NULL
);
81 LangStrings
= Languages
;
82 while (*LangStrings
!= 0) {
83 HiiLibGetNextLanguage (&LangStrings
, Lang
);
85 Status
= mHiiStringProt
->SetString (
93 if (EFI_ERROR (Status
)) {
106 HiiLibGetStringFromToken (
107 IN EFI_GUID
*ProducerGuid
,
108 IN EFI_STRING_ID StringId
,
109 OUT EFI_STRING
*String
114 UINTN HandleBufferLen
;
115 EFI_HII_HANDLE
*HiiHandleBuffer
;
118 Status
= HiiLibGetHiiHandles (&HandleBufferLen
, &HiiHandleBuffer
);
119 if (EFI_ERROR(Status
)) {
122 for (Index
= 0; Index
< (HandleBufferLen
/ sizeof (EFI_HII_HANDLE
)); Index
++) {
123 Status
= HiiLibExtractGuidFromHiiHandle (HiiHandleBuffer
[Index
], &Guid
);
124 if (EFI_ERROR(Status
)) {
127 if (CompareGuid (&Guid
, ProducerGuid
) == TRUE
) {
132 if (Index
>= (HandleBufferLen
/ sizeof (EFI_HII_HANDLE
))) {
134 // If PackageList with the matching ProducerGuid is not found, then ASSERT.
137 Status
= EFI_NOT_FOUND
;
141 Status
= HiiLibGetStringFromHandle (HiiHandleBuffer
[Index
], StringId
, String
);
144 if (HiiHandleBuffer
!= NULL
) {
145 gBS
->FreePool (HiiHandleBuffer
);
153 IN EFI_HII_HANDLE PackageList
,
154 IN EFI_STRING_ID StringId
,
155 OUT EFI_STRING String
,
156 IN OUT UINTN
*StringSize
162 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
163 CHAR8 CurrentLang
[RFC_3066_ENTRY_SIZE
];
165 ASSERT (String
!= NULL
);
166 ASSERT (StringSize
!= NULL
);
167 ASSERT (IsHiiHandleRegistered (PackageList
));
169 HiiLibGetCurrentLanguage (CurrentLang
);
171 Status
= mHiiStringProt
->GetString (
181 if (EFI_ERROR (Status
) && (Status
!= EFI_BUFFER_TOO_SMALL
)) {
182 Languages
= HiiLibGetSupportedLanguages (PackageList
);
183 ASSERT (Languages
!= NULL
);
185 LangStrings
= Languages
;
186 HiiLibGetNextLanguage (&LangStrings
, Lang
);
187 gBS
->FreePool (Languages
);
189 Status
= mHiiStringProt
->GetString (
206 HiiLibGetStringFromHandle (
207 IN EFI_HII_HANDLE HiiHandle
,
208 IN EFI_STRING_ID StringId
,
209 OUT EFI_STRING
*String
215 ASSERT (String
!= NULL
);
217 StringSize
= HII_LIB_DEFAULT_STRING_SIZE
;
218 *String
= AllocateZeroPool (StringSize
);
219 if (*String
== NULL
) {
220 return EFI_OUT_OF_RESOURCES
;
223 Status
= HiiLibGetString (HiiHandle
, StringId
, *String
, &StringSize
);
224 if (Status
== EFI_BUFFER_TOO_SMALL
) {
225 gBS
->FreePool (*String
);
226 *String
= AllocateZeroPool (StringSize
);
227 if (*String
== NULL
) {
228 return EFI_OUT_OF_RESOURCES
;
230 Status
= HiiLibGetString (HiiHandle
, StringId
, *String
, &StringSize
);
239 // Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
240 // Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
241 // The last 2 CHAR8 values are the ISO 639-1 code.
243 CHAR8 Iso639ToRfc3066ConversionTable
[] =
384 Convert language code from RFC3066 to ISO639-2.
386 @param LanguageRfc3066 RFC3066 language code.
387 @param LanguageIso639 ISO639-2 language code.
389 @retval EFI_SUCCESS Language code converted.
390 @retval EFI_NOT_FOUND Language code not found.
395 ConvertRfc3066LanguageToIso639Language (
396 CHAR8
*LanguageRfc3066
,
397 CHAR8
*LanguageIso639
402 if ((LanguageRfc3066
[2] != '-') && (LanguageRfc3066
[2] != 0)) {
403 CopyMem (LanguageIso639
, LanguageRfc3066
, 3);
407 for (Index
= 0; Iso639ToRfc3066ConversionTable
[Index
] != 0; Index
+= 5) {
408 if (CompareMem (LanguageRfc3066
, &Iso639ToRfc3066ConversionTable
[Index
+ 3], 2) == 0) {
409 CopyMem (LanguageIso639
, &Iso639ToRfc3066ConversionTable
[Index
], 3);
414 return EFI_NOT_FOUND
;
419 Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will
420 be converted to "engfra".
422 @param SupportedLanguages The RFC3066 language list.
424 @return The ISO639-2 language list.
430 CHAR8
*SupportedLanguages
436 CHAR8 LangRfc3066
[RFC_3066_ENTRY_SIZE
];
437 CHAR8 LangIso639
[ISO_639_2_ENTRY_SIZE
];
440 ReturnValue
= AllocateZeroPool (AsciiStrSize (SupportedLanguages
));
441 if (ReturnValue
== NULL
) {
445 Languages
= ReturnValue
;
446 LangCodes
= SupportedLanguages
;
447 while (*LangCodes
!= 0) {
448 HiiLibGetNextLanguage (&LangCodes
, LangRfc3066
);
450 Status
= ConvertRfc3066LanguageToIso639Language (LangRfc3066
, LangIso639
);
451 if (!EFI_ERROR (Status
)) {
452 CopyMem (Languages
, LangIso639
, 3);
453 Languages
= Languages
+ 3;