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
00033
00034
00035 #ifndef FOLDERSTORAGE_H
00036 #define FOLDERSTORAGE_H
00037
00038
00039 #include <config.h>
00040
00041 #include "kmfoldernode.h"
00042 #include "kmfoldertype.h"
00043 #include "kmmsginfo.h"
00044 #include "kmglobal.h"
00045 #include "folderjob.h"
00046 using KMail::FolderJob;
00047
00048 #include "mimelib/string.h"
00049
00050 #include <sys/types.h>
00051 #include <stdio.h>
00052
00053 class KMMessage;
00054 class KMAccount;
00055 class KMFolderDir;
00056 class KMMsgDict;
00057 class KMMsgDictREntry;
00058 class QTimer;
00059 class KMSearchPattern;
00060
00061 namespace KMail {
00062 class AttachmentStrategy;
00063 }
00064 using KMail::AttachmentStrategy;
00065
00066 typedef QValueList<Q_UINT32> SerNumList;
00067
00079 class FolderStorage : public QObject
00080 {
00081 Q_OBJECT
00082
00083 public:
00084
00085
00089 FolderStorage( KMFolder* folder, const char* name=0 );
00090 virtual ~FolderStorage();
00091
00092 KMFolder* folder() const { return mFolder; }
00093
00095 virtual KMFolderType folderType() const { return KMFolderTypeUnknown; }
00096
00098 virtual QString fileName() const;
00100 QString location() const;
00101
00103 virtual QString indexLocation() const = 0;
00104
00106 virtual bool noContent() const { return mNoContent; }
00107
00109 virtual void setNoContent(bool aNoContent);
00110
00112 virtual bool noChildren() const { return mNoChildren; }
00113
00115 virtual void setNoChildren( bool aNoChildren );
00116
00117 enum ChildrenState {
00118 HasChildren,
00119 HasNoChildren,
00120 ChildrenUnknown
00121 };
00124 virtual ChildrenState hasChildren() const { return mHasChildren; }
00125
00127 virtual void setHasChildren( ChildrenState state )
00128 { mHasChildren = state; }
00129
00131 virtual void updateChildrenState();
00132
00134 virtual KMMessage* getMsg(int idx);
00135
00137 virtual KMMsgInfo* unGetMsg(int idx);
00138
00140 virtual bool isMessage(int idx);
00141
00146 virtual KMMessage* readTemporaryMsg(int idx);
00147
00149 virtual DwString getDwString(int idx) = 0;
00150
00154 virtual void ignoreJobsForMessage( KMMessage* );
00155
00160 virtual FolderJob* createJob( KMMessage *msg, FolderJob::JobType jt = FolderJob::tGetMessage,
00161 KMFolder *folder = 0, QString partSpecifier = QString::null,
00162 const AttachmentStrategy *as = 0 ) const;
00163 virtual FolderJob* createJob( QPtrList<KMMessage>& msgList, const QString& sets,
00164 FolderJob::JobType jt = FolderJob::tGetMessage,
00165 KMFolder *folder = 0 ) const;
00166
00171 virtual const KMMsgBase* getMsgBase(int idx) const = 0;
00172 virtual KMMsgBase* getMsgBase(int idx) = 0;
00173
00175 virtual const KMMsgBase* operator[](int idx) const { return getMsgBase(idx); }
00176
00178 virtual KMMsgBase* operator[](int idx) { return getMsgBase(idx); }
00179
00182 virtual KMMessage* take(int idx);
00183 virtual void take(QPtrList<KMMessage> msgList);
00184
00191 virtual int addMsg(KMMessage* msg, int* index_return = 0) = 0;
00192
00196 virtual int addMsgKeepUID(KMMessage* msg, int* index_return = 0) {
00197 return addMsg(msg, index_return);
00198 }
00199
00204 virtual int addMsg( QPtrList<KMMessage>&, QValueList<int>& index_return );
00205
00208 void emitMsgAddedSignals(int idx);
00209
00212 virtual bool canAddMsgNow(KMMessage* aMsg, int* aIndex_ret);
00213
00215 virtual void removeMsg(int i, bool imapQuiet = false);
00216 virtual void removeMsg(const QPtrList<KMMsgBase>& msgList, bool imapQuiet = false);
00217 virtual void removeMsg(const QPtrList<KMMessage>& msgList, bool imapQuiet = false);
00218
00221 virtual int expungeOldMsg(int days);
00222
00227 virtual int moveMsg(KMMessage* msg, int* index_return = 0);
00228 virtual int moveMsg(QPtrList<KMMessage>, int* index_return = 0);
00229
00231 virtual int find(const KMMsgBase* msg) const = 0;
00232 int find( const KMMessage * msg ) const;
00233
00235 virtual int count(bool cache = false) const;
00236
00238 virtual int countUnread();
00239
00241 Q_INT64 folderSize() const;
00242
00245 virtual bool isCloseToQuota() const;
00246
00249 virtual void msgStatusChanged( const KMMsgStatus oldStatus,
00250 const KMMsgStatus newStatus,
00251 int idx);
00252
00258 virtual int open(const char* owner) = 0;
00259
00262 virtual int canAccess() = 0;
00263
00267 void close(const char* owner, bool force=false);
00268 virtual void reallyDoClose(const char* owner) = 0;
00269
00272 virtual void tryReleasingFolder(KMFolder*) {}
00273
00275 virtual void sync() = 0;
00276
00278 bool isOpened() const { return (mOpenCount>0); }
00279
00281 virtual void markNewAsUnread();
00282
00284 virtual void markUnreadAsRead();
00285
00289 virtual int create() = 0;
00290
00295 virtual void remove();
00296
00300 virtual int expunge();
00301
00306 virtual int compact( bool silent ) = 0;
00307
00310 virtual int rename(const QString& newName, KMFolderDir *aParent = 0);
00311
00313 bool autoCreateIndex() const { return mAutoCreateIndex; }
00314
00317 virtual void setAutoCreateIndex(bool);
00318
00322 bool dirty() const { return mDirty; }
00323
00325 void setDirty(bool f);
00326
00328 bool needsCompacting() const { return needsCompact; }
00329 virtual void setNeedsCompacting(bool f) { needsCompact = f; }
00330
00339 virtual void quiet(bool beQuiet);
00340
00342 virtual bool isReadOnly() const = 0;
00343
00345 virtual bool canDeleteMessages() const;
00346
00348 QString label() const;
00349
00351 virtual void correctUnreadMsgsCount();
00352
00355 virtual int writeIndex( bool createEmptyIndex = false ) = 0;
00356
00359 void registerWithMessageDict();
00360
00363 void deregisterFromMessageDict();
00364
00366 virtual void setStatus(int idx, KMMsgStatus status, bool toggle=false);
00367
00369 virtual void setStatus(QValueList<int>& ids, KMMsgStatus status, bool toggle=false);
00370
00371 void removeJobs();
00372
00374 static QString dotEscape(const QString&);
00375
00377 virtual void readConfig();
00378
00380 virtual void writeConfig();
00381
00386 virtual KMFolder* trashFolder() const { return 0; }
00387
00392 void addJob( FolderJob* ) const;
00393
00395 bool compactable() const { return mCompactable; }
00396
00398
00399
00400
00401 virtual void setContentsType( KMail::FolderContentsType type, bool quiet = false );
00403 KMail::FolderContentsType contentsType() const { return mContentsType; }
00404
00409 virtual void search( const KMSearchPattern* );
00410
00415 virtual void search( const KMSearchPattern*, Q_UINT32 serNum );
00416
00418 virtual bool isMoveable() const;
00419
00420 virtual KMAccount* account() const;
00421
00422 virtual bool mailCheckInProgress() const;
00423
00424 signals:
00427 void changed();
00428
00431 void cleared();
00432
00435 void expunged( KMFolder* );
00436
00438 void closed( KMFolder* );
00439
00441 void invalidated( KMFolder * );
00442
00444 void nameChanged();
00445
00449 void locationChanged( const QString &, const QString & );
00450
00453 void contentsTypeChanged( KMail::FolderContentsType type );
00454
00456 void readOnlyChanged(KMFolder*);
00457
00459 void noContentChanged();
00460
00462 void msgRemoved(KMFolder*, Q_UINT32 sernum);
00463
00465 void msgRemoved( int idx, QString msgIdMD5 );
00466 void msgRemoved( KMFolder* );
00467
00469 void msgAdded(int idx);
00470 void msgAdded(KMFolder*, Q_UINT32 sernum);
00471
00473 void msgChanged(KMFolder*, Q_UINT32 sernum, int delta);
00474
00476 void msgHeaderChanged(KMFolder*, int);
00477
00479 void statusMsg(const QString&);
00480
00482 void numUnreadMsgsChanged( KMFolder* );
00483
00485 void removed(KMFolder*, bool);
00486
00492 void searchResult( KMFolder*, QValueList<Q_UINT32>,
00493 const KMSearchPattern*, bool complete );
00494
00499 void searchDone( KMFolder*, Q_UINT32, const KMSearchPattern*, bool );
00500
00502 void folderSizeChanged();
00503
00504
00505 public slots:
00507 virtual int updateIndex() = 0;
00508
00511 virtual void reallyAddMsg(KMMessage* aMsg);
00512
00515 virtual void reallyAddCopyOfMsg(KMMessage* aMsg);
00516
00518 void slotEmitChangedTimer();
00519
00520 protected slots:
00521 virtual void removeJob( QObject* );
00522
00524 void slotProcessNextSearchBatch();
00525
00526 protected:
00527
00533 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt, KMFolder *folder,
00534 QString partSpecifier, const AttachmentStrategy *as ) const = 0;
00535 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00536 FolderJob::JobType jt, KMFolder *folder ) const = 0;
00537
00541 void headerOfMsgChanged(const KMMsgBase*, int idx);
00542
00545 virtual KMMessage* readMsg(int idx) = 0;
00546
00547
00548 friend class KMMsgDict;
00552 virtual void fillMessageDict() {}
00553
00557 void readFolderIdsFile();
00558
00560 int writeFolderIdsFile() const;
00561
00563 int touchFolderIdsFile();
00564
00566 int appendToFolderIdsFile( int idx = -1 );
00567
00571 void setRDict(KMMsgDictREntry *rentry) const;
00572
00574 KMMsgDictREntry *rDict() const { return mRDict; }
00575
00576
00579 void replaceMsgSerNum( unsigned long sernum, KMMsgBase* msg, int idx );
00580
00584 void invalidateFolder();
00585
00589 virtual int removeContents() = 0;
00590
00594 virtual int expungeContents() = 0;
00595
00597 virtual bool readIndex() = 0;
00598 virtual KMMsgBase* takeIndexEntry( int idx ) = 0;
00599 virtual KMMsgInfo* setIndexEntry( int idx, KMMessage *msg ) = 0;
00600 virtual void clearIndex(bool autoDelete=true, bool syncDict = false) = 0;
00601 virtual void truncateIndex() = 0;
00602
00603 virtual Q_INT64 doFolderSize() const { return 0; };
00604
00605 int mOpenCount;
00606 int mQuiet;
00607 bool mChanged :1;
00609 bool mAutoCreateIndex :1;
00612 bool mExportsSernums :1;
00614 bool mDirty :1;
00616 bool mFilesLocked :1;
00617
00619 int mUnreadMsgs, mGuessedUnreadMsgs;
00620 int mTotalMsgs;
00621 Q_INT64 mSize;
00622 bool mWriteConfigEnabled :1;
00624 bool needsCompact :1;
00626 bool mCompactable :1;
00627 bool mNoContent :1;
00628 bool mNoChildren :1;
00629 bool mConvertToUtf8 :1;
00630
00632 mutable KMMsgDictREntry *mRDict;
00634 mutable QPtrList<FolderJob> mJobList;
00635
00636 QTimer *mDirtyTimer;
00637 enum { mDirtyTimerInterval = 600000 };
00638
00639 ChildrenState mHasChildren;
00640
00642 KMail::FolderContentsType mContentsType;
00643
00644 KMFolder* mFolder;
00645
00646 QTimer * mEmitChangedTimer;
00647
00648 int mCurrentSearchedMsg;
00649 const KMSearchPattern* mSearchPattern;
00650 };
00651
00652 #endif // FOLDERSTORAGE_H