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 kmfolderimap_h
00025 #define kmfolderimap_h
00026
00027 #include "kmacctimap.h"
00028 #include "kmfoldermbox.h"
00029 #include "kmmsgbase.h"
00030
00031 #include <kio/job.h>
00032 #include <kio/global.h>
00033
00034 #include <kstandarddirs.h>
00035
00036 #include <QList>
00037 #include <q3intdict.h>
00038 #include <q3dict.h>
00039
00040 template< typename T> class QList;
00041
00042 class KMFolderImap;
00043 class KMSearchPattern;
00044 class KMMessage;
00045 namespace KMail {
00046 class FolderJob;
00047 class ImapJob;
00048 class AttachmentStrategy;
00049 class ImapAccountBase;
00050 }
00051 namespace KPIM {
00052 class ProgressItem;
00053 }
00054 using KMail::FolderJob;
00055 using KMail::ImapJob;
00056 using KMail::AttachmentStrategy;
00057 using KMail::ImapAccountBase;
00058 using KPIM::ProgressItem;
00059 using KPIM::MessageStatus;
00060
00061 class KMMsgMetaData
00062 {
00063 public:
00064 KMMsgMetaData( const MessageStatus& aStatus)
00065 :mStatus(aStatus), mSerNum(0) {}
00066 KMMsgMetaData(const MessageStatus& aStatus, quint32 aSerNum)
00067 :mStatus(aStatus), mSerNum(aSerNum) {}
00068 ~KMMsgMetaData() {}
00069 const MessageStatus& status() const { return mStatus; }
00070 const MessageStatus& messageStatus() const { return mStatus; }
00071 quint32 serNum() const { return mSerNum; }
00072 private:
00073 MessageStatus mStatus;
00074 quint32 mSerNum;
00075 };
00076
00077
00078
00079 class KMFolderImap : public KMFolderMbox
00080 {
00081 Q_OBJECT
00082 friend class ::KMail::ImapJob;
00083 public:
00084
00085 static QString cacheLocation() {
00086 return KStandardDirs::locateLocal("data", "kmail/imap" );
00087 }
00088
00089 enum imapState {
00090 imapNoInformation = 0,
00091 imapListingInProgress = 1,
00092 imapDownloadInProgress = 2,
00093 imapFinished = 3
00094 };
00095
00096 virtual imapState getContentState() { return mContentState; }
00097 virtual void setContentState(imapState state) { mContentState = state; }
00098
00099 virtual imapState getSubfolderState() { return mSubfolderState; }
00100 virtual void setSubfolderState(imapState state);
00101
00105 explicit KMFolderImap(KMFolder* folder, const char* name=0);
00106 virtual ~KMFolderImap();
00107
00109 virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00110
00111 virtual KMMessage* getMsg(int idx);
00113 void setImapPath( const QString &path );
00114 QString imapPath() const { return mImapPath; }
00115
00117 ulong lastUid();
00118
00120 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00121 QString uidValidity() { return mUidValidity; }
00122
00124 void setAccount(KMAcctImap *acct);
00125 KMAcctImap* account() const;
00126
00128 virtual void removeMsg(int i, bool quiet = false);
00129 virtual void removeMsg(const QList<KMMessage*>& msgList, bool quiet = false);
00130
00131 virtual int rename( const QString& newName, KMFolderDir *aParent = 0 );
00132
00134 virtual void remove();
00135
00137 bool autoExpunge();
00138
00140 virtual void writeConfig();
00141
00143 virtual void readConfig();
00144
00150 virtual bool listDirectory();
00151
00155 void getFolder(bool force = false);
00156
00160 void getAndCheckFolder(bool force = false);
00161
00169 void createFolder(const QString &name,
00170 const QString& imapPath = QString(), bool askUser = true);
00171
00175 void deleteMessage(KMMessage * msg);
00176 void deleteMessage(const QList<KMMessage*>& msgList);
00177
00182 virtual void setStatus(int idx, const MessageStatus& status, bool toggle);
00183
00187 virtual void setStatus(QList<int>& _ids, const MessageStatus& status, bool toggle);
00188
00190 static QStringList makeSets( QList<ulong>&, bool sort = true);
00191 static QStringList makeSets(const QStringList&, bool sort = true);
00192
00194 static QList<KMMessage*> splitMessageList(const QString& set,
00195 QList<KMMessage*>& msgList);
00196
00198 void getUids(QList<int>& ids, QList<ulong>& uids);
00199
00201 void getUids(const QList<KMMessage*>& msgList, QList<ulong>& uids);
00202
00206 void expungeFolder(KMFolderImap * aFolder, bool quiet);
00207
00208 virtual int compact( bool ) { expungeFolder(this, false); return 0; }
00209
00213 void sendFolderComplete(bool success)
00214 { emit folderComplete(this, success); }
00215
00220 bool processNewMail(bool interactive);
00221
00226 void setSelected(bool selected) { mIsSelected = selected; }
00227 bool isSelected() { return mIsSelected; }
00228
00232 static QString encodeFileName(const QString &);
00233 static QString decodeFileName(const QString &);
00234
00238 static QString statusToFlags( const KPIM::MessageStatus &status, int supportedFalgs);
00239
00243 virtual QString fileName() const {
00244 return encodeFileName( KMFolderMbox::fileName() ); }
00245
00249 ulong serNumForUID( ulong uid );
00250
00255 void saveMsgMetaData( KMMessage* msg, ulong uid = 0 );
00256
00260 static QList<ulong> splitSets(const QString&);
00261
00262 virtual void ignoreJobsForMessage( KMMessage* );
00263
00267 bool includeInMailCheck() { return mCheckMail; }
00268 void setIncludeInMailCheck( bool check );
00269
00271 virtual int create();
00272
00274 virtual bool isAutoExpire() const { return false; }
00275
00276 void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00277
00279 virtual void reallyDoClose();
00280
00282 KMFolder* trashFolder() const;
00283
00289 void setAlreadyRemoved(bool removed);
00290
00292 bool isReadOnly() const { return KMFolderMbox::isReadOnly() || mReadOnly; }
00293
00298 unsigned int userRights() const { return mUserRights; }
00299 bool canDeleteMessages() const;
00300
00302 void setUserRights( unsigned int userRights );
00303
00309 virtual void search( const KMSearchPattern* );
00310 virtual void search( const KMSearchPattern*, quint32 serNum );
00311
00313 virtual bool isMoveable() const;
00314
00316 void initializeFrom( KMFolderImap* parent, const QString &path, const QString &mimeType );
00317
00319 int permanentFlags() const { return mPermanentFlags; }
00320
00321 signals:
00322 void folderComplete(KMFolderImap *folder, bool success);
00323
00327 void deleted(KMFolderImap*);
00328
00332 void directoryListingFinished(KMFolderImap*);
00333
00339 void folderCreationResult( const QString &name, bool success );
00340
00341 public slots:
00343 virtual void addMsgQuiet(KMMessage *);
00344 virtual void addMsgQuiet(QList<KMMessage*>);
00345
00352 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00353 virtual int addMsg(QList<KMMessage*>&, QList<int>& index_return);
00354
00356 void copyMsg(QList<KMMessage*>& msgList);
00357
00358
00361 virtual KMMessage* take(int idx);
00362 virtual void take(const QList<KMMessage*>&);
00363
00367 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00368
00373 static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = true, int supportedFalgs = 31 );
00374
00378 void slotCopyMsgResult( KMail::FolderJob* job );
00379
00384 static void seenFlagToStatus( KMMsgBase *msg, int flags, bool newMsg = true );
00385
00389 void slotSearchDone( QList<quint32> serNums,
00390 const KMSearchPattern* pattern,
00391 bool complete );
00392
00396 void slotSearchDone( quint32 serNum, const KMSearchPattern* pattern, bool matches );
00397
00402 void slotListResult( const QStringList&, const QStringList&,
00403 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00404
00409 void slotCheckNamespace( const QStringList&, const QStringList&,
00410 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00411
00412 protected:
00413 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00414 KMFolder *folder, const QString &partSpecifier,
00415 const AttachmentStrategy *as ) const;
00416 virtual FolderJob* doCreateJob( QList<KMMessage*>& msgList, const QString& sets,
00417 FolderJob::JobType jt, KMFolder *folder ) const;
00418
00419 void getMessagesResult(KIO::Job * job, bool lastSet);
00420
00424 virtual int expungeContents();
00425
00426 void setChildrenState( const QString &attributes );
00427
00429 void initInbox();
00430
00432 KMFolderImap* findParent( const QString& path, const QString& name );
00433
00435 void checkFolders( const QStringList& folderNames, const QString& ns );
00436
00437 void finishMailCheck( const char *func, imapState state );
00438
00439 protected slots:
00440
00444 void checkValidity();
00445 void slotCheckValidityResult(KJob * job);
00446
00450 void reallyGetFolder(const QString &startUid = QString());
00451
00455 void slotListFolderResult(KJob * job);
00456 void slotListFolderEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00457
00461 void slotGetMessagesResult(KJob * job);
00462 void slotGetLastMessagesResult(KJob * job);
00463 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00464
00471 void rememberSerialNumber( const KMMessage *msg );
00472
00476 void slotCreateFolderResult(KJob * job);
00477
00481 void slotRemoveFolderResult(KJob *job);
00482
00486 void slotStatResult(KJob *job);
00487
00492 void slotCompleteMailCheckProgress();
00493
00497 void slotProcessNewMail( int errorCode, const QString& errorMsg );
00498
00504 void slotCreatePendingFolders( int errorCode, const QString& errorMsg );
00505
00509 void slotListNamespaces();
00510
00511 protected:
00512 QString mImapPath;
00513 ulong mLastUid;
00514 imapState mContentState, mSubfolderState;
00515 bool mIsSelected;
00516 bool mCheckFlags;
00517 bool mReadOnly;
00518 bool mCheckMail;
00519 mutable QPointer<KMAcctImap> mAccount;
00520
00521 QString mUidValidity;
00522 unsigned int mUserRights;
00523
00524 private:
00525
00526 bool mCheckingValidity;
00527
00528 Q3IntDict<KMMsgMetaData> mUidMetaDataMap;
00529
00530 Q3Dict<KMMsgMetaData> mMetaDataMap;
00531
00532 bool mAlreadyRemoved;
00533
00534 QPointer<ProgressItem> mMailCheckProgressItem;
00535
00536 ProgressItem *mListDirProgressItem;
00537
00538 ProgressItem *mAddMessageProgressItem;
00539
00540 QStringList mFoldersPendingCreation;
00541 QStringList owners;
00542
00543
00544
00545
00546
00547 bool mUploadAllFlags;
00548
00549
00550
00551 int mPermanentFlags;
00552 };
00553
00554 #endif // kmfolderimap_h