00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __KMAIL_IMAPACCOUNTBASE_H__
00025 #define __KMAIL_IMAPACCOUNTBASE_H__
00026
00027 #include <set>
00028
00029 #include "networkaccount.h"
00030
00031 #include <tqtimer.h>
00032 #include <tqguardedptr.h>
00033 #include <tdeio/global.h>
00034
00035 namespace KMail {
00036 class AccountManager;
00037 }
00038 class KMFolder;
00039 class TDEConfig;
00040 class KMMessagePart;
00041 class DwBodyPart;
00042 class DwMessage;
00043 class FolderStorage;
00044 template <typename T> class TQValueVector;
00045
00046 namespace TDEIO {
00047 class Job;
00048 }
00049
00050 namespace KPIM {
00051 class ProgressItem;
00052 }
00053
00054 namespace KMail {
00055 struct ACLListEntry;
00056 struct QuotaInfo;
00057 typedef TQValueVector<KMail::ACLListEntry> ACLList;
00058
00059 class AttachmentStrategy;
00060
00061 class ImapAccountBase : public KMail::NetworkAccount {
00062 Q_OBJECT
00063
00064 protected:
00065 ImapAccountBase( AccountManager * parent, const TQString & name, uint id );
00066 public:
00067 virtual ~ImapAccountBase();
00068
00070 virtual void init();
00071
00073 virtual void pseudoAssign( const KMAccount * a );
00074
00077 bool autoExpunge() const { return mAutoExpunge; }
00078 virtual void setAutoExpunge( bool expunge );
00079
00081 bool hiddenFolders() const { return mHiddenFolders; }
00082 virtual void setHiddenFolders( bool show );
00083
00085 bool onlySubscribedFolders() const { return mOnlySubscribedFolders; }
00086 virtual void setOnlySubscribedFolders( bool show );
00087
00089 bool onlyLocallySubscribedFolders() const { return mOnlyLocallySubscribedFolders; }
00090 virtual void setOnlyLocallySubscribedFolders( bool show );
00091
00092
00094 bool loadOnDemand() const { return mLoadOnDemand; }
00095 virtual void setLoadOnDemand( bool load );
00096
00098 bool listOnlyOpenFolders() const { return mListOnlyOpenFolders; }
00099 virtual void setListOnlyOpenFolders( bool only );
00100
00102 virtual TDEIO::MetaData slaveConfig() const;
00103
00104 virtual void readConfig( TDEConfig& config );
00105 virtual void writeConfig( TDEConfig& config );
00106
00110 enum ConnectionState { Error = 0, Connected, Connecting };
00111
00112
00113 enum ListType {
00114 List,
00115 ListSubscribed,
00116 ListSubscribedNoCheck,
00117 ListFolderOnly,
00118 ListFolderOnlySubscribed
00119 };
00120
00127 ConnectionState makeConnection();
00128
00129
00130 enum imapNamespace { PersonalNS=0, OtherUsersNS=1, SharedNS=2 };
00131
00132
00133 typedef TQMap<imapNamespace, TQStringList> nsMap;
00134
00135
00136 typedef TQMap<TQString, TQString> namespaceDelim;
00137
00138
00139 typedef TQMap<imapNamespace, namespaceDelim> nsDelimMap;
00140
00144 struct jobData
00145 {
00146
00147 jobData() : url(TQString()), parent(0), current(0), total(1), done(0), offset(0), progressItem(0),
00148 onlySubscribed(false), quiet(false), cancellable(false) {}
00149
00150 jobData( const TQString& _url, KMFolder *_parent = 0,
00151 int _total = 1, int _done = 0, bool _quiet = false,
00152 bool _cancelable = false )
00153 : url(_url), parent(_parent), current(0), total(_total), done(_done), offset(0),
00154 progressItem(0), quiet(_quiet), cancellable(_cancelable) {}
00155
00156 TQString path;
00157 TQString url;
00158 TQString curNamespace;
00159 TQByteArray data;
00160 TQCString cdata;
00161 TQStringList items;
00162 KMFolder *parent, *current;
00163 TQPtrList<KMMessage> msgList;
00164 int total, done, offset;
00165 KPIM::ProgressItem *progressItem;
00166 bool onlySubscribed, quiet, cancellable;
00167 };
00168
00169 typedef TQMap<TDEIO::Job *, jobData>::Iterator JobIterator;
00173 void insertJob( TDEIO::Job* job, const jobData& data ) {
00174 mapJobData.insert( job, data );
00175 }
00179 JobIterator findJob( TDEIO::Job* job ) { return mapJobData.find( job ); }
00180 JobIterator jobsEnd() { return mapJobData.end(); }
00185 void removeJob( JobIterator& it );
00186
00187 void removeJob( TDEIO::Job* job );
00188
00196 void changeSubscription(bool subscribe, const TQString& imapPath, bool quiet = false );
00197
00202 bool locallySubscribedTo( const TQString& imapPath );
00203
00208 void changeLocalSubscription( const TQString& imapPath, bool subscribe );
00209
00210
00216 void getUserRights( KMFolder* folder, const TQString& imapPath );
00217
00223 void getACL( KMFolder* folder, const TQString& imapPath );
00224
00230 void getStorageQuotaInfo( KMFolder* folder, const TQString& imapPath );
00231
00236 void setImapStatus( KMFolder* folder, const TQString& path, const TQCString& flags );
00237
00242 void setImapSeenStatus( KMFolder* folder, const TQString& path, bool seen );
00243
00247 void slaveDied() { mSlave = 0; killAllJobs(); }
00248
00252 void killAllJobs( bool disconnectSlave=false ) = 0;
00253
00257 virtual void cancelMailCheck();
00258
00262 enum FolderListType { Single, Recursive };
00263 void processNewMailInFolder( KMFolder* folder, FolderListType type = Single );
00264
00268 bool checkingSingleFolder() { return mCheckingSingleFolder; }
00269
00274 void postProcessNewMail( bool setStatusMsg = true );
00275
00280 bool checkingMail( KMFolder *folder );
00281
00282 bool checkingMail() { return NetworkAccount::checkingMail(); }
00283
00287 void handleBodyStructure( TQDataStream & stream, KMMessage * msg,
00288 const AttachmentStrategy *as );
00289
00293 virtual void setFolder(KMFolder*, bool addAccount = false);
00294
00299 bool hasACLSupport() const { return mACLSupport; }
00300
00305 bool hasAnnotationSupport() const { return mAnnotationSupport; }
00306
00310 void setHasNoAnnotationSupport() { mAnnotationSupport = false; }
00311
00316 bool hasQuotaSupport() const { return mQuotaSupport; }
00317
00321 void setHasNoQuotaSupport() { mQuotaSupport = false; }
00322
00327 bool handleJobError( TDEIO::Job* job, const TQString& context, bool abortSync = false );
00328
00332 virtual FolderStorage* rootFolder() const = 0;
00333
00337 KPIM::ProgressItem* listDirProgressItem();
00338
00343 virtual unsigned int folderCount() const;
00344
00348 nsMap namespaces() const { return mNamespaces; }
00349
00353 virtual void setNamespaces( nsMap map )
00354 { mNamespaces = map; }
00355
00360 nsDelimMap namespacesWithDelimiter();
00361
00365 TQString namespaceForFolder( FolderStorage* );
00366
00370 TQString addPathToNamespace( const TQString& ns );
00371
00375 TQString delimiterForNamespace( const TQString& prefix );
00376
00380 TQString delimiterForFolder( FolderStorage* );
00381
00385 namespaceDelim namespaceToDelimiter() const
00386 { return mNamespaceToDelimiter; }
00387
00391 void setNamespaceToDelimiter( namespaceDelim map )
00392 { mNamespaceToDelimiter = map; }
00393
00397 bool isNamespaceFolder( TQString& name );
00398
00402 bool hasCapability( const TQString& capa ) {
00403 return mCapabilities.contains( capa ); }
00404
00410 TQString createImapPath( FolderStorage* parent, const TQString& folderName );
00411
00415 TQString createImapPath( const TQString& parent, const TQString& folderName );
00416
00417
00418 public slots:
00423 void getNamespaces();
00424
00425 private slots:
00430 void slotSubscriptionResult(TDEIO::Job * job);
00431
00432 protected slots:
00433 virtual void slotCheckQueuedFolders();
00434
00436 void slotSchedulerSlaveConnected(TDEIO::Slave *aSlave);
00438 void slotSchedulerSlaveError(TDEIO::Slave *aSlave, int, const TQString &errorMsg);
00439
00443 void slotSetStatusResult(TDEIO::Job * job);
00444
00446 void slotGetUserRightsResult( TDEIO::Job* _job );
00447
00449 void slotGetACLResult( TDEIO::Job* _job );
00450
00452 void slotGetStorageQuotaInfoResult( TDEIO::Job* _job );
00453
00457 void slotNoopTimeout();
00461 void slotIdleTimeout();
00462
00466 void slotAbortRequested( KPIM::ProgressItem* );
00467
00471 void slotSimpleResult(TDEIO::Job * job);
00472
00474 void slotNamespaceResult( TDEIO::Job*, const TQString& str );
00475
00479 void slotSaveNamespaces( const ImapAccountBase::nsDelimMap& map );
00480
00484 void slotCapabilitiesResult( TDEIO::Job*, const TQString& result );
00485
00486 protected:
00487
00504 virtual bool handleError( int error, const TQString &errorMsg, TDEIO::Job* job, const TQString& context, bool abortSync = false );
00505
00507 bool handlePutError( TDEIO::Job* job, jobData& jd, KMFolder* folder );
00508
00509 virtual TQString protocol() const;
00510 virtual unsigned short int defaultPort() const;
00511
00515 void constructParts( TQDataStream & stream, int count, KMMessagePart* parentKMPart,
00516 DwBodyPart * parent, const DwMessage * dwmsg );
00517
00519 void migratePrefix();
00520
00521
00522 TQStringList locallyBlacklistedFolders() const;
00523 void localBlacklistFromStringList( const TQStringList & );
00524 TQString prettifyQuotaError( const TQString& _error, TDEIO::Job * job );
00525
00526 protected:
00527 TQPtrList<TQGuardedPtr<KMFolder> > mOpenFolders;
00528 TQStringList mSubfolderNames, mSubfolderPaths,
00529 mSubfolderMimeTypes, mSubfolderAttributes;
00530 TQMap<TDEIO::Job *, jobData> mapJobData;
00532 TQTimer mIdleTimer;
00534 TQTimer mNoopTimer;
00535 int mTotal, mCountUnread, mCountLastUnread;
00536 TQMap<TQString, int> mUnreadBeforeCheck;
00537 bool mAutoExpunge : 1;
00538 bool mHiddenFolders : 1;
00539 bool mOnlySubscribedFolders : 1;
00540 bool mOnlyLocallySubscribedFolders : 1;
00541 bool mLoadOnDemand : 1;
00542 bool mListOnlyOpenFolders : 1;
00543 bool mProgressEnabled : 1;
00544
00545 bool mErrorDialogIsActive : 1;
00546 bool mPasswordDialogIsActive : 1;
00547 bool mACLSupport : 1;
00548 bool mAnnotationSupport : 1;
00549 bool mQuotaSupport : 1;
00550 bool mSlaveConnected : 1;
00551 bool mSlaveConnectionError : 1;
00552 bool mCheckingSingleFolder : 1;
00553
00554
00555 TQValueList<TQGuardedPtr<KMFolder> > mMailCheckFolders;
00556
00557 TQValueList<TQGuardedPtr<KMFolder> > mFoldersQueuedForChecking;
00558
00559 TQPtrList<KMMessagePart> mBodyPartList;
00560
00561 KMMessage* mCurrentMsg;
00562
00563 TQGuardedPtr<KPIM::ProgressItem> mListDirProgressItem;
00564
00565
00566 nsMap mNamespaces;
00567
00568
00569 namespaceDelim mNamespaceToDelimiter;
00570
00571
00572 TQString mOldPrefix;
00573
00574
00575 TQStringList mCapabilities;
00576
00577 std::set<TQString> mLocalSubscriptionBlackList;
00578
00579 signals:
00586 void connectionResult( int errorCode, const TQString& errorMsg );
00587
00592 void subscriptionChanged(const TQString& imapPath, bool subscribed);
00593
00598 void subscriptionChangeFailed( const TQString &errorMessage );
00599
00605 void imapStatusChanged( KMFolder*, const TQString& imapPath, bool cont );
00606
00613 void receivedUserRights( KMFolder* folder );
00614
00622 void receivedACL( KMFolder* folder, TDEIO::Job* job, const KMail::ACLList& entries );
00623
00632 void receivedStorageQuotaInfo( KMFolder* folder, TDEIO::Job* job, const KMail::QuotaInfo& entries );
00633
00637 void namespacesFetched( const ImapAccountBase::nsDelimMap& );
00638
00642 void namespacesFetched();
00643 };
00644
00645
00646 }
00647
00648 #endif // __KMAIL_IMAPACCOUNTBASE_H__