Example of HTTPServer with additional features: * SNTPClient, DST rules * Link status indication * Local or SDCard-based WebServer * RPC-able class * Static and Dynamic HTML page

Dependencies:   mbed

Committer:
iva2k
Date:
Tue Jan 12 07:41:55 2010 +0000
Revision:
2:360fda42fefd
Parent:
0:886e4b3119ad

        

Who changed what in which revision?

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