in serializer/src/commanddecoder.c [744:871]
static bool validateModel_vs_Multitree(void* startAddress, SCHEMA_MODEL_TYPE_HANDLE modelHandle, MULTITREE_HANDLE desiredPropertiesTree, size_t offset)
{
bool result;
size_t nChildren;
size_t nProcessedChildren = 0;
(void)MultiTree_GetChildCount(desiredPropertiesTree, &nChildren);
for (size_t i = 0;i < nChildren;i++)
{
MULTITREE_HANDLE child;
if (MultiTree_GetChild(desiredPropertiesTree, i, &child) != MULTITREE_OK)
{
LogError("failure in MultiTree_GetChild");
i = nChildren;
}
else
{
STRING_HANDLE childName = STRING_new();
if (childName == NULL)
{
LogError("failure to STRING_new");
i = nChildren;
}
else
{
if (MultiTree_GetName(child, childName) != MULTITREE_OK)
{
LogError("failure to MultiTree_GetName");
i = nChildren;
}
else
{
const char *childName_str = STRING_c_str(childName);
SCHEMA_MODEL_ELEMENT elementType = Schema_GetModelElementByName(modelHandle, childName_str);
switch (elementType.elementType)
{
default:
{
LogError("INTERNAL ERROR: unexpected function return");
i = nChildren;
break;
}
case (SCHEMA_PROPERTY):
{
LogError("cannot ingest name (WITH_DATA instead of WITH_DESIRED_PROPERTY): %s", childName_str);
i = nChildren;
break;
}
case (SCHEMA_REPORTED_PROPERTY):
{
LogError("cannot ingest name (WITH_REPORTED_PROPERTY instead of WITH_DESIRED_PROPERTY): %s", childName_str);
i = nChildren;
break;
}
case (SCHEMA_DESIRED_PROPERTY):
{
SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle = elementType.elementHandle.desiredPropertyHandle;
const char* desiredPropertyType = Schema_GetModelDesiredPropertyType(desiredPropertyHandle);
AGENT_DATA_TYPE output;
if (DecodeValueFromNode(Schema_GetSchemaForModelType(modelHandle), &output, child, desiredPropertyType) != 0)
{
LogError("failure in DecodeValueFromNode");
i = nChildren;
}
else
{
pfDesiredPropertyFromAGENT_DATA_TYPE leFunction = Schema_GetModelDesiredProperty_pfDesiredPropertyFromAGENT_DATA_TYPE(desiredPropertyHandle);
if (leFunction(&output, (char*)startAddress + offset + Schema_GetModelDesiredProperty_offset(desiredPropertyHandle)) != 0)
{
LogError("failure in a function that converts from AGENT_DATA_TYPE to C data");
}
else
{
pfOnDesiredProperty onDesiredProperty = Schema_GetModelDesiredProperty_pfOnDesiredProperty(desiredPropertyHandle);
if (onDesiredProperty != NULL)
{
onDesiredProperty((char*)startAddress + offset);
}
nProcessedChildren++;
}
Destroy_AGENT_DATA_TYPE(&output);
}
break;
}
case(SCHEMA_MODEL_IN_MODEL):
{
SCHEMA_MODEL_TYPE_HANDLE modelModel = elementType.elementHandle.modelHandle;
if (!validateModel_vs_Multitree(startAddress, modelModel, child, offset + Schema_GetModelModelByName_Offset(modelHandle, childName_str)))
{
LogError("failure in validateModel_vs_Multitree");
i = nChildren;
}
else
{
/*if the model in model so happened to be a WITH_DESIRED_PROPERTY... (only those has non_NULL pfOnDesiredProperty) */
pfOnDesiredProperty onDesiredProperty = Schema_GetModelModelByName_OnDesiredProperty(modelHandle, childName_str);
if (onDesiredProperty != NULL)
{
onDesiredProperty((char*)startAddress + offset);
}
nProcessedChildren++;
}
break;
}
} /*switch*/
}
STRING_delete(childName);
}
}
}
if(nProcessedChildren == nChildren)
{
result = true;
}
else
{
LogError("not all constituents of the JSON have been ingested");
result = false;
}
return result;
}