The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /* Copyright (C) 2013 mbed.org, MIT License
sinrab 0:5464d5e415e5 2 *
sinrab 0:5464d5e415e5 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sinrab 0:5464d5e415e5 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sinrab 0:5464d5e415e5 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sinrab 0:5464d5e415e5 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sinrab 0:5464d5e415e5 7 * furnished to do so, subject to the following conditions:
sinrab 0:5464d5e415e5 8 *
sinrab 0:5464d5e415e5 9 * The above copyright notice and this permission notice shall be included in all copies or
sinrab 0:5464d5e415e5 10 * substantial portions of the Software.
sinrab 0:5464d5e415e5 11 *
sinrab 0:5464d5e415e5 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sinrab 0:5464d5e415e5 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sinrab 0:5464d5e415e5 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sinrab 0:5464d5e415e5 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sinrab 0:5464d5e415e5 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sinrab 0:5464d5e415e5 17 */
sinrab 0:5464d5e415e5 18
sinrab 0:5464d5e415e5 19 #include "TCPSocketConnection.h"
sinrab 0:5464d5e415e5 20 #include <algorithm>
sinrab 0:5464d5e415e5 21
sinrab 0:5464d5e415e5 22 TCPSocketConnection::TCPSocketConnection() : _is_connected(false) {
sinrab 0:5464d5e415e5 23 _cc3000_module = cc3000::get_instance();
sinrab 0:5464d5e415e5 24 if (_cc3000_module == NULL) {
sinrab 0:5464d5e415e5 25 error("Endpoint constructor error: no cc3000 instance available!\r\n");
sinrab 0:5464d5e415e5 26 }
sinrab 0:5464d5e415e5 27 }
sinrab 0:5464d5e415e5 28
sinrab 0:5464d5e415e5 29 int TCPSocketConnection::connect(const char *host, const int port) {
sinrab 0:5464d5e415e5 30 if (init_socket(SOCK_STREAM, IPPROTO_TCP) < 0) {
sinrab 0:5464d5e415e5 31 DBG_SOCKET("Failed to create tcp socket");
sinrab 0:5464d5e415e5 32 return -1;
sinrab 0:5464d5e415e5 33 }
sinrab 0:5464d5e415e5 34
sinrab 0:5464d5e415e5 35 if (set_address(host, port) != 0) {
sinrab 0:5464d5e415e5 36 DBG_SOCKET("Failed to set address (tcp)");
sinrab 0:5464d5e415e5 37 return -1;
sinrab 0:5464d5e415e5 38 }
sinrab 0:5464d5e415e5 39
sinrab 0:5464d5e415e5 40 if (_cc3000_module->_socket.connect(_sock_fd, (const sockaddr *)&_remote_host, sizeof(_remote_host)) < 0) {
sinrab 0:5464d5e415e5 41 DBG_SOCKET("Failed to connect (tcp)");
sinrab 0:5464d5e415e5 42 close();
sinrab 0:5464d5e415e5 43 return -1;
sinrab 0:5464d5e415e5 44 }
sinrab 0:5464d5e415e5 45
sinrab 0:5464d5e415e5 46 _is_connected = true;
sinrab 0:5464d5e415e5 47
sinrab 0:5464d5e415e5 48 return 0;
sinrab 0:5464d5e415e5 49 }
sinrab 0:5464d5e415e5 50
sinrab 0:5464d5e415e5 51 bool TCPSocketConnection::is_connected(void) {
sinrab 0:5464d5e415e5 52 return _is_connected;
sinrab 0:5464d5e415e5 53 }
sinrab 0:5464d5e415e5 54
sinrab 0:5464d5e415e5 55 int TCPSocketConnection::send(char* data, int length) {
sinrab 0:5464d5e415e5 56 if ((_sock_fd < 0) || !_is_connected) {
sinrab 0:5464d5e415e5 57 return -1;
sinrab 0:5464d5e415e5 58 }
sinrab 0:5464d5e415e5 59
sinrab 0:5464d5e415e5 60 if (!_blocking) {
sinrab 0:5464d5e415e5 61 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 62 if (wait_writable(timeout) != 0) {
sinrab 0:5464d5e415e5 63 return -1;
sinrab 0:5464d5e415e5 64 }
sinrab 0:5464d5e415e5 65 }
sinrab 0:5464d5e415e5 66
sinrab 0:5464d5e415e5 67 int n = _cc3000_module->_socket.send(_sock_fd, data, length, 0);
sinrab 0:5464d5e415e5 68 _is_connected = (n != 0);
sinrab 0:5464d5e415e5 69
sinrab 0:5464d5e415e5 70 return n;
sinrab 0:5464d5e415e5 71 }
sinrab 0:5464d5e415e5 72
sinrab 0:5464d5e415e5 73 int TCPSocketConnection::send_all(char *data, int length) {
sinrab 0:5464d5e415e5 74 if ((_sock_fd < 0) || !_is_connected) {
sinrab 0:5464d5e415e5 75 return -1;
sinrab 0:5464d5e415e5 76 }
sinrab 0:5464d5e415e5 77
sinrab 0:5464d5e415e5 78 int writtenLen = 0;
sinrab 0:5464d5e415e5 79 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 80 while (writtenLen < length) {
sinrab 0:5464d5e415e5 81 if (!_blocking) {
sinrab 0:5464d5e415e5 82 // Wait for socket to be writeable
sinrab 0:5464d5e415e5 83 if (wait_writable(timeout) != 0) {
sinrab 0:5464d5e415e5 84 return writtenLen;
sinrab 0:5464d5e415e5 85 }
sinrab 0:5464d5e415e5 86 }
sinrab 0:5464d5e415e5 87
sinrab 0:5464d5e415e5 88 int ret = _cc3000_module->_socket.send(_sock_fd, data + writtenLen, length - writtenLen, 0);
sinrab 0:5464d5e415e5 89 if (ret > 0) {
sinrab 0:5464d5e415e5 90 writtenLen += ret;
sinrab 0:5464d5e415e5 91 continue;
sinrab 0:5464d5e415e5 92 } else if (ret == 0) {
sinrab 0:5464d5e415e5 93 _is_connected = false;
sinrab 0:5464d5e415e5 94 return writtenLen;
sinrab 0:5464d5e415e5 95 } else {
sinrab 0:5464d5e415e5 96 return -1; //Connnection error
sinrab 0:5464d5e415e5 97 }
sinrab 0:5464d5e415e5 98 }
sinrab 0:5464d5e415e5 99
sinrab 0:5464d5e415e5 100 return writtenLen;
sinrab 0:5464d5e415e5 101 }
sinrab 0:5464d5e415e5 102
sinrab 0:5464d5e415e5 103 int TCPSocketConnection::receive(char *data, int length) {
sinrab 0:5464d5e415e5 104 if ((_sock_fd < 0) || !_is_connected) {
sinrab 0:5464d5e415e5 105 return -1;
sinrab 0:5464d5e415e5 106 }
sinrab 0:5464d5e415e5 107
sinrab 0:5464d5e415e5 108 if (!_blocking) {
sinrab 0:5464d5e415e5 109 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 110 if (wait_readable(timeout) != 0)
sinrab 0:5464d5e415e5 111 return -1;
sinrab 0:5464d5e415e5 112 }
sinrab 0:5464d5e415e5 113
sinrab 0:5464d5e415e5 114 int n = _cc3000_module->_socket.recv(_sock_fd, data, length, 0);
sinrab 0:5464d5e415e5 115 if (n >= 0) {
sinrab 0:5464d5e415e5 116 _is_connected = 1;
sinrab 0:5464d5e415e5 117 } else {
sinrab 0:5464d5e415e5 118 _is_connected = 0;
sinrab 0:5464d5e415e5 119 }
sinrab 0:5464d5e415e5 120
sinrab 0:5464d5e415e5 121 return n;
sinrab 0:5464d5e415e5 122 }
sinrab 0:5464d5e415e5 123
sinrab 0:5464d5e415e5 124 int TCPSocketConnection::receive_all(char *data, int length) {
sinrab 0:5464d5e415e5 125 if ((_sock_fd < 0) || !_is_connected) {
sinrab 0:5464d5e415e5 126 return -1;
sinrab 0:5464d5e415e5 127 }
sinrab 0:5464d5e415e5 128
sinrab 0:5464d5e415e5 129 int readLen = 0;
sinrab 0:5464d5e415e5 130 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 131 while (readLen < length) {
sinrab 0:5464d5e415e5 132 if (!_blocking) {
sinrab 0:5464d5e415e5 133 //Wait for socket to be readable
sinrab 0:5464d5e415e5 134 if (wait_readable(timeout) != 0)
sinrab 0:5464d5e415e5 135 return readLen;
sinrab 0:5464d5e415e5 136 }
sinrab 0:5464d5e415e5 137
sinrab 0:5464d5e415e5 138 int ret = _cc3000_module->_socket.recv(_sock_fd, data + readLen, length - readLen, 0);
sinrab 0:5464d5e415e5 139 if (ret > 0) {
sinrab 0:5464d5e415e5 140 readLen += ret;
sinrab 0:5464d5e415e5 141 } else if (ret == 0) {
sinrab 0:5464d5e415e5 142 _is_connected = false;
sinrab 0:5464d5e415e5 143 return readLen;
sinrab 0:5464d5e415e5 144 } else {
sinrab 0:5464d5e415e5 145 return -1; //Connnection error
sinrab 0:5464d5e415e5 146 }
sinrab 0:5464d5e415e5 147 }
sinrab 0:5464d5e415e5 148 return readLen;
sinrab 0:5464d5e415e5 149 }
sinrab 0:5464d5e415e5 150
sinrab 0:5464d5e415e5 151 int TCPSocketConnection::receive_until(char * data, int length, char ch)
sinrab 0:5464d5e415e5 152 {
sinrab 0:5464d5e415e5 153 if ((_sock_fd < 0) || !_is_connected) {
sinrab 0:5464d5e415e5 154 return -1;
sinrab 0:5464d5e415e5 155 }
sinrab 0:5464d5e415e5 156
sinrab 0:5464d5e415e5 157 int readLen = 0;
sinrab 0:5464d5e415e5 158 char tmpdata = '\0';
sinrab 0:5464d5e415e5 159
sinrab 0:5464d5e415e5 160 TimeInterval timeout(_timeout);
sinrab 0:5464d5e415e5 161 while ((readLen < length) && (tmpdata != ch))
sinrab 0:5464d5e415e5 162 {
sinrab 0:5464d5e415e5 163 if (!_blocking) {
sinrab 0:5464d5e415e5 164 //Wait for socket to be readable
sinrab 0:5464d5e415e5 165 if (wait_readable(timeout) != 0)
sinrab 0:5464d5e415e5 166 return readLen;
sinrab 0:5464d5e415e5 167 }
sinrab 0:5464d5e415e5 168
sinrab 0:5464d5e415e5 169 int ret = _cc3000_module->_socket.recv(_sock_fd, &tmpdata, 1, 0);
sinrab 0:5464d5e415e5 170 if( ret == 1)
sinrab 0:5464d5e415e5 171 {
sinrab 0:5464d5e415e5 172 data[readLen] = tmpdata;
sinrab 0:5464d5e415e5 173 readLen++;
sinrab 0:5464d5e415e5 174 }
sinrab 0:5464d5e415e5 175
sinrab 0:5464d5e415e5 176 if (ret < 0)
sinrab 0:5464d5e415e5 177 {
sinrab 0:5464d5e415e5 178 _is_connected = false;
sinrab 0:5464d5e415e5 179 return -1;
sinrab 0:5464d5e415e5 180 }
sinrab 0:5464d5e415e5 181 }
sinrab 0:5464d5e415e5 182 return readLen;
sinrab 0:5464d5e415e5 183 }
sinrab 0:5464d5e415e5 184