Microsoft Azure IoTHub client libraries
Dependents: sht15_remote_monitoring RobotArmDemo iothub_client_sample_amqp f767zi_mqtt ... more
This library implements the Microsoft Azure IoTHub client library. The code is replicated from https://github.com/Azure/azure-iot-sdks
Diff: iothub_client_ll.c
- Revision:
- 55:59b527ab3452
- Parent:
- 54:6dcad9019a64
- Child:
- 57:4524910c6445
--- a/iothub_client_ll.c Wed Dec 14 15:59:51 2016 -0800 +++ b/iothub_client_ll.c Sun Jan 08 11:11:58 2017 -0800 @@ -49,6 +49,7 @@ IOTHUB_CLIENT_DEVICE_TWIN_CALLBACK deviceTwinCallback; void* deviceTwinContextCallback; IOTHUB_CLIENT_DEVICE_METHOD_CALLBACK_ASYNC deviceMethodCallback; + IOTHUB_CLIENT_INBOUND_DEVICE_METHOD_CALLBACK deviceInboundMethodCallback; void* deviceMethodUserContextCallback; IOTHUB_CLIENT_RETRY_POLICY retryPolicy; size_t retryTimeoutLimitInSeconds; @@ -409,6 +410,7 @@ handleData->IoTHubTransport_Unsubscribe_DeviceTwin = protocol->IoTHubTransport_Unsubscribe_DeviceTwin; handleData->IoTHubTransport_Subscribe_DeviceMethod = protocol->IoTHubTransport_Subscribe_DeviceMethod; handleData->IoTHubTransport_Unsubscribe_DeviceMethod = protocol->IoTHubTransport_Unsubscribe_DeviceMethod; + handleData->IoTHubTransport_DeviceMethod_Response = protocol->IoTHubTransport_DeviceMethod_Response; } IOTHUB_CLIENT_LL_HANDLE IoTHubClient_LL_Create(const IOTHUB_CLIENT_CONFIG* config) @@ -472,6 +474,7 @@ handleData->deviceTwinCallback = NULL; handleData->deviceTwinContextCallback = NULL; handleData->deviceMethodCallback = NULL; + handleData->deviceInboundMethodCallback = NULL; handleData->deviceMethodUserContextCallback = NULL; handleData->lastMessageReceiveTime = INDEFINITE_TIME; handleData->data_msg_id = 1; @@ -642,6 +645,7 @@ handleData->deviceTwinCallback = NULL; handleData->deviceTwinContextCallback = NULL; handleData->deviceMethodCallback = NULL; + handleData->deviceInboundMethodCallback = NULL; handleData->deviceMethodUserContextCallback = NULL; handleData->lastMessageReceiveTime = INDEFINITE_TIME; handleData->data_msg_id = 1; @@ -1002,14 +1006,14 @@ } } -int IoTHubClient_LL_DeviceMethodComplete(IOTHUB_CLIENT_LL_HANDLE handle, const char* method_name, const unsigned char* payLoad, size_t size, BUFFER_HANDLE response) +int IoTHubClient_LL_DeviceMethodComplete(IOTHUB_CLIENT_LL_HANDLE handle, const char* method_name, const unsigned char* payLoad, size_t size, METHOD_HANDLE response_id) { int result; - if (handle == NULL || response == NULL) + if (handle == NULL) { /* Codes_SRS_IOTHUBCLIENT_LL_07_017: [ If handle or response is NULL then IoTHubClient_LL_DeviceMethodComplete shall return 500. ] */ LogError("Invalid argument handle=%p", handle); - result = 500; + result = __LINE__; } else { @@ -1018,25 +1022,30 @@ if (handleData->deviceMethodCallback) { unsigned char* payload_resp = NULL; - size_t resp_size = 0; - result = handleData->deviceMethodCallback(method_name, payLoad, size, &payload_resp, &resp_size, handleData->deviceMethodUserContextCallback); + size_t response_size = 0; + result = handleData->deviceMethodCallback(method_name, payLoad, size, &payload_resp, &response_size, handleData->deviceMethodUserContextCallback); /* Codes_SRS_IOTHUBCLIENT_LL_07_020: [ deviceMethodCallback shall buil the BUFFER_HANDLE with the response payload from the IOTHUB_CLIENT_DEVICE_METHOD_CALLBACK_ASYNC callback. ] */ - if (payload_resp != NULL && resp_size > 0) + if (payload_resp != NULL && response_size > 0) { - if (BUFFER_build(response, payload_resp, resp_size) != 0) - { - result = 500; - } + result = handleData->IoTHubTransport_DeviceMethod_Response(handleData->deviceHandle, response_id, payload_resp, response_size, result); + } + else + { + result = __LINE__; } if (payload_resp != NULL) { free(payload_resp); } } + else if (handleData->deviceInboundMethodCallback) + { + result = handleData->deviceInboundMethodCallback(method_name, payLoad, size, response_id, handleData->deviceMethodUserContextCallback); + } else { /* Codes_SRS_IOTHUBCLIENT_LL_07_019: [ If deviceMethodCallback is NULL IoTHubClient_LL_DeviceMethodComplete shall return 404. ] */ - result = 404; + result = 0; } } return result; @@ -1443,6 +1452,7 @@ { /*Codes_SRS_IOTHUBCLIENT_LL_12_022: [ Otherwise IoTHubClient_LL_SetDeviceMethodCallback shall succeed and return IOTHUB_CLIENT_OK. ]*/ handleData->deviceMethodCallback = deviceMethodCallback; + handleData->deviceInboundMethodCallback = NULL; handleData->deviceMethodUserContextCallback = userContextCallback; result = IOTHUB_CLIENT_OK; } @@ -1457,6 +1467,72 @@ return result; } +IOTHUB_CLIENT_RESULT IoTHubClient_LL_SetDeviceMethodCallback_Ex(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, IOTHUB_CLIENT_INBOUND_DEVICE_METHOD_CALLBACK inboundDeviceMethodCallback, void* userContextCallback) +{ + IOTHUB_CLIENT_RESULT result; + /* Codes_SRS_IOTHUBCLIENT_LL_07_021: [ If handle is NULL then IoTHubClient_LL_SetDeviceMethodCallback_Ex shall return IOTHUB_CLIENT_INVALID_ARG.] */ + if (iotHubClientHandle == NULL) + { + result = IOTHUB_CLIENT_INVALID_ARG; + LOG_ERROR_RESULT; + } + else + { + IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle; + if (inboundDeviceMethodCallback == NULL) + { + /* Codes_SRS_IOTHUBCLIENT_LL_07_022: [ If inboundDeviceMethodCallback is NULL then IoTHubClient_LL_SetDeviceMethodCallback_Ex shall call the underlying layer's IoTHubTransport_Unsubscribe_DeviceMethod function and return IOTHUB_CLIENT_OK.] */ + handleData->IoTHubTransport_Unsubscribe_DeviceMethod(handleData->transportHandle); + handleData->deviceInboundMethodCallback = NULL; + result = IOTHUB_CLIENT_OK; + } + else + { + /* Codes_SRS_IOTHUBCLIENT_LL_07_023: [ If inboundDeviceMethodCallback is non-NULL then IoTHubClient_LL_SetDeviceMethodCallback_Ex shall call the underlying layer's IoTHubTransport_Subscribe_DeviceMethod function.]*/ + if (handleData->IoTHubTransport_Subscribe_DeviceMethod(handleData->deviceHandle) == 0) + { + handleData->deviceInboundMethodCallback = inboundDeviceMethodCallback; + handleData->deviceMethodCallback = NULL; + handleData->deviceMethodUserContextCallback = userContextCallback; + result = IOTHUB_CLIENT_OK; + } + else + { + /* Codes_SRS_IOTHUBCLIENT_LL_07_025: [ If any error is encountered then IoTHubClient_LL_SetDeviceMethodCallback_Ex shall return IOTHUB_CLIENT_ERROR.] */ + result = IOTHUB_CLIENT_ERROR; + LOG_ERROR_RESULT; + } + } + } + return result; +} + +IOTHUB_CLIENT_RESULT IoTHubClient_LL_DeviceMethodResponse(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, METHOD_HANDLE methodId, const unsigned char* response, size_t response_size, int status_response) +{ + IOTHUB_CLIENT_RESULT result; + /* Codes_SRS_IOTHUBCLIENT_LL_07_026: [ If handle or methodId is NULL then IoTHubClient_LL_DeviceMethodResponse shall return IOTHUB_CLIENT_INVALID_ARG.] */ + if (iotHubClientHandle == NULL || methodId == NULL) + { + result = IOTHUB_CLIENT_INVALID_ARG; + LOG_ERROR_RESULT; + } + else + { + IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle; + /* Codes_SRS_IOTHUBCLIENT_LL_07_027: [ IoTHubClient_LL_DeviceMethodResponse shall call the IoTHubTransport_DeviceMethod_Response transport function.] */ + if (handleData->IoTHubTransport_DeviceMethod_Response(handleData->deviceHandle, methodId, response, response_size, status_response) != 0) + { + LogError("IoTHubTransport_DeviceMethod_Response failed"); + result = IOTHUB_CLIENT_ERROR; + } + else + { + result = IOTHUB_CLIENT_OK; + } + } + return result; +} + #ifndef DONT_USE_UPLOADTOBLOB IOTHUB_CLIENT_RESULT IoTHubClient_LL_UploadToBlob(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, const char* destinationFileName, const unsigned char* source, size_t size) {