Dependents: SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1
if/net/netudpsocket.h
- Committer:
- donatien
- Date:
- 2010-05-24
- Revision:
- 0:3717b703f76d
- Child:
- 1:e52ec2a24c6a
File content as of revision 0:3717b703f76d:
#ifndef NETUDPSOCKET_H #define NETUDPSOCKET_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 NetUdpSocketErr { __NETUDPSOCKET_MIN = -0xFFFF, NETUDPSOCKET_SETUP, //NetUdpSocket not properly configured NETUDPSOCKET_IF, //If has problems NETUDPSOCKET_MEM, //Not enough mem NETUDPSOCKET_INUSE, //If/Port is in use //... NETUDPSOCKET_OK = 0 }; enum NetUdpSocketEvent //Only one lonely event here... but who knows, maybe some day there'll be another one! { NETUDPSOCKET_READABLE, //Data in buf }; class NetUdpSocket { public: NetUdpSocket(); virtual ~NetUdpSocket(); //close() virtual NetUdpSocketErr bind(const Host& me) = 0; virtual int /*if < 0 : NetUdpSocketErr*/ sendto(const char* buf, int len, Host* pHost) = 0; virtual int /*if < 0 : NetUdpSocketErr*/ recvfrom(char* buf, int len, Host* pHost) = 0; /* TODO NTH : printf / scanf helpers that call send/recv */ virtual NetUdpSocketErr close() = 0; virtual NetUdpSocketErr poll() = 0; class CDummy; //Callbacks template<class T> //Linker bug : Must be defined here :( void setOnEvent( T* pItem, void (T::*pMethod)(NetUdpSocketEvent) ) { m_pCbItem = (CDummy*) pItem; m_pCbMeth = (void (CDummy::*)(NetUdpSocketEvent)) pMethod; } void resetOnEvent(); //Disable callback protected: void queueEvent(NetUdpSocketEvent 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(NetUdpSocketEvent e); //To be called on poll CDummy* m_pCbItem; void (CDummy::*m_pCbMeth)(NetUdpSocketEvent); queue<NetUdpSocketEvent> m_events; }; #endif