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