kmail

kmfolderimap.h
00001 /*
00002  * kmfolderimap.h
00003  *
00004  * Copyright (c) 2001 Kurt Granroth <granroth@kde.org>
00005  * Copyright (c) 2000-2002 Michael Haeckel <haeckel@kde.org>
00006  *
00007  * This file is based on kmacctimap.h by Michael Haeckel which is
00008  * based on popaccount.h by Don Sanders
00009  *
00010  *  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; version 2 of the License
00013  *
00014  *  This program is distributed in the hope that it will be useful,
00015  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  *  GNU General Public License for more details.
00018  *
00019  *  You should have received a copy of the GNU General Public License
00020  *  along with this program; if not, write to the Free Software
00021  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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 "tdeio/job.h"
00033 #include "tdeio/global.h"
00034 
00035 #include <kstandarddirs.h>
00036 
00037 #include <tqintdict.h>
00038 #include <tqdict.h>
00039 template< typename T> class TQPtrList;
00040 template< typename T> class TQValueList;
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, TQ_UINT32 aSerNum)
00067     :mStatus(aStatus), mSerNum(aSerNum) {}
00068   ~KMMsgMetaData() {};
00069   KMMsgStatus status() const { return mStatus; }
00070   TQ_UINT32 serNum() const { return mSerNum; }
00071 private:
00072   KMMsgStatus mStatus;
00073   TQ_UINT32 mSerNum;
00074 };
00075 
00076 
00077 
00078 class KMFolderImap : public KMFolderMbox
00079 {
00080   Q_OBJECT
00081   
00082   friend class ::KMail::ImapJob;
00083 public:
00084 
00085   static TQString cacheLocation() {
00086      return locateLocal("data", "kmail/imap" );
00087   }
00088 
00089   enum imapState {
00090     imapNoInformation = 0,
00091     imapListingInProgress = 1,
00092     imapDownloadInProgress = 2,
00093     imapFinished = 3
00094   };
00095 
00096   virtual imapState getContentState() const { return mContentState; }
00097   virtual void setContentState(imapState state) { mContentState = state; }
00098 
00099   virtual imapState getSubfolderState() { return mSubfolderState; }
00100   virtual void setSubfolderState(imapState state);
00101 
00105   KMFolderImap(KMFolder* folder, const char* name=0);
00106   virtual ~KMFolderImap();
00107 
00109   virtual KMFolderType folderType() const { return KMFolderTypeImap; }
00110 
00111   virtual KMMessage* getMsg(int idx);
00113   void setImapPath( const TQString &path );
00114   TQString imapPath() const { return mImapPath; }
00115 
00117   ulong lastUid();
00118 
00120   void setUidValidity(const TQString &validity) { mUidValidity = validity; }
00121   TQString uidValidity() { return mUidValidity; }
00122 
00124   void setAccount(KMAcctImap *acct);
00125   KMAcctImap* account() const;
00126 
00128   virtual void removeMsg(int i, bool quiet = FALSE);
00129   virtual void removeMsg(const TQPtrList<KMMessage>& msgList, bool quiet = FALSE);
00130 
00131   virtual int rename( const TQString& newName, KMFolderDir *aParent = 0 );
00132 
00134   virtual void remove();
00135 
00137   bool autoExpunge();
00138 
00140   virtual void writeConfig();
00141 
00143   virtual void readConfig();
00144 
00150   virtual bool listDirectory();
00151 
00155   void getFolder(bool force = FALSE);
00156 
00160   void getAndCheckFolder(bool force = FALSE);
00161 
00165   void getMessage(KMFolder * folder, KMMessage * msg);
00166 
00174   void createFolder(const TQString &name,
00175       const TQString& imapPath = TQString(), bool askUser = true);
00176 
00180   void deleteMessage(KMMessage * msg);
00181   void deleteMessage(const TQPtrList<KMMessage>& msgList);
00182 
00187   virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00188 
00192   virtual void setStatus(TQValueList<int>& _ids, KMMsgStatus status, bool toggle);
00193 
00195   static TQStringList makeSets( TQValueList<ulong>&, bool sort = true);
00196   static TQStringList makeSets(const TQStringList&, bool sort = true);
00197 
00199   static TQPtrList<KMMessage> splitMessageList(const TQString& set,
00200                                               TQPtrList<KMMessage>& msgList);
00201 
00203   void getUids(TQValueList<int>& ids, TQValueList<ulong>& uids);
00204 
00206   void getUids(const TQPtrList<KMMessage>& msgList, TQValueList<ulong>& uids);
00207 
00211   void expungeFolder(KMFolderImap * aFolder, bool quiet);
00212 
00213   virtual int compact( bool ) { expungeFolder(this, false); return 0; };
00214 
00218   void sendFolderComplete(bool success)
00219   { emit folderComplete(this, success); }
00220 
00225   bool processNewMail(bool interactive);
00226 
00231   void setSelected(bool selected) { mIsSelected = selected; }
00232   bool isSelected() { return mIsSelected; }
00233 
00237   static TQString encodeFileName(const TQString &);
00238   static TQString decodeFileName(const TQString &);
00239   static TQTextCodec * utf7Codec();
00240 
00244   static TQString statusToFlags(KMMsgStatus status, int supportedFalgs);
00245 
00249   virtual TQString fileName() const {
00250     return encodeFileName( KMFolderMbox::fileName() ); }
00251 
00255    ulong serNumForUID( ulong uid );
00256 
00261   void saveMsgMetaData( KMMessage* msg, ulong uid = 0 );
00262 
00266   static TQValueList<ulong> splitSets(const TQString);
00267 
00268   virtual void ignoreJobsForMessage( KMMessage* );
00269 
00273   bool includeInMailCheck() { return mCheckMail; }
00274   void setIncludeInMailCheck( bool check );
00275 
00277   virtual int create();
00278 
00280   virtual bool isAutoExpire() const { return false; }
00281 
00283   virtual void reallyDoClose(const char* owner);
00284 
00285   void setCheckingValidity( bool val ) { mCheckingValidity = val; }
00286 
00288   KMFolder* trashFolder() const;
00289 
00295   void setAlreadyRemoved(bool removed);
00296 
00298   bool isReadOnly() const { return KMFolderMbox::isReadOnly() || mReadOnly; }
00299   bool canDeleteMessages() const;
00300 
00306   unsigned int userRights() const { return mUserRights; }
00307   KMail::ACLJobs::ACLFetchState userRightsState() const { return mUserRightsState; }
00308 
00310   void setUserRights( unsigned int userRights, KMail::ACLJobs::ACLFetchState userRightsState );
00311 
00317   virtual void search( const KMSearchPattern* );
00318   virtual void search( const KMSearchPattern*, TQ_UINT32 serNum );
00319 
00321   virtual bool isMoveable() const;
00322 
00324   void initializeFrom( KMFolderImap* parent, TQString path, TQString mimeType );
00325 
00327   int permanentFlags() const { return mPermanentFlags; }
00328 
00329   virtual bool mailCheckInProgress() const;
00330 
00331 signals:
00332   void folderComplete(KMFolderImap *folder, bool success);
00333 
00337   void deleted(KMFolderImap*);
00338 
00342   void directoryListingFinished(KMFolderImap*);
00343 
00349   void folderCreationResult( const TQString &name, bool success );
00350 
00351 public slots:
00353   virtual void addMsgQuiet(KMMessage *);
00354   virtual void addMsgQuiet(TQPtrList<KMMessage>);
00355 
00362   virtual int addMsg(KMMessage* msg, int* index_return = 0);
00363   virtual int addMsg(TQPtrList<KMMessage>&, TQValueList<int>& index_return);
00364 
00366   void copyMsg(TQPtrList<KMMessage>& msgList/*, KMFolder* parent*/);
00367 
00368 
00371   virtual KMMessage* take(int idx);
00372   virtual void take(TQPtrList<KMMessage>);
00373 
00377   void slotSimpleData(TDEIO::Job * job, const TQByteArray & data);
00378 
00383   static void flagsToStatus(KMMsgBase *msg, int flags, bool newMsg = TRUE, int supportedFalgs = 31 );
00384 
00389   static void seenFlagToStatus( KMMsgBase *msg, int flags, bool newMsg = true );
00390 
00394   void slotCopyMsgResult( KMail::FolderJob* job );
00395 
00399   void slotSearchDone( TQValueList<TQ_UINT32> serNums,
00400                        const KMSearchPattern* pattern,
00401                        bool complete );
00402 
00406   void slotSearchDone( TQ_UINT32 serNum, const KMSearchPattern* pattern, bool matches );
00407 
00412   void slotListResult( const TQStringList&, const TQStringList&,
00413       const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00414 
00419   void slotCheckNamespace( const TQStringList&, const TQStringList&,
00420       const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00421 
00422 protected:
00423   virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00424                                   KMFolder *folder, TQString partSpecifier,
00425                                   const AttachmentStrategy *as ) const;
00426   virtual FolderJob* doCreateJob( TQPtrList<KMMessage>& msgList, const TQString& sets,
00427                                   FolderJob::JobType jt, KMFolder *folder ) const;
00428 
00429   void getMessagesResult(TDEIO::Job * job, bool lastSet);
00430 
00434   virtual int expungeContents();
00435 
00436   void setChildrenState( TQString attributes );
00437 
00439   void initInbox();
00440 
00442   KMFolderImap* findParent( const TQString& path, const TQString& name );
00443 
00445   void checkFolders( const TQStringList& folderNames, const TQString& ns );
00446 
00447   void finishMailCheck( const char *func, imapState state );
00448 
00449 protected slots:
00450 
00454   void checkValidity();
00455   void slotCheckValidityResult(TDEIO::Job * job);
00456 
00460   void reallyGetFolder(const TQString &startUid = TQString());
00461 
00465   void slotListFolderResult(TDEIO::Job * job);
00466   void slotListFolderEntries(TDEIO::Job * job, const TDEIO::UDSEntryList & uds);
00467 
00471   void slotGetMessagesResult(TDEIO::Job * job);
00472   void slotGetLastMessagesResult(TDEIO::Job * job);
00473   void slotGetMessagesData(TDEIO::Job * job, const TQByteArray & data);
00474 
00478   void slotCreateFolderResult(TDEIO::Job * job);
00479 
00483   void slotRemoveFolderResult(TDEIO::Job *job);
00484 
00488   void slotStatResult(TDEIO::Job *job);
00489 
00494   void slotCompleteMailCheckProgress();
00495 
00499   void slotProcessNewMail( int errorCode, const TQString& errorMsg );
00500 
00506   void slotCreatePendingFolders( int errorCode, const TQString& errorMsg );
00507 
00511   void slotListNamespaces();
00512 
00513 protected:
00514   TQString     mImapPath;
00515   ulong       mLastUid;
00516   imapState   mContentState, mSubfolderState;
00517   bool        mIsSelected;
00518   bool        mCheckFlags;
00519   bool        mReadOnly;
00520   bool        mCheckMail;
00521   mutable TQGuardedPtr<KMAcctImap> mAccount;
00522   // the current uidvalidity
00523   TQString mUidValidity;
00524   unsigned int mUserRights;
00525   KMail::ACLJobs::ACLFetchState mUserRightsState;
00526 
00527 private:
00528   // if we're checking validity currently
00529   bool        mCheckingValidity;
00530   // uid - metadata cache
00531   TQIntDict<KMMsgMetaData> mUidMetaDataMap;
00532   // msgidMD5 - status map
00533   TQDict<KMMsgMetaData> mMetaDataMap;
00534   // if the folder should be deleted without server roundtrip
00535   bool        mAlreadyRemoved;
00536   // the progress for mailchecks
00537   TQGuardedPtr<ProgressItem> mMailCheckProgressItem;
00538   // the progress for listings
00539   ProgressItem *mListDirProgressItem;
00540   // the progress for addMsg
00541   ProgressItem *mAddMessageProgressItem;
00542   // to-be-added folders
00543   TQStringList mFoldersPendingCreation;
00544 
00545   // push all flags to the server instead of just the changed once
00546   // when doing a flag change the next time
00547   // this is needed for migrating local flags from the time where we didn't
00548   // have the ability to store them on the server
00549   bool mUploadAllFlags;
00550 
00551   // PERMANENTFLAGS part of SELECT response, needed to determine if custom flags can be
00552   // stored on the server
00553   int mPermanentFlags;
00554 };
00555 
00556 #endif // kmfolderimap_h