00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef kmfoldercachedimap_h
00033 #define kmfoldercachedimap_h
00034
00035 #include <kdialogbase.h>
00036 #include <kstandarddirs.h>
00037 #include <tqvaluelist.h>
00038 #include <tqvaluevector.h>
00039 #include <tqptrlist.h>
00040 #include <tqdialog.h>
00041
00042 #include "kmfoldermaildir.h"
00043 #include "kmfolderimap.h"
00044 #include "kmacctcachedimap.h"
00045 #include "kmfoldertype.h"
00046 #include "folderjob.h"
00047 #include "cachedimapjob.h"
00048 #include "quotajobs.h"
00049
00050 #include <set>
00051
00052 using KMail::FolderJob;
00053 using KMail::QuotaInfo;
00054 class KMCommand;
00055
00056 class TQComboBox;
00057 class TQRadioButton;
00058
00059 namespace KMail {
00060 class AttachmentStrategy;
00061 class ImapAccountBase;
00062 struct ACLListEntry;
00063 }
00064 using KMail::AttachmentStrategy;
00065
00066 class DImapTroubleShootDialog : public KDialogBase
00067 {
00068 Q_OBJECT
00069
00070 public:
00071 enum SelectedOperation {
00072 None = -1,
00073 ReindexCurrent = 0,
00074 ReindexRecursive = 1,
00075 ReindexAll = 2,
00076 RefreshCache
00077 };
00078
00079 DImapTroubleShootDialog( TQWidget* parent=0, const char* name=0 );
00080
00081 static int run();
00082
00083 private slots:
00084 void slotDone();
00085 void slotChanged();
00086 private:
00087 TQRadioButton *mIndexButton, *mCacheButton;
00088 TQComboBox *mIndexScope;
00089 TQButtonGroup *mButtonGroup;
00090 int rc;
00091 };
00092
00093 class KMFolderCachedImap : public KMFolderMaildir
00094 {
00095 Q_OBJECT
00096
00097
00098 public:
00099 static TQString cacheLocation() {
00100 return locateLocal("data", "kmail/dimap" );
00101 }
00102
00106 KMFolderCachedImap(KMFolder* folder, const char* name=0);
00107 virtual ~KMFolderCachedImap();
00108
00110 void reallyDoClose(const char* owner);
00111
00113 void initializeFrom( KMFolderCachedImap* parent );
00114
00115 virtual void readConfig();
00116 virtual void writeConfig();
00117
00118 void writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig();
00119
00121 virtual KMFolderType folderType() const { return KMFolderTypeCachedImap; }
00122
00124 virtual int create();
00125
00127 virtual void remove();
00128
00130 virtual void serverSync( bool recurse, bool quotaOnly = false );
00131
00133 void resetSyncState( );
00134
00138 void setAlarmsBlocked( bool blocked );
00140 bool alarmsBlocked() const;
00141
00142 void checkUidValidity();
00143
00144 enum imapState { imapNoInformation=0, imapInProgress=1, imapFinished=2 };
00145
00146 virtual imapState getContentState() const { return mContentState; }
00147 virtual void setContentState(imapState state) { mContentState = state; }
00148
00149 virtual imapState getSubfolderState() { return mSubfolderState; }
00150 virtual void setSubfolderState(imapState state);
00151
00153 void setImapPath(const TQString &path);
00154 TQString imapPath() const { return mImapPath; }
00155
00157 void setLastUid( ulong uid );
00158 ulong lastUid();
00159
00161 KMMsgBase* findByUID( ulong uid );
00162
00164 void setUidValidity(const TQString &validity) { mUidValidity = validity; }
00165 TQString uidValidity() const { return mUidValidity; }
00166
00169 void clearUidMap() { uidMap.clear(); }
00170
00172 void setAccount(KMAcctCachedImap *acct);
00173 KMAcctCachedImap* account() const;
00174
00176 TQString uidCacheLocation() const;
00177
00179 int readUidCache();
00180
00182 int writeUidCache();
00183
00185 int progress() const { return mProgress; }
00186
00187
00188 virtual int rename(const TQString& aName, KMFolderDir *aParent=0);
00189
00195 virtual KMMessage* take(int idx);
00196
00202 void takeTemporarily( int idx );
00203
00204
00205 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00206
00207 virtual int addMsgInternal(KMMessage* msg, bool, int* index_return = 0);
00208 virtual int addMsgKeepUID(KMMessage* msg, int* index_return = 0) {
00209 return addMsgInternal(msg, false, index_return);
00210 }
00211
00212
00213 virtual void removeMsg(int i, bool imapQuiet = false);
00214 virtual void removeMsg( const TQPtrList<KMMsgBase> & msgList, bool imapQuiet = false)
00215 { FolderStorage::removeMsg(msgList, imapQuiet); }
00216
00218 bool isReadOnly() const { return KMFolderMaildir::isReadOnly() || mReadOnly; }
00219 bool canDeleteMessages() const;
00220
00221
00225 void sendFolderComplete(bool success)
00226 { emit folderComplete(this, success); }
00227
00231 void setSilentUpload( bool silent ) { mSilentUpload = silent; }
00232 bool silentUpload() { return mSilentUpload; }
00233
00234 virtual int createIndexFromContents() {
00235 const int result = KMFolderMaildir::createIndexFromContents();
00236 reloadUidMap();
00237 return result;
00238 }
00239
00240 int createIndexFromContentsRecursive();
00241
00242
00243
00249 virtual bool listDirectory();
00250
00251 virtual void listNamespaces();
00252
00254 KMFolder* trashFolder() const;
00255
00261 int userRights() const { return mUserRights; }
00262 KMail::ACLJobs::ACLFetchState userRightsState() const { return mUserRightsState; }
00263
00265 void setUserRights( unsigned int userRights, KMail::ACLJobs::ACLFetchState state );
00266
00276 const QuotaInfo quotaInfo() const { return mQuotaInfo; }
00277 void setQuotaInfo( const QuotaInfo & );
00278
00280 typedef TQValueVector<KMail::ACLListEntry> ACLList;
00281 const ACLList& aclList() const { return mACLList; }
00282 KMail::ACLJobs::ACLFetchState aclListState() const { return mACLListState; };
00283
00285 void setACLList( const ACLList& arr );
00286
00287
00288 virtual void setStatus( int id, KMMsgStatus status, bool toggle );
00289 virtual void setStatus( TQValueList<int>& ids, KMMsgStatus status, bool toggle );
00290
00291 TQString annotationFolderType() const { return mAnnotationFolderType; }
00292
00293
00294 void updateAnnotationFolderType();
00295
00304 enum IncidencesFor { IncForNobody, IncForAdmins, IncForReaders };
00305
00306 IncidencesFor incidencesFor() const { return mIncidencesFor; }
00308 void setIncidencesFor( IncidencesFor incfor );
00309
00311 bool sharedSeenFlags() const { return mSharedSeenFlags; }
00313 void setSharedSeenFlags( bool b );
00314
00316 virtual bool isMoveable() const;
00317
00322 TQStringList namespacesToList() { return mNamespacesToList; }
00323 void setNamespacesToList( TQStringList list ) { mNamespacesToList = list; }
00324
00329 const TQString& imapPathForCreation() { return mImapPathCreation; }
00330 void setImapPathForCreation( const TQString& path ) { mImapPathCreation = path; }
00331
00333 bool isCloseToQuota() const;
00334
00336 int permanentFlags() const { return mPermanentFlags; }
00337
00338
00339 TQString folderAttributes() const { return mFolderAttributes; }
00340
00341 virtual bool mailCheckInProgress() const;
00342
00343 protected slots:
00344 void slotGetMessagesData(TDEIO::Job * job, const TQByteArray & data);
00345 void getMessagesResult(KMail::FolderJob *, bool lastSet);
00346 void slotGetLastMessagesResult(KMail::FolderJob *);
00347 void slotProgress(unsigned long done, unsigned long total);
00348 void slotPutProgress( unsigned long, unsigned long );
00349
00350
00351 void slotSubFolderComplete(KMFolderCachedImap*, bool);
00352 void slotSubFolderCloseToQuotaChanged();
00353
00354
00355 void slotConnectionResult( int errorCode, const TQString& errorMsg );
00356
00357 void slotCheckUidValidityResult( KMail::FolderJob* job );
00358 void slotPermanentFlags( int flags );
00359 void slotTestAnnotationResult(TDEIO::Job *job);
00360 void slotGetAnnotationResult( TDEIO::Job* );
00361 void slotMultiUrlGetAnnotationResult( TDEIO::Job* );
00362 void slotSetAnnotationResult(TDEIO::Job *job);
00363 void slotReceivedUserRights( KMFolder* );
00364 void slotReceivedACL( KMFolder*, TDEIO::Job*, const KMail::ACLList& );
00365
00366 void slotMultiSetACLResult(TDEIO::Job *);
00367 void slotACLChanged( const TQString&, int );
00368 void slotAnnotationResult(const TQString& entry, const TQString& value, bool found);
00369 void slotAnnotationChanged( const TQString& entry, const TQString& attribute, const TQString& value );
00370 void slotDeleteMessagesResult(KMail::FolderJob *);
00371 void slotImapStatusChanged(KMFolder* folder, const TQString&, bool);
00372 void slotStorageQuotaResult( const QuotaInfo& );
00373 void slotQuotaResult( TDEIO::Job* job );
00374
00375 protected:
00376
00377
00378 bool deleteMessages();
00379 void listMessages();
00380 void uploadNewMessages();
00381 void uploadFlags();
00382 void uploadSeenFlags();
00383 void createNewFolders();
00384
00385 void listDirectory2();
00386 void createFoldersNewOnServerAndFinishListing( const TQValueVector<int> foldersNewOnServer );
00387
00388
00391 virtual TQValueList<unsigned long> findNewMessages();
00394 virtual TQValueList<KMFolderCachedImap*> findNewFolders();
00395
00397 virtual bool canRemoveFolder() const;
00398
00400 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt, KMFolder *folder,
00401 TQString partSpecifier, const AttachmentStrategy *as ) const;
00402 virtual FolderJob* doCreateJob( TQPtrList<KMMessage>& msgList, const TQString& sets,
00403 FolderJob::JobType jt, KMFolder *folder ) const;
00404
00405 virtual void timerEvent( TQTimerEvent* );
00406
00407
00408 void newState( int progress, const TQString& syncStatus );
00409
00411 KMFolderCachedImap* findParent( const TQString& path, const TQString& name );
00412
00413
00414
00415 public slots:
00419 void slotSimpleData(TDEIO::Job * job, const TQByteArray & data);
00420
00424 void slotTroubleshoot();
00425
00430 void slotListResult( const TQStringList&, const TQStringList&,
00431 const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00432
00437 void slotCheckNamespace( const TQStringList&, const TQStringList&,
00438 const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00439
00440 private slots:
00441 void serverSyncInternal();
00442 void slotIncreaseProgress();
00443 void slotUpdateLastUid();
00444 void slotFolderDeletionOnServerFinished();
00445 void slotRescueDone( KMCommand* command );
00446 void slotRenameFolderFinished();
00447
00448 signals:
00449 void folderComplete(KMFolderCachedImap *folder, bool success);
00450 void listComplete( KMFolderCachedImap* );
00451
00455 void closeToQuotaChanged();
00456
00457 private:
00458 void setReadOnly( bool readOnly );
00459 TQString state2String( int state ) const;
00460 void rememberDeletion( int );
00465 KMCommand* rescueUnsyncedMessages();
00467 void rescueUnsyncedMessagesAndDeleteFolder( KMFolder *folder, bool root = true );
00468
00473 void disconnectSubFolderSignals();
00474
00480 void syncNextSubFolder( bool secondSync );
00481
00485 void buildSubFolderList();
00486
00488 enum {
00489 SYNC_STATE_INITIAL,
00490 SYNC_STATE_TEST_ANNOTATIONS,
00491 SYNC_STATE_PUT_MESSAGES,
00492 SYNC_STATE_UPLOAD_FLAGS,
00493 SYNC_STATE_CREATE_SUBFOLDERS,
00494 SYNC_STATE_LIST_NAMESPACES,
00495 SYNC_STATE_LIST_SUBFOLDERS,
00496 SYNC_STATE_LIST_SUBFOLDERS2,
00497 SYNC_STATE_DELETE_SUBFOLDERS,
00498 SYNC_STATE_LIST_MESSAGES,
00499 SYNC_STATE_DELETE_MESSAGES,
00500 SYNC_STATE_EXPUNGE_MESSAGES,
00501 SYNC_STATE_GET_MESSAGES,
00502 SYNC_STATE_HANDLE_INBOX,
00503 SYNC_STATE_GET_USERRIGHTS,
00504 SYNC_STATE_GET_ANNOTATIONS,
00505 SYNC_STATE_SET_ANNOTATIONS,
00506 SYNC_STATE_GET_ACLS,
00507 SYNC_STATE_SET_ACLS,
00508 SYNC_STATE_GET_QUOTA,
00509 SYNC_STATE_FIND_SUBFOLDERS,
00510 SYNC_STATE_SYNC_SUBFOLDERS,
00511 SYNC_STATE_CHECK_UIDVALIDITY,
00512 SYNC_STATE_RENAME_FOLDER,
00513 SYNC_STATE_CLOSE,
00514 SYNC_STATE_GET_SUBFOLDER_QUOTA
00515 } mSyncState;
00516
00517 int mProgress;
00518 int mStatusFlagsJobs;
00519
00520 TQString mUidValidity;
00521 TQString mImapPath;
00522 imapState mContentState, mSubfolderState;
00523 TQStringList mSubfolderNames, mSubfolderPaths,
00524 mSubfolderMimeTypes, mSubfolderAttributes;
00525 TQString mFolderAttributes;
00526 TQString mAnnotationFolderType;
00527 IncidencesFor mIncidencesFor;
00528 bool mSharedSeenFlags;
00529
00530 bool mHasInbox;
00531 bool mIsSelected;
00532 bool mCheckFlags;
00533 bool mReadOnly;
00534 mutable TQGuardedPtr<KMAcctCachedImap> mAccount;
00535
00536 TQIntDict<int> uidsOnServer;
00537 TQValueList<ulong> uidsForDeletionOnServer;
00538 TQValueList<KMail::CachedImapJob::MsgForDownload> mMsgsForDownload;
00539 TQValueList<ulong> mUidsForDownload;
00540 TQStringList foldersForDeletionOnServer;
00541
00542 TQValueList< TQGuardedPtr<KMFolderCachedImap> > mSubfoldersForSync;
00543 KMFolderCachedImap* mCurrentSubfolder;
00544
00548 TQMap<ulong,int> uidMap;
00549 bool uidMapDirty;
00550 void reloadUidMap();
00551 int uidWriteTimer;
00552
00562 ulong mLastUid;
00567 ulong mTentativeHighestUid;
00568
00572 bool mFoundAnIMAPDigest;
00573
00574 int mUserRights, mOldUserRights;
00575 KMail::ACLJobs::ACLFetchState mUserRightsState;
00576 ACLList mACLList;
00577 KMail::ACLJobs::ACLFetchState mACLListState;
00578
00579 bool mSilentUpload;
00580 bool mFolderRemoved;
00581
00582 bool mRecurse;
00583 bool mQuotaOnly;
00584
00586 bool mAnnotationFolderTypeChanged;
00588 bool mIncidencesForChanged;
00590 bool mSharedSeenFlagsChanged;
00591
00598 std::set<ulong> mUIDsOfLocallyChangedStatuses;
00599
00604 bool mStatusChangedLocally;
00605
00606 TQStringList mNamespacesToList;
00607 int mNamespacesToCheck;
00608 bool mPersonalNamespacesCheckDone;
00609 TQString mImapPathCreation;
00610
00611 QuotaInfo mQuotaInfo;
00612
00615 bool mSomeSubFolderCloseToQuotaChanged;
00616
00617 TQMap<ulong,void*> mDeletedUIDsSinceLastSync;
00618 bool mAlarmsBlocked;
00619
00620 TQValueList<KMFolder*> mToBeDeletedAfterRescue;
00621 int mRescueCommandCount;
00622
00623 TQValueList< TQGuardedPtr<KMFolderCachedImap> > mNewlyCreatedSubfolders;
00624 int mPermanentFlags;
00625 };
00626
00627 #endif