/**@file\r
-\r
- This file contains the keyboard processing code to the HII database.\r
-\r
+ This file implements the protocol functions related to string package.\r
+ \r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
}\r
\r
EFI_STATUS\r
-GetTagGuidByFrameworkHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle,\r
+GetTagGuidByFwHiiHandle (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle,\r
OUT EFI_GUID *TagGuid\r
)\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
\r
ASSERT (TagGuid != NULL);\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
- CopyGuid (TagGuid, &HandleMapEntry->TagGuid);\r
+ if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
+ CopyGuid (TagGuid, &ThunkContext->TagGuid);\r
return EFI_SUCCESS;\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
- \r
+\r
return EFI_NOT_FOUND;\r
}\r
\r
+\r
+\r
EFI_STATUS\r
-HiiThunkNewStringForAllStringPackages (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- OUT CONST EFI_GUID *TagGuid,\r
- IN CHAR16 *Language,\r
- IN OUT STRING_REF *Reference,\r
- IN CHAR16 *NewString\r
+EFIAPI\r
+HiiNewString (\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN CHAR16 *Language,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN OUT STRING_REF *Reference,\r
+ IN CHAR16 *NewString\r
)\r
+/*++\r
+\r
+Routine Description:\r
+ This function allows a new String to be added to an already existing String Package.\r
+ We will make a buffer the size of the package + StrSize of the new string. We will\r
+ copy the string package that first gets changed and the following language packages until\r
+ we encounter the NULL string package. All this time we will ensure that the offsets have\r
+ been adjusted.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
{\r
EFI_STATUS Status;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
- EFI_STRING_ID StringId1;\r
- EFI_STRING_ID StringId2;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ EFI_GUID TagGuid;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ EFI_STRING_ID StringId;\r
+ EFI_STRING_ID LastStringId;\r
CHAR8 *AsciiLanguage;\r
BOOLEAN Found;\r
\r
- ASSERT (TagGuid != NULL);\r
+ //\r
+ // BugBug: Conver the language to 3066.\r
+ //\r
\r
- StringId1 = (EFI_STRING_ID) 0;\r
- StringId2 = (EFI_STRING_ID) 0;\r
- Found = FALSE;\r
+ LastStringId = (EFI_STRING_ID) 0;\r
+ StringId = (EFI_STRING_ID) 0;\r
+ Found = FALSE;\r
+ AsciiLanguage = NULL;\r
\r
- if (Language == NULL) {\r
- AsciiLanguage = NULL;\r
- } else {\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+ Status = GetTagGuidByFwHiiHandle (Private, Handle, &TagGuid);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ if (Language != NULL) {\r
AsciiLanguage = AllocateZeroPool (StrLen (Language) + 1);\r
UnicodeStrToAsciiStr (Language, AsciiLanguage);\r
}\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
-\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (CompareGuid (TagGuid, &HandleMapEntry->TagGuid)) {\r
+ if (CompareGuid (&TagGuid, &ThunkContext->TagGuid)) {\r
Found = TRUE;\r
if (*Reference == 0) {\r
+ //\r
+ // Create a new string token.\r
+ //\r
if (AsciiLanguage == NULL) {\r
- Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+ //\r
+ // For all languages in the package list.\r
+ //\r
+ Status = HiiLibNewString (ThunkContext->UefiHiiHandle, &StringId, NewString);\r
} else {\r
+ //\r
+ // For specified language.\r
+ //\r
Status = mHiiStringProtocol->NewString (\r
mHiiStringProtocol,\r
- HandleMapEntry->UefiHiiHandle,\r
- &StringId2,\r
+ ThunkContext->UefiHiiHandle,\r
+ &StringId,\r
AsciiLanguage,\r
NULL,\r
NewString,\r
);\r
}\r
} else {\r
+ //\r
+ // Update the existing string token.\r
+ //\r
if (AsciiLanguage == NULL) {\r
- Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+ //\r
+ // For all languages in the package list.\r
+ //\r
+ Status = HiiLibSetString (ThunkContext->UefiHiiHandle, *Reference, NewString);\r
} else {\r
+ //\r
+ // For specified language.\r
+ //\r
Status = mHiiStringProtocol->SetString (\r
mHiiStringProtocol,\r
- HandleMapEntry->UefiHiiHandle,\r
+ ThunkContext->UefiHiiHandle,\r
*Reference,\r
AsciiLanguage,\r
NewString,\r
}\r
}\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ //\r
+ // Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (*Reference == 0) {\r
- if (StringId1 == (EFI_STRING_ID) 0) {\r
- StringId1 = StringId2;\r
+ //\r
+ // When creating new string token, make sure all created token is the same\r
+ // for all string packages registered using FW HII interface.\r
+ //\r
+ if (LastStringId == (EFI_STRING_ID) 0) {\r
+ LastStringId = StringId;\r
} else {\r
- if (StringId1 != StringId2) {\r
+ if (LastStringId != StringId) {\r
ASSERT(FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
}\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
if (Found) {\r
- *Reference = StringId1;\r
+ if (*Reference == 0) {\r
+ *Reference = StringId;\r
+ }\r
Status = EFI_SUCCESS;\r
} else {\r
+ DEBUG((EFI_D_ERROR, "Thunk HiiNewString fails to find the String Packages to update\n"));\r
+ //\r
+ // BUGBUG: Remove ths ASSERT when development is done.\r
+ //\r
ASSERT (FALSE);\r
Status = EFI_NOT_FOUND;\r
}\r
\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiNewString (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN CHAR16 *Language,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN OUT STRING_REF *Reference,\r
- IN CHAR16 *NewString\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- This function allows a new String to be added to an already existing String Package.\r
- We will make a buffer the size of the package + StrSize of the new string. We will\r
- copy the string package that first gets changed and the following language packages until\r
- we encounter the NULL string package. All this time we will ensure that the offsets have\r
- been adjusted.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- EFI_GUID TagGuid;\r
-\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
-\r
- Status = GetTagGuidByFrameworkHiiHandle (Private, Handle, &TagGuid);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = HiiThunkNewStringForAllStringPackages (Private, &TagGuid, Language, Reference, NewString);\r
//\r
// For UNI file, some String may not be defined for a language. This has been true for a lot of platform code.\r
// For this case, EFI_NOT_FOUND will be returned. To allow the old code to be run without porting, we don't assert \r
\r
--*/\r
{\r
- ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
+ return EFI_SUCCESS;\r
}\r
\r
typedef struct {\r
\r
--*/\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
CHAR8 *AsciiLanguage;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
CHAR8 *Rfc3066AsciiLanguage;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
if (LanguageString == NULL) {\r
AsciiLanguage = NULL;\r
\r
}\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
+ if (Handle == ThunkContext->FwHiiHandle) {\r
if (AsciiLanguage == NULL) {\r
- return HiiLibGetString (HandleMapEntry->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
+ return HiiLibGetString (ThunkContext->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
} else {\r
return mHiiStringProtocol->GetString (\r
mHiiStringProtocol,\r
AsciiLanguage,\r
- HandleMapEntry->UefiHiiHandle,\r
+ ThunkContext->UefiHiiHandle,\r
Token,\r
StringBuffer,\r
BufferLengthTemp,\r
);\r
}\r
}\r
+ \r
+ \r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
return EFI_NOT_FOUND;\r