]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c
ArmPkg: Apply uncrustify 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
429309e0
MK
35 IN OUT CHAR8 **LangCode,\r
36 OUT CHAR8 *Lang\r
e64bd070
RC
37 )\r
38{\r
39 UINTN Index;\r
40 CHAR8 *StringPtr;\r
41\r
429309e0 42 if ((LangCode == NULL) || (*LangCode == NULL) || (Lang == NULL)) {\r
e64bd070
RC
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
429309e0 58\r
e64bd070
RC
59 *LangCode = StringPtr + Index;\r
60}\r
61\r
62/**\r
63 This function returns the number of supported languages on HiiHandle.\r
64\r
65 @param HiiHandle The HII package list handle.\r
66\r
67 @retval The number of supported languages.\r
68\r
69**/\r
70UINT16\r
71EFIAPI\r
72GetSupportedLanguageNumber (\r
429309e0 73 IN EFI_HII_HANDLE HiiHandle\r
e64bd070
RC
74 )\r
75{\r
76 CHAR8 *Lang;\r
77 CHAR8 *Languages;\r
78 CHAR8 *LanguageString;\r
79 UINT16 LangNumber;\r
80\r
81 Languages = HiiGetSupportedLanguages (HiiHandle);\r
82 if (Languages == NULL) {\r
83 return 0;\r
84 }\r
85\r
86 LangNumber = 0;\r
429309e0 87 Lang = AllocatePool (AsciiStrSize (Languages));\r
e64bd070
RC
88 if (Lang != NULL) {\r
89 LanguageString = Languages;\r
90 while (*LanguageString != 0) {\r
91 GetNextLanguage (&LanguageString, Lang);\r
92 LangNumber++;\r
93 }\r
429309e0 94\r
e64bd070
RC
95 FreePool (Lang);\r
96 }\r
429309e0 97\r
e64bd070
RC
98 FreePool (Languages);\r
99 return LangNumber;\r
100}\r
101\r
e64bd070
RC
102/**\r
103 This function makes boot time changes to the contents of the\r
104 MiscNumberOfInstallableLanguages (Type 13) record.\r
105\r
106 @param RecordData Pointer to SMBIOS table with default values.\r
107 @param Smbios SMBIOS protocol.\r
108\r
109 @retval EFI_SUCCESS The SMBIOS table was successfully added.\r
110 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
111 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.\r
112\r
113**/\r
429309e0
MK
114SMBIOS_MISC_TABLE_FUNCTION (MiscNumberOfInstallableLanguages) {\r
115 UINTN LangStrLen;\r
116 CHAR8 CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];\r
117 CHAR8 *OptionalStrStart;\r
118 EFI_STATUS Status;\r
119 SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
120 SMBIOS_TABLE_TYPE13 *InputData;\r
e64bd070
RC
121\r
122 InputData = NULL;\r
123\r
124 //\r
125 // First check for invalid parameters.\r
126 //\r
127 if (RecordData == NULL) {\r
128 return EFI_INVALID_PARAMETER;\r
129 }\r
130\r
131 InputData = (SMBIOS_TABLE_TYPE13 *)RecordData;\r
132\r
133 InputData->InstallableLanguages = GetSupportedLanguageNumber (mSmbiosMiscHiiHandle);\r
134\r
135 //\r
136 // Try to check if current langcode matches with the langcodes in installed languages\r
137 //\r
138 ZeroMem (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1);\r
139 (VOID)AsciiStrCpyS (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1, "en|US|iso8859-1");\r
140 LangStrLen = AsciiStrLen (CurrentLang);\r
141\r
142 //\r
143 // Two zeros following the last string.\r
144 //\r
145 SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
146 if (SmbiosRecord == NULL) {\r
147 return EFI_OUT_OF_RESOURCES;\r
148 }\r
149\r
150 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE13));\r
151\r
152 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
153\r
154 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
155 (VOID)AsciiStrCpyS (OptionalStrStart, SMBIOS_STRING_MAX_LENGTH - 1, CurrentLang);\r
156 //\r
157 // Now we have got the full smbios record, call smbios protocol to add this record.\r
158 //\r
429309e0 159 Status = SmbiosMiscAddRecord ((UINT8 *)SmbiosRecord, NULL);\r
e64bd070 160 if (EFI_ERROR (Status)) {\r
429309e0
MK
161 DEBUG ((\r
162 DEBUG_ERROR,\r
163 "[%a]:[%dL] Smbios Type13 Table Log Failed! %r \n",\r
164 __FUNCTION__,\r
165 DEBUG_LINE_NUMBER,\r
166 Status\r
167 ));\r
e64bd070
RC
168 }\r
169\r
170 FreePool (SmbiosRecord);\r
171 return Status;\r
172}\r