Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include <ctype.h>
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/tlsio.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/platform.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "azure_c_shared_utility/sastoken.h"
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_uamqp_c/connection.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_uamqp_c/message_receiver.h"
XinZhangMS 0:f7f1f0d76dd6 15 #include "azure_uamqp_c/message_sender.h"
XinZhangMS 0:f7f1f0d76dd6 16 #include "azure_uamqp_c/messaging.h"
XinZhangMS 0:f7f1f0d76dd6 17 #include "azure_uamqp_c/sasl_mechanism.h"
XinZhangMS 0:f7f1f0d76dd6 18 #include "azure_uamqp_c/saslclientio.h"
XinZhangMS 0:f7f1f0d76dd6 19 #include "azure_uamqp_c/sasl_plain.h"
XinZhangMS 0:f7f1f0d76dd6 20 #include "azure_uamqp_c/cbs.h"
XinZhangMS 0:f7f1f0d76dd6 21 #include <signal.h>
XinZhangMS 0:f7f1f0d76dd6 22 #include "azure_c_shared_utility/threadapi.h"
XinZhangMS 0:f7f1f0d76dd6 23 #include "azure_c_shared_utility/lock.h"
XinZhangMS 0:f7f1f0d76dd6 24
XinZhangMS 0:f7f1f0d76dd6 25 #include "parson.h"
XinZhangMS 0:f7f1f0d76dd6 26
XinZhangMS 0:f7f1f0d76dd6 27 #include "iothub_messaging_ll.h"
XinZhangMS 0:f7f1f0d76dd6 28 #include "iothub_messaging.h"
XinZhangMS 0:f7f1f0d76dd6 29
XinZhangMS 0:f7f1f0d76dd6 30 typedef struct IOTHUB_MESSAGING_CLIENT_INSTANCE_TAG
XinZhangMS 0:f7f1f0d76dd6 31 {
XinZhangMS 0:f7f1f0d76dd6 32 IOTHUB_MESSAGING_HANDLE IoTHubMessagingHandle;
XinZhangMS 0:f7f1f0d76dd6 33 THREAD_HANDLE ThreadHandle;
XinZhangMS 0:f7f1f0d76dd6 34 LOCK_HANDLE LockHandle;
XinZhangMS 0:f7f1f0d76dd6 35 sig_atomic_t StopThread;
XinZhangMS 0:f7f1f0d76dd6 36 } IOTHUB_MESSAGING_CLIENT_INSTANCE;
XinZhangMS 0:f7f1f0d76dd6 37
XinZhangMS 0:f7f1f0d76dd6 38 static int ScheduleWork_Thread(void* threadArgument)
XinZhangMS 0:f7f1f0d76dd6 39 {
XinZhangMS 0:f7f1f0d76dd6 40 IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)threadArgument;
XinZhangMS 0:f7f1f0d76dd6 41
XinZhangMS 0:f7f1f0d76dd6 42 while (1)
XinZhangMS 0:f7f1f0d76dd6 43 {
XinZhangMS 0:f7f1f0d76dd6 44 if (Lock(iotHubMessagingClientInstance->LockHandle) == LOCK_OK)
XinZhangMS 0:f7f1f0d76dd6 45 {
XinZhangMS 0:f7f1f0d76dd6 46 /*Codes_SRS_IOTHUBMESSAGING_12_041: [ The thread shall exit when all IoTHubServiceClients using the thread have had IoTHubMessaging_Destroy called. ]*/
XinZhangMS 0:f7f1f0d76dd6 47 if (iotHubMessagingClientInstance->StopThread)
XinZhangMS 0:f7f1f0d76dd6 48 {
XinZhangMS 0:f7f1f0d76dd6 49 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 50 break; /*gets out of the thread*/
XinZhangMS 0:f7f1f0d76dd6 51 }
XinZhangMS 0:f7f1f0d76dd6 52 else
XinZhangMS 0:f7f1f0d76dd6 53 {
XinZhangMS 0:f7f1f0d76dd6 54 /*Codes_SRS_IOTHUBMESSAGING_12_042: [ The thread created by IoTHubMessaging_SendAsync shall call IoTHubMessaging_LL_DoWork every 1 ms. ]*/
XinZhangMS 0:f7f1f0d76dd6 55 /*Codes_SRS_IOTHUBMESSAGING_12_043: [ All calls to IoTHubMessaging_LL_DoWork shall be protected by the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 56 IoTHubMessaging_LL_DoWork(iotHubMessagingClientInstance->IoTHubMessagingHandle);
XinZhangMS 0:f7f1f0d76dd6 57 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 58 }
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 else
XinZhangMS 0:f7f1f0d76dd6 61 {
XinZhangMS 0:f7f1f0d76dd6 62 /*Codes_SRS_IOTHUBMESSAGING_12_044: [ If acquiring the lock fails, `IoTHubMessaging_LL_DoWork` shall not be called. ]*/
XinZhangMS 0:f7f1f0d76dd6 63 LogError("Lock failed, shall retry");
XinZhangMS 0:f7f1f0d76dd6 64 }
XinZhangMS 0:f7f1f0d76dd6 65 (void)ThreadAPI_Sleep(1);
XinZhangMS 0:f7f1f0d76dd6 66 }
XinZhangMS 0:f7f1f0d76dd6 67
XinZhangMS 0:f7f1f0d76dd6 68 ThreadAPI_Exit(0);
XinZhangMS 0:f7f1f0d76dd6 69 return 0;
XinZhangMS 0:f7f1f0d76dd6 70 }
XinZhangMS 0:f7f1f0d76dd6 71
XinZhangMS 0:f7f1f0d76dd6 72 static IOTHUB_MESSAGING_RESULT StartWorkerThreadIfNeeded(IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance)
XinZhangMS 0:f7f1f0d76dd6 73 {
XinZhangMS 0:f7f1f0d76dd6 74 IOTHUB_MESSAGING_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 75 if (iotHubMessagingClientInstance->ThreadHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 76 {
XinZhangMS 0:f7f1f0d76dd6 77 iotHubMessagingClientInstance->StopThread = 0;
XinZhangMS 0:f7f1f0d76dd6 78 if (ThreadAPI_Create(&iotHubMessagingClientInstance->ThreadHandle, ScheduleWork_Thread, iotHubMessagingClientInstance) != THREADAPI_OK)
XinZhangMS 0:f7f1f0d76dd6 79 {
XinZhangMS 0:f7f1f0d76dd6 80 LogError("ThreadAPI_Create failed");
XinZhangMS 0:f7f1f0d76dd6 81 result = IOTHUB_MESSAGING_ERROR;
XinZhangMS 0:f7f1f0d76dd6 82 }
XinZhangMS 0:f7f1f0d76dd6 83 else
XinZhangMS 0:f7f1f0d76dd6 84 {
XinZhangMS 0:f7f1f0d76dd6 85 result = IOTHUB_MESSAGING_OK;
XinZhangMS 0:f7f1f0d76dd6 86 }
XinZhangMS 0:f7f1f0d76dd6 87 }
XinZhangMS 0:f7f1f0d76dd6 88 else
XinZhangMS 0:f7f1f0d76dd6 89 {
XinZhangMS 0:f7f1f0d76dd6 90 result = IOTHUB_MESSAGING_OK;
XinZhangMS 0:f7f1f0d76dd6 91 }
XinZhangMS 0:f7f1f0d76dd6 92 return result;
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94
XinZhangMS 0:f7f1f0d76dd6 95 IOTHUB_MESSAGING_CLIENT_HANDLE IoTHubMessaging_Create(IOTHUB_SERVICE_CLIENT_AUTH_HANDLE serviceClientHandle)
XinZhangMS 0:f7f1f0d76dd6 96 {
XinZhangMS 0:f7f1f0d76dd6 97 IOTHUB_MESSAGING_CLIENT_INSTANCE* result;
XinZhangMS 0:f7f1f0d76dd6 98
XinZhangMS 0:f7f1f0d76dd6 99 /*Codes_SRS_IOTHUBMESSAGING_12_001: [ IoTHubMessaging_Create shall verify the serviceClientHandle input parameter and if it is NULL then return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 100 if (serviceClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 101 {
XinZhangMS 0:f7f1f0d76dd6 102 LogError("serviceClientHandle input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 103 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 104 }
XinZhangMS 0:f7f1f0d76dd6 105 else
XinZhangMS 0:f7f1f0d76dd6 106 {
XinZhangMS 0:f7f1f0d76dd6 107 /*Codes_SRS_IOTHUBMESSAGING_12_002: [ IoTHubMessaging_Create shall allocate a new IoTHubMessagingClient instance. ]*/
XinZhangMS 0:f7f1f0d76dd6 108 if ((result = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)malloc(sizeof(IOTHUB_MESSAGING_CLIENT_INSTANCE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 109 {
XinZhangMS 0:f7f1f0d76dd6 110 /*Codes_SRS_IOTHUBMESSAGING_12_003: [If allocating memory for the new IoTHubMessagingClient instance fails, then IoTHubMessaging_Create shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 111 LogError("malloc failed for IoTHubMessagingClient");
XinZhangMS 0:f7f1f0d76dd6 112 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 113 }
XinZhangMS 0:f7f1f0d76dd6 114 else
XinZhangMS 0:f7f1f0d76dd6 115 {
XinZhangMS 0:f7f1f0d76dd6 116 /*Codes_SRS_IOTHUBMESSAGING_12_004: [IoTHubMessaging_Create shall create a lock object to be used later for serializing IoTHubMessagingClient calls. ]*/
XinZhangMS 0:f7f1f0d76dd6 117 result->LockHandle = Lock_Init();
XinZhangMS 0:f7f1f0d76dd6 118 if (result->LockHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 119 {
XinZhangMS 0:f7f1f0d76dd6 120 /*Codes_SRS_IOTHUBMESSAGING_12_005: [If creating the lock fails, then IoTHubMessaging_Create shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 121 /*Codes_SRS_IOTHUBMESSAGING_12_008: [If IoTHubMessaging_Create fails, all resources allocated by it shall be freed. ]*/
XinZhangMS 0:f7f1f0d76dd6 122 LogError("Lock_Init failed");
XinZhangMS 0:f7f1f0d76dd6 123 free(result);
XinZhangMS 0:f7f1f0d76dd6 124 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 125 }
XinZhangMS 0:f7f1f0d76dd6 126 else
XinZhangMS 0:f7f1f0d76dd6 127 {
XinZhangMS 0:f7f1f0d76dd6 128 /*Codes_SRS_IOTHUBMESSAGING_12_006: [IoTHubMessaging_Create shall instantiate a new IoTHubMessaging_LL instance by calling IoTHubMessaging_LL_Create and passing the serviceClientHandle argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 129 result->IoTHubMessagingHandle = IoTHubMessaging_LL_Create(serviceClientHandle);
XinZhangMS 0:f7f1f0d76dd6 130 if (result->IoTHubMessagingHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 131 {
XinZhangMS 0:f7f1f0d76dd6 132 /*Codes_SRS_IOTHUBMESSAGING_12_007: [ If IoTHubMessaging_LL_Create fails, then IoTHubMessaging_Create shall return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 133 /*Codes_SRS_IOTHUBMESSAGING_12_008: [If IoTHubMessaging_Create fails, all resources allocated by it shall be freed. ]*/
XinZhangMS 0:f7f1f0d76dd6 134 LogError("IoTHubMessaging_LL_Create failed");
XinZhangMS 0:f7f1f0d76dd6 135 Lock_Deinit(result->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 136 free(result);
XinZhangMS 0:f7f1f0d76dd6 137 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 138 }
XinZhangMS 0:f7f1f0d76dd6 139 else
XinZhangMS 0:f7f1f0d76dd6 140 {
XinZhangMS 0:f7f1f0d76dd6 141 result->StopThread = 0;
XinZhangMS 0:f7f1f0d76dd6 142 result->ThreadHandle = NULL;
XinZhangMS 0:f7f1f0d76dd6 143 }
XinZhangMS 0:f7f1f0d76dd6 144 }
XinZhangMS 0:f7f1f0d76dd6 145 }
XinZhangMS 0:f7f1f0d76dd6 146 }
XinZhangMS 0:f7f1f0d76dd6 147 return (IOTHUB_MESSAGING_CLIENT_HANDLE)result;
XinZhangMS 0:f7f1f0d76dd6 148 }
XinZhangMS 0:f7f1f0d76dd6 149
XinZhangMS 0:f7f1f0d76dd6 150 void IoTHubMessaging_Destroy(IOTHUB_MESSAGING_CLIENT_HANDLE messagingClientHandle)
XinZhangMS 0:f7f1f0d76dd6 151 {
XinZhangMS 0:f7f1f0d76dd6 152 /*Codes_SRS_IOTHUBMESSAGING_12_009: [ IoTHubMessaging_Destroy shall do nothing if parameter messagingClientHandle is NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 153 if (messagingClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 154 {
XinZhangMS 0:f7f1f0d76dd6 155 LogError("messagingClientHandle input parameter is NULL");
XinZhangMS 0:f7f1f0d76dd6 156 }
XinZhangMS 0:f7f1f0d76dd6 157 else
XinZhangMS 0:f7f1f0d76dd6 158 {
XinZhangMS 0:f7f1f0d76dd6 159 IOTHUB_MESSAGING_CLIENT_INSTANCE* messagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)messagingClientHandle;
XinZhangMS 0:f7f1f0d76dd6 160
XinZhangMS 0:f7f1f0d76dd6 161 /*Codes_SRS_IOTHUBMESSAGING_12_011: [ IoTHubMessaging_Destroy shall destroy IoTHubMessagingHandle by call IoTHubMessaging_LL_Destroy. ]*/
XinZhangMS 0:f7f1f0d76dd6 162 IoTHubMessaging_LL_Destroy(messagingClientInstance->IoTHubMessagingHandle);
XinZhangMS 0:f7f1f0d76dd6 163
XinZhangMS 0:f7f1f0d76dd6 164 /*Codes_SRS_IOTHUBMESSAGING_12_014: [ If the lock was allocated in IoTHubMessaging_Create, it shall be also freed. ]*/
XinZhangMS 0:f7f1f0d76dd6 165 Lock_Deinit(messagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 166
XinZhangMS 0:f7f1f0d76dd6 167 free(messagingClientInstance);
XinZhangMS 0:f7f1f0d76dd6 168 }
XinZhangMS 0:f7f1f0d76dd6 169 }
XinZhangMS 0:f7f1f0d76dd6 170
XinZhangMS 0:f7f1f0d76dd6 171 IOTHUB_MESSAGING_RESULT IoTHubMessaging_Open(IOTHUB_MESSAGING_CLIENT_HANDLE messagingClientHandle, IOTHUB_OPEN_COMPLETE_CALLBACK openCompleteCallback, void* userContextCallback)
XinZhangMS 0:f7f1f0d76dd6 172 {
XinZhangMS 0:f7f1f0d76dd6 173 IOTHUB_MESSAGING_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 174
XinZhangMS 0:f7f1f0d76dd6 175 if (messagingClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 /*Codes_SRS_IOTHUBMESSAGING_12_015: [ If messagingClientHandle is NULL, IoTHubMessaging_Open shall return IOTHUB_MESSAGING_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 178 LogError("NULL messagingClientHandle");
XinZhangMS 0:f7f1f0d76dd6 179 result = IOTHUB_MESSAGING_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 180 }
XinZhangMS 0:f7f1f0d76dd6 181 else
XinZhangMS 0:f7f1f0d76dd6 182 {
XinZhangMS 0:f7f1f0d76dd6 183 IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)messagingClientHandle;
XinZhangMS 0:f7f1f0d76dd6 184
XinZhangMS 0:f7f1f0d76dd6 185 /*Codes_SRS_IOTHUBMESSAGING_12_016: [ IoTHubMessaging_Open shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 186 if (Lock(iotHubMessagingClientInstance->LockHandle) != LOCK_OK)
XinZhangMS 0:f7f1f0d76dd6 187 {
XinZhangMS 0:f7f1f0d76dd6 188 /*Codes_SRS_IOTHUBMESSAGING_12_017: [ If acquiring the lock fails, IoTHubMessaging_Open shall return IOTHUB_MESSAGING_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 189 LogError("Could not acquire lock");
XinZhangMS 0:f7f1f0d76dd6 190 result = IOTHUB_MESSAGING_ERROR;
XinZhangMS 0:f7f1f0d76dd6 191 }
XinZhangMS 0:f7f1f0d76dd6 192 else
XinZhangMS 0:f7f1f0d76dd6 193 {
XinZhangMS 0:f7f1f0d76dd6 194 /*Codes_SRS_IOTHUBMESSAGING_12_018: [ IoTHubMessaging_Open shall call IoTHubMessaging_LL_Open, while passing the IOTHUB_MESSAGING_HANDLE handle created by IoTHubMessaging_Create and the parameters openCompleteCallback and userContextCallback. ]*/
XinZhangMS 0:f7f1f0d76dd6 195 /*Codes_SRS_IOTHUBMESSAGING_12_019: [ When IoTHubMessaging_LL_Open is called, IoTHubMessaging_Open shall return the result of IoTHubMessaging_LL_Open. ]*/
XinZhangMS 0:f7f1f0d76dd6 196 result = IoTHubMessaging_LL_Open(messagingClientHandle->IoTHubMessagingHandle, openCompleteCallback, userContextCallback);
XinZhangMS 0:f7f1f0d76dd6 197
XinZhangMS 0:f7f1f0d76dd6 198 /*Codes_SRS_IOTHUBMESSAGING_12_016: [ IoTHubMessaging_Open shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 199 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 200 }
XinZhangMS 0:f7f1f0d76dd6 201 }
XinZhangMS 0:f7f1f0d76dd6 202
XinZhangMS 0:f7f1f0d76dd6 203 return result;
XinZhangMS 0:f7f1f0d76dd6 204 }
XinZhangMS 0:f7f1f0d76dd6 205
XinZhangMS 0:f7f1f0d76dd6 206 void IoTHubMessaging_Close(IOTHUB_MESSAGING_CLIENT_HANDLE messagingClientHandle)
XinZhangMS 0:f7f1f0d76dd6 207 {
XinZhangMS 0:f7f1f0d76dd6 208 if (messagingClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 209 {
XinZhangMS 0:f7f1f0d76dd6 210 /*Codes_SRS_IOTHUBMESSAGING_12_021: [ If messagingClientHandle is NULL, IoTHubMessaging_Close shall return IOTHUB_MESSAGING_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 211 LogError("NULL messagingClientHandle");
XinZhangMS 0:f7f1f0d76dd6 212 }
XinZhangMS 0:f7f1f0d76dd6 213 else
XinZhangMS 0:f7f1f0d76dd6 214 {
XinZhangMS 0:f7f1f0d76dd6 215 IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)messagingClientHandle;
XinZhangMS 0:f7f1f0d76dd6 216
XinZhangMS 0:f7f1f0d76dd6 217 /*Codes_SRS_IOTHUBMESSAGING_12_022: [ IoTHubMessaging_Close shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 218 if (Lock(iotHubMessagingClientInstance->LockHandle) != LOCK_OK)
XinZhangMS 0:f7f1f0d76dd6 219 {
XinZhangMS 0:f7f1f0d76dd6 220 LogError("Could not acquire lock");
XinZhangMS 0:f7f1f0d76dd6 221 iotHubMessagingClientInstance->StopThread = 1; /*setting it even when Lock fails*/
XinZhangMS 0:f7f1f0d76dd6 222 }
XinZhangMS 0:f7f1f0d76dd6 223 else
XinZhangMS 0:f7f1f0d76dd6 224 {
XinZhangMS 0:f7f1f0d76dd6 225 iotHubMessagingClientInstance->StopThread = 1;
XinZhangMS 0:f7f1f0d76dd6 226
XinZhangMS 0:f7f1f0d76dd6 227 /*Codes_SRS_IOTHUBMESSAGING_12_022: [ IoTHubMessaging_Close shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 228 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 229 }
XinZhangMS 0:f7f1f0d76dd6 230
XinZhangMS 0:f7f1f0d76dd6 231 if (iotHubMessagingClientInstance->ThreadHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 232 {
XinZhangMS 0:f7f1f0d76dd6 233 int res;
XinZhangMS 0:f7f1f0d76dd6 234 /*Codes_SRS_IOTHUBMESSAGING_12_013: [ The thread created as part of executing IoTHubMessaging_SendAsync shall be joined. ]*/
XinZhangMS 0:f7f1f0d76dd6 235 if (ThreadAPI_Join(iotHubMessagingClientInstance->ThreadHandle, &res) != THREADAPI_OK)
XinZhangMS 0:f7f1f0d76dd6 236 {
XinZhangMS 0:f7f1f0d76dd6 237 LogError("ThreadAPI_Join failed");
XinZhangMS 0:f7f1f0d76dd6 238 }
XinZhangMS 0:f7f1f0d76dd6 239 }
XinZhangMS 0:f7f1f0d76dd6 240
XinZhangMS 0:f7f1f0d76dd6 241 /*Codes_SRS_IOTHUBMESSAGING_12_024: [ IoTHubMessaging_Close shall call IoTHubMessaging_LL_Close, while passing the IOTHUB_MESSAGING_HANDLE handle created by IoTHubMessaging_Create ]*/
XinZhangMS 0:f7f1f0d76dd6 242 IoTHubMessaging_LL_Close(messagingClientHandle->IoTHubMessagingHandle);
XinZhangMS 0:f7f1f0d76dd6 243 }
XinZhangMS 0:f7f1f0d76dd6 244 }
XinZhangMS 0:f7f1f0d76dd6 245
XinZhangMS 0:f7f1f0d76dd6 246 IOTHUB_MESSAGING_RESULT IoTHubMessaging_SetFeedbackMessageCallback(IOTHUB_MESSAGING_CLIENT_HANDLE messagingClientHandle, IOTHUB_FEEDBACK_MESSAGE_RECEIVED_CALLBACK feedbackMessageReceivedCallback, void* userContextCallback)
XinZhangMS 0:f7f1f0d76dd6 247 {
XinZhangMS 0:f7f1f0d76dd6 248 IOTHUB_MESSAGING_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 249
XinZhangMS 0:f7f1f0d76dd6 250 if (messagingClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 251 {
XinZhangMS 0:f7f1f0d76dd6 252 /*Codes_SRS_IOTHUBMESSAGING_12_027: [ If messagingClientHandle is NULL, IoTHubMessaging_SetFeedbackMessageCallback shall return IOTHUB_MESSAGING_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 253 LogError("NULL messagingClientHandle");
XinZhangMS 0:f7f1f0d76dd6 254 result = IOTHUB_MESSAGING_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 255 }
XinZhangMS 0:f7f1f0d76dd6 256 else
XinZhangMS 0:f7f1f0d76dd6 257 {
XinZhangMS 0:f7f1f0d76dd6 258 IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)messagingClientHandle;
XinZhangMS 0:f7f1f0d76dd6 259
XinZhangMS 0:f7f1f0d76dd6 260 /*Codes_SRS_IOTHUBMESSAGING_12_028: [ IoTHubMessaging_SetFeedbackMessageCallback shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 261 if (Lock(iotHubMessagingClientInstance->LockHandle) != LOCK_OK)
XinZhangMS 0:f7f1f0d76dd6 262 {
XinZhangMS 0:f7f1f0d76dd6 263 /*Codes_SRS_IOTHUBMESSAGING_12_029: [ If acquiring the lock fails, IoTHubMessaging_SetFeedbackMessageCallback shall return IOTHUB_MESSAGING_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 264 LogError("Could not acquire lock");
XinZhangMS 0:f7f1f0d76dd6 265 result = IOTHUB_MESSAGING_ERROR;
XinZhangMS 0:f7f1f0d76dd6 266 }
XinZhangMS 0:f7f1f0d76dd6 267 else
XinZhangMS 0:f7f1f0d76dd6 268 {
XinZhangMS 0:f7f1f0d76dd6 269 /*Codes_SRS_IOTHUBMESSAGING_12_030: [ IoTHubMessaging_SetFeedbackMessageCallback shall call IoTHubMessaging_LL_SetFeedbackMessageCallback, while passing the IOTHUB_MESSAGING_HANDLE handle created by IoTHubMessaging_Create, feedbackMessageReceivedCallback and userContextCallback ]*/
XinZhangMS 0:f7f1f0d76dd6 270 /*Codes_SRS_IOTHUBMESSAGING_12_031: [ When IoTHubMessaging_LL_SetFeedbackMessageCallback is called, IoTHubMessaging_SetFeedbackMessageCallback shall return the result of IoTHubMessaging_LL_SetFeedbackMessageCallback. ]*/
XinZhangMS 0:f7f1f0d76dd6 271 result = IoTHubMessaging_LL_SetFeedbackMessageCallback(messagingClientHandle->IoTHubMessagingHandle, feedbackMessageReceivedCallback, userContextCallback);
XinZhangMS 0:f7f1f0d76dd6 272
XinZhangMS 0:f7f1f0d76dd6 273 /*Codes_SRS_IOTHUBMESSAGING_12_032: [ IoTHubMessaging_SetFeedbackMessageCallback shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 274 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 275 }
XinZhangMS 0:f7f1f0d76dd6 276 }
XinZhangMS 0:f7f1f0d76dd6 277
XinZhangMS 0:f7f1f0d76dd6 278 return result;
XinZhangMS 0:f7f1f0d76dd6 279 }
XinZhangMS 0:f7f1f0d76dd6 280
XinZhangMS 0:f7f1f0d76dd6 281
XinZhangMS 0:f7f1f0d76dd6 282
XinZhangMS 0:f7f1f0d76dd6 283
XinZhangMS 0:f7f1f0d76dd6 284 IOTHUB_MESSAGING_RESULT IoTHubMessaging_SendAsync(IOTHUB_MESSAGING_CLIENT_HANDLE messagingClientHandle, const char* deviceId, IOTHUB_MESSAGE_HANDLE message, IOTHUB_SEND_COMPLETE_CALLBACK sendCompleteCallback, void* userContextCallback)
XinZhangMS 0:f7f1f0d76dd6 285 {
XinZhangMS 0:f7f1f0d76dd6 286 IOTHUB_MESSAGING_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 287
XinZhangMS 0:f7f1f0d76dd6 288 if (messagingClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 289 {
XinZhangMS 0:f7f1f0d76dd6 290 /*Codes_SRS_IOTHUBMESSAGING_12_033: [ If messagingClientHandle is NULL, IoTHubMessaging_SendAsync shall return IOTHUB_MESSAGING_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 291 LogError("NULL iothubClientHandle");
XinZhangMS 0:f7f1f0d76dd6 292 result = IOTHUB_MESSAGING_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 293 }
XinZhangMS 0:f7f1f0d76dd6 294 else
XinZhangMS 0:f7f1f0d76dd6 295 {
XinZhangMS 0:f7f1f0d76dd6 296 IOTHUB_MESSAGING_CLIENT_INSTANCE* iotHubMessagingClientInstance = (IOTHUB_MESSAGING_CLIENT_INSTANCE*)messagingClientHandle;
XinZhangMS 0:f7f1f0d76dd6 297
XinZhangMS 0:f7f1f0d76dd6 298 /*Codes_SRS_IOTHUBMESSAGING_12_034: [ IoTHubMessaging_SendAsync shall be made thread-safe by using the lock created in IoTHubMessaging_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 299 if (Lock(iotHubMessagingClientInstance->LockHandle) != LOCK_OK)
XinZhangMS 0:f7f1f0d76dd6 300 {
XinZhangMS 0:f7f1f0d76dd6 301 /*Codes_SRS_IOTHUBMESSAGING_12_035: [ If acquiring the lock fails, IoTHubMessaging_SendAsync shall return IOTHUB_MESSAGING_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 302 LogError("Could not acquire lock");
XinZhangMS 0:f7f1f0d76dd6 303 result = IOTHUB_MESSAGING_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 304 }
XinZhangMS 0:f7f1f0d76dd6 305 else
XinZhangMS 0:f7f1f0d76dd6 306 {
XinZhangMS 0:f7f1f0d76dd6 307 /*Codes_SRS_IOTHUBMESSAGING_12_036: [ IoTHubClient_SendEventAsync shall start the worker thread if it was not previously started. ]*/
XinZhangMS 0:f7f1f0d76dd6 308 if ((result = StartWorkerThreadIfNeeded(iotHubMessagingClientInstance)) != IOTHUB_MESSAGING_OK)
XinZhangMS 0:f7f1f0d76dd6 309 {
XinZhangMS 0:f7f1f0d76dd6 310 /*Codes_SRS_IOTHUBMESSAGING_12_037: [ If starting the thread fails, IoTHubClient_SendEventAsync shall return IOTHUB_CLIENT_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 311 LogError("Could not start worker thread");
XinZhangMS 0:f7f1f0d76dd6 312 result = IOTHUB_MESSAGING_ERROR;
XinZhangMS 0:f7f1f0d76dd6 313 }
XinZhangMS 0:f7f1f0d76dd6 314 else
XinZhangMS 0:f7f1f0d76dd6 315 {
XinZhangMS 0:f7f1f0d76dd6 316 /*Codes_SRS_IOTHUBMESSAGING_12_038: [ IoTHubMessaging_SendAsync shall call IoTHubMessaging_LL_Send, while passing the IOTHUB_MESSAGING_HANDLE handle created by IoTHubClient_Create and the parameters deviceId, message, sendCompleteCallback and userContextCallback.*/
XinZhangMS 0:f7f1f0d76dd6 317 /*Codes_SRS_IOTHUBMESSAGING_12_039: [ When IoTHubMessaging_LL_Send is called, IoTHubMessaging_SendAsync shall return the result of IoTHubMessaging_LL_Send. ]*/
XinZhangMS 0:f7f1f0d76dd6 318 result = IoTHubMessaging_LL_Send(iotHubMessagingClientInstance->IoTHubMessagingHandle, deviceId, message, sendCompleteCallback, userContextCallback);
XinZhangMS 0:f7f1f0d76dd6 319 }
XinZhangMS 0:f7f1f0d76dd6 320
XinZhangMS 0:f7f1f0d76dd6 321 /*Codes_SRS_IOTHUBMESSAGING_12_040: [ IoTHubClient_SendEventAsync shall be made thread-safe by using the lock created in IoTHubClient_Create. ]*/
XinZhangMS 0:f7f1f0d76dd6 322 (void)Unlock(iotHubMessagingClientInstance->LockHandle);
XinZhangMS 0:f7f1f0d76dd6 323 }
XinZhangMS 0:f7f1f0d76dd6 324 }
XinZhangMS 0:f7f1f0d76dd6 325
XinZhangMS 0:f7f1f0d76dd6 326 return result;
XinZhangMS 0:f7f1f0d76dd6 327 }
XinZhangMS 0:f7f1f0d76dd6 328