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