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