Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

api/UdpSocket.h

Committer:
donatien
Date:
2010-05-24
Revision:
0:3717b703f76d
Child:
1:e52ec2a24c6a

File content as of revision 0:3717b703f76d:

#ifndef UDPSOCKET_H
#define UDPSOCKET_H

#include "if/net/net.h"
//Essentially it is a safe interface to NetUdpSocket

enum UdpSocketErr
{
  __UDPSOCKET_MIN = -0xFFFF,
  UDPSOCKET_SETUP, //NetUdpSocket not properly configured
  UDPSOCKET_IF, //If has problems, does not exist or is not initialized
  UDPSOCKET_MEM, //Not enough mem
  UDPSOCKET_INUSE, //If/Port is in use
//...
  UDPSOCKET_OK = 0
};

enum UdpSocketEvent //Only one lonely event here... but who knows, maybe some day there'll be another one!
{
  UDPSOCKET_READABLE, //Data in buf
};


class UdpSocket
{
public:
  UdpSocket();
  ~UdpSocket(); //close()
  
  UdpSocketErr bind(const Host& me);
  
  int /*if < 0 : UdpSocketErr*/ sendto(const char* buf, int len, Host* pHost);
  int /*if < 0 : UdpSocketErr*/ recvfrom(char* buf, int len, Host* pHost);

  /* TODO NTH : printf / scanf helpers that call send/recv */

  UdpSocketErr close();

  class CDummy;
  //Callbacks
  void setOnEvent( void (*pMethod)(UdpSocketEvent) );
  template<class T> 
  //Linker bug : Must be defined here :(
  void setOnEvent( T* pItem, void (T::*pMethod)(UdpSocketEvent) )
  {
    m_pCbItem = (CDummy*) pItem;
    m_pCbMeth = (void (CDummy::*)(UdpSocketEvent)) pMethod;
  }
  
  void resetOnEvent(); //Disable callback

protected:
  void onNetUdpSocketEvent(NetUdpSocketEvent e);
  UdpSocketErr checkInst();

private:
  NetUdpSocket* m_pNetUdpSocket;
  
  CDummy* m_pCbItem;
  void (CDummy::*m_pCbMeth)(UdpSocketEvent);
  
  void (*m_pCb)(UdpSocketEvent);

};

#endif