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