Embedded WebSockets Experiment

Dependencies:   mbed MD5

Committer:
nandgate
Date:
Tue Jul 26 05:30:53 2011 +0000
Revision:
0:6dee052a3fa4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nandgate 0:6dee052a3fa4 1 #ifndef TCPCALLBACKCONNECTION_H
nandgate 0:6dee052a3fa4 2 #define TCPCALLBACKCONNECTION_H
nandgate 0:6dee052a3fa4 3
nandgate 0:6dee052a3fa4 4 #include "TCPConnection.h"
nandgate 0:6dee052a3fa4 5
nandgate 0:6dee052a3fa4 6 namespace mbed {
nandgate 0:6dee052a3fa4 7
nandgate 0:6dee052a3fa4 8 #define NO_SENT_FNC ((err_t (*)(TCPCallbackConnection *, u16_t))NULL)
nandgate 0:6dee052a3fa4 9 #define NO_RECV_FNC ((err_t (*)(TCPCallbackConnection *, struct pbuf *, err_t))NULL)
nandgate 0:6dee052a3fa4 10 #define NO_POLL_FNC ((err_t (*)(TCPCallbackConnection *))NULL)
nandgate 0:6dee052a3fa4 11 #define NO_ACCEPT_FNC ((err_t (*)(TCPCallbackConnection *, struct tcp_pcb *, err_t))NULL)
nandgate 0:6dee052a3fa4 12 #define NO_CONNECT_FNC ((err_t (*)(TCPCallbackConnection *, err_t))NULL)
nandgate 0:6dee052a3fa4 13 #define NO_ERR_FNC ((void (*)(TCPCallbackConnection *, err_t))NULL)
nandgate 0:6dee052a3fa4 14
nandgate 0:6dee052a3fa4 15
nandgate 0:6dee052a3fa4 16 class TCPCallbackConnection : public TCPConnection {
nandgate 0:6dee052a3fa4 17 public:
nandgate 0:6dee052a3fa4 18 TCPCallbackConnection(struct ip_addr ip_addr, u16_t port,
nandgate 0:6dee052a3fa4 19 err_t (*psent)(TCPCallbackConnection *, u16_t),
nandgate 0:6dee052a3fa4 20 err_t (*precv)(TCPCallbackConnection *, struct pbuf *, err_t),
nandgate 0:6dee052a3fa4 21 err_t (*ppoll)(TCPCallbackConnection *),
nandgate 0:6dee052a3fa4 22 err_t (*pconnected)(TCPCallbackConnection *, err_t),
nandgate 0:6dee052a3fa4 23 void (*perr )(TCPCallbackConnection *, err_t))
nandgate 0:6dee052a3fa4 24 : TCPConnection(ip_addr, port) {
nandgate 0:6dee052a3fa4 25 _sent = psent;
nandgate 0:6dee052a3fa4 26 _recv = precv;
nandgate 0:6dee052a3fa4 27 _poll = ppoll;
nandgate 0:6dee052a3fa4 28 _connected = pconnected;
nandgate 0:6dee052a3fa4 29 _err = perr;
nandgate 0:6dee052a3fa4 30 }
nandgate 0:6dee052a3fa4 31
nandgate 0:6dee052a3fa4 32 TCPCallbackConnection(TCPListener *parent, struct tcp_pcb *npcb,
nandgate 0:6dee052a3fa4 33 err_t (*psent)(TCPCallbackConnection *, u16_t),
nandgate 0:6dee052a3fa4 34 err_t (*precv)(TCPCallbackConnection *, struct pbuf *, err_t),
nandgate 0:6dee052a3fa4 35 err_t (*ppoll)(TCPCallbackConnection *),
nandgate 0:6dee052a3fa4 36 err_t (*pconnected)(TCPCallbackConnection *, err_t),
nandgate 0:6dee052a3fa4 37 void (*perr )(TCPCallbackConnection *, err_t))
nandgate 0:6dee052a3fa4 38 : TCPConnection(parent, npcb) {
nandgate 0:6dee052a3fa4 39 _sent = psent;
nandgate 0:6dee052a3fa4 40 _recv = precv;
nandgate 0:6dee052a3fa4 41 _poll = ppoll;
nandgate 0:6dee052a3fa4 42 _connected = pconnected;
nandgate 0:6dee052a3fa4 43 _err = perr;
nandgate 0:6dee052a3fa4 44 }
nandgate 0:6dee052a3fa4 45
nandgate 0:6dee052a3fa4 46 private:
nandgate 0:6dee052a3fa4 47 /*
nandgate 0:6dee052a3fa4 48 * Function to be called when more send buffer space is available.
nandgate 0:6dee052a3fa4 49 * @param space the amount of bytes available
nandgate 0:6dee052a3fa4 50 * @return ERR_OK: try to send some data by calling tcp_output
nandgate 0:6dee052a3fa4 51 */
nandgate 0:6dee052a3fa4 52 virtual err_t sent(u16_t space) {
nandgate 0:6dee052a3fa4 53 if(_sent) {
nandgate 0:6dee052a3fa4 54 return (_sent)(this, space);
nandgate 0:6dee052a3fa4 55 } else {
nandgate 0:6dee052a3fa4 56 return ERR_OK;
nandgate 0:6dee052a3fa4 57 }
nandgate 0:6dee052a3fa4 58 }
nandgate 0:6dee052a3fa4 59
nandgate 0:6dee052a3fa4 60 /*
nandgate 0:6dee052a3fa4 61 * Function to be called when (in-sequence) data has arrived.
nandgate 0:6dee052a3fa4 62 * @param p the packet buffer which arrived
nandgate 0:6dee052a3fa4 63 * @param err an error argument (TODO: that is current always ERR_OK?)
nandgate 0:6dee052a3fa4 64 * @return ERR_OK: try to send some data by calling tcp_output
nandgate 0:6dee052a3fa4 65 */
nandgate 0:6dee052a3fa4 66 virtual err_t recv(struct pbuf *p, err_t err) {
nandgate 0:6dee052a3fa4 67 if(_recv) {
nandgate 0:6dee052a3fa4 68 return (_recv)(this, p, err);
nandgate 0:6dee052a3fa4 69 } else {
nandgate 0:6dee052a3fa4 70 return ERR_OK;
nandgate 0:6dee052a3fa4 71 }
nandgate 0:6dee052a3fa4 72 }
nandgate 0:6dee052a3fa4 73
nandgate 0:6dee052a3fa4 74 /*
nandgate 0:6dee052a3fa4 75 * Function which is called periodically.
nandgate 0:6dee052a3fa4 76 * The period can be adjusted in multiples of the TCP slow timer interval
nandgate 0:6dee052a3fa4 77 * by changing tcp_pcb.polltmr.
nandgate 0:6dee052a3fa4 78 * @return ERR_OK: try to send some data by calling tcp_output
nandgate 0:6dee052a3fa4 79 */
nandgate 0:6dee052a3fa4 80 virtual err_t poll() {
nandgate 0:6dee052a3fa4 81 if(_poll) {
nandgate 0:6dee052a3fa4 82 return (_poll)(this);
nandgate 0:6dee052a3fa4 83 } else {
nandgate 0:6dee052a3fa4 84 return ERR_OK;
nandgate 0:6dee052a3fa4 85 }
nandgate 0:6dee052a3fa4 86 }
nandgate 0:6dee052a3fa4 87
nandgate 0:6dee052a3fa4 88 virtual err_t connected(err_t err) {
nandgate 0:6dee052a3fa4 89 err = TCPConnection::connected(err);
nandgate 0:6dee052a3fa4 90 if(_connected) {
nandgate 0:6dee052a3fa4 91 return (_connected)(this, err);
nandgate 0:6dee052a3fa4 92 } else {
nandgate 0:6dee052a3fa4 93 return ERR_OK;
nandgate 0:6dee052a3fa4 94 }
nandgate 0:6dee052a3fa4 95 }
nandgate 0:6dee052a3fa4 96
nandgate 0:6dee052a3fa4 97 /*
nandgate 0:6dee052a3fa4 98 * Function to be called whenever a fatal error occurs.
nandgate 0:6dee052a3fa4 99 * There is no pcb parameter since most of the times, the pcb is
nandgate 0:6dee052a3fa4 100 * already deallocated (or there is no pcb) when this function is called.
nandgate 0:6dee052a3fa4 101 * @param err an indication why the error callback is called:
nandgate 0:6dee052a3fa4 102 * ERR_ABRT: aborted through tcp_abort or by a TCP timer
nandgate 0:6dee052a3fa4 103 * ERR_RST: the connection was reset by the remote host
nandgate 0:6dee052a3fa4 104 */
nandgate 0:6dee052a3fa4 105 virtual void err(err_t erra) {
nandgate 0:6dee052a3fa4 106 if(_err) {
nandgate 0:6dee052a3fa4 107 (_err)(this, erra);
nandgate 0:6dee052a3fa4 108 }
nandgate 0:6dee052a3fa4 109 }
nandgate 0:6dee052a3fa4 110
nandgate 0:6dee052a3fa4 111 virtual void dnsreply(const char *hostname, struct ip_addr *addr) {};
nandgate 0:6dee052a3fa4 112
nandgate 0:6dee052a3fa4 113 err_t (*_sent)(TCPCallbackConnection *, u16_t);
nandgate 0:6dee052a3fa4 114 err_t (*_recv)(TCPCallbackConnection *, struct pbuf *p, err_t err);
nandgate 0:6dee052a3fa4 115 err_t (*_poll)(TCPCallbackConnection *);
nandgate 0:6dee052a3fa4 116 err_t (*_accept)(TCPCallbackConnection *, struct tcp_pcb *newpcb, err_t err);
nandgate 0:6dee052a3fa4 117 err_t (*_connected)(TCPCallbackConnection *, err_t err);
nandgate 0:6dee052a3fa4 118 void (*_err )(TCPCallbackConnection *, err_t);
nandgate 0:6dee052a3fa4 119 };
nandgate 0:6dee052a3fa4 120
nandgate 0:6dee052a3fa4 121 };
nandgate 0:6dee052a3fa4 122
nandgate 0:6dee052a3fa4 123 #endif /* TCPCALLBACKCONNECTION_H */