#ifndef PROTOCOL_H
#define PROTOCOL_H
#include <map>
#include <BufferedDataIO.h>
#include <ObjectList.h>
#include <OS.h>
#include <SecureSocket.h>
#include <String.h>
#include "Commands.h"
#define xEOF 236
const bigtime_t kIMAP4ClientTimeout = 1000000 * 60;
namespace IMAP {
class Command;
class Handler;
typedef BObjectList<Handler> HandlerList;
typedef std::map<int32, Command*> CommandIDMap;
class FolderEntry {
public:
FolderEntry()
:
subscribed(false)
{
}
BString folder;
bool subscribed;
};
typedef std::vector<FolderEntry> FolderList;
class Protocol {
public:
Protocol();
~Protocol();
status_t Connect(const BNetworkAddress& address,
const char* username, const char* password,
bool useSSL = true);
status_t Disconnect();
bool IsConnected();
bool AddHandler(Handler& handler);
void RemoveHandler(Handler& handler);
status_t GetFolders(FolderList& folders,
BString& separator);
status_t GetSubscribedFolders(BStringList& folders,
BString& separator);
status_t SubscribeFolder(const char* folder);
status_t UnsubscribeFolder(const char* folder);
status_t GetQuota(uint64& used, uint64& total);
status_t SendCommand(const char* command);
status_t SendCommand(int32 id, const char* command);
ssize_t SendData(const char* buffer, uint32 length);
status_t ProcessCommand(Command& command,
bigtime_t timeout = kIMAP4ClientTimeout);
ArgumentList& Capabilities() { return fCapabilities; }
const ArgumentList& Capabilities() const { return fCapabilities; }
const BString& CommandError() { return fCommandError; }
protected:
status_t HandleResponse(Command* command,
bigtime_t timeout = kIMAP4ClientTimeout,
bool disconnectOnTimeout = true);
int32 NextCommandID();
private:
status_t _Disconnect();
status_t _GetAllFolders(BStringList& folders);
void _ParseCapabilities(
const ArgumentList& arguments);
protected:
BSocket* fSocket;
BBufferedDataIO* fBufferedSocket;
HandlerList fHandlerList;
ArgumentList fCapabilities;
private:
int32 fCommandID;
CommandIDMap fOngoingCommands;
BString fCommandError;
bool fIsConnected;
};
}
#endif