OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcSerializeLib.h
Go to the documentation of this file.
1
19#ifndef OC_SERIALIZE_LIB_H
20#define OC_SERIALIZE_LIB_H
21
22#include <Library/OcXmlLib.h>
24
25typedef struct OC_SCHEMA_ OC_SCHEMA;
27
28//
29// Generic applier interface that knows how to provide Info with data from Node.
30//
31typedef
32VOID
33(*OC_APPLY) (
34 OUT VOID *Serialized,
35 IN XML_NODE *Node,
36 IN OC_SCHEMA_INFO *Info,
37 IN CONST CHAR8 *Context OPTIONAL,
38 IN OUT UINT32 *ErrorCount OPTIONAL
39 );
40
41//
42// OC_SCHEMA_INFO for nested dictionaries
43//
44typedef struct {
45 //
46 // Nested schema list.
47 //
49 //
50 // Nested schema list size.
51 //
52 UINT32 SchemaSize;
54
55//
56// OC_SCHEMA_INFO for static values
57//
58
66
67typedef struct {
68 //
69 // Value pointer.
70 //
71 UINTN Field;
72 //
73 // Value size.
74 //
75 UINT32 FieldSize;
76 //
77 // Source type.
78 //
81
82//
83// OC_SCHEMA_INFO for blob values
84//
85
91
92typedef struct {
93 //
94 // Blob pointer.
95 //
96 UINTN Field;
97 //
98 // Source type.
99 //
102
103//
104// OC_SCHEMA_INFO for array/map lists
105//
106typedef struct {
107 //
108 // List pointer.
109 //
110 UINTN Field;
111 //
112 // List entry schema.
113 //
116
117//
118// All standard variants of schema info
119//
126
127//
128// Schema context, allowing node recursion.
129//
131 //
132 // Key name to match against in the dictionary.
133 //
134 CONST CHAR8 *Name;
135 //
136 // Node type required to match to be able to call Apply.
137 // PLIST_NODE_TYPE_ANY could be specified if Apply does the validation.
138 //
140 //
141 // Whether this node is optional to use.
142 //
143 BOOLEAN Optional;
144 //
145 // Apply handler that will merge Node data into object.
146 //
148 //
149 // Information about Node to object bridge.
150 //
152};
153
154//
155// Find schema in a sorted list
156//
157OC_SCHEMA *
159 IN OC_SCHEMA *SortedList,
160 IN UINT32 Size,
161 IN CONST CHAR8 *Name
162 );
163
164//
165// Apply interface to parse serialized dictionaries
166//
167VOID
169 OUT VOID *Serialized,
170 IN XML_NODE *Node,
171 IN OC_SCHEMA_INFO *Info,
172 IN CONST CHAR8 *Context OPTIONAL,
173 IN OUT UINT32 *ErrorCount OPTIONAL
174 );
175
176//
177// Apply interface to parse serialized OC_SCHEMA_VALUE_TYPE.
178//
179VOID
181 OUT VOID *Serialized,
182 IN XML_NODE *Node,
183 IN OC_SCHEMA_INFO *Info,
184 IN CONST CHAR8 *Context OPTIONAL,
185 IN OUT UINT32 *ErrorCount OPTIONAL
186 );
187
188//
189// Apply interface to parse serialized OC_SCHEMA_BLOB_TYPE.
190//
191VOID
193 OUT VOID *Serialized,
194 IN XML_NODE *Node,
195 IN OC_SCHEMA_INFO *Info,
196 IN CONST CHAR8 *Context OPTIONAL,
197 IN OUT UINT32 *ErrorCount OPTIONAL
198 );
199
200//
201// Apply interface to parse serialized map with arbitrary values,
202// and OC_STRING strings.
203//
204VOID
206 OUT VOID *Serialized,
207 IN XML_NODE *Node,
208 IN OC_SCHEMA_INFO *Info,
209 IN CONST CHAR8 *Context OPTIONAL,
210 IN OUT UINT32 *ErrorCount OPTIONAL
211 );
212
213//
214// Apply interface to parse serialized array
215//
216VOID
218 OUT VOID *Serialized,
219 IN XML_NODE *Node,
220 IN OC_SCHEMA_INFO *Info,
221 IN CONST CHAR8 *Context OPTIONAL,
222 IN OUT UINT32 *ErrorCount OPTIONAL
223 );
224
225//
226// Main interface for parsing serialized data.
227// PlistBuffer will be modified during the execution.
228//
229BOOLEAN
231 OUT VOID *Serialized,
232 IN OC_SCHEMA_INFO *RootSchema,
233 IN VOID *PlistBuffer,
234 IN UINT32 PlistSize,
235 IN OUT UINT32 *ErrorCount OPTIONAL
236 );
237
238//
239// Retrieve typed field pointer from offset
240//
241#define OC_SCHEMA_FIELD(Base, Type, Offset) \
242 ((Type *)(((UINT8 *) (Base)) + (Offset)))
243
244//
245// Smart declaration base macros, see usage below.
246//
247#define OC_SCHEMA_VALUE(Name, Offset, Type, SourceType) \
248 {(Name), PLIST_NODE_TYPE_ANY, FALSE, ParseSerializedValue, \
249 {.Value = {Offset, sizeof (Type), SourceType}}}
250
251#define OC_SCHEMA_BLOB(Name, Offset, SourceType) \
252 {(Name), PLIST_NODE_TYPE_ANY, FALSE, ParseSerializedBlob, \
253 {.Blob = {Offset, SourceType}}}
254
255//
256// Smart declaration macros for builtin appliers,
257// which point straight to types.
258//
259// Name represents dictionary name if any (otherwise NULL).
260// Type represents value or value type for size calculation.
261// Schema represents element schema.
262//
263// M prefix stands for Meta, which means meta data type casting is used.
264// F suffix stands for Fixed, which means fixed file size is assumed.
265//
266#define OC_SCHEMA_DICT(Name, Schema) \
267 {(Name), PLIST_NODE_TYPE_DICT, FALSE, ParseSerializedDict, \
268 {.Dict = {(Schema), ARRAY_SIZE (Schema)}}}
269
270#define OC_SCHEMA_DICT_OPT(Name, Schema) \
271 {(Name), PLIST_NODE_TYPE_DICT, TRUE, ParseSerializedDict, \
272 {.Dict = {(Schema), ARRAY_SIZE (Schema)}}}
273
274#define OC_SCHEMA_BOOLEAN(Name) \
275 OC_SCHEMA_VALUE (Name, 0, BOOLEAN, OC_SCHEMA_VALUE_BOOLEAN)
276
277#define OC_SCHEMA_INTEGER(Name, Type) \
278 OC_SCHEMA_VALUE (Name, 0, Type, OC_SCHEMA_VALUE_INTEGER)
279
280#define OC_SCHEMA_STRING(Name) \
281 OC_SCHEMA_BLOB (Name, 0, OC_SCHEMA_BLOB_STRING)
282
283#define OC_SCHEMA_STRINGF(Name, Type) \
284 OC_SCHEMA_VALUE (Name, 0, Type, OC_SCHEMA_VALUE_STRING)
285
286#define OC_SCHEMA_DATA(Name) \
287 OC_SCHEMA_BLOB (Name, 0, OC_SCHEMA_BLOB_DATA)
288
289#define OC_SCHEMA_DATAF(Name, Type) \
290 OC_SCHEMA_VALUE (Name, 0, Type, OC_SCHEMA_VALUE_DATA)
291
292#define OC_SCHEMA_MDATA(Name) \
293 OC_SCHEMA_BLOB (Name, 0, OC_SCHEMA_BLOB_MDATA)
294
295#define OC_SCHEMA_MDATAF(Name, Type) \
296 OC_SCHEMA_VALUE (Name, 0, Type, OC_SCHEMA_VALUE_MDATA)
297
298#define OC_SCHEMA_ARRAY(Name, ChildSchema) \
299 {(Name), PLIST_NODE_TYPE_ARRAY, FALSE, ParseSerializedArray, \
300 {.List = {0, ChildSchema}}}
301
302#define OC_SCHEMA_MAP(Name, ChildSchema) \
303 {(Name), PLIST_NODE_TYPE_DICT, FALSE, ParseSerializedMap, \
304 {.List = {0, ChildSchema}}}
305
306//
307// Smart declaration macros for builtin appliers,
308// which point to structures, containing these types.
309//
310// Name represents dictionary name if any (otherwise NULL).
311// Type represents container structure type for this value.
312// Field represents item in the container type.
313// Schema represents element schema.
314//
315#define OC_SCHEMA_BOOLEAN_IN(Name, Type, Field) \
316 OC_SCHEMA_VALUE (Name, OFFSET_OF (Type, Field), (((Type *)0)->Field), \
317 OC_SCHEMA_VALUE_BOOLEAN)
318
319#define OC_SCHEMA_INTEGER_IN(Name, Type, Field) \
320 OC_SCHEMA_VALUE (Name, OFFSET_OF (Type, Field), (((Type *)0)->Field), \
321 OC_SCHEMA_VALUE_INTEGER)
322
323#define OC_SCHEMA_STRING_IN(Name, Type, Field) \
324 OC_SCHEMA_BLOB (Name, OFFSET_OF (Type, Field), OC_SCHEMA_BLOB_STRING)
325
326#define OC_SCHEMA_STRINGF_IN(Name, Type, Field) \
327 OC_SCHEMA_VALUE (Name, OFFSET_OF (Type, Field), (((Type *)0)->Field), \
328 OC_SCHEMA_VALUE_STRING)
329
330#define OC_SCHEMA_DATA_IN(Name, Type, Field) \
331 OC_SCHEMA_BLOB (Name, OFFSET_OF (Type, Field), OC_SCHEMA_BLOB_DATA)
332
333#define OC_SCHEMA_DATAF_IN(Name, Type, Field) \
334 OC_SCHEMA_VALUE (Name, OFFSET_OF (Type, Field), (((Type *)0)->Field), \
335 OC_SCHEMA_VALUE_DATA)
336
337#define OC_SCHEMA_MDATA_IN(Name, Type, Field) \
338 OC_SCHEMA_BLOB (Name, OFFSET_OF (Type, Field), OC_SCHEMA_BLOB_MDATA)
339
340#define OC_SCHEMA_MDATAF_IN(Name, Type, Field) \
341 OC_SCHEMA_VALUE (Name, OFFSET_OF (Type, Field), (((Type *)0)->Field), \
342 OC_SCHEMA_VALUE_MDATA)
343
344#define OC_SCHEMA_ARRAY_IN(Name, Type, Field, ChildSchema) \
345 {(Name), PLIST_NODE_TYPE_ARRAY, FALSE, ParseSerializedArray, \
346 {.List = {OFFSET_OF (Type, Field), ChildSchema}}}
347
348#define OC_SCHEMA_MAP_IN(Name, Type, Field, ChildSchema) \
349 {(Name), PLIST_NODE_TYPE_DICT, FALSE, ParseSerializedMap, \
350 {.List = {OFFSET_OF (Type, Field), ChildSchema}}}
351
352#endif // OC_SERIALIZE_LIB_H
DMG_SIZE_DEVICE_PATH Size
#define OC_SCHEMA_BLOB(Name, Offset, SourceType)
VOID ParseSerializedArray(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
OC_SCHEMA * LookupConfigSchema(IN OC_SCHEMA *SortedList, IN UINT32 Size, IN CONST CHAR8 *Name)
BOOLEAN ParseSerialized(OUT VOID *Serialized, IN OC_SCHEMA_INFO *RootSchema, IN VOID *PlistBuffer, IN UINT32 PlistSize, IN OUT UINT32 *ErrorCount OPTIONAL)
VOID ParseSerializedValue(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
VOID ParseSerializedBlob(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
VOID ParseSerializedDict(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
VOID(* OC_APPLY)(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
VOID ParseSerializedMap(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
enum OC_SCHEMA_BLOB_TYPE_ OC_SCHEMA_BLOB_TYPE
#define OC_SCHEMA_VALUE(Name, Offset, Type, SourceType)
OC_SCHEMA_VALUE_TYPE_
@ OC_SCHEMA_VALUE_BOOLEAN
@ OC_SCHEMA_VALUE_DATA
@ OC_SCHEMA_VALUE_INTEGER
@ OC_SCHEMA_VALUE_MDATA
@ OC_SCHEMA_VALUE_STRING
#define OC_SCHEMA_DICT(Name, Schema)
enum OC_SCHEMA_VALUE_TYPE_ OC_SCHEMA_VALUE_TYPE
OC_SCHEMA_BLOB_TYPE_
@ OC_SCHEMA_BLOB_DATA
@ OC_SCHEMA_BLOB_STRING
@ OC_SCHEMA_BLOB_MDATA
enum PLIST_NODE_TYPE_ PLIST_NODE_TYPE
OC_SCHEMA_BLOB_TYPE Type
OC_SCHEMA * Schema
OC_SCHEMA_INFO Info
OC_APPLY Apply
PLIST_NODE_TYPE Type
BOOLEAN Optional
CONST CHAR8 * Name
OC_SCHEMA * Schema
OC_SCHEMA_VALUE_TYPE Type
OC_SCHEMA_DICT Dict
OC_SCHEMA_LIST List
OC_SCHEMA_BLOB Blob
OC_SCHEMA_VALUE Value