My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Mon Aug 06 09:23:14 2012 +0000
Revision:
0:7a64fbb4069d
[mbed] converted /DGWWebServer/HTTPServer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:7a64fbb4069d 1 #include "lwip/arch.h"
screamer 0:7a64fbb4069d 2
screamer 0:7a64fbb4069d 3 #include "dns.h"
screamer 0:7a64fbb4069d 4
screamer 0:7a64fbb4069d 5 #include "TCPConnection.h"
screamer 0:7a64fbb4069d 6 #include "TCPListener.h"
screamer 0:7a64fbb4069d 7 #include "NetServer.h"
screamer 0:7a64fbb4069d 8
screamer 0:7a64fbb4069d 9 using namespace std;
screamer 0:7a64fbb4069d 10 using namespace mbed;
screamer 0:7a64fbb4069d 11
screamer 0:7a64fbb4069d 12 void TCPConnection::dnsreply_callback(const char *name, struct ip_addr *ipaddr, void *arg) {
screamer 0:7a64fbb4069d 13 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 14 if(connection) {
screamer 0:7a64fbb4069d 15 (connection->dnsreply)(name, ipaddr);
screamer 0:7a64fbb4069d 16 }
screamer 0:7a64fbb4069d 17 }
screamer 0:7a64fbb4069d 18
screamer 0:7a64fbb4069d 19 err_t TCPConnection::connected_callback(void *arg, struct tcp_pcb *pcb, err_t err) {
screamer 0:7a64fbb4069d 20 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 21 LWIP_UNUSED_ARG(pcb);
screamer 0:7a64fbb4069d 22 if(connection) {
screamer 0:7a64fbb4069d 23 return (connection->connected)(err);
screamer 0:7a64fbb4069d 24 }
screamer 0:7a64fbb4069d 25 return ERR_OK;
screamer 0:7a64fbb4069d 26 }
screamer 0:7a64fbb4069d 27
screamer 0:7a64fbb4069d 28 err_t TCPConnection::sent_callback(void *arg, struct tcp_pcb *pcb, u16_t space) {
screamer 0:7a64fbb4069d 29 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 30 LWIP_UNUSED_ARG(pcb);
screamer 0:7a64fbb4069d 31 if(connection) {
screamer 0:7a64fbb4069d 32 return (connection->sent)(space);
screamer 0:7a64fbb4069d 33 }
screamer 0:7a64fbb4069d 34 return ERR_OK;
screamer 0:7a64fbb4069d 35 }
screamer 0:7a64fbb4069d 36
screamer 0:7a64fbb4069d 37 err_t TCPConnection::recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {
screamer 0:7a64fbb4069d 38 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 39 LWIP_UNUSED_ARG(pcb);
screamer 0:7a64fbb4069d 40 if(connection) {
screamer 0:7a64fbb4069d 41 return (connection->recv)(p, err);
screamer 0:7a64fbb4069d 42 }
screamer 0:7a64fbb4069d 43 return ERR_OK;
screamer 0:7a64fbb4069d 44 }
screamer 0:7a64fbb4069d 45
screamer 0:7a64fbb4069d 46 err_t TCPConnection::poll_callback(void *arg, struct tcp_pcb *pcb) {
screamer 0:7a64fbb4069d 47 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 48 LWIP_UNUSED_ARG(pcb);
screamer 0:7a64fbb4069d 49 if(connection) {
screamer 0:7a64fbb4069d 50 return (connection->poll)();
screamer 0:7a64fbb4069d 51 }
screamer 0:7a64fbb4069d 52 return ERR_OK;
screamer 0:7a64fbb4069d 53 }
screamer 0:7a64fbb4069d 54
screamer 0:7a64fbb4069d 55 void TCPConnection::error_callback(void *arg, err_t erra) {
screamer 0:7a64fbb4069d 56 TCPConnection *connection = static_cast<TCPConnection *>(arg);
screamer 0:7a64fbb4069d 57 if(connection) {
screamer 0:7a64fbb4069d 58 (connection->err)(erra);
screamer 0:7a64fbb4069d 59 }
screamer 0:7a64fbb4069d 60 }
screamer 0:7a64fbb4069d 61
screamer 0:7a64fbb4069d 62 TCPConnection::TCPConnection() : _parent(NULL), _port(0) {
screamer 0:7a64fbb4069d 63 }
screamer 0:7a64fbb4069d 64
screamer 0:7a64fbb4069d 65 TCPConnection::TCPConnection(struct ip_addr ip, u16_t port) : _parent(NULL) {
screamer 0:7a64fbb4069d 66 this->_ipaddr = ip;
screamer 0:7a64fbb4069d 67 this->_port = port;
screamer 0:7a64fbb4069d 68 }
screamer 0:7a64fbb4069d 69
screamer 0:7a64fbb4069d 70 TCPConnection::TCPConnection(TCPListener *parent, struct tcp_pcb *pcb)
screamer 0:7a64fbb4069d 71 : TCPItem(pcb), _parent(parent), _ipaddr(pcb->remote_ip), _port(pcb->remote_port) {
screamer 0:7a64fbb4069d 72 tcp_arg(this->_pcb, static_cast<void *>(this));
screamer 0:7a64fbb4069d 73 connected(ERR_OK);
screamer 0:7a64fbb4069d 74 }
screamer 0:7a64fbb4069d 75
screamer 0:7a64fbb4069d 76 TCPConnection::~TCPConnection() {
screamer 0:7a64fbb4069d 77 }
screamer 0:7a64fbb4069d 78
screamer 0:7a64fbb4069d 79 err_t TCPConnection::write(void *msg, u16_t len, u8_t flags) const {
screamer 0:7a64fbb4069d 80 return tcp_write(this->_pcb, msg, len, flags);
screamer 0:7a64fbb4069d 81 }
screamer 0:7a64fbb4069d 82
screamer 0:7a64fbb4069d 83 void TCPConnection::recved(u32_t len) const {
screamer 0:7a64fbb4069d 84 tcp_recved(this->_pcb, len);
screamer 0:7a64fbb4069d 85 }
screamer 0:7a64fbb4069d 86
screamer 0:7a64fbb4069d 87 err_t TCPConnection::connected(err_t err) {
screamer 0:7a64fbb4069d 88 tcp_recv(this->_pcb, TCPConnection::recv_callback);
screamer 0:7a64fbb4069d 89 tcp_sent(this->_pcb, TCPConnection::sent_callback);
screamer 0:7a64fbb4069d 90 tcp_poll(this->_pcb, TCPConnection::poll_callback, 1); // addjust time (in twice a sec)
screamer 0:7a64fbb4069d 91 tcp_err(this->_pcb, TCPConnection::error_callback);
screamer 0:7a64fbb4069d 92 return ERR_OK;
screamer 0:7a64fbb4069d 93 }
screamer 0:7a64fbb4069d 94
screamer 0:7a64fbb4069d 95 void TCPConnection::connect() {
screamer 0:7a64fbb4069d 96 NetServer::ready();
screamer 0:7a64fbb4069d 97 open();
screamer 0:7a64fbb4069d 98 tcp_connect(this->_pcb, &this->_ipaddr, this->_port, TCPConnection::connected_callback);
screamer 0:7a64fbb4069d 99 }
screamer 0:7a64fbb4069d 100
screamer 0:7a64fbb4069d 101 err_t TCPConnection::dnsrequest(const char *hostname, struct ip_addr *addr) const {
screamer 0:7a64fbb4069d 102 return dns_gethostbyname(hostname, addr, TCPConnection::dnsreply_callback, (void *)this);
screamer 0:7a64fbb4069d 103 }