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 "kio/job.h"
00033 #include "kio/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, 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 TQString 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 TQString &path );
00113   TQString imapPath() const { return mImapPath; }
00114 
00116   ulong lastUid();
00117 
00119   void setUidValidity(const TQString &validity) { mUidValidity = validity; }
00120   TQString 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 TQPtrList<KMMessage>& msgList, bool quiet = FALSE);
00129 
00130   virtual int rename( const TQString& 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 TQString &name,
00174       const TQString& imapPath = TQString::null, bool askUser = true);
00175 
00179   void deleteMessage(KMMessage * msg);
00180   void deleteMessage(const TQPtrList<KMMessage>& msgList);
00181 
00186   virtual void setStatus(int idx, KMMsgStatus status, bool toggle);
00187 
00191   virtual void setStatus(TQValueList<int>& _ids, KMMsgStatus status, bool toggle);
00192 
00194   static TQStringList makeSets( TQValueList<ulong>&, bool sort = true);
00195   static TQStringList makeSets(const TQStringList&, bool sort = true);
00196 
00198   static TQPtrList<KMMessage> splitMessageList(const TQString& set,
00199                                               TQPtrList<KMMessage>& msgList);
00200 
00202   void getUids(TQValueList<int>& ids, TQValueList<ulong>& uids);
00203 
00205   void getUids(const TQPtrList<KMMessage>& msgList, TQValueList<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 TQString encodeFileName(const TQString &);
00237   static TQString decodeFileName(const TQString &);
00238   static TQTextCodec * utf7Codec();
00239 
00243   static TQString statusToFlags(KMMsgStatus status, int supportedFalgs);
00244 
00248   virtual TQString 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 TQValueList<ulong> splitSets(const TQString);
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, TQString path, TQString 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 TQString &name, bool success );
00349 
00350 public slots:
00352   virtual void addMsgQuiet(KMMessage *);
00353   virtual void addMsgQuiet(TQPtrList<KMMessage>);
00354 
00361   virtual int addMsg(KMMessage* msg, int* index_return = 0);
00362   virtual int addMsg(TQPtrList<KMMessage>&, TQValueList<int>& index_return);
00363 
00365   void copyMsg(TQPtrList<KMMessage>& msgList/*, KMFolder* parent*/);
00366 
00367 
00370   virtual KMMessage* take(int idx);
00371   virtual void take(TQPtrList<KMMessage>);
00372 
00376   void slotSimpleData(KIO::Job * job, const TQByteArray & 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( TQValueList<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 TQStringList&, const TQStringList&,
00412       const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00413 
00418   void slotCheckNamespace( const TQStringList&, const TQStringList&,
00419       const TQStringList&, const TQStringList&, const ImapAccountBase::jobData& );
00420 
00421 protected:
00422   virtual FolderJob* doCreateJob( KMMessage *msg, FolderJob::JobType jt,
00423                                   KMFolder *folder, TQString partSpecifier,
00424                                   const AttachmentStrategy *as ) const;
00425   virtual FolderJob* doCreateJob( TQPtrList<KMMessage>& msgList, const TQString& 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( TQString attributes );
00436 
00438   void initInbox();
00439 
00441   KMFolderImap* findParent( const TQString& path, const TQString& name );
00442 
00444   void checkFolders( const TQStringList& folderNames, const TQString& 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 TQString &startUid = TQString::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 TQByteArray & 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 TQString& errorMsg );
00499 
00505   void slotCreatePendingFolders( int errorCode, const TQString& errorMsg );
00506 
00510   void slotListNamespaces();
00511 
00512 protected:
00513   TQString     mImapPath;
00514   ulong       mLastUid;
00515   imapState   mContentState, mSubfolderState;
00516   bool        mIsSelected;
00517   bool        mCheckFlags;
00518   bool        mReadOnly;
00519   bool        mCheckMail;
00520   mutable TQGuardedPtr<KMAcctImap> mAccount;
00521   // the current uidvalidity
00522   TQString mUidValidity;
00523   unsigned int mUserRights;
00524   KMail::ACLJobs::ACLFetchState mUserRightsState;
00525 
00526 private:
00527   // if we're checking validity currently
00528   bool        mCheckingValidity;
00529   // uid - metadata cache
00530   TQIntDict<KMMsgMetaData> mUidMetaDataMap;
00531   // msgidMD5 - status map
00532   TQDict<KMMsgMetaData> mMetaDataMap;
00533   // if the folder should be deleted without server roundtrip
00534   bool        mAlreadyRemoved;
00535   // the progress for mailchecks
00536   TQGuardedPtr<ProgressItem> mMailCheckProgressItem;
00537   // the progress for listings
00538   ProgressItem *mListDirProgressItem;
00539   // the progress for addMsg
00540   ProgressItem *mAddMessageProgressItem;
00541   // to-be-added folders
00542   TQStringList mFoldersPendingCreation;
00543 
00544   // push all flags to the server instead of just the changed once
00545   // when doing a flag change the next time
00546   // this is needed for migrating local flags from the time where we didn't
00547   // have the ability to store them on the server
00548   bool mUploadAllFlags;
00549 
00550   // PERMANENTFLAGS part of SELECT response, needed to determine if custom flags can be
00551   // stored on the server
00552   int mPermanentFlags;
00553 };
00554 
00555 #endif // kmfolderimap_h