Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
iothub_service_client/src/iothub_messaging.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- 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?
| User | Revision | Line number | New 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 |