00001
00024 #ifndef kmfolderimap_h
00025 #define kmfolderimap_h
00026
00027 #include "kmacctimap.h"
00028 #include "kmfoldermbox.h"
00029 #include "kmmsgbase.h"
00030 #include "imapaccountbase.h"
00031 using KMail::ImapAccountBase;
00032
00033 #include "kio/job.h"
00034 #include "kio/global.h"
00035
00036 #include <qintdict.h>
00037 #include <qdict.h>
00038 #include <qvaluelist.h>
00039 #include <kstandarddirs.h>
00040
00041 class KMFolderTreeItem;
00042 class KMFolderImap;
00043 namespace KMail {
00044 class FolderJob;
00045 class ImapJob;
00046 class AttachmentStrategy;
00047 class ProgressItem;
00048 }
00049 using KMail::FolderJob;
00050 using KMail::ImapJob;
00051 using KMail::AttachmentStrategy;
00052 using KPIM::ProgressItem;
00053
00054 class KMMsgMetaData
00055 {
00056 public:
00057 KMMsgMetaData(KMMsgStatus aStatus)
00058 :mStatus(aStatus), mSerNum(0) {}
00059 KMMsgMetaData(KMMsgStatus aStatus, Q_UINT32 aSerNum)
00060 :mStatus(aStatus), mSerNum(aSerNum) {}
00061 ~KMMsgMetaData() {};
00062 const KMMsgStatus status() const { return mStatus; }
00063 const Q_UINT32 serNum() const { return mSerNum; }
00064 private:
00065 KMMsgStatus mStatus;
00066 Q_UINT32 mSerNum;
00067 };
00068
00069
00070
00071 class KMFolderImap : public KMFolderMbox
00072 {
00073 Q_OBJECT
00074 friend class ImapJob;
00075 public:
00076
00077 static QString cacheLocation() {
00078 return locateLocal("data", "kmail/imap" );
00079 }
00080
00081 enum imapState { imapNoInformation=0, imapInProgress=1, imapFinished=2 };
00082
00083 virtual imapState getContentState() { return mContentState; }
00084 virtual void setContentState(imapState state) { mContentState = state; }
00085
00086 virtual imapState getSubfolderState() { return mSubfolderState; }
00087 virtual void setSubfolderState(imapState state);
00088
00092 KMFolderImap(KMFolder* folder, const char* name=0);
00093 virtual ~KMFolderImap();
00094
00096 virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00097
00098 virtual KMMessage* getMsg(int idx);
00100 void setImapPath(const QString &path) { mImapPath = path; }
00101 QString imapPath() { return mImapPath; }
00102
00104 ulong lastUid();
00105
00107 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00108 QString uidValidity() { return mUidValidity; }
00109
00111 void setAccount(KMAcctImap *acct);
00112 KMAcctImap* account() const { return mAccount; }
00113
00115 virtual void removeMsg(int i, bool quiet = FALSE);
00116 virtual void removeMsg(const QPtrList<KMMessage>& msgList, bool quiet = FALSE);
00117
00118 virtual int rename( const QString& newName, KMFolderDir *aParent = 0 );
00119
00121 virtual void remove();
00122
00124 bool autoExpunge();
00125
00127 virtual void writeConfig();
00128
00130 virtual void readConfig();
00131
00137 virtual bool listDirectory(bool secondStep = false);
00138
00142 void getFolder(bool force = FALSE);
00143
00147 void getAndCheckFolder(bool force = FALSE);
00148
00152 void getMessage(KMFolder * folder, KMMessage * msg);
00153
00157 void createFolder(const QString &name);
00158
00162 void deleteMessage(KMMessage * msg);
00163 void deleteMessage(const QPtrList<KMMessage>& msgList);
00164
00169 virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00170
00174 virtual void setStatus(QValueList<int>& ids, KMMsgStatus status, bool toggle);
00175
00177 static QStringList makeSets( QValueList<ulong>&, bool sort = true);
00178 static QStringList makeSets(const QStringList&, bool sort = true);
00179
00181 static QPtrList<KMMessage> splitMessageList(const QString& set,
00182 QPtrList<KMMessage>& msgList);
00183
00185 void getUids(QValueList<int>& ids, QValueList<ulong>& uids);
00186
00188 void getUids(const QPtrList<KMMessage>& msgList, QValueList<ulong>& uids, KMFolder* msgParent = 0);
00189
00193 void expungeFolder(KMFolderImap * aFolder, bool quiet);
00194
00195 virtual int compact( bool ) { expungeFolder(this, false); return 0; };
00196
00200 void sendFolderComplete(bool success)
00201 { emit folderComplete(this, success); }
00202
00207 bool processNewMail(bool interactive);
00208
00213 void setSelected(bool selected) { mIsSelected = selected; }
00214 bool isSelected() { return mIsSelected; }
00215
00219 static QString encodeFileName(const QString &);
00220 static QString decodeFileName(const QString &);
00221 static QTextCodec * utf7Codec();
00222
00226 static QString statusToFlags(KMMsgStatus status);
00227
00231 virtual QString fileName() const {
00232 return encodeFileName( KMFolderMbox::fileName() ); }
00233
00237 void insertUidSerNumEntry(ulong uid, const ulong * sernum) {
00238 uidmap.insert(uid, sernum); }
00239
00243 static QValueList<ulong> splitSets(const QString);
00244
00245 virtual void ignoreJobsForMessage( KMMessage* );
00246
00250 bool includeInMailCheck() { return mCheckMail; }
00251 void setIncludeInMailCheck( bool check );
00252
00254 virtual int create(bool imap = FALSE);
00255
00257 virtual bool isAutoExpire() const { return false; }
00258
00262 virtual void close(bool force=FALSE);
00263
00264 void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00265
00267 KMFolder* trashFolder() const;
00268
00274 void setAlreadyRemoved(bool removed);
00275
00277 bool isReadOnly() const { return KMFolderMbox::isReadOnly() || mReadOnly; }
00278
00283 unsigned int userRights() const { return mUserRights; }
00284
00286 void setUserRights( unsigned int userRights );
00287
00288 signals:
00289 void folderComplete(KMFolderImap *folder, bool success);
00290
00294 void deleted(KMFolderImap*);
00295
00299 void directoryListingFinished(KMFolderImap*);
00300
00301 public slots:
00303 virtual void addMsgQuiet(KMMessage *);
00304 virtual void addMsgQuiet(QPtrList<KMMessage>);
00305
00312 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00313 int addMsg(QPtrList<KMMessage>&, int* index_return = 0);
00314
00316 void copyMsg(QPtrList<KMMessage>& msgList);
00317
00318
00321 virtual KMMessage* take(int idx);
00322 virtual void take(QPtrList<KMMessage>);
00323
00327 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00328
00333 static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE);
00334
00335 protected:
00336 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00337 KMFolder *folder, QString partSpecifier,
00338 const AttachmentStrategy *as ) const;
00339 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00340 FolderJob::JobType jt, KMFolder *folder ) const;
00341
00342 void getMessagesResult(KIO::Job * job, bool lastSet);
00343
00347 virtual int expungeContents();
00348
00349 protected slots:
00350
00355 void slotListResult(const QStringList&, const QStringList&,
00356 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00357
00361 void checkValidity();
00362 void slotCheckValidityResult(KIO::Job * job);
00363
00367 void reallyGetFolder(const QString &startUid = QString::null);
00368
00372 void slotListFolderResult(KIO::Job * job);
00373 void slotListFolderEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00374
00378 void slotRenameResult( KIO::Job *job );
00379
00383 void slotGetMessagesResult(KIO::Job * job);
00384 void slotGetLastMessagesResult(KIO::Job * job);
00385 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00386
00390 void slotCreateFolderResult(KIO::Job * job);
00391
00395 void slotRemoveFolderResult(KIO::Job *job);
00396
00400 void slotStatResult(KIO::Job *job);
00401
00406 void slotCompleteMailCheckProgress();
00407
00411 void slotProcessNewMail( int errorCode, const QString& errorMsg );
00412
00418 void slotCreatePendingFolders();
00419
00420 protected:
00421 QString mImapPath;
00422 ulong mLastUid;
00423 imapState mContentState, mSubfolderState;
00424 bool mIsSelected;
00425 bool mCheckFlags;
00426 bool mReadOnly;
00427 bool mCheckMail;
00428 QGuardedPtr<KMAcctImap> mAccount;
00429 QIntDict<ulong> uidmap;
00430 QString mUidValidity;
00431 unsigned int mUserRights;
00432
00433 private:
00434 bool mCheckingValidity;
00435 QDict<KMMsgMetaData> mMetaDataMap;
00436 bool mAlreadyRemoved;
00437 QGuardedPtr<ProgressItem> mMailCheckProgressItem;
00438 ProgressItem *mListDirProgressItem;
00439 QStringList mFoldersPendingCreation;
00440 };
00441
00442 #endif // kmfolderimap_h