in serializer/src/codefirst.c [1162:1311]
CODEFIRST_RESULT CodeFirst_SendAsync(unsigned char** destination, size_t* destinationSize, size_t numProperties, ...)
{
CODEFIRST_RESULT result;
va_list ap;
if (
(numProperties == 0) ||
(destination == NULL) ||
(destinationSize == NULL)
)
{
result = CODEFIRST_INVALID_ARG;
LOG_CODEFIRST_ERROR;
}
else
{
(void)CodeFirst_Init_impl(NULL, false); /*lazy init*/
DEVICE_HEADER_DATA* deviceHeader = NULL;
size_t i;
TRANSACTION_HANDLE transaction = NULL;
result = CODEFIRST_OK;
va_start(ap, numProperties);
for (i = 0; i < numProperties; i++)
{
void* value = (void*)va_arg(ap, void*);
DEVICE_HEADER_DATA* currentValueDeviceHeader = FindDevice(value);
if (currentValueDeviceHeader == NULL)
{
result = CODEFIRST_INVALID_ARG;
LOG_CODEFIRST_ERROR;
break;
}
else if ((deviceHeader != NULL) &&
(currentValueDeviceHeader != deviceHeader))
{
result = CODEFIRST_VALUES_FROM_DIFFERENT_DEVICES_ERROR;
LOG_CODEFIRST_ERROR;
break;
}
else if ((deviceHeader == NULL) &&
((transaction = Device_StartTransaction(currentValueDeviceHeader->DeviceHandle)) == NULL))
{
result = CODEFIRST_DEVICE_PUBLISH_FAILED;
LOG_CODEFIRST_ERROR;
break;
}
else
{
deviceHeader = currentValueDeviceHeader;
if (value == ((unsigned char*)deviceHeader->data))
{
/* we got a full device, send all its state data */
result = SendAllDeviceProperties(deviceHeader, transaction);
if (result != CODEFIRST_OK)
{
LOG_CODEFIRST_ERROR;
break;
}
}
else
{
const REFLECTED_SOMETHING* propertyReflectedData;
const char* modelName;
STRING_HANDLE valuePath;
if ((valuePath = STRING_new()) == NULL)
{
result = CODEFIRST_ERROR;
LOG_CODEFIRST_ERROR;
break;
}
else
{
if ((modelName = Schema_GetModelName(deviceHeader->ModelHandle)) == NULL)
{
result = CODEFIRST_ERROR;
LOG_CODEFIRST_ERROR;
STRING_delete(valuePath);
break;
}
else if ((propertyReflectedData = FindValue(deviceHeader, value, modelName, 0, valuePath)) == NULL)
{
result = CODEFIRST_INVALID_ARG;
LOG_CODEFIRST_ERROR;
STRING_delete(valuePath);
break;
}
else
{
AGENT_DATA_TYPE agentDataType;
if (propertyReflectedData->what.property.Create_AGENT_DATA_TYPE_from_Ptr(value, &agentDataType) != AGENT_DATA_TYPES_OK)
{
result = CODEFIRST_AGENT_DATA_TYPE_ERROR;
LOG_CODEFIRST_ERROR;
STRING_delete(valuePath);
break;
}
else
{
if (Device_PublishTransacted(transaction, STRING_c_str(valuePath), &agentDataType) != DEVICE_OK)
{
Destroy_AGENT_DATA_TYPE(&agentDataType);
result = CODEFIRST_DEVICE_PUBLISH_FAILED;
LOG_CODEFIRST_ERROR;
STRING_delete(valuePath);
break;
}
else
{
STRING_delete(valuePath); /*anyway*/
}
Destroy_AGENT_DATA_TYPE(&agentDataType);
}
}
}
}
}
}
if (i < numProperties)
{
if (transaction != NULL)
{
(void)Device_CancelTransaction(transaction);
}
}
else if (Device_EndTransaction(transaction, destination, destinationSize) != DEVICE_OK)
{
result = CODEFIRST_DEVICE_PUBLISH_FAILED;
LOG_CODEFIRST_ERROR;
}
else
{
result = CODEFIRST_OK;
}
va_end(ap);
}
return result;
}