• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Unicode Collation Support component that hides the trivial difference of Unicode Collation
3   and Unicode collation 2 Protocol.
4 
5   Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
6   This program and the accompanying materials are licensed and made available
7 under the terms and conditions of the BSD License which accompanies this
8 distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include "Fat.h"
17 
18 EFI_UNICODE_COLLATION_PROTOCOL  *mUnicodeCollationInterface = NULL;
19 
20 /**
21   Worker function to initialize Unicode Collation support.
22 
23   It tries to locate Unicode Collation (2) protocol and matches it with current
24   platform language code.
25 
26   @param  AgentHandle          The handle used to open Unicode Collation (2) protocol.
27   @param  ProtocolGuid         The pointer to Unicode Collation (2) protocol GUID.
28   @param  VariableName         The name of the RFC 4646 or ISO 639-2 language variable.
29   @param  DefaultLanguage      The default language in case the RFC 4646 or ISO 639-2 language is absent.
30 
31   @retval EFI_SUCCESS          The Unicode Collation (2) protocol has been successfully located.
32   @retval Others               The Unicode Collation (2) protocol has not been located.
33 
34 **/
35 EFI_STATUS
InitializeUnicodeCollationSupportWorker(IN EFI_HANDLE AgentHandle,IN EFI_GUID * ProtocolGuid,IN CONST CHAR16 * VariableName,IN CONST CHAR8 * DefaultLanguage)36 InitializeUnicodeCollationSupportWorker (
37   IN EFI_HANDLE         AgentHandle,
38   IN EFI_GUID           *ProtocolGuid,
39   IN CONST CHAR16       *VariableName,
40   IN CONST CHAR8        *DefaultLanguage
41   )
42 {
43   EFI_STATUS                      ReturnStatus;
44   EFI_STATUS                      Status;
45   UINTN                           NumHandles;
46   UINTN                           Index;
47   EFI_HANDLE                      *Handles;
48   EFI_UNICODE_COLLATION_PROTOCOL  *Uci;
49   BOOLEAN                         Iso639Language;
50   CHAR8                           *Language;
51   CHAR8                           *BestLanguage;
52 
53   Status = gBS->LocateHandleBuffer (
54                   ByProtocol,
55                   ProtocolGuid,
56                   NULL,
57                   &NumHandles,
58                   &Handles
59                   );
60   if (EFI_ERROR (Status)) {
61     return Status;
62   }
63 
64   Iso639Language = (BOOLEAN) (ProtocolGuid == &gEfiUnicodeCollationProtocolGuid);
65   GetEfiGlobalVariable2 (VariableName, (VOID**) &Language, NULL);
66 
67   ReturnStatus = EFI_UNSUPPORTED;
68   for (Index = 0; Index < NumHandles; Index++) {
69     //
70     // Open Unicode Collation Protocol
71     //
72     Status = gBS->OpenProtocol (
73                     Handles[Index],
74                     ProtocolGuid,
75                     (VOID **) &Uci,
76                     AgentHandle,
77                     NULL,
78                     EFI_OPEN_PROTOCOL_GET_PROTOCOL
79                     );
80     if (EFI_ERROR (Status)) {
81       continue;
82     }
83 
84     //
85     // Find the best matching matching language from the supported languages
86     // of Unicode Collation (2) protocol.
87     //
88     BestLanguage = GetBestLanguage (
89                      Uci->SupportedLanguages,
90                      Iso639Language,
91                      (Language == NULL) ? "" : Language,
92                      DefaultLanguage,
93                      NULL
94                      );
95     if (BestLanguage != NULL) {
96       FreePool (BestLanguage);
97       mUnicodeCollationInterface = Uci;
98       ReturnStatus = EFI_SUCCESS;
99       break;
100     }
101   }
102 
103   if (Language != NULL) {
104     FreePool (Language);
105   }
106 
107   FreePool (Handles);
108 
109   return ReturnStatus;
110 }
111 
112 /**
113   Initialize Unicode Collation support.
114 
115   It tries to locate Unicode Collation 2 protocol and matches it with current
116   platform language code. If for any reason the first attempt fails, it then tries to
117   use Unicode Collation Protocol.
118 
119   @param  AgentHandle          The handle used to open Unicode Collation (2) protocol.
120 
121   @retval EFI_SUCCESS          The Unicode Collation (2) protocol has been successfully located.
122   @retval Others               The Unicode Collation (2) protocol has not been located.
123 
124 **/
125 EFI_STATUS
InitializeUnicodeCollationSupport(IN EFI_HANDLE AgentHandle)126 InitializeUnicodeCollationSupport (
127   IN EFI_HANDLE    AgentHandle
128   )
129 {
130 
131   EFI_STATUS       Status;
132 
133   Status = EFI_UNSUPPORTED;
134 
135   //
136   // First try to use RFC 4646 Unicode Collation 2 Protocol.
137   //
138   Status = InitializeUnicodeCollationSupportWorker (
139              AgentHandle,
140              &gEfiUnicodeCollation2ProtocolGuid,
141              L"PlatformLang",
142              (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang)
143              );
144   //
145   // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back
146   // on the ISO 639-2 Unicode Collation Protocol.
147   //
148   if (EFI_ERROR (Status)) {
149     Status = InitializeUnicodeCollationSupportWorker (
150                AgentHandle,
151                &gEfiUnicodeCollationProtocolGuid,
152                L"Lang",
153                (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang)
154                );
155   }
156 
157   return Status;
158 }
159 
160 
161 /**
162   Performs a case-insensitive comparison of two Null-terminated Unicode strings.
163 
164   @param  S1                   A pointer to a Null-terminated Unicode string.
165   @param  S2                   A pointer to a Null-terminated Unicode string.
166 
167   @retval 0                    S1 is equivalent to S2.
168   @retval >0                   S1 is lexically greater than S2.
169   @retval <0                   S1 is lexically less than S2.
170 **/
171 INTN
FatStriCmp(IN CHAR16 * S1,IN CHAR16 * S2)172 FatStriCmp (
173   IN CHAR16       *S1,
174   IN CHAR16       *S2
175   )
176 {
177   ASSERT (StrSize (S1) != 0);
178   ASSERT (StrSize (S2) != 0);
179   ASSERT (mUnicodeCollationInterface != NULL);
180 
181   return mUnicodeCollationInterface->StriColl (
182                                        mUnicodeCollationInterface,
183                                        S1,
184                                        S2
185                                        );
186 }
187 
188 
189 /**
190   Uppercase a string.
191 
192   @param  String                   The string which will be upper-cased.
193 
194 
195 **/
196 VOID
FatStrUpr(IN OUT CHAR16 * String)197 FatStrUpr (
198   IN OUT CHAR16   *String
199   )
200 {
201   ASSERT (StrSize (String) != 0);
202   ASSERT (mUnicodeCollationInterface != NULL);
203 
204   mUnicodeCollationInterface->StrUpr (mUnicodeCollationInterface, String);
205 }
206 
207 
208 /**
209   Lowercase a string
210 
211   @param  String                   The string which will be lower-cased.
212 
213 
214 **/
215 VOID
FatStrLwr(IN OUT CHAR16 * String)216 FatStrLwr (
217   IN OUT CHAR16   *String
218   )
219 {
220   ASSERT (StrSize (String) != 0);
221   ASSERT (mUnicodeCollationInterface != NULL);
222 
223   mUnicodeCollationInterface->StrLwr (mUnicodeCollationInterface, String);
224 }
225 
226 
227 /**
228   Convert FAT string to unicode string.
229 
230   @param  FatSize               The size of FAT string.
231   @param  Fat                   The FAT string.
232   @param  String                The unicode string.
233 
234   @return None.
235 
236 **/
237 VOID
FatFatToStr(IN UINTN FatSize,IN CHAR8 * Fat,OUT CHAR16 * String)238 FatFatToStr (
239   IN  UINTN                            FatSize,
240   IN  CHAR8                            *Fat,
241   OUT CHAR16                           *String
242   )
243 {
244   ASSERT (Fat != NULL);
245   ASSERT (String != NULL);
246   ASSERT (((UINTN) String & 0x01) == 0);
247   ASSERT (mUnicodeCollationInterface != NULL);
248 
249   mUnicodeCollationInterface->FatToStr (mUnicodeCollationInterface, FatSize, Fat, String);
250 }
251 
252 
253 /**
254   Convert unicode string to Fat string.
255 
256   @param  String                The unicode string.
257   @param  FatSize               The size of the FAT string.
258   @param  Fat                   The FAT string.
259 
260   @retval TRUE                  Convert successfully.
261   @retval FALSE                 Convert error.
262 
263 **/
264 BOOLEAN
FatStrToFat(IN CHAR16 * String,IN UINTN FatSize,OUT CHAR8 * Fat)265 FatStrToFat (
266   IN  CHAR16                          *String,
267   IN  UINTN                           FatSize,
268   OUT CHAR8                           *Fat
269   )
270 {
271   ASSERT (Fat != NULL);
272   ASSERT (StrSize (String) != 0);
273   ASSERT (mUnicodeCollationInterface != NULL);
274 
275   return mUnicodeCollationInterface->StrToFat (
276                                        mUnicodeCollationInterface,
277                                        String,
278                                        FatSize,
279                                        Fat
280                                        );
281 }
282