20#include <Library/BaseLib.h>
21#include <Library/DebugLib.h>
70 Cmp = AsciiStrCmp (SortedList[Curr].Name, Name);
73 return &SortedList[Curr];
76 }
else if (Curr > 0) {
94 IN CONST CHAR8 *Context OPTIONAL,
95 IN OUT UINT32 *ErrorCount OPTIONAL
101 CONST CHAR8 *CurrentKey;
108 for (Index = 0; Index < DictSize; Index++) {
111 if (CurrentKey == NULL) {
112 DEBUG ((DEBUG_WARN,
"OCS: No serialized key at %u index, context <%a>!\n", Index, Context));
113 if (ErrorCount != NULL) {
123 if (CurrentKey[0] ==
'#') {
127 DEBUG ((DEBUG_VERBOSE,
"OCS: Parsing serialized at %a at %u index!\n", CurrentKey, Index));
132 NewSchema =
LookupConfigSchema (Info->Dict.Schema, Info->Dict.SchemaSize, CurrentKey);
134 if (NewSchema == NULL) {
135 DEBUG ((DEBUG_WARN,
"OCS: No schema for %a at %u index, context <%a>!\n", CurrentKey, Index, Context));
136 if (ErrorCount != NULL) {
143 OldValue = CurrentValue;
145 if (CurrentValue == NULL) {
148 "OCS: No type match for %a at %u index, expected type %a got %a, context <%a>!\n",
155 if (ErrorCount != NULL) {
162 NewSchema->
Apply (Serialized, CurrentValue, &NewSchema->
Info, CurrentKey, ErrorCount);
167 for (Index = 0; Index < Info->Dict.SchemaSize; ++Index) {
168 if (Info->Dict.Schema[Index].Optional) {
172 for (Index2 = 0; Index2 < DictSize; ++Index2) {
175 if (CurrentKey == NULL) {
179 if (AsciiStrCmp (CurrentKey, Info->Dict.Schema[Index].Name) == 0) {
184 if (Index2 == DictSize) {
187 "OCS: Missing key %a, context <%a>!\n",
188 Info->Dict.Schema[Index].Name,
191 if (ErrorCount != NULL) {
202 OUT VOID *Serialized,
205 IN CONST CHAR8 *Context OPTIONAL,
206 IN OUT UINT32 *ErrorCount OPTIONAL
215 Size = Info->Value.FieldSize;
217 switch (Info->Value.Type) {
235 if (Result == FALSE) {
238 "OCS: Failed to parse %a field as value with type %a and <%a> contents, context <%a>!\n",
244 if (ErrorCount != NULL) {
252 OUT VOID *Serialized,
255 IN CONST CHAR8 *Context OPTIONAL,
256 IN OUT UINT32 *ErrorCount OPTIONAL
267 switch (Info->Blob.Type) {
279 if (Result == FALSE) {
282 "OCS: Failed to calculate size of %a field containing <%a> as type %a, context <%a>!\n",
288 if (ErrorCount != NULL) {
298 if (BlobMemory == NULL) {
301 "OCS: Failed to allocate %u bytes %a field of type %a, context <%a>!\n",
307 if (ErrorCount != NULL) {
316 switch (Info->Blob.Type) {
328 if (Result == FALSE) {
331 "OCS: Failed to parse %a field as blob with type %a and <%a> contents, context <%a>!\n",
337 if (ErrorCount != NULL) {
345 OUT VOID *Serialized,
348 IN CONST CHAR8 *Context OPTIONAL,
349 IN OUT UINT32 *ErrorCount OPTIONAL
354 CONST CHAR8 *CurrentKey;
355 UINT32 CurrentKeyLen;
364 for (Index = 0; Index < DictSize; Index++) {
366 CurrentKeyLen = CurrentKey != NULL ? (UINT32)(AsciiStrLen (CurrentKey) + 1) : 0;
368 if (CurrentKeyLen == 0) {
369 DEBUG ((DEBUG_INFO,
"OCS: No get serialized key at %u index!\n", Index));
370 if (ErrorCount != NULL) {
380 if (CurrentKey[0] ==
'#') {
384 if (
PlistNodeCast (ChildNode, Info->List.Schema->Type) == NULL) {
385 DEBUG ((DEBUG_INFO,
"OCS: No valid serialized value at %u index!\n", Index));
386 if (ErrorCount != NULL) {
398 if (Success == FALSE) {
399 DEBUG ((DEBUG_INFO,
"OCS: Couldn't insert dict serialized at %u index!\n", Index));
400 if (ErrorCount != NULL) {
408 if (NewKeyValue != NULL) {
409 AsciiStrnCpyS ((CHAR8 *)NewKeyValue, CurrentKeyLen, CurrentKey, CurrentKeyLen - 1);
411 DEBUG ((DEBUG_INFO,
"OCS: Couldn't allocate key name at %u index!\n", Index));
412 if (ErrorCount != NULL) {
417 Info->List.Schema->Apply (NewValue, ChildNode, &Info->List.Schema->Info, CurrentKey, ErrorCount);
423 OUT VOID *Serialized,
426 IN CONST CHAR8 *Context OPTIONAL,
427 IN OUT UINT32 *ErrorCount OPTIONAL
438 for (Index = 0; Index < ArraySize; Index++) {
441 DEBUG ((DEBUG_VERBOSE,
"OCS: Processing array %u/%u element\n", Index + 1, ArraySize));
443 if (ChildNode == NULL) {
444 DEBUG ((DEBUG_INFO,
"OCS: Couldn't get array serialized at %u index!\n", Index));
445 if (ErrorCount != NULL) {
457 if (Success == FALSE) {
458 DEBUG ((DEBUG_INFO,
"OCS: Couldn't insert array serialized at %u index!\n", Index));
459 if (ErrorCount != NULL) {
466 Info->List.Schema->Apply (NewValue, ChildNode, &Info->List.Schema->Info, Context, ErrorCount);
472 OUT VOID *Serialized,
474 IN VOID *PlistBuffer,
476 IN OUT UINT32 *ErrorCount OPTIONAL
484 if (Document == NULL) {
485 DEBUG ((DEBUG_INFO,
"OCS: Couldn't parse serialized file!\n"));
486 if (ErrorCount != NULL) {
495 if (RootDict == NULL) {
496 DEBUG ((DEBUG_INFO,
"OCS: Couldn't get serialized root!\n"));
498 if (ErrorCount != NULL) {
#define ARRAY_SIZE(Array)
EFI_DEVICE_PATH_PROTOCOL End
DMG_SIZE_DEVICE_PATH Size
STATIC CONST CHAR8 * mSchemaTypeNames[]
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)
STATIC CONST CHAR8 * GetSchemaTypeName(IN UINT32 Type)
VOID ParseSerializedMap(OUT VOID *Serialized, IN XML_NODE *Node, IN OC_SCHEMA_INFO *Info, IN CONST CHAR8 *Context OPTIONAL, IN OUT UINT32 *ErrorCount OPTIONAL)
#define OC_SCHEMA_FIELD(Base, Type, Offset)
@ OC_SCHEMA_VALUE_BOOLEAN
@ OC_SCHEMA_VALUE_INTEGER
BOOLEAN OcListEntryAllocate(VOID *Pointer, VOID **Value, VOID **Key)
VOID * OcBlobAllocate(VOID *Pointer, UINT32 Size, UINT32 **OutSize OPTIONAL)
BOOLEAN PlistDataSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
XML_DOCUMENT * XmlDocumentParse(IN OUT CHAR8 *Buffer, IN UINT32 Length, IN BOOLEAN WithRefs)
CONST CHAR8 * PlistKeyValue(IN XML_NODE *Node OPTIONAL)
BOOLEAN PlistMultiDataSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
UINT32 XmlNodeChildren(IN CONST XML_NODE *Node)
CONST CHAR8 * XmlNodeContent(IN CONST XML_NODE *Node)
UINT32 PlistDictChildren(IN CONST XML_NODE *Node)
BOOLEAN PlistStringSize(IN XML_NODE *Node OPTIONAL, OUT UINT32 *Size)
BOOLEAN PlistStringValue(IN XML_NODE *Node OPTIONAL, OUT CHAR8 *Value, IN OUT UINT32 *Size)
BOOLEAN PlistIntegerValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Value, IN UINT32 Size, IN BOOLEAN Hex)
XML_NODE * PlistNodeCast(IN XML_NODE *Node OPTIONAL, IN PLIST_NODE_TYPE Type)
CONST CHAR8 * XmlNodeName(IN CONST XML_NODE *Node)
XML_NODE * PlistDocumentRoot(IN CONST XML_DOCUMENT *Document)
BOOLEAN PlistDataValue(IN XML_NODE *Node OPTIONAL, OUT UINT8 *Buffer, IN OUT UINT32 *Size)
XML_NODE * XmlNodeChild(IN CONST XML_NODE *Node, IN UINT32 Child)
BOOLEAN PlistBooleanValue(IN XML_NODE *Node OPTIONAL, OUT BOOLEAN *Value)
VOID XmlDocumentFree(IN OUT XML_DOCUMENT *Document)
BOOLEAN PlistMultiDataValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Buffer, IN OUT UINT32 *Size)
XML_NODE * PlistDictChild(IN CONST XML_NODE *Node, IN UINT32 Child, OUT XML_NODE **Value OPTIONAL)