]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c
ArmPkg: Reproduce builds across source format changes
[mirror_edk2.git] / ArmPkg / Universal / Smbios / SmbiosMiscDxe / Type13 / MiscNumberOfInstallableLanguagesFunction.c
CommitLineData
e64bd070
RC
1/** @file\r
2 Based on files under Nt32Pkg/MiscSubClassPlatformDxe/\r
3\r
4 Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
5 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
6 Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>\r
7 Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>\r
8 SPDX-License-Identifier: BSD-2-Clause-Patent\r
9\r
10**/\r
11\r
12#include <Library/BaseLib.h>\r
13#include <Library/BaseMemoryLib.h>\r
14#include <Library/DebugLib.h>\r
15#include <Library/HiiLib.h>\r
16#include <Library/MemoryAllocationLib.h>\r
17#include <Library/OemMiscLib.h>\r
18#include <Library/PrintLib.h>\r
19#include <Library/UefiBootServicesTableLib.h>\r
20\r
21#include "SmbiosMisc.h"\r
22\r
23/**\r
24 Get next language from language code list (with separator ';').\r
25\r
b8de64be
PG
26 @param LangCode Input: point to first language in the list. On\r
27 Output: point to next language in the list, or\r
28 NULL if no more language in the list.\r
e64bd070
RC
29 @param Lang The first language in the list.\r
30\r
31**/\r
32VOID\r
33EFIAPI\r
34GetNextLanguage (\r
35 IN OUT CHAR8 **LangCode,\r
36 OUT CHAR8 *Lang\r
37 )\r
38{\r
39 UINTN Index;\r
40 CHAR8 *StringPtr;\r
41\r
42 if (LangCode == NULL || *LangCode == NULL || Lang == NULL) {\r
43 return;\r
44 }\r
45\r
46 Index = 0;\r
47 StringPtr = *LangCode;\r
48 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
49 Index++;\r
50 }\r
51\r
52 (VOID)CopyMem (Lang, StringPtr, Index);\r
53 Lang[Index] = 0;\r
54\r
55 if (StringPtr[Index] == ';') {\r
56 Index++;\r
57 }\r
58 *LangCode = StringPtr + Index;\r
59}\r
60\r
61/**\r
62 This function returns the number of supported languages on HiiHandle.\r
63\r
64 @param HiiHandle The HII package list handle.\r
65\r
66 @retval The number of supported languages.\r
67\r
68**/\r
69UINT16\r
70EFIAPI\r
71GetSupportedLanguageNumber (\r
72 IN EFI_HII_HANDLE HiiHandle\r
73 )\r
74{\r
75 CHAR8 *Lang;\r
76 CHAR8 *Languages;\r
77 CHAR8 *LanguageString;\r
78 UINT16 LangNumber;\r
79\r
80 Languages = HiiGetSupportedLanguages (HiiHandle);\r
81 if (Languages == NULL) {\r
82 return 0;\r
83 }\r
84\r
85 LangNumber = 0;\r
86 Lang = AllocatePool (AsciiStrSize (Languages));\r
87 if (Lang != NULL) {\r
88 LanguageString = Languages;\r
89 while (*LanguageString != 0) {\r
90 GetNextLanguage (&LanguageString, Lang);\r
91 LangNumber++;\r
92 }\r
93 FreePool (Lang);\r
94 }\r
95 FreePool (Languages);\r
96 return LangNumber;\r
97}\r
98\r
99\r
100/**\r
101 This function makes boot time changes to the contents of the\r
102 MiscNumberOfInstallableLanguages (Type 13) record.\r
103\r
104 @param RecordData Pointer to SMBIOS table with default values.\r
105 @param Smbios SMBIOS protocol.\r
106\r
107 @retval EFI_SUCCESS The SMBIOS table was successfully added.\r
108 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
109 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.\r
110\r
111**/\r
112SMBIOS_MISC_TABLE_FUNCTION(MiscNumberOfInstallableLanguages)\r
113{\r
114 UINTN LangStrLen;\r
115 CHAR8 CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];\r
116 CHAR8 *OptionalStrStart;\r
117 EFI_STATUS Status;\r
118 SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
119 SMBIOS_TABLE_TYPE13 *InputData;\r
120\r
121 InputData = NULL;\r
122\r
123 //\r
124 // First check for invalid parameters.\r
125 //\r
126 if (RecordData == NULL) {\r
127 return EFI_INVALID_PARAMETER;\r
128 }\r
129\r
130 InputData = (SMBIOS_TABLE_TYPE13 *)RecordData;\r
131\r
132 InputData->InstallableLanguages = GetSupportedLanguageNumber (mSmbiosMiscHiiHandle);\r
133\r
134 //\r
135 // Try to check if current langcode matches with the langcodes in installed languages\r
136 //\r
137 ZeroMem (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1);\r
138 (VOID)AsciiStrCpyS (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1, "en|US|iso8859-1");\r
139 LangStrLen = AsciiStrLen (CurrentLang);\r
140\r
141 //\r
142 // Two zeros following the last string.\r
143 //\r
144 SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
145 if (SmbiosRecord == NULL) {\r
146 return EFI_OUT_OF_RESOURCES;\r
147 }\r
148\r
149 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE13));\r
150\r
151 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
152\r
153 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
154 (VOID)AsciiStrCpyS (OptionalStrStart, SMBIOS_STRING_MAX_LENGTH - 1, CurrentLang);\r
155 //\r
156 // Now we have got the full smbios record, call smbios protocol to add this record.\r
157 //\r
158 Status = SmbiosMiscAddRecord ((UINT8*)SmbiosRecord, NULL);\r
159 if (EFI_ERROR (Status)) {\r
160 DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type13 Table Log Failed! %r \n",\r
f331310a 161 __FUNCTION__, DEBUG_LINE_NUMBER, Status));\r
e64bd070
RC
162 }\r
163\r
164 FreePool (SmbiosRecord);\r
165 return Status;\r
166}\r