Dependents:   SimpleLCDClock readCard2Twitter_http AnalogClock_StepperMotor_NTP ServoCamV1

services/email/smtp/smtpClient.h

Committer:
donatien
Date:
2010-05-24
Revision:
0:a2dd0ba6cd2d
Child:
1:7043cc0db03c

File content as of revision 0:a2dd0ba6cd2d:

#ifndef SMTP_CLIENT_H
#define SMTP_CLIENT_H

class EmailMessage;

#include "if/net/net.h"
#include "api/TcpSocket.h"
#include "../emailMessage.h"

#include "mbed.h"

#define SMTP_REQUEST_TIMEOUT 5000

enum SmtpResult
{
  SMTP_OK,
  SMTP_PRTCL, //Protocol error
  SMTP_TIMEOUT, //Connection timeout
  SMTP_DISC //Disconnected 
};

class SmtpClient /*: public NetService*/
{
public:
  SmtpClient();
  virtual ~SmtpClient();
  
  void setHost(const Host& host);
  void send(EmailMessage* pMessage);
  
  class CDummy;
  template<class T> 
  //Linker bug : Must be defined here :(
  void setOnResult( T* pItem, void (T::*pMethod)(SmtpResult) )
  {
    m_pCbItem = (CDummy*) pItem;
    m_pCbMeth = (void (CDummy::*)(SmtpResult)) pMethod;
  }
  
  void init(); //Create and setup socket if needed
  void close();
  
private:
  int rc(char* buf); //Return code
  void process(bool moreData); //Main state-machine

  void setTimeout(int ms);
  void resetTimeout();
  
  void onTimeout(); //Connection has timed out
  void onTcpSocketEvent(TcpSocketEvent e);
  void onResult(SmtpResult r); //Called when exchange completed or on failure
  
  EmailMessage* m_pMessage;

  TcpSocket* m_pTcpSocket;

  enum SmtpStep
  {
    SMTP_HELLO,
    SMTP_FROM,
    SMTP_TO,
    SMTP_DATA,
    SMTP_BODY,
    SMTP_BODYMORE,
    SMTP_EOF,
    SMTP_BYE
  };
  
  SmtpStep m_nextState;
  
  CDummy* m_pCbItem;
  void (CDummy::*m_pCbMeth)(SmtpResult);
  
  Timeout m_watchdog;
  int m_timeout;
  
  int m_posInMsg;
  
  bool m_closed;
  
  Host m_host;

};

#endif