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 signals:
00425 void changed();
00426
00429 void cleared();
00430
00433 void expunged( KMFolder* );
00434
00436 void closed( KMFolder* );
00437
00439 void invalidated( KMFolder * );
00440
00442 void nameChanged();
00443
00447 void locationChanged( const QString &, const QString & );
00448
00451 void contentsTypeChanged( KMail::FolderContentsType type );
00452
00454 void readOnlyChanged(KMFolder*);
00455
00457 void noContentChanged();
00458
00460 void msgRemoved(KMFolder*, Q_UINT32 sernum);
00461
00463 void msgRemoved( int idx, QString msgIdMD5 );
00464 void msgRemoved( KMFolder* );
00465
00467 void msgAdded(int idx);
00468 void msgAdded(KMFolder*, Q_UINT32 sernum);
00469
00471 void msgChanged(KMFolder*, Q_UINT32 sernum, int delta);
00472
00474 void msgHeaderChanged(KMFolder*, int);
00475
00477 void statusMsg(const QString&);
00478
00480 void numUnreadMsgsChanged( KMFolder* );
00481
00483 void removed(KMFolder*, bool);
00484
00490 void searchResult( KMFolder*, QValueList<Q_UINT32>,
00491 const KMSearchPattern*, bool complete );
00492
00497 void searchDone( KMFolder*, Q_UINT32, const KMSearchPattern*, bool );
00498
00500 void folderSizeChanged();
00501
00502
00503 public slots:
00505 virtual int updateIndex() = 0;
00506
00509 virtual void reallyAddMsg(KMMessage* aMsg);
00510
00513 virtual void reallyAddCopyOfMsg(KMMessage* aMsg);
00514
00516 void slotEmitChangedTimer();
00517
00518 protected slots:
00519 virtual void removeJob( QObject* );
00520
00522 void slotProcessNextSearchBatch();
00523
00524 protected:
00525
00531 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt, KMFolder *folder,
00532 QString partSpecifier, const AttachmentStrategy *as ) const = 0;
00533 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00534 FolderJob::JobType jt, KMFolder *folder ) const = 0;
00535
00539 void headerOfMsgChanged(const KMMsgBase*, int idx);
00540
00543 virtual KMMessage* readMsg(int idx) = 0;
00544
00545
00546 friend class KMMsgDict;
00550 virtual void fillMessageDict() {}
00551
00555 void readFolderIdsFile();
00556
00558 int writeFolderIdsFile() const;
00559
00561 int touchFolderIdsFile();
00562
00564 int appendToFolderIdsFile( int idx = -1 );
00565
00569 void setRDict(KMMsgDictREntry *rentry) const;
00570
00572 KMMsgDictREntry *rDict() const { return mRDict; }
00573
00574
00577 void replaceMsgSerNum( unsigned long sernum, KMMsgBase* msg, int idx );
00578
00582 void invalidateFolder();
00583
00587 virtual int removeContents() = 0;
00588
00592 virtual int expungeContents() = 0;
00593
00595 virtual bool readIndex() = 0;
00596 virtual KMMsgBase* takeIndexEntry( int idx ) = 0;
00597 virtual KMMsgInfo* setIndexEntry( int idx, KMMessage *msg ) = 0;
00598 virtual void clearIndex(bool autoDelete=true, bool syncDict = false) = 0;
00599 virtual void truncateIndex() = 0;
00600
00601 virtual Q_INT64 doFolderSize() const { return 0; };
00602
00603 int mOpenCount;
00604 int mQuiet;
00605 bool mChanged :1;
00607 bool mAutoCreateIndex :1;
00610 bool mExportsSernums :1;
00612 bool mDirty :1;
00614 bool mFilesLocked :1;
00615
00617 int mUnreadMsgs, mGuessedUnreadMsgs;
00618 int mTotalMsgs;
00619 Q_INT64 mSize;
00620 bool mWriteConfigEnabled :1;
00622 bool needsCompact :1;
00624 bool mCompactable :1;
00625 bool mNoContent :1;
00626 bool mNoChildren :1;
00627 bool mConvertToUtf8 :1;
00628
00630 mutable KMMsgDictREntry *mRDict;
00632 mutable QPtrList<FolderJob> mJobList;
00633
00634 QTimer *mDirtyTimer;
00635 enum { mDirtyTimerInterval = 600000 };
00636
00637 ChildrenState mHasChildren;
00638
00640 KMail::FolderContentsType mContentsType;
00641
00642 KMFolder* mFolder;
00643
00644 QTimer * mEmitChangedTimer;
00645
00646 int mCurrentSearchedMsg;
00647 const KMSearchPattern* mSearchPattern;
00648 };
00649
00650 #endif // FOLDERSTORAGE_H