]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
Refine language conversion in ECP. Create a new library LanguageLib providing functio...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / HiiDatabase.h
1 /**@file
2
3 This file contains global defines and prototype definitions
4 for the Framework HII to Uefi HII Thunk Module.
5
6 Copyright (c) 2006 - 2008, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #ifndef _HIIDATABASE_H
18 #define _HIIDATABASE_H
19
20
21 #include <FrameworkDxe.h>
22
23 #include <Guid/GlobalVariable.h>
24 #include <Protocol/FrameworkFormCallback.h>
25 #include <Protocol/FrameworkHii.h>
26 #include <Protocol/FrameworkFormBrowser.h>
27
28 //
29 // UEFI HII Protocols
30 //
31 #include <Protocol/HiiFont.h>
32 #include <Protocol/HiiImage.h>
33 #include <Protocol/HiiString.h>
34 #include <Protocol/HiiDatabase.h>
35 #include <Protocol/HiiConfigRouting.h>
36 #include <Protocol/HiiConfigAccess.h>
37 #include <Protocol/UgaDraw.h>
38
39
40 #include <Library/BaseLib.h>
41 #include <Library/DebugLib.h>
42 #include <Library/UefiDriverEntryPoint.h>
43 #include <Library/MemoryAllocationLib.h>
44 #include <Library/BaseMemoryLib.h>
45 #include <Library/UefiBootServicesTableLib.h>
46 #include <Library/UefiRuntimeServicesTableLib.h>
47 #include <Library/HiiLib.h>
48 #include <Library/UefiLib.h>
49 #include <Library/PcdLib.h>
50 #include <Library/LanguageLib.h>
51
52 #include <Guid/MdeModuleHii.h>
53
54 #include "UefiIfrParser.h"
55
56
57 //
58 // VARSTORE ID of 0 for Buffer Storage Type Storage is defined as invalid in UEFI 2.1 HII. VARSTORE ID
59 // 0 is the default VarStore ID for storage without explicit declaration in Framework HII 0.92. EDK II UEFI VFR compiler
60 // in compatible mode will assign 0x0001 as UEFI VARSTORE ID to this default storage id in Framework VFR without
61 // VARSTORE declaration.
62 //
63 // In addition, the Name of Default VarStore is assumed to be L"Setup" for those storage without explicit VARSTORE declaration in the formset
64 // by Framework HII. EDK II UEFI VFR compiler in compatible mode hard-coded L"Setup" as VARSTORE name.
65 //
66 #define FRAMEWORK_RESERVED_VARSTORE_ID 0x0001
67 #define FRAMEWORK_RESERVED_VARSTORE_NAME L"Setup"
68
69 ///
70 /// The size of a 3 character ISO639 language code.
71 ///
72 #define ISO_639_2_ENTRY_SIZE 3
73
74 #pragma pack (1)
75 typedef struct {
76 EFI_HII_PACK_HEADER FrameworkPackageHeader;
77 EFI_HII_PACKAGE_HEADER PackageHeader;
78 } TIANO_AUTOGEN_PACKAGES_HEADER;
79 #pragma pack ()
80
81 #define HII_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, HII_THUNK_PRIVATE_DATA, Hii, HII_THUNK_PRIVATE_DATA_SIGNATURE)
82 #define HII_THUNK_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('H', 'i', 'I', 'T')
83 typedef struct {
84 UINTN Signature;
85 EFI_HANDLE Handle;
86 EFI_HII_PROTOCOL Hii;
87
88 //
89 // The head of link list for all HII_THUNK_CONTEXT.
90 //
91 LIST_ENTRY ThunkContextListHead;
92
93 EFI_HANDLE RemovePackNotifyHandle;
94 EFI_HANDLE AddPackNotifyHandle;
95 } HII_THUNK_PRIVATE_DATA;
96
97
98
99
100
101 #define QUESTION_ID_MAP_ENTRY_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP_ENTRY, Link, QUESTION_ID_MAP_ENTRY_SIGNATURE)
102 #define QUESTION_ID_MAP_ENTRY_SIGNATURE SIGNATURE_32 ('Q', 'I', 'M', 'E')
103 typedef struct {
104 UINT32 Signature;
105 LIST_ENTRY Link;
106 UINT16 FwQId;
107 EFI_QUESTION_ID UefiQid;
108 } QUESTION_ID_MAP_ENTRY;
109
110
111
112 #define QUESTION_ID_MAP_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP, Link, QUESTION_ID_MAP_SIGNATURE)
113 #define QUESTION_ID_MAP_SIGNATURE SIGNATURE_32 ('Q', 'I', 'M', 'P')
114 typedef struct {
115 UINT32 Signature;
116 LIST_ENTRY Link;
117 UINT16 VarStoreId;
118 UINTN VarSize;
119 LIST_ENTRY MapEntryListHead;
120 } QUESTION_ID_MAP;
121
122
123
124 #define HII_THUNK_CONTEXT_FROM_LINK(Record) CR(Record, HII_THUNK_CONTEXT, Link, HII_THUNK_CONTEXT_SIGNATURE)
125 #define HII_THUNK_CONTEXT_SIGNATURE SIGNATURE_32 ('H', 'T', 'H', 'M')
126 typedef struct {
127 LIST_ENTRY Link;
128 UINT32 Signature;
129 FRAMEWORK_EFI_HII_HANDLE FwHiiHandle;
130 EFI_HII_HANDLE UefiHiiHandle;
131 EFI_HANDLE UefiHiiDriverHandle;
132
133 UINTN IfrPackageCount;
134 UINTN StringPackageCount;
135
136 BOOLEAN ByFrameworkHiiNewPack;
137
138 //
139 // HII Thunk will use TagGuid to associate the String Package and Form Package togehter.
140 // See description for TagGuid. This field is to record if either one of the following condition
141 // is TRUE:
142 // 1) if ((SharingStringPack == TRUE) && (StringPackageCount != 0 && IfrPackageCount == 0)), then this Package List only
143 /// has String Packages and provides Strings to other IFR package.
144 // 2) if ((SharingStringPack == TRUE) && (StringPackageCount == 0 && IfrPackageCount != 1)), then this Form Package
145 // copied String Packages from other Package List.
146 // 3) if ((SharingStringPack == FALSE)), this Package does not provide String Package or copy String Packages from other
147 // Package List.
148 //
149 //
150 // When a Hii->NewString() is called for this FwHiiHandle and SharingStringPack is TRUE, then all Package List that sharing
151 // the same TagGuid will update or create String in there respective String Packages. If SharingStringPack is FALSE, then
152 // only the String from String Packages in this Package List will be updated or created.
153 //
154 BOOLEAN SharingStringPack;
155
156 //
157 // The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption
158 // in both HII Database implementation and all modules that registering packages:
159 // If a Package List has only IFR package and no String Package, the IFR package will reference
160 // String in another Package List registered with the HII database with the same EFI_HII_PACKAGES.GuidId.
161 // TagGuid is the used to record this GuidId.
162 EFI_GUID TagGuid;
163
164 UINT8 *NvMapOverride;
165
166 FORM_BROWSER_FORMSET *FormSet;
167
168 } HII_THUNK_CONTEXT;
169
170
171
172 #define BUFFER_STORAGE_ENTRY_SIGNATURE SIGNATURE_32 ('H', 'T', 's', 'k')
173 #define BUFFER_STORAGE_ENTRY_FROM_LINK(Record) CR(Record, BUFFER_STORAGE_ENTRY, Link, BUFFER_STORAGE_ENTRY_SIGNATURE)
174 typedef struct {
175 LIST_ENTRY Link;
176 UINT32 Signature;
177 EFI_GUID Guid;
178 CHAR16 *Name;
179 UINTN Size;
180 UINT16 VarStoreId;
181 } BUFFER_STORAGE_ENTRY;
182
183 #pragma pack(1)
184 ///
185 /// HII specific Vendor Device Path Node definition.
186 ///
187 typedef struct {
188 VENDOR_DEVICE_PATH VendorDevicePath;
189 UINT32 Reserved;
190 UINT64 UniqueId;
191 } HII_VENDOR_DEVICE_PATH_NODE;
192
193 ///
194 /// HII specific Vendor Device Path definition.
195 ///
196 typedef struct {
197 HII_VENDOR_DEVICE_PATH_NODE Node;
198 EFI_DEVICE_PATH_PROTOCOL End;
199 } HII_VENDOR_DEVICE_PATH;
200 #pragma pack()
201
202 #define CONFIG_ACCESS_PRIVATE_SIGNATURE SIGNATURE_32 ('H', 'T', 'c', 'a')
203 #define CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL(Record) CR(Record, CONFIG_ACCESS_PRIVATE, ConfigAccessProtocol, CONFIG_ACCESS_PRIVATE_SIGNATURE)
204 typedef struct {
205 UINT32 Signature;
206 EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccessProtocol;
207 //
208 // Framework's callback
209 //
210 EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;
211
212 HII_THUNK_CONTEXT *ThunkContext;
213 } CONFIG_ACCESS_PRIVATE;
214
215
216
217 #define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('F', 'B', 'T', 'd')
218 #define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, EFI_FORMBROWSER_THUNK_PRIVATE_DATA, FormBrowser, EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE)
219 typedef struct {
220 UINTN Signature;
221 EFI_HANDLE Handle;
222 HII_THUNK_PRIVATE_DATA *ThunkPrivate;
223 EFI_FORM_BROWSER_PROTOCOL FormBrowser;
224 } EFI_FORMBROWSER_THUNK_PRIVATE_DATA;
225
226
227 //
228 // Extern Variables
229 //
230 extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
231 extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;
232 extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;
233 extern CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;
234 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;
235 extern CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;
236
237 extern HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;
238
239 extern BOOLEAN mInFrameworkUpdatePakcage;
240
241
242 EFI_STATUS
243 EFIAPI
244 HiiNewPack (
245 IN EFI_HII_PROTOCOL *This,
246 IN EFI_HII_PACKAGES *PackageList,
247 OUT FRAMEWORK_EFI_HII_HANDLE *Handle
248 );
249
250 EFI_STATUS
251 EFIAPI
252 HiiRemovePack (
253 IN EFI_HII_PROTOCOL *This,
254 IN FRAMEWORK_EFI_HII_HANDLE Handle
255 );
256
257 EFI_STATUS
258 EFIAPI
259 HiiFindHandles (
260 IN EFI_HII_PROTOCOL *This,
261 IN OUT UINT16 *HandleBufferLength,
262 OUT FRAMEWORK_EFI_HII_HANDLE *Handle
263 );
264
265 EFI_STATUS
266 EFIAPI
267 HiiExportDatabase (
268 IN EFI_HII_PROTOCOL *This,
269 IN FRAMEWORK_EFI_HII_HANDLE Handle,
270 IN OUT UINTN *BufferSize,
271 OUT VOID *Buffer
272 );
273
274 EFI_STATUS
275 EFIAPI
276 HiiGetGlyph (
277 IN EFI_HII_PROTOCOL *This,
278 IN CHAR16 *Source,
279 IN OUT UINT16 *Index,
280 OUT UINT8 **GlyphBuffer,
281 OUT UINT16 *BitWidth,
282 IN OUT UINT32 *InternalStatus
283 );
284
285 EFI_STATUS
286 EFIAPI
287 HiiGlyphToBlt (
288 IN EFI_HII_PROTOCOL *This,
289 IN UINT8 *GlyphBuffer,
290 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,
291 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,
292 IN UINTN Count,
293 IN UINTN Width,
294 IN UINTN Height,
295 IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer
296 );
297
298 EFI_STATUS
299 EFIAPI
300 HiiNewString (
301 IN EFI_HII_PROTOCOL *This,
302 IN CHAR16 *Language,
303 IN FRAMEWORK_EFI_HII_HANDLE Handle,
304 IN OUT STRING_REF *Reference,
305 IN CHAR16 *NewString
306 );
307
308 EFI_STATUS
309 EFIAPI
310 HiiThunkGetString (
311 IN EFI_HII_PROTOCOL *This,
312 IN FRAMEWORK_EFI_HII_HANDLE Handle,
313 IN STRING_REF Token,
314 IN BOOLEAN Raw,
315 IN CHAR16 *LanguageString,
316 IN OUT UINTN *BufferLength,
317 OUT EFI_STRING StringBuffer
318 );
319
320 EFI_STATUS
321 EFIAPI
322 HiiResetStrings (
323 IN EFI_HII_PROTOCOL *This,
324 IN FRAMEWORK_EFI_HII_HANDLE Handle
325 );
326
327 EFI_STATUS
328 EFIAPI
329 HiiTestString (
330 IN EFI_HII_PROTOCOL *This,
331 IN CHAR16 *StringToTest,
332 IN OUT UINT32 *FirstMissing,
333 OUT UINT32 *GlyphBufferSize
334 );
335
336 EFI_STATUS
337 EFIAPI
338 HiiGetPrimaryLanguages (
339 IN EFI_HII_PROTOCOL *This,
340 IN FRAMEWORK_EFI_HII_HANDLE Handle,
341 OUT EFI_STRING *LanguageString
342 );
343
344 EFI_STATUS
345 EFIAPI
346 HiiGetSecondaryLanguages (
347 IN EFI_HII_PROTOCOL *This,
348 IN FRAMEWORK_EFI_HII_HANDLE Handle,
349 IN CHAR16 *PrimaryLanguage,
350 OUT EFI_STRING *LanguageString
351 );
352
353 EFI_STATUS
354 EFIAPI
355 HiiGetLine (
356 IN EFI_HII_PROTOCOL *This,
357 IN FRAMEWORK_EFI_HII_HANDLE Handle,
358 IN STRING_REF Token,
359 IN OUT UINT16 *Index,
360 IN UINT16 LineWidth,
361 IN CHAR16 *LanguageString,
362 IN OUT UINT16 *BufferLength,
363 OUT EFI_STRING StringBuffer
364 );
365
366 EFI_STATUS
367 EFIAPI
368 HiiGetForms (
369 IN EFI_HII_PROTOCOL *This,
370 IN FRAMEWORK_EFI_HII_HANDLE Handle,
371 IN EFI_FORM_ID FormId,
372 IN OUT UINTN *BufferLength,
373 OUT UINT8 *Buffer
374 );
375
376 EFI_STATUS
377 EFIAPI
378 HiiGetDefaultImage (
379 IN EFI_HII_PROTOCOL *This,
380 IN FRAMEWORK_EFI_HII_HANDLE Handle,
381 IN UINTN DefaultMask,
382 OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList
383 );
384
385 EFI_STATUS
386 EFIAPI
387 HiiThunkUpdateForm (
388 IN EFI_HII_PROTOCOL *This,
389 IN FRAMEWORK_EFI_HII_HANDLE Handle,
390 IN EFI_FORM_LABEL Label,
391 IN BOOLEAN AddData,
392 IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data
393 );
394
395 EFI_STATUS
396 EFIAPI
397 HiiGetKeyboardLayout (
398 IN EFI_HII_PROTOCOL *This,
399 OUT UINT16 *DescriptorCount,
400 OUT FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor
401 );
402
403 EFI_STATUS
404 EFIAPI
405 ThunkSendForm (
406 IN EFI_FORM_BROWSER_PROTOCOL *This,
407 IN BOOLEAN UseDatabase,
408 IN FRAMEWORK_EFI_HII_HANDLE *Handle,
409 IN UINTN HandleCount,
410 IN FRAMEWORK_EFI_IFR_PACKET *Packet, OPTIONAL
411 IN EFI_HANDLE CallbackHandle, OPTIONAL
412 IN UINT8 *NvMapOverride, OPTIONAL
413 IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL
414 OUT BOOLEAN *ResetRequired OPTIONAL
415 );
416
417 EFI_STATUS
418 EFIAPI
419 ThunkCreatePopUp (
420 IN UINTN LinesNumber,
421 IN BOOLEAN HotKey,
422 IN UINTN MaximumStringSize,
423 OUT CHAR16 *StringBuffer,
424 OUT EFI_INPUT_KEY *Key,
425 IN CHAR16 *FirstString,
426 ...
427 );
428
429 EFI_STATUS
430 EFIAPI
431 RemovePackNotify (
432 IN UINT8 PackageType,
433 IN CONST EFI_GUID *PackageGuid,
434 IN CONST EFI_HII_PACKAGE_HEADER *Package,
435 IN EFI_HII_HANDLE Handle,
436 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
437 );
438
439 EFI_STATUS
440 EFIAPI
441 NewOrAddPackNotify (
442 IN UINT8 PackageType,
443 IN CONST EFI_GUID *PackageGuid,
444 IN CONST EFI_HII_PACKAGE_HEADER *Package,
445 IN EFI_HII_HANDLE Handle,
446 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
447 );
448
449 /**
450 Create a Hii Update data Handle used to call IfrLibUpdateForm.
451
452 @param ThunkContext The HII Thunk Context.
453 @param FwUpdateData The Framework Update Data.
454 @param UefiOpCodeHandle The UEFI Update Data.
455
456 @retval EFI_SUCCESS The UEFI Update Data is created successfully.
457 @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData.
458 @retval EFI_OUT_OF_RESOURCES There is not enough resource.
459 **/
460 EFI_STATUS
461 FwUpdateDataToUefiUpdateData (
462 IN HII_THUNK_CONTEXT *ThunkContext,
463 IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *FwUpdateData,
464 IN VOID *UefiOpCodeHandle
465 )
466 ;
467
468 /**
469
470 Initialize string packages in HII database.
471
472 **/
473 VOID
474 InitSetBrowserStrings (
475 VOID
476 )
477 ;
478
479 /**
480 Convert language code from RFC4646 to ISO639-2.
481
482 LanguageRfc4646 contain a single RFC 4646 code such as
483 "en-US" or "fr-FR".
484
485 The LanguageRfc4646 must be a buffer large enough
486 for ISO_639_2_ENTRY_SIZE characters.
487
488 If LanguageRfc4646 is NULL, then ASSERT.
489 If LanguageIso639 is NULL, then ASSERT.
490
491 @param LanguageRfc4646 RFC4646 language code.
492 @param LanguageIso639 ISO639-2 language code.
493
494 @retval EFI_SUCCESS Language code converted.
495 @retval EFI_NOT_FOUND Language code not found.
496
497 **/
498 EFI_STATUS
499 EFIAPI
500 ConvertRfc4646LanguageToIso639Language (
501 IN CHAR8 *LanguageRfc4646,
502 OUT CHAR8 *LanguageIso639
503 )
504 ;
505
506 /**
507 Convert language code from ISO639-2 to RFC4646 and return the converted language.
508 Caller is responsible for freeing the allocated buffer.
509
510 LanguageIso639 contain a single ISO639-2 code such as
511 "eng" or "fra".
512
513 If LanguageIso639 is NULL, then ASSERT.
514 If LanguageRfc4646 is NULL, then ASSERT.
515
516 @param LanguageIso639 ISO639-2 language code.
517
518 @return the allocated buffer or NULL, if the language is not found.
519
520 **/
521 CHAR8*
522 EFIAPI
523 ConvertIso639LanguageToRfc4646Language (
524 IN CONST CHAR8 *LanguageIso639
525 )
526 ;
527
528 /**
529 Get next language from language code list (with separator ';').
530
531 If LangCode is NULL, then ASSERT.
532 If Lang is NULL, then ASSERT.
533
534 @param LangCode On input: point to first language in the list. On
535 output: point to next language in the list, or
536 NULL if no more language in the list.
537 @param Lang The first language in the list.
538
539 **/
540 VOID
541 EFIAPI
542 GetNextLanguage (
543 IN OUT CHAR8 **LangCode,
544 OUT CHAR8 *Lang
545 )
546 ;
547
548 #include "Utility.h"
549 #include "ConfigAccess.h"
550
551 #endif