00001
00002
00003
00004
00005
00006
00007 #ifndef kmfolder_h
00008 #define kmfolder_h
00009
00010
00011 #include <config.h>
00012
00013 #include "kmfoldernode.h"
00014 #include "kmfoldertype.h"
00015 #include "kmmsginfo.h"
00016 #include "kmglobal.h"
00017 #include "folderjob.h"
00018 using KMail::FolderJob;
00019
00020 #include "mimelib/string.h"
00021
00022 #include <qptrvector.h>
00023 #include <sys/types.h>
00024 #include <stdio.h>
00025
00026 class KMMessage;
00027 class KMFolderDir;
00028 class KMAcctList;
00029 class KMMsgDict;
00030 class KMMsgDictREntry;
00031 class QTimer;
00032
00033 namespace KMail {
00034 class AttachmentStrategy;
00035 }
00036 using KMail::AttachmentStrategy;
00037
00038 typedef QValueList<Q_UINT32> SerNumList;
00039
00050 class KMFolder: public KMFolderNode
00051 {
00052 Q_OBJECT
00053 friend class KMFolderJob;
00054 public:
00055
00056
00060 KMFolder(KMFolderDir* parent=0, const QString& name=QString::null);
00061 virtual ~KMFolder();
00062
00064 virtual KMFolderType folderType() const { return KMFolderTypeUnknown; }
00065
00067 virtual QString fileName() const { return name(); }
00068
00070 QString location() const;
00071
00073 virtual QString indexLocation() const = 0;
00074
00076 QString subdirLocation() const;
00077
00080 virtual KMFolderDir* child() const
00081 { return mChild; }
00082
00084 virtual KMFolderDir* createChildFolder();
00085
00087 virtual void setChild( KMFolderDir* aChild )
00088 { mChild = aChild; }
00089
00091 virtual bool noContent() const
00092 { return mNoContent; }
00093
00095 virtual void setNoContent(bool aNoContent)
00096 { mNoContent = aNoContent; }
00097
00099 virtual KMMessage* getMsg(int idx);
00100
00102 virtual KMMsgInfo* unGetMsg(int idx);
00103
00105 virtual bool isMessage(int idx);
00106
00108 virtual QCString& getMsgString(int idx, QCString& mDest) = 0;
00109
00111 virtual DwString getDwString(int idx) = 0;
00112
00116 virtual void ignoreJobsForMessage( KMMessage* );
00117
00122 virtual FolderJob* createJob( KMMessage *msg, FolderJob::JobType jt = FolderJob::tGetMessage,
00123 KMFolder *folder = 0, QString partSpecifier = QString::null,
00124 const AttachmentStrategy *as = 0 ) const;
00125 virtual FolderJob* createJob( QPtrList<KMMessage>& msgList, const QString& sets,
00126 FolderJob::JobType jt = FolderJob::tGetMessage,
00127 KMFolder *folder = 0 ) const;
00128
00133 virtual const KMMsgBase* getMsgBase(int idx) const = 0;
00134 virtual KMMsgBase* getMsgBase(int idx) = 0;
00135
00137 virtual const KMMsgBase* operator[](int idx) const { return getMsgBase(idx); }
00138
00140 virtual KMMsgBase* operator[](int idx) { return getMsgBase(idx); }
00141
00144 virtual KMMessage* take(int idx);
00145 virtual void take(QPtrList<KMMessage> msgList);
00146
00153 virtual int addMsg(KMMessage* msg, int* index_return = 0) = 0;
00154
00158 virtual int addMsgKeepUID(KMMessage* msg, int* index_return = 0) {
00159 return addMsg(msg, index_return);
00160 }
00161
00164 void emitMsgAddedSignals(int idx);
00165
00168 virtual bool canAddMsgNow(KMMessage* aMsg, int* aIndex_ret);
00169
00171 virtual void removeMsg(int i, bool imapQuiet = FALSE);
00172 virtual void removeMsg(QPtrList<KMMessage> msgList, bool imapQuiet = FALSE);
00173
00176 virtual int expungeOldMsg(int days);
00177
00182 virtual int moveMsg(KMMessage* msg, int* index_return = 0);
00183 virtual int moveMsg(QPtrList<KMMessage>, int* index_return = 0);
00184
00186 virtual int find(const KMMsgBase* msg) const = 0;
00187 int find( const KMMessage * msg ) const;
00188
00190 virtual int count(bool cache = false) const;
00191
00193 virtual int countUnread();
00194
00197 virtual int countUnreadRecursive();
00198
00201 virtual void msgStatusChanged( const KMMsgStatus oldStatus,
00202 const KMMsgStatus newStatus,
00203 int idx);
00204
00210 virtual int open() = 0;
00211
00214 virtual int canAccess() = 0;
00215
00218 virtual void close(bool force=FALSE) = 0;
00219
00221 virtual void sync() = 0;
00222
00224 bool isOpened() const { return (mOpenCount>0); }
00225
00227 virtual void markNewAsUnread();
00228
00230 virtual void markUnreadAsRead();
00231
00235 virtual int create(bool imap = FALSE) = 0;
00236
00241 virtual int remove();
00242
00246 virtual int expunge();
00247
00250 virtual int compact() = 0;
00251
00254 virtual int rename(const QString& newName, KMFolderDir *aParent = 0);
00255
00257 bool autoCreateIndex() const { return mAutoCreateIndex; }
00258
00261 virtual void setAutoCreateIndex(bool);
00262
00266 bool dirty() const { return mDirty; }
00267
00269 void setDirty(bool f);
00270
00272 bool needsCompacting() const { return needsCompact; }
00273 virtual void setNeedsCompacting(bool f) { needsCompact = f; }
00274
00283 virtual void quiet(bool beQuiet);
00284
00286 virtual bool isReadOnly() const = 0;
00287
00292 bool isSystemFolder() const { return mIsSystemFolder; }
00293 void setSystemFolder(bool itIs) { mIsSystemFolder=itIs; }
00294
00296 virtual QString label() const;
00297 void setLabel(const QString& lbl) { mLabel = lbl; }
00298
00300 virtual const char* type() const;
00301
00302 virtual QCString protocol() const = 0;
00303
00305 bool hasAccounts() const { return (mAcctList != 0); }
00306
00308 void setMailingList(bool enabled)
00309 { mMailingListEnabled = enabled; writeConfig(); }
00310 bool isMailingList() const { return mMailingListEnabled; }
00311
00312 void setMailingListPostAddress(const QString &address)
00313 { mMailingListPostingAddress = address; writeConfig(); }
00314 QString mailingListPostAddress() const
00315 { return mMailingListPostingAddress; }
00316
00317 void setMailingListAdminAddress(const QString &address)
00318 { mMailingListAdminAddress = address; writeConfig(); }
00319 QString mailingListAdminAddress() const
00320 { return mMailingListAdminAddress; }
00321
00322 void setIdentity(uint identity);
00323 uint identity() const { return mIdentity; }
00324
00326 QString whoField() const { return mWhoField; }
00327 void setWhoField(const QString& aWhoField) { mWhoField = aWhoField; }
00328
00330 QString userWhoField(void) { return mUserWhoField; }
00331 void setUserWhoField(const QString &whoField,bool writeConfig=true);
00332
00334 virtual void correctUnreadMsgsCount();
00335
00337 virtual QString idString() const;
00338
00342 void
00343 setAutoExpire(bool enabled) {
00344 expireMessages = enabled;
00345 writeConfig();
00346 }
00347
00351 virtual bool isAutoExpire() const { return expireMessages; }
00352
00358 void
00359 setUnreadExpireAge(int age) {
00360 if (age >= 0) {
00361 unreadExpireAge = age;
00362 writeConfig();
00363 }
00364 }
00365
00370 void
00371 setUnreadExpireUnits(ExpireUnits units) {
00372 if (units >= expireNever && units < expireMaxUnits) {
00373 unreadExpireUnits = units;
00374 }
00375 }
00376
00382 void
00383 setReadExpireAge(int age) {
00384 if (age >= 0) {
00385 readExpireAge = age;
00386 writeConfig();
00387 }
00388 }
00389
00394 void
00395 setReadExpireUnits(ExpireUnits units) {
00396 if (units >= expireNever && units <= expireMaxUnits) {
00397 readExpireUnits = units;
00398 }
00399 }
00400
00405 int getUnreadExpireAge() const { return unreadExpireAge; }
00406
00411 int getReadExpireAge() const { return readExpireAge; }
00412
00417 ExpireUnits getUnreadExpireUnits() const { return unreadExpireUnits; }
00418
00423 ExpireUnits getReadExpireUnits() const { return readExpireUnits; }
00424
00425 void expireOldMessages();
00426
00429 virtual int writeIndex( bool createEmptyIndex = false ) = 0;
00430
00433 void fillMsgDict(KMMsgDict *dict);
00434
00436 int writeMsgDict(KMMsgDict *dict = 0);
00437
00439 int touchMsgDict();
00440
00442 int appendtoMsgDict(int idx = -1);
00443
00445 void setRDict(KMMsgDictREntry *rentry);
00446
00448 KMMsgDictREntry *rDict() const { return mRDict; }
00449
00451 virtual void setStatus(int idx, KMMsgStatus status, bool toggle=false);
00452
00454 virtual void setStatus(QValueList<int>& ids, KMMsgStatus status, bool toggle=false);
00455
00457 virtual bool useCustomIcons() const { return mUseCustomIcons; }
00458 virtual void setUseCustomIcons(bool useCustomIcons) { mUseCustomIcons = useCustomIcons; }
00459 virtual QString normalIconPath() const { return mNormalIconPath; }
00460 virtual QString unreadIconPath() const { return mUnreadIconPath; }
00461 virtual void setIconPaths(const QString &normalPath, const QString &unreadPath);
00462
00463 void removeJobs();
00464
00468 static size_t crlf2lf( char* str, const size_t strLen );
00469
00470 signals:
00473 void changed();
00474
00477 void cleared();
00478
00481 void expunged();
00482
00484 void iconsChanged();
00485
00487 void nameChanged();
00488
00490 void msgRemoved(KMFolder*, Q_UINT32 sernum);
00491
00493 void msgRemoved(int idx,QString msgIdMD5, QString strippedSubjMD5);
00494 void msgRemoved(KMFolder*);
00495
00497 void msgAdded(int idx);
00498 void msgAdded(KMFolder*, Q_UINT32 sernum);
00499
00501 void msgChanged(KMFolder*, Q_UINT32 sernum, int delta);
00502
00504 void msgHeaderChanged(KMFolder*, int);
00505
00507 void statusMsg(const QString&);
00508
00510 void numUnreadMsgsChanged( KMFolder* );
00511
00512
00513 void syncRunning( KMFolder*, bool );
00514
00515 public slots:
00517 virtual int updateIndex() = 0;
00518
00521 virtual void reallyAddMsg(KMMessage* aMsg);
00522
00525 virtual void reallyAddCopyOfMsg(KMMessage* aMsg);
00526
00527 protected slots:
00528 virtual void removeJob( QObject* );
00529 protected:
00530 virtual void addJob( FolderJob* ) const;
00536 virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt, KMFolder *folder,
00537 QString partSpecifier, const AttachmentStrategy *as ) const = 0;
00538 virtual FolderJob* doCreateJob( QPtrList<KMMessage>& msgList, const QString& sets,
00539 FolderJob::JobType jt, KMFolder *folder ) const = 0;
00540
00544 void headerOfMsgChanged(const KMMsgBase*, int idx);
00545
00547 virtual QString dotEscape(const QString&) const;
00548
00551 virtual KMMessage* readMsg(int idx) = 0;
00552
00554 virtual bool readIndex() = 0;
00555
00559 virtual int removeContents() = 0;
00560
00564 virtual int expungeContents() = 0;
00565
00567 virtual void writeConfig();
00568
00570 virtual void readConfig();
00571
00572 virtual KMMsgBase* takeIndexEntry( int idx ) = 0;
00573 virtual KMMsgInfo* setIndexEntry( int idx, KMMessage *msg ) = 0;
00574 virtual void clearIndex(bool autoDelete=true, bool syncDict = false) = 0;
00575 virtual void fillDictFromIndex(KMMsgDict *dict) = 0;
00576 virtual void truncateIndex() = 0;
00577
00578 int mOpenCount;
00579 int mQuiet;
00580 bool mChanged;
00582 bool mAutoCreateIndex;
00584 bool mDirty;
00586 bool mFilesLocked;
00588 QString mLabel;
00590 QString mWhoField, mUserWhoField;
00591 bool mIsSystemFolder;
00592 KMAcctList* mAcctList;
00593
00594 bool mMailingListEnabled;
00595 QString mMailingListPostingAddress;
00596 QString mMailingListAdminAddress;
00597 uint mIdentity;
00598
00600 int mUnreadMsgs, mGuessedUnreadMsgs;
00601 int mTotalMsgs;
00602 bool mWriteConfigEnabled;
00604 bool needsCompact;
00606 bool mCompactable;
00607 bool mNoContent;
00608 KMFolderDir* mChild;
00609 bool mConvertToUtf8;
00610
00612 bool expireMessages;
00613 int unreadExpireAge;
00614 int readExpireAge;
00615 ExpireUnits unreadExpireUnits;
00616 ExpireUnits readExpireUnits;
00617
00618 int daysToExpire(int num, ExpireUnits units);
00619
00621 KMMsgDictREntry *mRDict;
00626 mutable QPtrList<FolderJob> mJobList;
00627
00629 bool mUseCustomIcons;
00630 QString mNormalIconPath;
00631 QString mUnreadIconPath;
00632 QTimer *mDirtyTimer;
00633 enum { mDirtyTimerInterval = 600000 };
00634 };
00635
00636 #endif