Dependents: SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1
if/net/nettcpsocket.h
- Committer:
- donatien
- Date:
- 2010-05-24
- Revision:
- 0:3717b703f76d
- Child:
- 1:e52ec2a24c6a
File content as of revision 0:3717b703f76d:
#ifndef NETTCPSOCKET_H #define NETTCPSOCKET_H #include "net.h" #include "host.h" #include <queue> using std::queue; //Implements a Berkeley-like socket if //Can be interfaced either to lwip or a Telit module enum NetTcpSocketErr { __NETTCPSOCKET_MIN = -0xFFFF, NETTCPSOCKET_SETUP, //NetTcpSocket not properly configured NETTCPSOCKET_TIMEOUT, NETTCPSOCKET_IF, //If has problems NETTCPSOCKET_MEM, //Not enough mem NETTCPSOCKET_INUSE, //If/Port is in use NETTCPSOCKET_EMPTY, //Connections queue is empty NETTCPSOCKET_RST, // Connection was reset by remote host //... NETTCPSOCKET_OK = 0 }; enum NetTcpSocketEvent { NETTCPSOCKET_CONNECTED, //Connected to host, must call accept() if we were listening NETTCPSOCKET_ACCEPT, //Connected to client NETTCPSOCKET_READABLE, //Data in buf NETTCPSOCKET_WRITEABLE, //Can write data to buf NETTCPSOCKET_CONTIMEOUT, NETTCPSOCKET_CONRST, NETTCPSOCKET_CONABRT, NETTCPSOCKET_ERROR, NETTCPSOCKET_DISCONNECTED }; class NetTcpSocket { public: NetTcpSocket(); virtual ~NetTcpSocket(); //close() virtual NetTcpSocketErr bind(const Host& me) = 0; virtual NetTcpSocketErr listen() = 0; virtual NetTcpSocketErr connect(const Host& host) = 0; virtual NetTcpSocketErr accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) = 0; virtual int /*if < 0 : NetTcpSocketErr*/ send(const char* buf, int len) = 0; virtual int /*if < 0 : NetTcpSocketErr*/ recv(char* buf, int len) = 0; virtual NetTcpSocketErr close() = 0; virtual NetTcpSocketErr poll() = 0; class CDummy; //Callbacks template<class T> //Linker bug : Must be defined here :( void setOnEvent( T* pItem, void (T::*pMethod)(NetTcpSocketEvent) ) { m_pCbItem = (CDummy*) pItem; m_pCbMeth = (void (CDummy::*)(NetTcpSocketEvent)) pMethod; } void resetOnEvent(); //Disable callback protected: void queueEvent(NetTcpSocketEvent e); void discardEvents(); void flushEvents(); //to be called during polling Host m_host; Host m_client; friend class Net; int m_refs; bool m_closed; bool m_removed; private: //We do not want to execute user code in interrupt routines, so we queue events until the server is polled //If we port this to a multithreaded OS, we could avoid this (however some functions here are not thread-safe, so beware ;) ) void onEvent(NetTcpSocketEvent e); //To be called on poll CDummy* m_pCbItem; void (CDummy::*m_pCbMeth)(NetTcpSocketEvent); queue<NetTcpSocketEvent> m_events; }; #endif