1/*
2 * Copyright 2013-2016, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef IMAP_PROTOCOL_H
6#define IMAP_PROTOCOL_H
7
8
9#include <map>
10
11#include <MailProtocol.h>
12#include <ObjectList.h>
13
14#include <locks.h>
15
16#include "Commands.h"
17#include "Settings.h"
18
19
20class IMAPConnectionWorker;
21class IMAPFolder;
22namespace IMAP {
23	class Protocol;
24}
25
26
27typedef std::map<BString, IMAPFolder*> FolderMap;
28
29
30class IMAPProtocol : public BInboundMailProtocol {
31public:
32								IMAPProtocol(
33									const BMailAccountSettings& settings);
34	virtual						~IMAPProtocol();
35
36			status_t			CheckSubscribedFolders(
37									IMAP::Protocol& protocol, bool idle);
38			void				WorkerQuit(IMAPConnectionWorker* worker);
39
40			void				MessageStored(IMAPFolder& folder,
41									entry_ref& ref, BFile& stream,
42									uint32 fetchFlags, BMessage& attributes);
43
44			status_t			UpdateMessageFlags(IMAPFolder& folder,
45									uint32 uid, uint32 flags);
46
47	virtual	status_t			SyncMessages();
48	virtual	status_t			MarkMessageAsRead(const entry_ref& ref,
49									read_flags flags = B_READ);
50
51	virtual void				MessageReceived(BMessage* message);
52	const ::Settings*			Settings() const { return &fSettings; }
53
54protected:
55	virtual status_t			HandleFetchBody(const entry_ref& ref,
56									const BMessenger& replyTo);
57
58			void				ReadyToRun();
59
60private:
61			IMAPFolder*			_CreateFolder(const BString& mailbox,
62									const BString& separator);
63			IMAPFolder*			_FolderFor(ino_t directory);
64			status_t			_EnqueueCheckMailboxes();
65
66protected:
67	typedef std::map<IMAPFolder*, IMAPConnectionWorker*> WorkerMap;
68	typedef std::map<ino_t, IMAPFolder*> FolderNodeMap;
69
70			::Settings			fSettings;
71			mutex				fWorkerLock;
72			BObjectList<IMAPConnectionWorker> fWorkers;
73			WorkerMap			fWorkerMap;
74			FolderMap			fFolders;
75			FolderNodeMap		fFolderNodeMap;
76};
77
78
79#endif	// IMAP_PROTOCOL_H