Implementation for EFI_HII_STRING_PROTOCOL.\r
\r
\r
-Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
@param StringSrc Points to current null-terminated string.\r
@param BufferSize Length of the buffer.\r
\r
- @retval EFI_SUCCESS The string text was outputed successfully.\r
+ @retval EFI_SUCCESS The string text was outputted successfully.\r
@retval EFI_BUFFER_TOO_SMALL Buffer is insufficient to store the found string\r
text. BufferSize is updated to the required buffer\r
size.\r
@param StringSrc Points to current null-terminated string.\r
@param BufferSize Length of the buffer.\r
\r
- @retval EFI_SUCCESS The string text was outputed successfully.\r
+ @retval EFI_SUCCESS The string text was outputted successfully.\r
@retval EFI_BUFFER_TOO_SMALL Buffer is insufficient to store the found string\r
text. BufferSize is updated to the required buffer\r
size.\r
@param StringFontInfo Buffer to record the output font info. It's\r
caller's responsibility to free this buffer.\r
\r
- @retval EFI_SUCCESS The string font is outputed successfully.\r
+ @retval EFI_SUCCESS The string font is outputted successfully.\r
@retval EFI_NOT_FOUND The specified font id does not exist.\r
\r
**/\r
/**\r
Parse all string blocks to find a String block specified by StringId.\r
If StringId = (EFI_STRING_ID) (-1), find out all EFI_HII_SIBT_FONT blocks\r
- within this string package and backup its information. If LastStringId is \r
+ within this string package and backup its information. If LastStringId is\r
specified, the string id of last string block will also be output.\r
If StringId = 0, output the string id of last string block (EFI_HII_SIBT_STRING).\r
\r
ASSERT (StringPackage->Signature == HII_STRING_PACKAGE_SIGNATURE);\r
\r
CurrentStringId = 1;\r
+ StringSize = 0;\r
\r
if (StringId != (EFI_STRING_ID) (-1) && StringId != 0) {\r
ASSERT (BlockType != NULL && StringBlockAddr != NULL && StringTextOffset != NULL);\r
// Since string package tool set FontId initially to 0 and increases it\r
// progressively by one, StringPackage->FondId always represents an unique\r
// and available FontId.\r
- // \r
+ //\r
StringPackage->FontId++;\r
\r
FreePool (FontInfo);\r
*StartStringId = CurrentStringId;\r
}\r
}\r
- \r
+\r
//\r
// Get last string ID\r
//\r
}\r
\r
//\r
- // Get the string font. The FontId 0 is the default font for those string blocks which \r
+ // Get the string font. The FontId 0 is the default font for those string blocks which\r
// do not specify a font identifier. If default font is not specified, return NULL.\r
//\r
if (StringFontInfo != NULL) {\r
\r
/**\r
If GetStringBlock find the StringId's string is not saved in the exist string block,\r
- this function will create the UCS2 string block to save the string; also split the \r
+ this function will create the UCS2 string block to save the string; also split the\r
skip block into two or one skip block.\r
\r
This is a internal function.\r
- \r
+\r
@param StringPackage Hii string package instance.\r
@param StartStringId The first id in the skip block which StringId in the block.\r
@param StringId The string's id, which is unique within\r
- PackageList. \r
- @param BlockType Output the block type of found string block. \r
- @param StringBlockAddr Output the block address of found string block. \r
+ PackageList.\r
+ @param BlockType Output the block type of found string block.\r
+ @param StringBlockAddr Output the block address of found string block.\r
@param FontBlock whether this string block has font info.\r
\r
- @retval EFI_SUCCESS The string font is outputed successfully.\r
+ @retval EFI_SUCCESS The string font is outputted successfully.\r
@retval EFI_OUT_OF_RESOURCES NO resource for the memory to save the new string block.\r
\r
**/\r
{\r
UINT8 *BlockPtr;\r
UINT8 *StringBlock;\r
- UINT32 SkipLen; \r
+ UINT32 SkipLen;\r
UINT32 OldBlockSize;\r
UINT32 NewBlockSize;\r
UINT32 FrontSkipNum;\r
FrontSkipNum = 0;\r
SkipLen = 0;\r
OldStringAddr = *StringBlockAddr;\r
- \r
+\r
ASSERT (*BlockType == EFI_HII_SIBT_SKIP1 || *BlockType == EFI_HII_SIBT_SKIP2);\r
//\r
// Old skip block size.\r
} else {\r
SkipLen = sizeof (EFI_HII_SIBT_SKIP2_BLOCK);\r
IdCount = *(UINT16*)(OldStringAddr + sizeof (EFI_HII_STRING_BLOCK));\r
- } \r
+ }\r
\r
//\r
// New create UCS or UCS2 block size.\r
//\r
// Copy old block in front of skip block.\r
//\r
- CopyMem (StringBlock, StringPackage->StringBlock, OldStringAddr - StringPackage->StringBlock); \r
+ CopyMem (StringBlock, StringPackage->StringBlock, OldStringAddr - StringPackage->StringBlock);\r
BlockPtr = StringBlock + (OldStringAddr - StringPackage->StringBlock);\r
\r
if (FrontSkipNum > 0) {\r
//\r
// Append a EFI_HII_SIBT_END block to the end.\r
//\r
- CopyMem (BlockPtr, OldStringAddr + SkipLen, OldBlockSize - (OldStringAddr - StringPackage->StringBlock) - SkipLen); \r
+ CopyMem (BlockPtr, OldStringAddr + SkipLen, OldBlockSize - (OldStringAddr - StringPackage->StringBlock) - SkipLen);\r
\r
if (FontBlock) {\r
*BlockType = EFI_HII_SIBT_STRING_UCS2_FONT;\r
&StartStringId\r
);\r
if (EFI_ERROR (Status) && (BlockType == EFI_HII_SIBT_SKIP1 || BlockType == EFI_HII_SIBT_SKIP2)) {\r
- Status = InsertLackStringBlock(StringPackage, \r
- StartStringId, \r
- StringId, \r
+ Status = InsertLackStringBlock(StringPackage,\r
+ StartStringId,\r
+ StringId,\r
&BlockType,\r
&StringBlockAddr,\r
(BOOLEAN)(StringFontInfo != NULL)\r
return EFI_INVALID_PARAMETER;\r
} else {\r
Referred = ReferFontInfoLocally (\r
- Private, \r
- StringPackage, \r
- StringPackage->FontId, \r
- FALSE, \r
- GlobalFont, \r
+ Private,\r
+ StringPackage,\r
+ StringPackage->FontId,\r
+ FALSE,\r
+ GlobalFont,\r
&LocalFont\r
);\r
if (!Referred) {\r
// Update the FontId of the specified string block to input font info.\r
//\r
switch (BlockType) {\r
- case EFI_HII_SIBT_STRING_SCSU_FONT: \r
+ case EFI_HII_SIBT_STRING_SCSU_FONT:\r
case EFI_HII_SIBT_STRINGS_SCSU_FONT:\r
case EFI_HII_SIBT_STRING_UCS2_FONT:\r
case EFI_HII_SIBT_STRINGS_UCS2_FONT:\r
// When modify the font info of these blocks, the block type should be updated\r
// to contain font info thus the whole structure should be revised.\r
// It is recommended to use tool to modify the block type not in the code.\r
- // \r
+ //\r
return EFI_UNSUPPORTED;\r
}\r
}\r
}\r
*BlockPtr++ = 0;\r
\r
- \r
+\r
TmpSize = OldBlockSize - (StringTextPtr - StringPackage->StringBlock) - AsciiStrSize ((CHAR8 *) StringTextPtr);\r
CopyMem (\r
BlockPtr,\r
\r
/**\r
This function adds the string String to the group of strings owned by PackageList, with the\r
- specified font information StringFontInfo and returns a new string id. \r
- The new string identifier is guaranteed to be unique within the package list. \r
- That new string identifier is reserved for all languages in the package list. \r
+ specified font information StringFontInfo and returns a new string id.\r
+ The new string identifier is guaranteed to be unique within the package list.\r
+ That new string identifier is reserved for all languages in the package list.\r
\r
\r
@param This A pointer to the EFI_HII_STRING_PROTOCOL instance.\r
return EFI_NOT_FOUND;\r
}\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
Status = EFI_SUCCESS;\r
NewStringPackageCreated = FALSE;\r
NewStringId = 0;\r
// Calculate the length of the string blocks, including string block to record\r
// printable language full name and EFI_HII_SIBT_END_BLOCK.\r
//\r
- Ucs2BlockSize = (UINT32) (StrSize ((CHAR16 *) LanguageName) + \r
+ Ucs2BlockSize = (UINT32) (StrSize ((CHAR16 *) LanguageName) +\r
(*StringId - 1) * sizeof (EFI_HII_SIBT_STRING_UCS2_BLOCK) - sizeof (CHAR16));\r
\r
BlockSize = Ucs2BlockSize + sizeof (EFI_HII_SIBT_END_BLOCK);\r
PackageListNode->PackageListHdr.PackageLength += FontBlockSize + Ucs2FontBlockSize;\r
\r
//\r
- // Increase the FontId to make it unique since we already add \r
+ // Increase the FontId to make it unique since we already add\r
// a EFI_HII_SIBT_FONT block to this string package.\r
//\r
StringPackage->FontId++;\r
FreePool (StringPackage->StringPkgHdr);\r
FreePool (StringPackage);\r
}\r
+ //\r
+ // The contents of HiiDataBase may updated,need to check.\r
+ //\r
+ //\r
+ // Check whether need to get the contents of HiiDataBase.\r
+ // Only after ReadyToBoot to do the export.\r
+ //\r
+ if (gExportAfterReadyToBoot) {\r
+ if (!EFI_ERROR (Status)) {\r
+ HiiGetDatabaseInfo(&Private->HiiDatabase);\r
+ }\r
+ }\r
+\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
\r
return Status;\r
}\r
//\r
// Second search: to match the StringId in other available languages if exist.\r
//\r
- for (Link = PackageListNode->StringPkgHdr.ForwardLink; \r
+ for (Link = PackageListNode->StringPkgHdr.ForwardLink;\r
Link != &PackageListNode->StringPkgHdr;\r
Link = Link->ForwardLink\r
) {\r
- StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); \r
+ StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
Status = GetStringWorker (Private, StringPackage, StringId, NULL, NULL, NULL);\r
if (!EFI_ERROR (Status)) {\r
return EFI_INVALID_LANGUAGE;\r
}\r
- } \r
+ }\r
}\r
\r
return EFI_NOT_FOUND;\r
return EFI_NOT_FOUND;\r
}\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
Private = HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
PackageListNode = NULL;\r
\r
(EFI_FONT_INFO *) StringFontInfo\r
);\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
PackageListNode->PackageListHdr.PackageLength += StringPackage->StringPkgHdr->Header.Length - OldPackageLen;\r
+ //\r
+ // Check whether need to get the contents of HiiDataBase.\r
+ // Only after ReadyToBoot to do the export.\r
+ //\r
+ if (gExportAfterReadyToBoot) {\r
+ HiiGetDatabaseInfo(&Private->HiiDatabase);\r
+ }\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return EFI_SUCCESS;\r
}\r
}\r
}\r
\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return EFI_NOT_FOUND;\r
}\r
\r
Link = Link->ForwardLink\r
) {\r
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
- if (AsciiStrnCmp (StringPackage->StringPkgHdr->Language, UEFI_CONFIG_LANG, AsciiStrLen (UEFI_CONFIG_LANG)) == 0) {\r
- //\r
- // Skip string package used for keyword protocol.\r
- //\r
- continue;\r
- }\r
ResultSize += AsciiStrSize (StringPackage->StringPkgHdr->Language);\r
if (ResultSize <= *LanguagesSize) {\r
AsciiStrCpyS (Languages, *LanguagesSize / sizeof (CHAR8), StringPackage->StringPkgHdr->Language);\r
\r
Private = HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
\r
- PackageListNode = NULL; \r
+ PackageListNode = NULL;\r
for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
if (DatabaseRecord->Handle == PackageList) {\r
if (PackageListNode == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
- \r
+\r
Languages = NULL;\r
ResultSize = 0;\r
for (Link1 = PackageListNode->StringPkgHdr.ForwardLink;\r