00001
00021 #ifndef kmfoldercachedimap_h
00022 #define kmfoldercachedimap_h
00023
00024 #include <kdialogbase.h>
00025 #include <qvaluelist.h>
00026 #include <qptrlist.h>
00027 #include <qdialog.h>
00028
00029 #include "kmfoldermaildir.h"
00030 #include "kmfolderimap.h"
00031 #include "kmacctimap.h"
00032 #include "kmfoldertype.h"
00033 #include "folderjob.h"
00034 #include "cachedimapjob.h"
00035
00036 using KMail::FolderJob;
00037 class KMAcctCachedImap;
00038
00039 namespace KMail {
00040 class AttachmentStrategy;
00041 }
00042 using KMail::AttachmentStrategy;
00043
00044 class DImapTroubleShootDialog : public KDialogBase
00045 {
00046 Q_OBJECT
00047 public:
00048 DImapTroubleShootDialog( QWidget* parent=0, const char* name=0 );
00049
00050 static int run();
00051
00052 private slots:
00053 void slotRebuildIndex();
00054 void slotRebuildCache();
00055
00056 private:
00057 int rc;
00058 };
00059
00060 class KMFolderCachedImap : public KMFolderMaildir
00061 {
00062 Q_OBJECT
00063 public:
00067 KMFolderCachedImap(KMFolderDir* parent=0, const QString& name=QString::null);
00068 virtual ~KMFolderCachedImap();
00069
00071 virtual KMFolderType folderType() const { return KMFolderTypeCachedImap; }
00072
00074 virtual int remove();
00075
00077 virtual void serverSync( bool suppressDialog );
00078
00080 void resetSyncState() { mSyncState = SYNC_STATE_INITIAL; }
00081
00082 virtual void checkUidValidity();
00083
00084 enum imapState { imapNoInformation=0, imapInProgress=1, imapFinished=2 };
00085
00086 virtual imapState getContentState() { return mContentState; }
00087 virtual void setContentState(imapState state) { mContentState = state; }
00088
00089 virtual imapState getSubfolderState() { return mSubfolderState; }
00090 virtual void setSubfolderState(imapState state) { mSubfolderState = state; }
00091
00092 virtual QCString protocol() const { return "cachedimap"; }
00093
00095 void setImapPath(const QString &path) { mImapPath = path; }
00096 QString imapPath() { return mImapPath; }
00097
00099 void setLastUid( ulong uid );
00100 ulong lastUid();
00101
00103 KMMessage* findByUID( ulong uid );
00104
00106 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00107 QString uidValidity() const { return mUidValidity; }
00108
00110 void setAccount(KMAcctCachedImap *acct);
00111 KMAcctCachedImap* account();
00112
00114 QString uidCacheLocation() const;
00115
00117 int readUidCache();
00118
00120 int writeUidCache();
00121
00123 int progress() const { return mProgress; }
00124
00125
00126 virtual int rename(const QString& aName, KMFolderDir *aParent=0);
00127
00128
00129 virtual KMMessage* take(int idx);
00130
00131 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00132
00133 virtual int addMsgInternal(KMMessage* msg, bool, int* index_return = 0);
00134 virtual int addMsgKeepUID(KMMessage* msg, int* index_return = 0) {
00135 return addMsgInternal(msg, false, index_return);
00136 }
00137
00138
00139 virtual void removeMsg(int i, bool imapQuiet = FALSE);
00140 virtual void removeMsg(QPtrList<KMMessage> msgList, bool imapQuiet = FALSE)
00141 { KMFolder::removeMsg(msgList, imapQuiet); }
00142
00143
00144 static QStringList makeSets(QStringList& uids, bool sort);
00145 static QStringList makeSets(QValueList<ulong>& uids, bool sort);
00146
00150 void sendFolderComplete(bool success)
00151 { emit folderComplete(this, success); }
00152
00153 static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE);
00157 static QCString statusToFlags(KMMsgStatus status);
00158
00162 void setSilentUpload( bool silent ) { mSilentUpload = silent; }
00163 bool silentUpload() { return mSilentUpload; }
00164
00165 virtual int createIndexFromContents()
00166 { return KMFolderMaildir::createIndexFromContents(); }
00167
00168
00169 void resync() { mResync = true; }
00170
00171 virtual void holdSyncs( bool hold ) { mHoldSyncs = hold; }
00172
00173 void removeRightAway() { mRemoveRightAway = true; }
00174
00179 bool listDirectory();
00180
00181 protected slots:
00185 void slotListEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00189 void slotListResult(KIO::Job * job);
00190
00191 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00192 void getMessagesResult(KIO::Job * job, bool lastSet);
00193 void slotGetMessagesResult(KIO::Job * job);
00194 void slotGetLastMessagesResult(KIO::Job * job);
00195 void slotProgress(unsigned long done, unsigned long total);
00196
00197
00198 virtual void listMessages();
00199 virtual void uploadNewMessages();
00200
00201
00202 virtual bool deleteMessages();
00203 virtual void createNewFolders();
00204
00205
00206 void slotConnectionResult( int errorCode );
00207
00208 protected:
00209 void listDirectory2();
00210
00211
00214 virtual QValueList<unsigned long> findNewMessages();
00217 virtual QValueList<KMFolderCachedImap*> findNewFolders();
00218
00220 virtual bool canRemoveFolder() const;
00221
00223 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt, KMFolder *folder,
00224 QString partSpecifier, const AttachmentStrategy *as ) const;
00225 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00226 FolderJob::JobType jt, KMFolder *folder ) const;
00227
00228 virtual void timerEvent( QTimerEvent* );
00229
00230 public slots:
00234 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00235
00239 void slotTroubleshoot();
00240
00244 void processNewMail();
00245
00246 private slots:
00247 void serverSyncInternal();
00248
00249 signals:
00250 void folderComplete(KMFolderCachedImap *folder, bool success);
00251 void listComplete( KMFolderCachedImap* );
00252
00253 void listMessagesComplete();
00254
00255
00256 void newState( const QString& folderName, int progressLevel, const QString& syncStatus );
00257
00261 void syncState( int state, int number );
00262
00263 private:
00264
00266 enum {
00267 SYNC_STATE_INITIAL,
00268 SYNC_STATE_PUT_MESSAGES,
00269 SYNC_STATE_CREATE_SUBFOLDERS,
00270 SYNC_STATE_LIST_SUBFOLDERS,
00271 SYNC_STATE_LIST_SUBFOLDERS2,
00272 SYNC_STATE_DELETE_SUBFOLDERS,
00273 SYNC_STATE_LIST_MESSAGES,
00274 SYNC_STATE_DELETE_MESSAGES,
00275 SYNC_STATE_EXPUNGE_MESSAGES,
00276 SYNC_STATE_GET_MESSAGES,
00277 SYNC_STATE_HANDLE_INBOX,
00278 SYNC_STATE_FIND_SUBFOLDERS,
00279 SYNC_STATE_SYNC_SUBFOLDERS,
00280 SYNC_STATE_CHECK_UIDVALIDITY
00281 } mSyncState;
00282
00283 int mProgress;
00284
00285 QString mUidValidity;
00286 QString mImapPath;
00287 imapState mContentState, mSubfolderState;
00288 QStringList mSubfolderNames, mSubfolderPaths, mSubfolderMimeTypes;
00289
00290 bool mHasInbox;
00291 bool mIsSelected;
00292 bool mCheckFlags;
00293 bool mReadOnly;
00294 QGuardedPtr<KMAcctCachedImap> mAccount;
00295
00296 QValueList<ulong> uidsOnServer;
00297 QValueList<ulong> uidsForDeletionOnServer;
00298 QValueList<KMail::CachedImapJob::MsgForDownload> mMsgsForDownload;
00299 QValueList<ulong> mUidsForDownload;
00300 QStringList foldersForDeletionOnServer;
00301
00302 QValueList<KMFolderCachedImap*> mSubfoldersForSync;
00303 KMFolderCachedImap* mCurrentSubfolder;
00304
00305
00306
00307 QMap<ulong,int> uidMap;
00308 bool uidMapDirty;
00309 ulong mLastUid;
00310 int uidWriteTimer;
00311 void reloadUidMap();
00312
00313 QString state2String( int state ) const;
00314 bool mIsConnected;
00315
00316 bool mSilentUpload;
00317 bool mFolderRemoved;
00318 bool mResync;
00319 bool mSuppressDialog;
00320 bool mHoldSyncs;
00321 bool mRemoveRightAway;
00322 };
00323
00324 #endif