1/* 2 * Copyright 2004-2016, Haiku, Inc. All Rights Reserved. 3 * Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved. 4 * Copyright 2011 Clemens Zeidler. All rights reserved. 5 * 6 * Distributed under the terms of the MIT License. 7 */ 8#ifndef _MAIL_PROTOCOL_H 9#define _MAIL_PROTOCOL_H 10 11 12#include <map> 13 14#include <Looper.h> 15#include <OS.h> 16#include <ObjectList.h> 17#include <Entry.h> 18#include <File.h> 19 20#include <E-mail.h> 21#include <MailSettings.h> 22 23 24class BMailFilter; 25class BMailSettingsView; 26class BView; 27 28 29class BMailNotifier { 30public: 31 virtual ~BMailNotifier() {} 32 33 virtual BMailNotifier* Clone() = 0; 34 35 virtual void ShowError(const char* error) = 0; 36 virtual void ShowMessage(const char* message) = 0; 37 38 virtual void SetTotalItems(uint32 items) = 0; 39 virtual void SetTotalItemsSize(uint64 size) = 0; 40 virtual void ReportProgress(uint32 items, uint64 bytes, 41 const char* message = NULL) = 0; 42 virtual void ResetProgress(const char* message = NULL) = 0; 43}; 44 45 46typedef status_t BMailFilterAction; 47 48#define B_NO_MAIL_ACTION 0 49#define B_MOVE_MAIL_ACTION 1 50#define B_DELETE_MAIL_ACTION 2 51 52 53class BMailProtocol : public BLooper { 54public: 55 BMailProtocol(const char* name, 56 const BMailAccountSettings& settings); 57 virtual ~BMailProtocol(); 58 59 const BMailAccountSettings& AccountSettings() const; 60 61 void SetMailNotifier(BMailNotifier* mailNotifier); 62 BMailNotifier* MailNotifier() const; 63 64 //! We take ownership of the filters 65 bool AddFilter(BMailFilter* filter); 66 int32 CountFilter() const; 67 BMailFilter* FilterAt(int32 index) const; 68 BMailFilter* RemoveFilter(int32 index); 69 bool RemoveFilter(BMailFilter* filter); 70 71 virtual void MessageReceived(BMessage* message); 72 73 // Convenience methods that call the BMailNotifier 74 void ShowError(const char* error); 75 void ShowMessage(const char* message); 76 77#if __GNUC__ > 2 78 // Unhide virtual base methods 79 using BHandler::AddFilter; 80 using BHandler::RemoveFilter; 81#endif 82 83protected: 84 void SetTotalItems(uint32 items); 85 void SetTotalItemsSize(uint64 size); 86 void ReportProgress(uint32 items, uint64 bytes, 87 const char* message = NULL); 88 void ResetProgress(const char* message = NULL); 89 void NotifyNewMessagesToFetch(int32 nMessages); 90 91 // Filter notifications 92 BMailFilterAction ProcessHeaderFetched(entry_ref& ref, 93 BFile& mail, BMessage& attributes); 94 void NotifyBodyFetched(const entry_ref& ref, 95 BFile& mail, BMessage& attributes); 96 BMailFilterAction ProcessMessageFetched(entry_ref& ref, 97 BFile& mail, BMessage& attributes); 98 void NotifyMessageReadyToSend(const entry_ref& ref, 99 BFile& mail); 100 void NotifyMessageSent(const entry_ref& ref, 101 BFile& mail); 102 103 void LoadFilters( 104 const BMailProtocolSettings& settings); 105 106private: 107 static BString _LooperName(const char* name, 108 const BMailAccountSettings& settings); 109 BMailFilter* _LoadFilter(const BMailAddOnSettings& settings); 110 BMailFilterAction _ProcessHeaderFetched(entry_ref& ref, 111 BFile& mail, BMessage& attributes); 112 void _NotifyBodyFetched(const entry_ref& ref, 113 BFile& mail, BMessage& attributes); 114 115protected: 116 const BMailAccountSettings fAccountSettings; 117 BMailNotifier* fMailNotifier; 118 119private: 120 BObjectList<BMailFilter> fFilterList; 121 std::map<entry_ref, image_id> fFilterImages; 122}; 123 124 125class BInboundMailProtocol : public BMailProtocol { 126public: 127 BInboundMailProtocol(const char* name, 128 const BMailAccountSettings& settings); 129 virtual ~BInboundMailProtocol(); 130 131 virtual void MessageReceived(BMessage* message); 132 133 virtual status_t SyncMessages() = 0; 134 virtual status_t FetchBody(const entry_ref& ref, 135 BMessenger* replyTo); 136 virtual status_t MarkMessageAsRead(const entry_ref& ref, 137 read_flags flags = B_READ); 138 139 static void ReplyBodyFetched(const BMessenger& replyTo, 140 const entry_ref& ref, status_t status); 141 142protected: 143 virtual status_t HandleFetchBody(const entry_ref& ref, 144 const BMessenger& replyTo) = 0; 145 146 void NotiyMailboxSynchronized(status_t status); 147}; 148 149 150class BOutboundMailProtocol : public BMailProtocol { 151public: 152 BOutboundMailProtocol(const char* name, 153 const BMailAccountSettings& settings); 154 virtual ~BOutboundMailProtocol(); 155 156 virtual status_t SendMessages(const BMessage& message, 157 off_t totalBytes); 158 159 virtual void MessageReceived(BMessage* message); 160 161protected: 162 virtual status_t HandleSendMessages(const BMessage& message, 163 off_t totalBytes) = 0; 164}; 165 166 167// Your protocol needs to export these hooks in order to be picked up 168extern "C" BInboundMailProtocol* instantiate_inbound_protocol( 169 const BMailAccountSettings& settings); 170extern "C" BOutboundMailProtocol* instantiate_outbound_protocol( 171 const BMailAccountSettings& settings); 172 173extern "C" BMailSettingsView* instantiate_protocol_settings_view( 174 const BMailAccountSettings& accountSettings, 175 const BMailProtocolSettings& settings); 176 177 178#endif // _MAIL_PROTOCOL_H 179