WIP. send a large constant string twice a second, in order to test out the transport with something indicative of our required load.

Dependencies:   FXOS8700CQ NTPClient azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip

Fork of FXOS8700CQ_To_Azure_IoT by Mark Radbourne

Committer:
julianhigginson
Date:
Thu Jan 05 23:40:24 2017 +0000
Revision:
7:0d1a0fe537dc
Parent:
3:c0556ff7b8e3
modified dummy message for minimal data transport

Who changed what in which revision?

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