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