NetworkSocketAPI

Dependencies:   DnsQuery

Dependents:   HelloWizFi250Interface

Fork of NetworkSocketAPI by NetworkSocketAPI

Files at this revision

API Documentation at this revision

Comitter:
Christopher Haster
Date:
Thu Feb 18 09:20:39 2016 -0600
Branch:
api-changes
Parent:
26:9774a2edad71
Child:
28:163fbe3263f4
Commit message:
Added better behaviour for urls in constructors

Changed in this revision

Socket.cpp Show annotated file Show diff for this revision Revisions of this file
Socket.h Show annotated file Show diff for this revision Revisions of this file
SocketInterface.h Show annotated file Show diff for this revision Revisions of this file
TCPSocket.h Show annotated file Show diff for this revision Revisions of this file
UDPSocket.h Show annotated file Show diff for this revision Revisions of this file
--- a/Socket.cpp	Thu Feb 18 06:16:11 2016 -0600
+++ b/Socket.cpp	Thu Feb 18 09:20:39 2016 -0600
@@ -15,6 +15,8 @@
  */
 
 #include "Socket.h"
+#include <cstdlib>
+#include <cstring>
 
 Socket::Socket(
         NetworkInterface *iface,
@@ -23,36 +25,74 @@
         uint16_t port)
   : _iface(iface)
   , _proto(proto)
-  , _socket(0) {
-    if (url)  setURL(url);
-    if (port) setPort(port);
+  , _socket(0)
+  , _pending_url(0)
+  , _pending_ip(0)
+  , _pending_port(0) {
+
+    if (url) {
+        _pending_url = (char*)malloc(strlen(url)+1);
+        strcpy(_pending_url, url);
+    }
+
+    if (port) {
+        _pending_port = port;
+    }
 }
 
 Socket::~Socket() {
     if (_socket) _iface->destroySocket(_socket);
+    free(_pending_url);
+    free(_pending_ip);
 }
 
 SocketInterface *Socket::_get_socket() {
-    if (!_socket) _socket = _iface->createSocket(_proto);
+    if (!_socket) {
+        _socket = _iface->createSocket(_proto);
+
+        if (_pending_url) {
+            _socket->setURL(_pending_url);
+            free(_pending_url);
+            _pending_url = 0;
+        }
+
+        if (_pending_ip) {
+            _socket->setIPAddress(_pending_ip);
+            free(_pending_ip);
+            _pending_ip = 0;
+        }
+
+        if (_pending_port) {
+            _socket->setPort(_pending_port);
+            _pending_port = 0;
+        }
+    }
+
     return _socket;
 }
 
-void Socket::setURL(const char *url) {
+int32_t Socket::setURL(const char *url) {
     SocketInterface *s = _get_socket();
-    if (!s) return;
-    s->setURL(url);
+    if (!s) return -2;
+    return s->setURL(url);
 }
 
 void Socket::setIPAddress(const char *ip) {
-    SocketInterface *s = _get_socket();
-    if (!s) return;
-    s->setIPAddress(ip);
+    if (!_socket) {
+        free(_pending_ip);
+        _pending_ip = (char*)malloc(strlen(ip)+1);
+        strcpy(_pending_ip, ip);
+    } else {
+        _socket->setIPAddress(ip);
+    }
 }
 
 void Socket::setPort(uint16_t port) {
-    SocketInterface *s = _get_socket();
-	if (!s) return;
-	s->setPort(port);
+    if (!_socket) {
+        _pending_port = port;
+    } else {
+        _socket->setPort(port);
+    }
 }
 
 const char *Socket::getIPAddress() {
--- a/Socket.h	Thu Feb 18 06:16:11 2016 -0600
+++ b/Socket.h	Thu Feb 18 09:20:39 2016 -0600
@@ -29,8 +29,9 @@
     /** Set the URL of the socket
      *  Performs DNS lookup if necessary
      *  @param url URL to connect to
+     *  @return 0 on success
      */
-    void setURL(const char *url);
+    int32_t setURL(const char *url);
 
     /** Set the IP address of the socket
      *  @param ip IP address to connect to, copied internally
@@ -83,6 +84,10 @@
     NetworkInterface *_iface;
     socket_protocol_t _proto;
     SocketInterface *_socket;
+
+    char *_pending_url;
+    char *_pending_ip;
+    uint16_t _pending_port;
 };
 
 #endif
--- a/SocketInterface.h	Thu Feb 18 06:16:11 2016 -0600
+++ b/SocketInterface.h	Thu Feb 18 09:20:39 2016 -0600
@@ -39,8 +39,9 @@
     /** Set the URL of the socket
      *  Performs DNS lookup if necessary
      *  @param url URL to connect to
+     *  @return 0 on success
      */
-    virtual void setURL(const char *url) = 0;
+    virtual int32_t setURL(const char *url) = 0;
 
     /** Set the IP address of the socket
      *  @param ip IP address to connect to, copied internally
--- a/TCPSocket.h	Thu Feb 18 06:16:11 2016 -0600
+++ b/TCPSocket.h	Thu Feb 18 09:20:39 2016 -0600
@@ -27,8 +27,9 @@
 {
 public:
     /** Create a socket using the specified network interface
+     *  No network operations are performed until the socket is actually used
      *  @param iface The network interface to use
-     *  @param ip Optional URL to connect to, copied internally
+     *  @param url Optional URL to connect to, copied internally
      *  @param port Optional port to connect to
      */
     TCPSocket(NetworkInterface *iface, const char *url = 0, uint16_t port = 0);
--- a/UDPSocket.h	Thu Feb 18 06:16:11 2016 -0600
+++ b/UDPSocket.h	Thu Feb 18 09:20:39 2016 -0600
@@ -27,6 +27,7 @@
 {
 public:
     /** Create a socket using the specified network interface
+     *  No network operations are performed until the socket is actually used
      *  @param iface The network interface to use
      *  @param ip Optional URL to connect to, copied internally
      *  @param port Optional port to connect to