Azure IoT / azure_c_shared_utility

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Thu Oct 20 17:08:18 2016 -0700
Revision:
13:920e00014ee3
Parent:
10:1be0bc9a9deb
Child:
19:2e0811512ceb
1.0.10

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