Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Sat Jan 28 09:35:22 2017 -0800
Revision:
19:2e0811512ceb
Parent:
13:920e00014ee3
Child:
21:b92006c5b9ff
1.1.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #include <stddef.h>
Azure.IoT Build 0:fa2de1b79154 6 #include <stdio.h>
Azure.IoT Build 0:fa2de1b79154 7 #include <string.h>
Azure.IoT Build 0:fa2de1b79154 8 #include "azure_c_shared_utility/socketio.h"
AzureIoTClient 13:920e00014ee3 9 #include "azure_c_shared_utility/singlylinkedlist.h"
Azure.IoT Build 0:fa2de1b79154 10 #include "azure_c_shared_utility/tcpsocketconnection_c.h"
Azure.IoT Build 6:c55b013dfc2a 11 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13 #define UNABLE_TO_COMPLETE -2
AzureIoTClient 1:9190c0f4d23a 14 #define MBED_RECEIVE_BYTES_VALUE 128
Azure.IoT Build 0:fa2de1b79154 15
Azure.IoT Build 0:fa2de1b79154 16 typedef enum IO_STATE_TAG
Azure.IoT Build 0:fa2de1b79154 17 {
Azure.IoT Build 0:fa2de1b79154 18 IO_STATE_CLOSED,
Azure.IoT Build 0:fa2de1b79154 19 IO_STATE_OPENING,
Azure.IoT Build 0:fa2de1b79154 20 IO_STATE_OPEN,
Azure.IoT Build 0:fa2de1b79154 21 IO_STATE_CLOSING,
Azure.IoT Build 0:fa2de1b79154 22 IO_STATE_ERROR
Azure.IoT Build 0:fa2de1b79154 23 } IO_STATE;
Azure.IoT Build 0:fa2de1b79154 24
Azure.IoT Build 0:fa2de1b79154 25 typedef struct PENDING_SOCKET_IO_TAG
Azure.IoT Build 0:fa2de1b79154 26 {
Azure.IoT Build 0:fa2de1b79154 27 unsigned char* bytes;
Azure.IoT Build 0:fa2de1b79154 28 size_t size;
Azure.IoT Build 0:fa2de1b79154 29 ON_SEND_COMPLETE on_send_complete;
Azure.IoT Build 0:fa2de1b79154 30 void* callback_context;
AzureIoTClient 13:920e00014ee3 31 SINGLYLINKEDLIST_HANDLE pending_io_list;
Azure.IoT Build 0:fa2de1b79154 32 } PENDING_SOCKET_IO;
Azure.IoT Build 0:fa2de1b79154 33
Azure.IoT Build 0:fa2de1b79154 34 typedef struct SOCKET_IO_INSTANCE_TAG
Azure.IoT Build 0:fa2de1b79154 35 {
Azure.IoT Build 0:fa2de1b79154 36 TCPSOCKETCONNECTION_HANDLE tcp_socket_connection;
Azure.IoT Build 0:fa2de1b79154 37 ON_BYTES_RECEIVED on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 38 ON_IO_ERROR on_io_error;
Azure.IoT Build 0:fa2de1b79154 39 void* on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 40 void* on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 41 char* hostname;
Azure.IoT Build 0:fa2de1b79154 42 int port;
Azure.IoT Build 0:fa2de1b79154 43 IO_STATE io_state;
AzureIoTClient 13:920e00014ee3 44 SINGLYLINKEDLIST_HANDLE pending_io_list;
Azure.IoT Build 0:fa2de1b79154 45 } SOCKET_IO_INSTANCE;
Azure.IoT Build 0:fa2de1b79154 46
AzureIoTClient 10:1be0bc9a9deb 47 /*this function will clone an option given by name and value*/
AzureIoTClient 10:1be0bc9a9deb 48 static void* socketio_CloneOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 49 {
AzureIoTClient 10:1be0bc9a9deb 50 (void)(name, value);
AzureIoTClient 10:1be0bc9a9deb 51 return NULL;
AzureIoTClient 10:1be0bc9a9deb 52 }
AzureIoTClient 10:1be0bc9a9deb 53
AzureIoTClient 10:1be0bc9a9deb 54 /*this function destroys an option previously created*/
AzureIoTClient 10:1be0bc9a9deb 55 static void socketio_DestroyOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 56 {
AzureIoTClient 10:1be0bc9a9deb 57 (void)(name, value);
AzureIoTClient 10:1be0bc9a9deb 58 }
AzureIoTClient 10:1be0bc9a9deb 59
AzureIoTClient 10:1be0bc9a9deb 60 static OPTIONHANDLER_HANDLE socketio_retrieveoptions(CONCRETE_IO_HANDLE socket_io)
AzureIoTClient 10:1be0bc9a9deb 61 {
AzureIoTClient 10:1be0bc9a9deb 62 OPTIONHANDLER_HANDLE result;
AzureIoTClient 10:1be0bc9a9deb 63 (void)socket_io;
AzureIoTClient 10:1be0bc9a9deb 64 result = OptionHandler_Create(socketio_CloneOption, socketio_DestroyOption, socketio_setoption);
AzureIoTClient 10:1be0bc9a9deb 65 if (result == NULL)
AzureIoTClient 10:1be0bc9a9deb 66 {
AzureIoTClient 10:1be0bc9a9deb 67 /*return as is*/
AzureIoTClient 10:1be0bc9a9deb 68 }
AzureIoTClient 10:1be0bc9a9deb 69 else
AzureIoTClient 10:1be0bc9a9deb 70 {
AzureIoTClient 10:1be0bc9a9deb 71 /*insert here work to add the options to "result" handle*/
AzureIoTClient 10:1be0bc9a9deb 72 }
AzureIoTClient 10:1be0bc9a9deb 73 return result;
AzureIoTClient 10:1be0bc9a9deb 74 }
AzureIoTClient 10:1be0bc9a9deb 75
Azure.IoT Build 0:fa2de1b79154 76 static const IO_INTERFACE_DESCRIPTION socket_io_interface_description =
Azure.IoT Build 0:fa2de1b79154 77 {
AzureIoTClient 10:1be0bc9a9deb 78 socketio_retrieveoptions,
Azure.IoT Build 0:fa2de1b79154 79 socketio_create,
Azure.IoT Build 0:fa2de1b79154 80 socketio_destroy,
Azure.IoT Build 0:fa2de1b79154 81 socketio_open,
Azure.IoT Build 0:fa2de1b79154 82 socketio_close,
Azure.IoT Build 0:fa2de1b79154 83 socketio_send,
Azure.IoT Build 0:fa2de1b79154 84 socketio_dowork,
Azure.IoT Build 0:fa2de1b79154 85 socketio_setoption
Azure.IoT Build 0:fa2de1b79154 86 };
Azure.IoT Build 0:fa2de1b79154 87
Azure.IoT Build 0:fa2de1b79154 88 static void indicate_error(SOCKET_IO_INSTANCE* socket_io_instance)
Azure.IoT Build 0:fa2de1b79154 89 {
Azure.IoT Build 0:fa2de1b79154 90 if (socket_io_instance->on_io_error != NULL)
Azure.IoT Build 0:fa2de1b79154 91 {
Azure.IoT Build 0:fa2de1b79154 92 socket_io_instance->on_io_error(socket_io_instance->on_io_error_context);
Azure.IoT Build 0:fa2de1b79154 93 }
Azure.IoT Build 0:fa2de1b79154 94 }
Azure.IoT Build 0:fa2de1b79154 95
Azure.IoT Build 0:fa2de1b79154 96 static int add_pending_io(SOCKET_IO_INSTANCE* socket_io_instance, const unsigned char* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context)
Azure.IoT Build 0:fa2de1b79154 97 {
Azure.IoT Build 0:fa2de1b79154 98 int result;
Azure.IoT Build 0:fa2de1b79154 99 PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)malloc(sizeof(PENDING_SOCKET_IO));
Azure.IoT Build 0:fa2de1b79154 100 if (pending_socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 101 {
Azure.IoT Build 0:fa2de1b79154 102 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 103 }
Azure.IoT Build 0:fa2de1b79154 104 else
Azure.IoT Build 0:fa2de1b79154 105 {
Azure.IoT Build 0:fa2de1b79154 106 pending_socket_io->bytes = (unsigned char*)malloc(size);
Azure.IoT Build 0:fa2de1b79154 107 if (pending_socket_io->bytes == NULL)
Azure.IoT Build 0:fa2de1b79154 108 {
Azure.IoT Build 0:fa2de1b79154 109 free(pending_socket_io);
Azure.IoT Build 0:fa2de1b79154 110 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 111 }
Azure.IoT Build 0:fa2de1b79154 112 else
Azure.IoT Build 0:fa2de1b79154 113 {
Azure.IoT Build 0:fa2de1b79154 114 pending_socket_io->size = size;
Azure.IoT Build 0:fa2de1b79154 115 pending_socket_io->on_send_complete = on_send_complete;
Azure.IoT Build 0:fa2de1b79154 116 pending_socket_io->callback_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 117 pending_socket_io->pending_io_list = socket_io_instance->pending_io_list;
Azure.IoT Build 0:fa2de1b79154 118 (void)memcpy(pending_socket_io->bytes, buffer, size);
Azure.IoT Build 0:fa2de1b79154 119
AzureIoTClient 13:920e00014ee3 120 if (singlylinkedlist_add(socket_io_instance->pending_io_list, pending_socket_io) == NULL)
Azure.IoT Build 0:fa2de1b79154 121 {
Azure.IoT Build 0:fa2de1b79154 122 free(pending_socket_io->bytes);
Azure.IoT Build 0:fa2de1b79154 123 free(pending_socket_io);
Azure.IoT Build 0:fa2de1b79154 124 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 125 }
Azure.IoT Build 0:fa2de1b79154 126 else
Azure.IoT Build 0:fa2de1b79154 127 {
Azure.IoT Build 0:fa2de1b79154 128 result = 0;
Azure.IoT Build 0:fa2de1b79154 129 }
Azure.IoT Build 0:fa2de1b79154 130 }
Azure.IoT Build 0:fa2de1b79154 131 }
Azure.IoT Build 0:fa2de1b79154 132
Azure.IoT Build 0:fa2de1b79154 133 return result;
Azure.IoT Build 0:fa2de1b79154 134 }
Azure.IoT Build 0:fa2de1b79154 135
Azure.IoT Build 6:c55b013dfc2a 136 CONCRETE_IO_HANDLE socketio_create(void* io_create_parameters)
Azure.IoT Build 0:fa2de1b79154 137 {
Azure.IoT Build 0:fa2de1b79154 138 SOCKETIO_CONFIG* socket_io_config = io_create_parameters;
Azure.IoT Build 0:fa2de1b79154 139 SOCKET_IO_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 140
Azure.IoT Build 0:fa2de1b79154 141 if (socket_io_config == NULL)
Azure.IoT Build 0:fa2de1b79154 142 {
Azure.IoT Build 0:fa2de1b79154 143 result = NULL;
Azure.IoT Build 0:fa2de1b79154 144 }
Azure.IoT Build 0:fa2de1b79154 145 else
Azure.IoT Build 0:fa2de1b79154 146 {
Azure.IoT Build 0:fa2de1b79154 147 result = malloc(sizeof(SOCKET_IO_INSTANCE));
Azure.IoT Build 0:fa2de1b79154 148 if (result != NULL)
Azure.IoT Build 0:fa2de1b79154 149 {
AzureIoTClient 13:920e00014ee3 150 result->pending_io_list = singlylinkedlist_create();
Azure.IoT Build 0:fa2de1b79154 151 if (result->pending_io_list == NULL)
Azure.IoT Build 0:fa2de1b79154 152 {
Azure.IoT Build 0:fa2de1b79154 153 free(result);
Azure.IoT Build 0:fa2de1b79154 154 result = NULL;
Azure.IoT Build 0:fa2de1b79154 155 }
Azure.IoT Build 0:fa2de1b79154 156 else
Azure.IoT Build 0:fa2de1b79154 157 {
Azure.IoT Build 0:fa2de1b79154 158 result->hostname = (char*)malloc(strlen(socket_io_config->hostname) + 1);
Azure.IoT Build 0:fa2de1b79154 159 if (result->hostname == NULL)
Azure.IoT Build 0:fa2de1b79154 160 {
AzureIoTClient 13:920e00014ee3 161 singlylinkedlist_destroy(result->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 162 free(result);
Azure.IoT Build 0:fa2de1b79154 163 result = NULL;
Azure.IoT Build 0:fa2de1b79154 164 }
Azure.IoT Build 0:fa2de1b79154 165 else
Azure.IoT Build 0:fa2de1b79154 166 {
Azure.IoT Build 0:fa2de1b79154 167 strcpy(result->hostname, socket_io_config->hostname);
Azure.IoT Build 0:fa2de1b79154 168 result->port = socket_io_config->port;
Azure.IoT Build 0:fa2de1b79154 169 result->on_bytes_received = NULL;
Azure.IoT Build 0:fa2de1b79154 170 result->on_io_error = NULL;
Azure.IoT Build 0:fa2de1b79154 171 result->on_bytes_received_context = NULL;
Azure.IoT Build 0:fa2de1b79154 172 result->on_io_error_context = NULL;
Azure.IoT Build 0:fa2de1b79154 173 result->io_state = IO_STATE_CLOSED;
Azure.IoT Build 0:fa2de1b79154 174 result->tcp_socket_connection = NULL;
Azure.IoT Build 0:fa2de1b79154 175 }
Azure.IoT Build 0:fa2de1b79154 176 }
Azure.IoT Build 0:fa2de1b79154 177 }
Azure.IoT Build 0:fa2de1b79154 178 }
Azure.IoT Build 0:fa2de1b79154 179
Azure.IoT Build 0:fa2de1b79154 180 return result;
Azure.IoT Build 0:fa2de1b79154 181 }
Azure.IoT Build 0:fa2de1b79154 182
Azure.IoT Build 0:fa2de1b79154 183 void socketio_destroy(CONCRETE_IO_HANDLE socket_io)
Azure.IoT Build 0:fa2de1b79154 184 {
Azure.IoT Build 0:fa2de1b79154 185 if (socket_io != NULL)
Azure.IoT Build 0:fa2de1b79154 186 {
Azure.IoT Build 0:fa2de1b79154 187 SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io;
Azure.IoT Build 0:fa2de1b79154 188
Azure.IoT Build 0:fa2de1b79154 189 tcpsocketconnection_destroy(socket_io_instance->tcp_socket_connection);
Azure.IoT Build 0:fa2de1b79154 190
Azure.IoT Build 0:fa2de1b79154 191 /* clear all pending IOs */
AzureIoTClient 13:920e00014ee3 192 LIST_ITEM_HANDLE first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 193 while (first_pending_io != NULL)
Azure.IoT Build 0:fa2de1b79154 194 {
AzureIoTClient 13:920e00014ee3 195 PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)singlylinkedlist_item_get_value(first_pending_io);
Azure.IoT Build 0:fa2de1b79154 196 if (pending_socket_io != NULL)
Azure.IoT Build 0:fa2de1b79154 197 {
Azure.IoT Build 0:fa2de1b79154 198 free(pending_socket_io->bytes);
Azure.IoT Build 0:fa2de1b79154 199 free(pending_socket_io);
Azure.IoT Build 0:fa2de1b79154 200 }
Azure.IoT Build 0:fa2de1b79154 201
AzureIoTClient 13:920e00014ee3 202 (void)singlylinkedlist_remove(socket_io_instance->pending_io_list, first_pending_io);
AzureIoTClient 13:920e00014ee3 203 first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 204 }
Azure.IoT Build 0:fa2de1b79154 205
AzureIoTClient 13:920e00014ee3 206 singlylinkedlist_destroy(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 207 free(socket_io_instance->hostname);
Azure.IoT Build 0:fa2de1b79154 208 free(socket_io);
Azure.IoT Build 0:fa2de1b79154 209 }
Azure.IoT Build 0:fa2de1b79154 210 }
Azure.IoT Build 0:fa2de1b79154 211
Azure.IoT Build 0:fa2de1b79154 212 int socketio_open(CONCRETE_IO_HANDLE socket_io, ON_IO_OPEN_COMPLETE on_io_open_complete, void* on_io_open_complete_context, ON_BYTES_RECEIVED on_bytes_received, void* on_bytes_received_context, ON_IO_ERROR on_io_error, void* on_io_error_context)
Azure.IoT Build 0:fa2de1b79154 213 {
Azure.IoT Build 0:fa2de1b79154 214 int result;
Azure.IoT Build 0:fa2de1b79154 215
Azure.IoT Build 0:fa2de1b79154 216 SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io;
Azure.IoT Build 0:fa2de1b79154 217 if (socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 218 {
Azure.IoT Build 0:fa2de1b79154 219 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 220 }
Azure.IoT Build 0:fa2de1b79154 221 else
Azure.IoT Build 0:fa2de1b79154 222 {
Azure.IoT Build 0:fa2de1b79154 223 socket_io_instance->tcp_socket_connection = tcpsocketconnection_create();
Azure.IoT Build 0:fa2de1b79154 224 if (socket_io_instance->tcp_socket_connection == NULL)
Azure.IoT Build 0:fa2de1b79154 225 {
Azure.IoT Build 0:fa2de1b79154 226 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 227 }
Azure.IoT Build 0:fa2de1b79154 228 else
Azure.IoT Build 0:fa2de1b79154 229 {
Azure.IoT Build 0:fa2de1b79154 230 if (tcpsocketconnection_connect(socket_io_instance->tcp_socket_connection, socket_io_instance->hostname, socket_io_instance->port) != 0)
Azure.IoT Build 0:fa2de1b79154 231 {
Azure.IoT Build 0:fa2de1b79154 232 tcpsocketconnection_destroy(socket_io_instance->tcp_socket_connection);
Azure.IoT Build 0:fa2de1b79154 233 socket_io_instance->tcp_socket_connection = NULL;
Azure.IoT Build 0:fa2de1b79154 234 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 235 }
Azure.IoT Build 0:fa2de1b79154 236 else
Azure.IoT Build 0:fa2de1b79154 237 {
Azure.IoT Build 0:fa2de1b79154 238 tcpsocketconnection_set_blocking(socket_io_instance->tcp_socket_connection, false, 0);
Azure.IoT Build 0:fa2de1b79154 239
Azure.IoT Build 0:fa2de1b79154 240 socket_io_instance->on_bytes_received = on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 241 socket_io_instance->on_bytes_received_context = on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 242
Azure.IoT Build 0:fa2de1b79154 243 socket_io_instance->on_io_error = on_io_error;
Azure.IoT Build 0:fa2de1b79154 244 socket_io_instance->on_io_error_context = on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 245
Azure.IoT Build 0:fa2de1b79154 246 socket_io_instance->io_state = IO_STATE_OPEN;
Azure.IoT Build 0:fa2de1b79154 247
Azure.IoT Build 0:fa2de1b79154 248 result = 0;
Azure.IoT Build 0:fa2de1b79154 249 }
Azure.IoT Build 0:fa2de1b79154 250 }
Azure.IoT Build 0:fa2de1b79154 251 }
AzureIoTClient 19:2e0811512ceb 252
AzureIoTClient 19:2e0811512ceb 253 if (on_io_open_complete != NULL)
AzureIoTClient 19:2e0811512ceb 254 {
AzureIoTClient 19:2e0811512ceb 255 on_io_open_complete(on_io_open_complete_context, result == 0 ? IO_OPEN_OK : IO_OPEN_ERROR);
AzureIoTClient 19:2e0811512ceb 256 }
Azure.IoT Build 0:fa2de1b79154 257
Azure.IoT Build 0:fa2de1b79154 258 return result;
Azure.IoT Build 0:fa2de1b79154 259 }
Azure.IoT Build 0:fa2de1b79154 260
Azure.IoT Build 0:fa2de1b79154 261 int socketio_close(CONCRETE_IO_HANDLE socket_io, ON_IO_CLOSE_COMPLETE on_io_close_complete, void* callback_context)
Azure.IoT Build 0:fa2de1b79154 262 {
Azure.IoT Build 0:fa2de1b79154 263 int result = 0;
Azure.IoT Build 0:fa2de1b79154 264
Azure.IoT Build 0:fa2de1b79154 265 if (socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 266 {
Azure.IoT Build 0:fa2de1b79154 267 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 268 }
Azure.IoT Build 0:fa2de1b79154 269 else
Azure.IoT Build 0:fa2de1b79154 270 {
Azure.IoT Build 0:fa2de1b79154 271 SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io;
Azure.IoT Build 0:fa2de1b79154 272
Azure.IoT Build 0:fa2de1b79154 273 if ((socket_io_instance->io_state == IO_STATE_CLOSED) ||
Azure.IoT Build 0:fa2de1b79154 274 (socket_io_instance->io_state == IO_STATE_CLOSING))
Azure.IoT Build 0:fa2de1b79154 275 {
Azure.IoT Build 0:fa2de1b79154 276 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 277 }
Azure.IoT Build 0:fa2de1b79154 278 else
Azure.IoT Build 0:fa2de1b79154 279 {
Azure.IoT Build 0:fa2de1b79154 280 tcpsocketconnection_close(socket_io_instance->tcp_socket_connection);
Azure.IoT Build 0:fa2de1b79154 281 socket_io_instance->tcp_socket_connection = NULL;
Azure.IoT Build 0:fa2de1b79154 282 socket_io_instance->io_state = IO_STATE_CLOSED;
Azure.IoT Build 0:fa2de1b79154 283
Azure.IoT Build 0:fa2de1b79154 284 if (on_io_close_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 285 {
Azure.IoT Build 0:fa2de1b79154 286 on_io_close_complete(callback_context);
Azure.IoT Build 0:fa2de1b79154 287 }
Azure.IoT Build 0:fa2de1b79154 288
Azure.IoT Build 0:fa2de1b79154 289 result = 0;
Azure.IoT Build 0:fa2de1b79154 290 }
Azure.IoT Build 0:fa2de1b79154 291 }
Azure.IoT Build 0:fa2de1b79154 292
Azure.IoT Build 0:fa2de1b79154 293 return result;
Azure.IoT Build 0:fa2de1b79154 294 }
Azure.IoT Build 0:fa2de1b79154 295
Azure.IoT Build 0:fa2de1b79154 296 int socketio_send(CONCRETE_IO_HANDLE socket_io, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context)
Azure.IoT Build 0:fa2de1b79154 297 {
Azure.IoT Build 0:fa2de1b79154 298 int result;
Azure.IoT Build 0:fa2de1b79154 299
Azure.IoT Build 0:fa2de1b79154 300 if ((socket_io == NULL) ||
Azure.IoT Build 0:fa2de1b79154 301 (buffer == NULL) ||
Azure.IoT Build 0:fa2de1b79154 302 (size == 0))
Azure.IoT Build 0:fa2de1b79154 303 {
Azure.IoT Build 0:fa2de1b79154 304 /* Invalid arguments */
Azure.IoT Build 0:fa2de1b79154 305 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 306 }
Azure.IoT Build 0:fa2de1b79154 307 else
Azure.IoT Build 0:fa2de1b79154 308 {
Azure.IoT Build 0:fa2de1b79154 309 SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io;
Azure.IoT Build 0:fa2de1b79154 310 if (socket_io_instance->io_state != IO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 311 {
Azure.IoT Build 0:fa2de1b79154 312 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 313 }
Azure.IoT Build 0:fa2de1b79154 314 else
Azure.IoT Build 0:fa2de1b79154 315 {
AzureIoTClient 13:920e00014ee3 316 LIST_ITEM_HANDLE first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 317 if (first_pending_io != NULL)
Azure.IoT Build 0:fa2de1b79154 318 {
Azure.IoT Build 0:fa2de1b79154 319 if (add_pending_io(socket_io_instance, buffer, size, on_send_complete, callback_context) != 0)
Azure.IoT Build 0:fa2de1b79154 320 {
Azure.IoT Build 0:fa2de1b79154 321 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 322 }
Azure.IoT Build 0:fa2de1b79154 323 else
Azure.IoT Build 0:fa2de1b79154 324 {
Azure.IoT Build 0:fa2de1b79154 325 result = 0;
Azure.IoT Build 0:fa2de1b79154 326 }
Azure.IoT Build 0:fa2de1b79154 327 }
Azure.IoT Build 0:fa2de1b79154 328 else
Azure.IoT Build 0:fa2de1b79154 329 {
Azure.IoT Build 0:fa2de1b79154 330 int send_result = tcpsocketconnection_send(socket_io_instance->tcp_socket_connection, buffer, size);
Azure.IoT Build 0:fa2de1b79154 331 if (send_result != size)
Azure.IoT Build 0:fa2de1b79154 332 {
Azure.IoT Build 0:fa2de1b79154 333 if (send_result < 0)
Azure.IoT Build 0:fa2de1b79154 334 {
Azure.IoT Build 0:fa2de1b79154 335 send_result = 0;
Azure.IoT Build 0:fa2de1b79154 336 }
Azure.IoT Build 0:fa2de1b79154 337
Azure.IoT Build 0:fa2de1b79154 338 /* queue data */
Azure.IoT Build 0:fa2de1b79154 339 if (add_pending_io(socket_io_instance, (unsigned char*)buffer + send_result, size - send_result, on_send_complete, callback_context) != 0)
Azure.IoT Build 0:fa2de1b79154 340 {
Azure.IoT Build 0:fa2de1b79154 341 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 342 }
Azure.IoT Build 0:fa2de1b79154 343 else
Azure.IoT Build 0:fa2de1b79154 344 {
Azure.IoT Build 0:fa2de1b79154 345 result = 0;
Azure.IoT Build 0:fa2de1b79154 346 }
Azure.IoT Build 0:fa2de1b79154 347 }
Azure.IoT Build 0:fa2de1b79154 348 else
Azure.IoT Build 0:fa2de1b79154 349 {
Azure.IoT Build 0:fa2de1b79154 350 if (on_send_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 351 {
Azure.IoT Build 0:fa2de1b79154 352 on_send_complete(callback_context, IO_SEND_OK);
Azure.IoT Build 0:fa2de1b79154 353 }
Azure.IoT Build 0:fa2de1b79154 354
Azure.IoT Build 0:fa2de1b79154 355 result = 0;
Azure.IoT Build 0:fa2de1b79154 356 }
Azure.IoT Build 0:fa2de1b79154 357 }
Azure.IoT Build 0:fa2de1b79154 358 }
Azure.IoT Build 0:fa2de1b79154 359 }
Azure.IoT Build 0:fa2de1b79154 360
Azure.IoT Build 0:fa2de1b79154 361 return result;
Azure.IoT Build 0:fa2de1b79154 362 }
Azure.IoT Build 0:fa2de1b79154 363
Azure.IoT Build 0:fa2de1b79154 364 void socketio_dowork(CONCRETE_IO_HANDLE socket_io)
Azure.IoT Build 0:fa2de1b79154 365 {
Azure.IoT Build 0:fa2de1b79154 366 if (socket_io != NULL)
Azure.IoT Build 0:fa2de1b79154 367 {
Azure.IoT Build 0:fa2de1b79154 368 SOCKET_IO_INSTANCE* socket_io_instance = (SOCKET_IO_INSTANCE*)socket_io;
Azure.IoT Build 0:fa2de1b79154 369 if (socket_io_instance->io_state == IO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 370 {
Azure.IoT Build 0:fa2de1b79154 371 int received = 1;
Azure.IoT Build 0:fa2de1b79154 372
AzureIoTClient 13:920e00014ee3 373 LIST_ITEM_HANDLE first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 374 while (first_pending_io != NULL)
Azure.IoT Build 0:fa2de1b79154 375 {
AzureIoTClient 13:920e00014ee3 376 PENDING_SOCKET_IO* pending_socket_io = (PENDING_SOCKET_IO*)singlylinkedlist_item_get_value(first_pending_io);
Azure.IoT Build 0:fa2de1b79154 377 if (pending_socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 378 {
Azure.IoT Build 0:fa2de1b79154 379 socket_io_instance->io_state = IO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 380 indicate_error(socket_io_instance);
Azure.IoT Build 0:fa2de1b79154 381 break;
Azure.IoT Build 0:fa2de1b79154 382 }
Azure.IoT Build 0:fa2de1b79154 383
Azure.IoT Build 0:fa2de1b79154 384 int send_result = tcpsocketconnection_send(socket_io_instance->tcp_socket_connection, (const char*)pending_socket_io->bytes, pending_socket_io->size);
Azure.IoT Build 0:fa2de1b79154 385 if (send_result != pending_socket_io->size)
Azure.IoT Build 0:fa2de1b79154 386 {
Azure.IoT Build 0:fa2de1b79154 387 if (send_result < 0)
Azure.IoT Build 0:fa2de1b79154 388 {
Azure.IoT Build 0:fa2de1b79154 389 if (send_result < UNABLE_TO_COMPLETE)
Azure.IoT Build 0:fa2de1b79154 390 {
Azure.IoT Build 0:fa2de1b79154 391 // Bad error. Indicate as much.
Azure.IoT Build 0:fa2de1b79154 392 socket_io_instance->io_state = IO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 393 indicate_error(socket_io_instance);
Azure.IoT Build 0:fa2de1b79154 394 }
Azure.IoT Build 0:fa2de1b79154 395 break;
Azure.IoT Build 0:fa2de1b79154 396 }
Azure.IoT Build 0:fa2de1b79154 397 else
Azure.IoT Build 0:fa2de1b79154 398 {
Azure.IoT Build 0:fa2de1b79154 399 /* send something, wait for the rest */
Azure.IoT Build 0:fa2de1b79154 400 (void)memmove(pending_socket_io->bytes, pending_socket_io->bytes + send_result, pending_socket_io->size - send_result);
Azure.IoT Build 0:fa2de1b79154 401 }
Azure.IoT Build 0:fa2de1b79154 402 }
Azure.IoT Build 0:fa2de1b79154 403 else
Azure.IoT Build 0:fa2de1b79154 404 {
Azure.IoT Build 0:fa2de1b79154 405 if (pending_socket_io->on_send_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 406 {
Azure.IoT Build 0:fa2de1b79154 407 pending_socket_io->on_send_complete(pending_socket_io->callback_context, IO_SEND_OK);
Azure.IoT Build 0:fa2de1b79154 408 }
Azure.IoT Build 0:fa2de1b79154 409
Azure.IoT Build 0:fa2de1b79154 410 free(pending_socket_io->bytes);
Azure.IoT Build 0:fa2de1b79154 411 free(pending_socket_io);
AzureIoTClient 13:920e00014ee3 412 if (singlylinkedlist_remove(socket_io_instance->pending_io_list, first_pending_io) != 0)
Azure.IoT Build 0:fa2de1b79154 413 {
Azure.IoT Build 0:fa2de1b79154 414 socket_io_instance->io_state = IO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 415 indicate_error(socket_io_instance);
Azure.IoT Build 0:fa2de1b79154 416 }
Azure.IoT Build 0:fa2de1b79154 417 }
Azure.IoT Build 0:fa2de1b79154 418
AzureIoTClient 13:920e00014ee3 419 first_pending_io = singlylinkedlist_get_head_item(socket_io_instance->pending_io_list);
Azure.IoT Build 0:fa2de1b79154 420 }
Azure.IoT Build 0:fa2de1b79154 421
Azure.IoT Build 0:fa2de1b79154 422 while (received > 0)
Azure.IoT Build 0:fa2de1b79154 423 {
AzureIoTClient 1:9190c0f4d23a 424 unsigned char* recv_bytes = malloc(MBED_RECEIVE_BYTES_VALUE);
AzureIoTClient 1:9190c0f4d23a 425 if (recv_bytes == NULL)
AzureIoTClient 1:9190c0f4d23a 426 {
AzureIoTClient 1:9190c0f4d23a 427 LogError("Socketio_Failure: NULL allocating input buffer.");
AzureIoTClient 1:9190c0f4d23a 428 indicate_error(socket_io_instance);
AzureIoTClient 1:9190c0f4d23a 429 }
AzureIoTClient 1:9190c0f4d23a 430 else
Azure.IoT Build 0:fa2de1b79154 431 {
AzureIoTClient 1:9190c0f4d23a 432 received = tcpsocketconnection_receive(socket_io_instance->tcp_socket_connection, (char*)recv_bytes, MBED_RECEIVE_BYTES_VALUE);
AzureIoTClient 1:9190c0f4d23a 433 if (received > 0)
Azure.IoT Build 0:fa2de1b79154 434 {
AzureIoTClient 1:9190c0f4d23a 435 if (socket_io_instance->on_bytes_received != NULL)
AzureIoTClient 1:9190c0f4d23a 436 {
AzureIoTClient 1:9190c0f4d23a 437 /* explictly ignoring here the result of the callback */
AzureIoTClient 1:9190c0f4d23a 438 (void)socket_io_instance->on_bytes_received(socket_io_instance->on_bytes_received_context, recv_bytes, received);
AzureIoTClient 1:9190c0f4d23a 439 }
Azure.IoT Build 0:fa2de1b79154 440 }
AzureIoTClient 1:9190c0f4d23a 441 free(recv_bytes);
Azure.IoT Build 0:fa2de1b79154 442 }
Azure.IoT Build 0:fa2de1b79154 443 }
Azure.IoT Build 0:fa2de1b79154 444 }
Azure.IoT Build 0:fa2de1b79154 445 }
Azure.IoT Build 0:fa2de1b79154 446 }
Azure.IoT Build 0:fa2de1b79154 447
Azure.IoT Build 0:fa2de1b79154 448 int socketio_setoption(CONCRETE_IO_HANDLE socket_io, const char* optionName, const void* value)
Azure.IoT Build 0:fa2de1b79154 449 {
Azure.IoT Build 0:fa2de1b79154 450 /* Not implementing any options */
Azure.IoT Build 0:fa2de1b79154 451 return __LINE__;
Azure.IoT Build 0:fa2de1b79154 452 }
Azure.IoT Build 0:fa2de1b79154 453
Azure.IoT Build 0:fa2de1b79154 454 const IO_INTERFACE_DESCRIPTION* socketio_get_interface_description(void)
Azure.IoT Build 0:fa2de1b79154 455 {
Azure.IoT Build 0:fa2de1b79154 456 return &socket_io_interface_description;
Azure.IoT Build 0:fa2de1b79154 457 }
Azure.IoT Build 0:fa2de1b79154 458