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
00040 class KMFolderTreeItem;
00041 class KMFolderImap;
00042 namespace KMail {
00043 class FolderJob;
00044 class ImapJob;
00045 class AttachmentStrategy;
00046 }
00047 using KMail::FolderJob;
00048 using KMail::ImapJob;
00049 using KMail::AttachmentStrategy;
00050
00051 class KMMsgMetaData
00052 {
00053 public:
00054 KMMsgMetaData(KMMsgStatus aStatus)
00055 :mStatus(aStatus), mSerNum(0) {}
00056 KMMsgMetaData(KMMsgStatus aStatus, Q_UINT32 aSerNum)
00057 :mStatus(aStatus), mSerNum(aSerNum) {}
00058 ~KMMsgMetaData() {};
00059 const KMMsgStatus status() const { return mStatus; }
00060 const Q_UINT32 serNum() const { return mSerNum; }
00061 private:
00062 KMMsgStatus mStatus;
00063 Q_UINT32 mSerNum;
00064 };
00065
00066
00067
00068 class KMFolderImap : public KMFolderMbox
00069 {
00070 Q_OBJECT
00071 friend class ImapJob;
00072
00073 public:
00074 enum imapState { imapNoInformation=0, imapInProgress=1, imapFinished=2 };
00075
00076 virtual imapState getContentState() { return mContentState; }
00077 virtual void setContentState(imapState state) { mContentState = state; }
00078
00079 virtual imapState getSubfolderState() { return mSubfolderState; }
00080 virtual void setSubfolderState(imapState state) { mSubfolderState = state; }
00081
00085 KMFolderImap(KMFolderDir* parent=0, const QString& name=QString::null);
00086 virtual ~KMFolderImap();
00087
00089 virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00090
00091 virtual QCString protocol() const { return "imap"; }
00092 virtual KMMessage* getMsg(int idx);
00094 void setImapPath(const QString &path) { mImapPath = path; }
00095 QString imapPath() { return mImapPath; }
00096
00098 ulong lastUid();
00099
00101 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00102 QString uidValidity() { return mUidValidity; }
00103
00105 void setAccount(KMAcctImap *acct);
00106 KMAcctImap* account() { return mAccount; }
00107
00109 virtual void removeMsg(int i, bool quiet = FALSE);
00110 virtual void removeMsg(QPtrList<KMMessage> msgList, bool quiet = FALSE);
00111
00112 virtual int rename( const QString& newName, KMFolderDir *aParent = 0 );
00113
00115 virtual void removeOnServer();
00116
00118 bool autoExpunge();
00119
00121 virtual void writeConfig();
00122
00124 virtual void readConfig();
00125
00131 bool listDirectory(bool secondStep = FALSE);
00132
00136 void getFolder(bool force = FALSE);
00137
00141 void getAndCheckFolder(bool force = FALSE);
00142
00146 void getMessage(KMFolder * folder, KMMessage * msg);
00147
00151 void createFolder(const QString &name);
00152
00156 void deleteMessage(KMMessage * msg);
00157 void deleteMessage(QPtrList<KMMessage> msgList);
00158
00163 virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00164
00168 virtual void setStatus(QValueList<int>& ids, KMMsgStatus status, bool toggle);
00169
00171 void setImapStatus(QString path, QCString flags);
00172
00174 QStringList makeSets(QValueList<int>&, bool sort = true);
00175 QStringList makeSets(QStringList&, bool sort = true);
00176
00178 void getUids(QValueList<int>& ids, QValueList<int>& uids);
00179
00181 void getUids(QPtrList<KMMessage>& msgList, QValueList<int>& uids, KMFolder* msgParent = 0);
00182
00186 void expungeFolder(KMFolderImap * aFolder, bool quiet);
00187
00188 int compact() { expungeFolder(this, false); return 0; };
00189
00193 void sendFolderComplete(bool success)
00194 { emit folderComplete(this, success); }
00195
00200 bool processNewMail(bool interactive);
00201
00206 void setSelected(bool selected) { mIsSelected = selected; }
00207 bool isSelected() { return mIsSelected; }
00208
00212 static QString encodeFileName(const QString &);
00213 static QString decodeFileName(const QString &);
00214 static QTextCodec * utf7Codec();
00215
00219 static QString statusToFlags(KMMsgStatus status);
00220
00224 virtual QString fileName() const { return encodeFileName(name()); }
00225
00229 void insertUidSerNumEntry(ulong uid, const ulong * sernum) {
00230 uidmap.insert(uid, sernum); }
00231
00235 static QValueList<int> splitSets(QString);
00236
00237 virtual void ignoreJobsForMessage( KMMessage* );
00238
00242 bool includeInMailCheck() { return mCheckMail; }
00243 void setIncludeInMailCheck( bool check ) { mCheckMail = check; }
00244
00246 virtual int create(bool imap = FALSE);
00247
00249 virtual bool isAutoExpire() const { return false; }
00250
00254 virtual void close(bool force=FALSE);
00255
00256 void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00257
00258 signals:
00259 void folderComplete(KMFolderImap *folder, bool success);
00260
00264 void deleted(KMFolderImap*);
00265
00266 public slots:
00268 virtual void addMsgQuiet(KMMessage *);
00269 virtual void addMsgQuiet(QPtrList<KMMessage>);
00270
00277 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00278 int addMsg(QPtrList<KMMessage>&, int* index_return = 0);
00279
00281 void copyMsg(QPtrList<KMMessage>& msgList);
00282
00283 QPtrList<KMMessage> splitMessageList(QString set, QPtrList<KMMessage>& msgList);
00284
00287 virtual KMMessage* take(int idx);
00288 virtual void take(QPtrList<KMMessage>);
00289
00293 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00294
00295 protected:
00296 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00297 KMFolder *folder, QString partSpecifier,
00298 const AttachmentStrategy *as ) const;
00299 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00300 FolderJob::JobType jt, KMFolder *folder ) const;
00305 void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE);
00306
00307 void getMessagesResult(KIO::Job * job, bool lastSet);
00308
00309 bool gotMsgs;
00310
00311 QString mUidValidity;
00312
00313 protected slots:
00314
00319 void slotListResult(QStringList, QStringList,
00320 QStringList, const ImapAccountBase::jobData &);
00321
00325 void checkValidity();
00326 void slotCheckValidityResult(KIO::Job * job);
00327
00331 void reallyGetFolder(const QString &startUid = QString::null);
00332
00336 void slotListFolderResult(KIO::Job * job);
00337 void slotListFolderEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00338
00342 void slotRenameResult( KIO::Job *job );
00343
00347 void slotGetMessagesResult(KIO::Job * job);
00348 void slotGetLastMessagesResult(KIO::Job * job);
00349 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00350
00354 void slotCreateFolderResult(KIO::Job * job);
00355
00359 void slotSetStatusResult(KIO::Job * job);
00360
00364 void slotRemoveFolderResult(KIO::Job *job);
00365
00369 void slotStatResult(KIO::Job *job);
00370
00371 protected:
00372 QString mImapPath;
00373 ulong mLastUid;
00374 imapState mContentState, mSubfolderState;
00375 QStringList mSubfolderNames, mSubfolderPaths, mSubfolderMimeTypes;
00376 bool mIsSelected;
00377 bool mCheckFlags;
00378 bool mReadOnly;
00379 bool mCheckMail : 1;
00380 QGuardedPtr<KMAcctImap> mAccount;
00381 QIntDict<ulong> uidmap;
00382 private:
00383 bool mCheckingValidity;
00384 QDict<KMMsgMetaData> mMetaDataMap;
00385 };
00386
00387 #endif // kmfolderimap_h