Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

Committer:
donatien
Date:
Mon May 24 10:23:42 2010 +0000
Revision:
0:3717b703f76d
Child:
1:e52ec2a24c6a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:3717b703f76d 1 #ifndef NETTCPSOCKET_H
donatien 0:3717b703f76d 2 #define NETTCPSOCKET_H
donatien 0:3717b703f76d 3
donatien 0:3717b703f76d 4 #include "net.h"
donatien 0:3717b703f76d 5 #include "host.h"
donatien 0:3717b703f76d 6
donatien 0:3717b703f76d 7 #include <queue>
donatien 0:3717b703f76d 8 using std::queue;
donatien 0:3717b703f76d 9
donatien 0:3717b703f76d 10 //Implements a Berkeley-like socket if
donatien 0:3717b703f76d 11 //Can be interfaced either to lwip or a Telit module
donatien 0:3717b703f76d 12
donatien 0:3717b703f76d 13 enum NetTcpSocketErr
donatien 0:3717b703f76d 14 {
donatien 0:3717b703f76d 15 __NETTCPSOCKET_MIN = -0xFFFF,
donatien 0:3717b703f76d 16 NETTCPSOCKET_SETUP, //NetTcpSocket not properly configured
donatien 0:3717b703f76d 17 NETTCPSOCKET_TIMEOUT,
donatien 0:3717b703f76d 18 NETTCPSOCKET_IF, //If has problems
donatien 0:3717b703f76d 19 NETTCPSOCKET_MEM, //Not enough mem
donatien 0:3717b703f76d 20 NETTCPSOCKET_INUSE, //If/Port is in use
donatien 0:3717b703f76d 21 NETTCPSOCKET_EMPTY, //Connections queue is empty
donatien 0:3717b703f76d 22 NETTCPSOCKET_RST, // Connection was reset by remote host
donatien 0:3717b703f76d 23 //...
donatien 0:3717b703f76d 24 NETTCPSOCKET_OK = 0
donatien 0:3717b703f76d 25 };
donatien 0:3717b703f76d 26
donatien 0:3717b703f76d 27 enum NetTcpSocketEvent
donatien 0:3717b703f76d 28 {
donatien 0:3717b703f76d 29 NETTCPSOCKET_CONNECTED, //Connected to host, must call accept() if we were listening
donatien 0:3717b703f76d 30 NETTCPSOCKET_ACCEPT, //Connected to client
donatien 0:3717b703f76d 31 NETTCPSOCKET_READABLE, //Data in buf
donatien 0:3717b703f76d 32 NETTCPSOCKET_WRITEABLE, //Can write data to buf
donatien 0:3717b703f76d 33 NETTCPSOCKET_CONTIMEOUT,
donatien 0:3717b703f76d 34 NETTCPSOCKET_CONRST,
donatien 0:3717b703f76d 35 NETTCPSOCKET_CONABRT,
donatien 0:3717b703f76d 36 NETTCPSOCKET_ERROR,
donatien 0:3717b703f76d 37 NETTCPSOCKET_DISCONNECTED
donatien 0:3717b703f76d 38 };
donatien 0:3717b703f76d 39
donatien 0:3717b703f76d 40
donatien 0:3717b703f76d 41 class NetTcpSocket
donatien 0:3717b703f76d 42 {
donatien 0:3717b703f76d 43 public:
donatien 0:3717b703f76d 44 NetTcpSocket();
donatien 0:3717b703f76d 45 virtual ~NetTcpSocket(); //close()
donatien 0:3717b703f76d 46
donatien 0:3717b703f76d 47 virtual NetTcpSocketErr bind(const Host& me) = 0;
donatien 0:3717b703f76d 48 virtual NetTcpSocketErr listen() = 0;
donatien 0:3717b703f76d 49 virtual NetTcpSocketErr connect(const Host& host) = 0;
donatien 0:3717b703f76d 50 virtual NetTcpSocketErr accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) = 0;
donatien 0:3717b703f76d 51
donatien 0:3717b703f76d 52 virtual int /*if < 0 : NetTcpSocketErr*/ send(const char* buf, int len) = 0;
donatien 0:3717b703f76d 53 virtual int /*if < 0 : NetTcpSocketErr*/ recv(char* buf, int len) = 0;
donatien 0:3717b703f76d 54
donatien 0:3717b703f76d 55 virtual NetTcpSocketErr close() = 0;
donatien 0:3717b703f76d 56
donatien 0:3717b703f76d 57 virtual NetTcpSocketErr poll() = 0;
donatien 0:3717b703f76d 58
donatien 0:3717b703f76d 59 class CDummy;
donatien 0:3717b703f76d 60 //Callbacks
donatien 0:3717b703f76d 61 template<class T>
donatien 0:3717b703f76d 62 //Linker bug : Must be defined here :(
donatien 0:3717b703f76d 63 void setOnEvent( T* pItem, void (T::*pMethod)(NetTcpSocketEvent) )
donatien 0:3717b703f76d 64 {
donatien 0:3717b703f76d 65 m_pCbItem = (CDummy*) pItem;
donatien 0:3717b703f76d 66 m_pCbMeth = (void (CDummy::*)(NetTcpSocketEvent)) pMethod;
donatien 0:3717b703f76d 67 }
donatien 0:3717b703f76d 68
donatien 0:3717b703f76d 69 void resetOnEvent(); //Disable callback
donatien 0:3717b703f76d 70
donatien 0:3717b703f76d 71 protected:
donatien 0:3717b703f76d 72 void queueEvent(NetTcpSocketEvent e);
donatien 0:3717b703f76d 73 void discardEvents();
donatien 0:3717b703f76d 74 void flushEvents(); //to be called during polling
donatien 0:3717b703f76d 75
donatien 0:3717b703f76d 76 Host m_host;
donatien 0:3717b703f76d 77 Host m_client;
donatien 0:3717b703f76d 78
donatien 0:3717b703f76d 79 friend class Net;
donatien 0:3717b703f76d 80 int m_refs;
donatien 0:3717b703f76d 81
donatien 0:3717b703f76d 82 bool m_closed;
donatien 0:3717b703f76d 83 bool m_removed;
donatien 0:3717b703f76d 84
donatien 0:3717b703f76d 85 private:
donatien 0:3717b703f76d 86 //We do not want to execute user code in interrupt routines, so we queue events until the server is polled
donatien 0:3717b703f76d 87 //If we port this to a multithreaded OS, we could avoid this (however some functions here are not thread-safe, so beware ;) )
donatien 0:3717b703f76d 88 void onEvent(NetTcpSocketEvent e); //To be called on poll
donatien 0:3717b703f76d 89 CDummy* m_pCbItem;
donatien 0:3717b703f76d 90 void (CDummy::*m_pCbMeth)(NetTcpSocketEvent);
donatien 0:3717b703f76d 91 queue<NetTcpSocketEvent> m_events;
donatien 0:3717b703f76d 92
donatien 0:3717b703f76d 93 };
donatien 0:3717b703f76d 94
donatien 0:3717b703f76d 95 #endif