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 <qintdict.h>
00037 #include <qdict.h>
00038 template< typename T> class QPtrList;
00039 template< typename T> class QValueList;
00040
00041 class KMFolderTreeItem;
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
00060 class KMMsgMetaData
00061 {
00062 public:
00063 KMMsgMetaData(KMMsgStatus aStatus)
00064 :mStatus(aStatus), mSerNum(0) {}
00065 KMMsgMetaData(KMMsgStatus aStatus, Q_UINT32 aSerNum)
00066 :mStatus(aStatus), mSerNum(aSerNum) {}
00067 ~KMMsgMetaData() {};
00068 const KMMsgStatus status() const { return mStatus; }
00069 const Q_UINT32 serNum() const { return mSerNum; }
00070 private:
00071 KMMsgStatus mStatus;
00072 Q_UINT32 mSerNum;
00073 };
00074
00075
00076
00077 class KMFolderImap : public KMFolderMbox
00078 {
00079 Q_OBJECT
00080 friend class ::KMail::ImapJob;
00081 public:
00082
00083 static QString cacheLocation() {
00084 return locateLocal("data", "kmail/imap" );
00085 }
00086
00087 enum imapState {
00088 imapNoInformation = 0,
00089 imapListingInProgress = 1,
00090 imapDownloadInProgress = 2,
00091 imapFinished = 3
00092 };
00093
00094 virtual imapState getContentState() { return mContentState; }
00095 virtual void setContentState(imapState state) { mContentState = state; }
00096
00097 virtual imapState getSubfolderState() { return mSubfolderState; }
00098 virtual void setSubfolderState(imapState state);
00099
00103 KMFolderImap(KMFolder* folder, const char* name=0);
00104 virtual ~KMFolderImap();
00105
00107 virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00108
00109 virtual KMMessage* getMsg(int idx);
00111 void setImapPath( const QString &path );
00112 QString imapPath() const { return mImapPath; }
00113
00115 ulong lastUid();
00116
00118 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00119 QString uidValidity() { return mUidValidity; }
00120
00122 void setAccount(KMAcctImap *acct);
00123 KMAcctImap* account() const;
00124
00126 virtual void removeMsg(int i, bool quiet = FALSE);
00127 virtual void removeMsg(const QPtrList<KMMessage>& msgList, bool quiet = FALSE);
00128
00129 virtual int rename( const QString& newName, KMFolderDir *aParent = 0 );
00130
00132 virtual void remove();
00133
00135 bool autoExpunge();
00136
00138 virtual void writeConfig();
00139
00141 virtual void readConfig();
00142
00148 virtual bool listDirectory();
00149
00153 void getFolder(bool force = FALSE);
00154
00158 void getAndCheckFolder(bool force = FALSE);
00159
00163 void getMessage(KMFolder * folder, KMMessage * msg);
00164
00172 void createFolder(const QString &name,
00173 const QString& imapPath = QString::null, bool askUser = true);
00174
00178 void deleteMessage(KMMessage * msg);
00179 void deleteMessage(const QPtrList<KMMessage>& msgList);
00180
00185 virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00186
00190 virtual void setStatus(QValueList<int>& _ids, KMMsgStatus status, bool toggle);
00191
00193 static QStringList makeSets( QValueList<ulong>&, bool sort = true);
00194 static QStringList makeSets(const QStringList&, bool sort = true);
00195
00197 static QPtrList<KMMessage> splitMessageList(const QString& set,
00198 QPtrList<KMMessage>& msgList);
00199
00201 void getUids(QValueList<int>& ids, QValueList<ulong>& uids);
00202
00204 void getUids(const QPtrList<KMMessage>& msgList, QValueList<ulong>& uids);
00205
00209 void expungeFolder(KMFolderImap * aFolder, bool quiet);
00210
00211 virtual int compact( bool ) { expungeFolder(this, false); return 0; };
00212
00216 void sendFolderComplete(bool success)
00217 { emit folderComplete(this, success); }
00218
00223 bool processNewMail(bool interactive);
00224
00229 void setSelected(bool selected) { mIsSelected = selected; }
00230 bool isSelected() { return mIsSelected; }
00231
00235 static QString encodeFileName(const QString &);
00236 static QString decodeFileName(const QString &);
00237 static QTextCodec * utf7Codec();
00238
00242 static QString statusToFlags(KMMsgStatus status, int supportedFalgs);
00243
00247 virtual QString fileName() const {
00248 return encodeFileName( KMFolderMbox::fileName() ); }
00249
00253 const ulong serNumForUID( ulong uid );
00254
00259 void saveMsgMetaData( KMMessage* msg, ulong uid = 0 );
00260
00264 static QValueList<ulong> splitSets(const QString);
00265
00266 virtual void ignoreJobsForMessage( KMMessage* );
00267
00271 bool includeInMailCheck() { return mCheckMail; }
00272 void setIncludeInMailCheck( bool check );
00273
00275 virtual int create();
00276
00278 virtual bool isAutoExpire() const { return false; }
00279
00281 virtual void reallyDoClose(const char* owner);
00282
00283 void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00284
00286 KMFolder* trashFolder() const;
00287
00293 void setAlreadyRemoved(bool removed);
00294
00296 bool isReadOnly() const { return KMFolderMbox::isReadOnly() || mReadOnly; }
00297 bool canDeleteMessages() const;
00298
00303 unsigned int userRights() const { return mUserRights; }
00304
00306 void setUserRights( unsigned int userRights );
00307
00313 virtual void search( const KMSearchPattern* );
00314 virtual void search( const KMSearchPattern*, Q_UINT32 serNum );
00315
00317 virtual bool isMoveable() const;
00318
00320 void initializeFrom( KMFolderImap* parent, QString path, QString mimeType );
00321
00323 int permanentFlags() const { return mPermanentFlags; }
00324
00325 signals:
00326 void folderComplete(KMFolderImap *folder, bool success);
00327
00331 void deleted(KMFolderImap*);
00332
00336 void directoryListingFinished(KMFolderImap*);
00337
00343 void folderCreationResult( const QString &name, bool success );
00344
00345 public slots:
00347 virtual void addMsgQuiet(KMMessage *);
00348 virtual void addMsgQuiet(QPtrList<KMMessage>);
00349
00356 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00357 virtual int addMsg(QPtrList<KMMessage>&, QValueList<int>& index_return);
00358
00360 void copyMsg(QPtrList<KMMessage>& msgList);
00361
00362
00365 virtual KMMessage* take(int idx);
00366 virtual void take(QPtrList<KMMessage>);
00367
00371 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00372
00377 static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE, int supportedFalgs = 31 );
00378
00383 static void seenFlagToStatus( KMMsgBase *msg, int flags, bool newMsg = true );
00384
00388 void slotCopyMsgResult( KMail::FolderJob* job );
00389
00393 void slotSearchDone( QValueList<Q_UINT32> serNums,
00394 const KMSearchPattern* pattern,
00395 bool complete );
00396
00400 void slotSearchDone( Q_UINT32 serNum, const KMSearchPattern* pattern, bool matches );
00401
00406 void slotListResult( const QStringList&, const QStringList&,
00407 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00408
00413 void slotCheckNamespace( const QStringList&, const QStringList&,
00414 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00415
00416 protected:
00417 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00418 KMFolder *folder, QString partSpecifier,
00419 const AttachmentStrategy *as ) const;
00420 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00421 FolderJob::JobType jt, KMFolder *folder ) const;
00422
00423 void getMessagesResult(KIO::Job * job, bool lastSet);
00424
00428 virtual int expungeContents();
00429
00430 void setChildrenState( QString attributes );
00431
00433 void initInbox();
00434
00436 KMFolderImap* findParent( const QString& path, const QString& name );
00437
00439 void checkFolders( const QStringList& folderNames, const QString& ns );
00440
00441 void finishMailCheck( const char *func, imapState state );
00442
00443 protected slots:
00444
00448 void checkValidity();
00449 void slotCheckValidityResult(KIO::Job * job);
00450
00454 void reallyGetFolder(const QString &startUid = QString::null);
00455
00459 void slotListFolderResult(KIO::Job * job);
00460 void slotListFolderEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00461
00465 void slotGetMessagesResult(KIO::Job * job);
00466 void slotGetLastMessagesResult(KIO::Job * job);
00467 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00468
00472 void slotCreateFolderResult(KIO::Job * job);
00473
00477 void slotRemoveFolderResult(KIO::Job *job);
00478
00482 void slotStatResult(KIO::Job *job);
00483
00488 void slotCompleteMailCheckProgress();
00489
00493 void slotProcessNewMail( int errorCode, const QString& errorMsg );
00494
00500 void slotCreatePendingFolders( int errorCode, const QString& errorMsg );
00501
00505 void slotListNamespaces();
00506
00507 protected:
00508 QString mImapPath;
00509 ulong mLastUid;
00510 imapState mContentState, mSubfolderState;
00511 bool mIsSelected;
00512 bool mCheckFlags;
00513 bool mReadOnly;
00514 bool mCheckMail;
00515 mutable QGuardedPtr<KMAcctImap> mAccount;
00516
00517 QString mUidValidity;
00518 unsigned int mUserRights;
00519
00520 private:
00521
00522 bool mCheckingValidity;
00523
00524 QIntDict<KMMsgMetaData> mUidMetaDataMap;
00525
00526 QDict<KMMsgMetaData> mMetaDataMap;
00527
00528 bool mAlreadyRemoved;
00529
00530 QGuardedPtr<ProgressItem> mMailCheckProgressItem;
00531
00532 ProgressItem *mListDirProgressItem;
00533
00534 ProgressItem *mAddMessageProgressItem;
00535
00536 QStringList mFoldersPendingCreation;
00537
00538
00539
00540
00541
00542 bool mUploadAllFlags;
00543
00544
00545
00546 int mPermanentFlags;
00547 };
00548
00549 #endif // kmfolderimap_h