NetworkSocketAPI
Dependents: HelloWizFi250Interface
Fork of NetworkSocketAPI by
Socket.cpp@27:d7ed39727306, 2016-02-18 (annotated)
- Committer:
- Christopher Haster
- Date:
- Thu Feb 18 09:20:39 2016 -0600
- Branch:
- api-changes
- Revision:
- 27:d7ed39727306
- Parent:
- 25:ed7b2a52e8ac
- Child:
- 28:163fbe3263f4
Added better behaviour for urls in constructors
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Christopher Haster |
25:ed7b2a52e8ac | 1 | /* Socket |
Christopher Haster |
25:ed7b2a52e8ac | 2 | * Copyright (c) 2015 ARM Limited |
Christopher Haster |
25:ed7b2a52e8ac | 3 | * |
Christopher Haster |
25:ed7b2a52e8ac | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Christopher Haster |
25:ed7b2a52e8ac | 5 | * you may not use this file except in compliance with the License. |
Christopher Haster |
25:ed7b2a52e8ac | 6 | * You may obtain a copy of the License at |
Christopher Haster |
25:ed7b2a52e8ac | 7 | * |
Christopher Haster |
25:ed7b2a52e8ac | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Christopher Haster |
25:ed7b2a52e8ac | 9 | * |
Christopher Haster |
25:ed7b2a52e8ac | 10 | * Unless required by applicable law or agreed to in writing, software |
Christopher Haster |
25:ed7b2a52e8ac | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
Christopher Haster |
25:ed7b2a52e8ac | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Christopher Haster |
25:ed7b2a52e8ac | 13 | * See the License for the specific language governing permissions and |
Christopher Haster |
25:ed7b2a52e8ac | 14 | * limitations under the License. |
Christopher Haster |
25:ed7b2a52e8ac | 15 | */ |
Christopher Haster |
25:ed7b2a52e8ac | 16 | |
Christopher Haster |
25:ed7b2a52e8ac | 17 | #include "Socket.h" |
Christopher Haster |
27:d7ed39727306 | 18 | #include <cstdlib> |
Christopher Haster |
27:d7ed39727306 | 19 | #include <cstring> |
Christopher Haster |
25:ed7b2a52e8ac | 20 | |
Christopher Haster |
25:ed7b2a52e8ac | 21 | Socket::Socket( |
Christopher Haster |
25:ed7b2a52e8ac | 22 | NetworkInterface *iface, |
Christopher Haster |
25:ed7b2a52e8ac | 23 | socket_protocol_t proto, |
Christopher Haster |
25:ed7b2a52e8ac | 24 | const char *url, |
Christopher Haster |
25:ed7b2a52e8ac | 25 | uint16_t port) |
Christopher Haster |
25:ed7b2a52e8ac | 26 | : _iface(iface) |
Christopher Haster |
25:ed7b2a52e8ac | 27 | , _proto(proto) |
Christopher Haster |
27:d7ed39727306 | 28 | , _socket(0) |
Christopher Haster |
27:d7ed39727306 | 29 | , _pending_url(0) |
Christopher Haster |
27:d7ed39727306 | 30 | , _pending_ip(0) |
Christopher Haster |
27:d7ed39727306 | 31 | , _pending_port(0) { |
Christopher Haster |
27:d7ed39727306 | 32 | |
Christopher Haster |
27:d7ed39727306 | 33 | if (url) { |
Christopher Haster |
27:d7ed39727306 | 34 | _pending_url = (char*)malloc(strlen(url)+1); |
Christopher Haster |
27:d7ed39727306 | 35 | strcpy(_pending_url, url); |
Christopher Haster |
27:d7ed39727306 | 36 | } |
Christopher Haster |
27:d7ed39727306 | 37 | |
Christopher Haster |
27:d7ed39727306 | 38 | if (port) { |
Christopher Haster |
27:d7ed39727306 | 39 | _pending_port = port; |
Christopher Haster |
27:d7ed39727306 | 40 | } |
Christopher Haster |
25:ed7b2a52e8ac | 41 | } |
Christopher Haster |
25:ed7b2a52e8ac | 42 | |
Christopher Haster |
25:ed7b2a52e8ac | 43 | Socket::~Socket() { |
Christopher Haster |
25:ed7b2a52e8ac | 44 | if (_socket) _iface->destroySocket(_socket); |
Christopher Haster |
27:d7ed39727306 | 45 | free(_pending_url); |
Christopher Haster |
27:d7ed39727306 | 46 | free(_pending_ip); |
Christopher Haster |
25:ed7b2a52e8ac | 47 | } |
Christopher Haster |
25:ed7b2a52e8ac | 48 | |
Christopher Haster |
25:ed7b2a52e8ac | 49 | SocketInterface *Socket::_get_socket() { |
Christopher Haster |
27:d7ed39727306 | 50 | if (!_socket) { |
Christopher Haster |
27:d7ed39727306 | 51 | _socket = _iface->createSocket(_proto); |
Christopher Haster |
27:d7ed39727306 | 52 | |
Christopher Haster |
27:d7ed39727306 | 53 | if (_pending_url) { |
Christopher Haster |
27:d7ed39727306 | 54 | _socket->setURL(_pending_url); |
Christopher Haster |
27:d7ed39727306 | 55 | free(_pending_url); |
Christopher Haster |
27:d7ed39727306 | 56 | _pending_url = 0; |
Christopher Haster |
27:d7ed39727306 | 57 | } |
Christopher Haster |
27:d7ed39727306 | 58 | |
Christopher Haster |
27:d7ed39727306 | 59 | if (_pending_ip) { |
Christopher Haster |
27:d7ed39727306 | 60 | _socket->setIPAddress(_pending_ip); |
Christopher Haster |
27:d7ed39727306 | 61 | free(_pending_ip); |
Christopher Haster |
27:d7ed39727306 | 62 | _pending_ip = 0; |
Christopher Haster |
27:d7ed39727306 | 63 | } |
Christopher Haster |
27:d7ed39727306 | 64 | |
Christopher Haster |
27:d7ed39727306 | 65 | if (_pending_port) { |
Christopher Haster |
27:d7ed39727306 | 66 | _socket->setPort(_pending_port); |
Christopher Haster |
27:d7ed39727306 | 67 | _pending_port = 0; |
Christopher Haster |
27:d7ed39727306 | 68 | } |
Christopher Haster |
27:d7ed39727306 | 69 | } |
Christopher Haster |
27:d7ed39727306 | 70 | |
Christopher Haster |
25:ed7b2a52e8ac | 71 | return _socket; |
Christopher Haster |
25:ed7b2a52e8ac | 72 | } |
Christopher Haster |
25:ed7b2a52e8ac | 73 | |
Christopher Haster |
27:d7ed39727306 | 74 | int32_t Socket::setURL(const char *url) { |
Christopher Haster |
25:ed7b2a52e8ac | 75 | SocketInterface *s = _get_socket(); |
Christopher Haster |
27:d7ed39727306 | 76 | if (!s) return -2; |
Christopher Haster |
27:d7ed39727306 | 77 | return s->setURL(url); |
Christopher Haster |
25:ed7b2a52e8ac | 78 | } |
Christopher Haster |
25:ed7b2a52e8ac | 79 | |
Christopher Haster |
25:ed7b2a52e8ac | 80 | void Socket::setIPAddress(const char *ip) { |
Christopher Haster |
27:d7ed39727306 | 81 | if (!_socket) { |
Christopher Haster |
27:d7ed39727306 | 82 | free(_pending_ip); |
Christopher Haster |
27:d7ed39727306 | 83 | _pending_ip = (char*)malloc(strlen(ip)+1); |
Christopher Haster |
27:d7ed39727306 | 84 | strcpy(_pending_ip, ip); |
Christopher Haster |
27:d7ed39727306 | 85 | } else { |
Christopher Haster |
27:d7ed39727306 | 86 | _socket->setIPAddress(ip); |
Christopher Haster |
27:d7ed39727306 | 87 | } |
Christopher Haster |
25:ed7b2a52e8ac | 88 | } |
Christopher Haster |
25:ed7b2a52e8ac | 89 | |
Christopher Haster |
25:ed7b2a52e8ac | 90 | void Socket::setPort(uint16_t port) { |
Christopher Haster |
27:d7ed39727306 | 91 | if (!_socket) { |
Christopher Haster |
27:d7ed39727306 | 92 | _pending_port = port; |
Christopher Haster |
27:d7ed39727306 | 93 | } else { |
Christopher Haster |
27:d7ed39727306 | 94 | _socket->setPort(port); |
Christopher Haster |
27:d7ed39727306 | 95 | } |
Christopher Haster |
25:ed7b2a52e8ac | 96 | } |
Christopher Haster |
25:ed7b2a52e8ac | 97 | |
Christopher Haster |
25:ed7b2a52e8ac | 98 | const char *Socket::getIPAddress() { |
Christopher Haster |
25:ed7b2a52e8ac | 99 | SocketInterface *s = _get_socket(); |
Christopher Haster |
25:ed7b2a52e8ac | 100 | if (!s) return 0; |
Christopher Haster |
25:ed7b2a52e8ac | 101 | return s->getIPAddress(); |
Christopher Haster |
25:ed7b2a52e8ac | 102 | } |
Christopher Haster |
25:ed7b2a52e8ac | 103 | |
Christopher Haster |
25:ed7b2a52e8ac | 104 | uint16_t Socket::getPort() { |
Christopher Haster |
25:ed7b2a52e8ac | 105 | SocketInterface *s = _get_socket(); |
Christopher Haster |
25:ed7b2a52e8ac | 106 | if (!s) return 0; |
Christopher Haster |
25:ed7b2a52e8ac | 107 | return s->getPort(); |
Christopher Haster |
25:ed7b2a52e8ac | 108 | } |
Christopher Haster |
25:ed7b2a52e8ac | 109 | |
Christopher Haster |
25:ed7b2a52e8ac | 110 | int32_t Socket::send(const void *data, uint32_t len, uint32_t timeout_ms) { |
Christopher Haster |
25:ed7b2a52e8ac | 111 | SocketInterface *s = _get_socket(); |
Christopher Haster |
25:ed7b2a52e8ac | 112 | if (!s) return -2; |
Christopher Haster |
25:ed7b2a52e8ac | 113 | return s->send(data, len, timeout_ms); |
Christopher Haster |
25:ed7b2a52e8ac | 114 | } |
Christopher Haster |
25:ed7b2a52e8ac | 115 | |
Christopher Haster |
25:ed7b2a52e8ac | 116 | int32_t Socket::recv(void *data, uint32_t len, uint32_t timeout_ms) { |
Christopher Haster |
25:ed7b2a52e8ac | 117 | SocketInterface *s = _get_socket(); |
Christopher Haster |
25:ed7b2a52e8ac | 118 | if (!s) return -2; |
Christopher Haster |
25:ed7b2a52e8ac | 119 | return s->recv(data, len, timeout_ms); |
Christopher Haster |
25:ed7b2a52e8ac | 120 | } |
Christopher Haster |
25:ed7b2a52e8ac | 121 |