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 "acljobs.h"
00028 #include "kmacctimap.h"
00029 #include "kmfoldermbox.h"
00030 #include "kmmsgbase.h"
00031
00032 #include "kio/job.h"
00033 #include "kio/global.h"
00034
00035 #include <kstandarddirs.h>
00036
00037 #include <qintdict.h>
00038 #include <qdict.h>
00039 template< typename T> class QPtrList;
00040 template< typename T> class QValueList;
00041
00042 class KMFolderTreeItem;
00043 class KMFolderImap;
00044 class KMSearchPattern;
00045 class KMMessage;
00046 namespace KMail {
00047 class FolderJob;
00048 class ImapJob;
00049 class AttachmentStrategy;
00050 class ImapAccountBase;
00051 }
00052 namespace KPIM {
00053 class ProgressItem;
00054 }
00055 using KMail::FolderJob;
00056 using KMail::ImapJob;
00057 using KMail::AttachmentStrategy;
00058 using KMail::ImapAccountBase;
00059 using KPIM::ProgressItem;
00060
00061 class KMMsgMetaData
00062 {
00063 public:
00064 KMMsgMetaData(KMMsgStatus aStatus)
00065 :mStatus(aStatus), mSerNum(0) {}
00066 KMMsgMetaData(KMMsgStatus aStatus, Q_UINT32 aSerNum)
00067 :mStatus(aStatus), mSerNum(aSerNum) {}
00068 ~KMMsgMetaData() {};
00069 KMMsgStatus status() const { return mStatus; }
00070 Q_UINT32 serNum() const { return mSerNum; }
00071 private:
00072 KMMsgStatus mStatus;
00073 Q_UINT32 mSerNum;
00074 };
00075
00076
00077
00078 class KMFolderImap : public KMFolderMbox
00079 {
00080 Q_OBJECT
00081 friend class ::KMail::ImapJob;
00082 public:
00083
00084 static QString cacheLocation() {
00085 return locateLocal("data", "kmail/imap" );
00086 }
00087
00088 enum imapState {
00089 imapNoInformation = 0,
00090 imapListingInProgress = 1,
00091 imapDownloadInProgress = 2,
00092 imapFinished = 3
00093 };
00094
00095 virtual imapState getContentState() const { return mContentState; }
00096 virtual void setContentState(imapState state) { mContentState = state; }
00097
00098 virtual imapState getSubfolderState() { return mSubfolderState; }
00099 virtual void setSubfolderState(imapState state);
00100
00104 KMFolderImap(KMFolder* folder, const char* name=0);
00105 virtual ~KMFolderImap();
00106
00108 virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00109
00110 virtual KMMessage* getMsg(int idx);
00112 void setImapPath( const QString &path );
00113 QString imapPath() const { return mImapPath; }
00114
00116 ulong lastUid();
00117
00119 void setUidValidity(const QString &validity) { mUidValidity = validity; }
00120 QString uidValidity() { return mUidValidity; }
00121
00123 void setAccount(KMAcctImap *acct);
00124 KMAcctImap* account() const;
00125
00127 virtual void removeMsg(int i, bool quiet = FALSE);
00128 virtual void removeMsg(const QPtrList<KMMessage>& msgList, bool quiet = FALSE);
00129
00130 virtual int rename( const QString& newName, KMFolderDir *aParent = 0 );
00131
00133 virtual void remove();
00134
00136 bool autoExpunge();
00137
00139 virtual void writeConfig();
00140
00142 virtual void readConfig();
00143
00149 virtual bool listDirectory();
00150
00154 void getFolder(bool force = FALSE);
00155
00159 void getAndCheckFolder(bool force = FALSE);
00160
00164 void getMessage(KMFolder * folder, KMMessage * msg);
00165
00173 void createFolder(const QString &name,
00174 const QString& imapPath = QString::null, bool askUser = true);
00175
00179 void deleteMessage(KMMessage * msg);
00180 void deleteMessage(const QPtrList<KMMessage>& msgList);
00181
00186 virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00187
00191 virtual void setStatus(QValueList<int>& _ids, KMMsgStatus status, bool toggle);
00192
00194 static QStringList makeSets( QValueList<ulong>&, bool sort = true);
00195 static QStringList makeSets(const QStringList&, bool sort = true);
00196
00198 static QPtrList<KMMessage> splitMessageList(const QString& set,
00199 QPtrList<KMMessage>& msgList);
00200
00202 void getUids(QValueList<int>& ids, QValueList<ulong>& uids);
00203
00205 void getUids(const QPtrList<KMMessage>& msgList, QValueList<ulong>& uids);
00206
00210 void expungeFolder(KMFolderImap * aFolder, bool quiet);
00211
00212 virtual int compact( bool ) { expungeFolder(this, false); return 0; };
00213
00217 void sendFolderComplete(bool success)
00218 { emit folderComplete(this, success); }
00219
00224 bool processNewMail(bool interactive);
00225
00230 void setSelected(bool selected) { mIsSelected = selected; }
00231 bool isSelected() { return mIsSelected; }
00232
00236 static QString encodeFileName(const QString &);
00237 static QString decodeFileName(const QString &);
00238 static QTextCodec * utf7Codec();
00239
00243 static QString statusToFlags(KMMsgStatus status, int supportedFalgs);
00244
00248 virtual QString fileName() const {
00249 return encodeFileName( KMFolderMbox::fileName() ); }
00250
00254 ulong serNumForUID( ulong uid );
00255
00260 void saveMsgMetaData( KMMessage* msg, ulong uid = 0 );
00261
00265 static QValueList<ulong> splitSets(const QString);
00266
00267 virtual void ignoreJobsForMessage( KMMessage* );
00268
00272 bool includeInMailCheck() { return mCheckMail; }
00273 void setIncludeInMailCheck( bool check );
00274
00276 virtual int create();
00277
00279 virtual bool isAutoExpire() const { return false; }
00280
00282 virtual void reallyDoClose(const char* owner);
00283
00284 void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00285
00287 KMFolder* trashFolder() const;
00288
00294 void setAlreadyRemoved(bool removed);
00295
00297 bool isReadOnly() const { return KMFolderMbox::isReadOnly() || mReadOnly; }
00298 bool canDeleteMessages() const;
00299
00305 unsigned int userRights() const { return mUserRights; }
00306 KMail::ACLJobs::ACLFetchState userRightsState() const { return mUserRightsState; }
00307
00309 void setUserRights( unsigned int userRights, KMail::ACLJobs::ACLFetchState userRightsState );
00310
00316 virtual void search( const KMSearchPattern* );
00317 virtual void search( const KMSearchPattern*, Q_UINT32 serNum );
00318
00320 virtual bool isMoveable() const;
00321
00323 void initializeFrom( KMFolderImap* parent, QString path, QString mimeType );
00324
00326 int permanentFlags() const { return mPermanentFlags; }
00327
00328 virtual bool mailCheckInProgress() const;
00329
00330 signals:
00331 void folderComplete(KMFolderImap *folder, bool success);
00332
00336 void deleted(KMFolderImap*);
00337
00341 void directoryListingFinished(KMFolderImap*);
00342
00348 void folderCreationResult( const QString &name, bool success );
00349
00350 public slots:
00352 virtual void addMsgQuiet(KMMessage *);
00353 virtual void addMsgQuiet(QPtrList<KMMessage>);
00354
00361 virtual int addMsg(KMMessage* msg, int* index_return = 0);
00362 virtual int addMsg(QPtrList<KMMessage>&, QValueList<int>& index_return);
00363
00365 void copyMsg(QPtrList<KMMessage>& msgList);
00366
00367
00370 virtual KMMessage* take(int idx);
00371 virtual void take(QPtrList<KMMessage>);
00372
00376 void slotSimpleData(KIO::Job * job, const QByteArray & data);
00377
00382 static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE, int supportedFalgs = 31 );
00383
00388 static void seenFlagToStatus( KMMsgBase *msg, int flags, bool newMsg = true );
00389
00393 void slotCopyMsgResult( KMail::FolderJob* job );
00394
00398 void slotSearchDone( QValueList<Q_UINT32> serNums,
00399 const KMSearchPattern* pattern,
00400 bool complete );
00401
00405 void slotSearchDone( Q_UINT32 serNum, const KMSearchPattern* pattern, bool matches );
00406
00411 void slotListResult( const QStringList&, const QStringList&,
00412 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00413
00418 void slotCheckNamespace( const QStringList&, const QStringList&,
00419 const QStringList&, const QStringList&, const ImapAccountBase::jobData& );
00420
00421 protected:
00422 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00423 KMFolder *folder, QString partSpecifier,
00424 const AttachmentStrategy *as ) const;
00425 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00426 FolderJob::JobType jt, KMFolder *folder ) const;
00427
00428 void getMessagesResult(KIO::Job * job, bool lastSet);
00429
00433 virtual int expungeContents();
00434
00435 void setChildrenState( QString attributes );
00436
00438 void initInbox();
00439
00441 KMFolderImap* findParent( const QString& path, const QString& name );
00442
00444 void checkFolders( const QStringList& folderNames, const QString& ns );
00445
00446 void finishMailCheck( const char *func, imapState state );
00447
00448 protected slots:
00449
00453 void checkValidity();
00454 void slotCheckValidityResult(KIO::Job * job);
00455
00459 void reallyGetFolder(const QString &startUid = QString::null);
00460
00464 void slotListFolderResult(KIO::Job * job);
00465 void slotListFolderEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
00466
00470 void slotGetMessagesResult(KIO::Job * job);
00471 void slotGetLastMessagesResult(KIO::Job * job);
00472 void slotGetMessagesData(KIO::Job * job, const QByteArray & data);
00473
00477 void slotCreateFolderResult(KIO::Job * job);
00478
00482 void slotRemoveFolderResult(KIO::Job *job);
00483
00487 void slotStatResult(KIO::Job *job);
00488
00493 void slotCompleteMailCheckProgress();
00494
00498 void slotProcessNewMail( int errorCode, const QString& errorMsg );
00499
00505 void slotCreatePendingFolders( int errorCode, const QString& errorMsg );
00506
00510 void slotListNamespaces();
00511
00512 protected:
00513 QString mImapPath;
00514 ulong mLastUid;
00515 imapState mContentState, mSubfolderState;
00516 bool mIsSelected;
00517 bool mCheckFlags;
00518 bool mReadOnly;
00519 bool mCheckMail;
00520 mutable QGuardedPtr<KMAcctImap> mAccount;
00521
00522 QString mUidValidity;
00523 unsigned int mUserRights;
00524 KMail::ACLJobs::ACLFetchState mUserRightsState;
00525
00526 private:
00527
00528 bool mCheckingValidity;
00529
00530 QIntDict<KMMsgMetaData> mUidMetaDataMap;
00531
00532 QDict<KMMsgMetaData> mMetaDataMap;
00533
00534 bool mAlreadyRemoved;
00535
00536 QGuardedPtr<ProgressItem> mMailCheckProgressItem;
00537
00538 ProgressItem *mListDirProgressItem;
00539
00540 ProgressItem *mAddMessageProgressItem;
00541
00542 QStringList mFoldersPendingCreation;
00543
00544
00545
00546
00547
00548 bool mUploadAllFlags;
00549
00550
00551
00552 int mPermanentFlags;
00553 };
00554
00555 #endif // kmfolderimap_h