#ifndef __BACKEND_H__
#define __BACKEND_H__

#include "ratelimiter.h"

class CBackend : public CRateLimiterObject
{
public:
	CBackend(wxEvtHandler* pEvtHandler);
	virtual ~CBackend() {}
	virtual void Read(void *data, unsigned int len) = 0;
	virtual void Write(const void *data, unsigned int len) = 0;
	virtual bool Error() const = 0;
	virtual int LastError() const = 0;
	virtual unsigned int LastCount() const = 0;
	virtual void Peek(void *buffer, unsigned int len) = 0;

	virtual void OnRateAvailable(enum CRateLimiter::rate_direction direction) = 0;

	int GetId() const { return m_Id; }

protected:
	wxEvtHandler* const m_pEvtHandler;

private:
	int m_Id;

	// Initialized with 0, incremented each time
	// a new instance is created
	// Mainly needed for CHttpControlSockets if server sends a redirects.
	// Otherwise, lingering events from the previous connection will cause
	// problems
	static int m_nextId;
};

class CSocketBackend : public CBackend
{
public:
	CSocketBackend(wxEvtHandler* pEvtHandler, wxSocketBase* pSocket);
	virtual ~CSocketBackend();
	// Backend definitions
	virtual void Read(void *buffer, unsigned int len);
	virtual void Write(const void *buffer, unsigned int len);
	virtual bool Error() const { return m_error; }
	virtual unsigned int LastCount() const { return m_lastCount; }
	virtual int LastError() const { return m_lastError; }
	virtual void Peek(void *buffer, unsigned int len);

protected:
	virtual void OnRateAvailable(enum CRateLimiter::rate_direction direction);

	void UpdateResults();
	wxSocketBase* m_pSocket;

	bool m_error;
	int m_lastCount;
	int m_lastError;
};

#endif //__BACKEND_H__


syntax highlighted by Code2HTML, v. 0.9.1