Nigel Rantor / azure_c_shared_utility

Fork of azure_c_shared_utility by Azure IoT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tcpsocketconnection_c.cpp Source File

tcpsocketconnection_c.cpp

00001 // Copyright (c) Microsoft. All rights reserved.
00002 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
00003 
00004 #include "mbed.h"
00005 #include <stddef.h>
00006 #include "azure_c_shared_utility/tcpsocketconnection_c.h"
00007 #include "azure_c_shared_utility/platform.h"
00008 
00009 typedef struct {
00010     TCPSocket* socket;
00011     bool connected;
00012 } TCPSOCKETCONNECTION_HANDLE_T;
00013 
00014 TCPSOCKETCONNECTION_HANDLE tcpsocketconnection_create(void)
00015 {
00016     TCPSOCKETCONNECTION_HANDLE_T* conn = new TCPSOCKETCONNECTION_HANDLE_T;
00017     conn->socket = new TCPSocket(platform_get_network_stack());
00018     conn->connected = false;
00019     return conn;
00020 }
00021 
00022 void tcpsocketconnection_set_blocking(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, bool blocking, unsigned int timeout)
00023 {
00024     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00025     tsc->socket->set_blocking(blocking);
00026     tsc->socket->set_timeout(timeout);
00027 }
00028 
00029 void tcpsocketconnection_destroy(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle)
00030 {
00031     delete (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00032 }
00033 
00034 int tcpsocketconnection_connect(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, const char* host, const int port)
00035 {
00036     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00037     // TODO: so, we set this but we really need to kill it if we get an error later too.....
00038     auto rv = tsc->socket->connect(host, port);
00039     if(rv == 0) { tsc->connected = true; }
00040     return rv;
00041 }
00042 
00043 bool tcpsocketconnection_is_connected(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle)
00044 {
00045     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00046     return tsc->connected;
00047 }
00048 
00049 void tcpsocketconnection_close(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle)
00050 {
00051     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00052     tsc->socket->close();
00053 }
00054 
00055 int tcpsocketconnection_send(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, const char* data, int length)
00056 {
00057     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00058     return tsc->socket->send((char*)data, length);
00059 }
00060 
00061 int tcpsocketconnection_send_all(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, const char* data, int length)
00062 {
00063     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00064     // TODO: this is shonky and quickly done....
00065 
00066     auto rv = tsc->socket->send((char*)data, length);
00067 
00068     if(rv < 0 || rv == length) {
00069         return rv;
00070     }
00071 
00072     auto remain = length - rv;
00073 
00074     while(rv > 0 && remain > 0) {
00075         data = data + rv;
00076         rv = tsc->socket->send((char*)data, length);
00077         remain = length - rv;
00078     }
00079 
00080     return rv;
00081 }
00082 
00083 int tcpsocketconnection_receive(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, char* data, int length)
00084 {
00085     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00086     return tsc->socket->recv(data, length);
00087 }
00088 
00089 int tcpsocketconnection_receive_all(TCPSOCKETCONNECTION_HANDLE tcpSocketConnectionHandle, char* data, int length)
00090 {
00091     TCPSOCKETCONNECTION_HANDLE_T* tsc = (TCPSOCKETCONNECTION_HANDLE_T*)tcpSocketConnectionHandle;
00092     // TODO: this is shonky and quickly done....
00093 
00094     auto rv = tsc->socket->recv((char*)data, length);
00095 
00096     if(rv < 0 || rv == length) {
00097         return rv;
00098     }
00099 
00100     auto remain = length - rv;
00101 
00102     while(rv > 0 && remain > 0) {
00103         data = data + rv;
00104         rv = tsc->socket->recv((char*)data, length);
00105         remain = length - rv;
00106     }
00107 
00108     return rv;
00109 }