You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

309 lines
9.3 KiB

/** -*- c++ -*-
* imapaccountbase.h
*
* Copyright (c) 2000-2002 Michael Haeckel <haeckel@kde.org>
* Copyright (c) 2002 Marc Mutz <mutz@kde.org>
*
* This file is based on work on pop3 and imap account implementations
* by Don Sanders <sanders@kde.org> and Michael Haeckel <haeckel@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __KMAIL_IMAPACCOUNTBASE_H__
#define __KMAIL_IMAPACCOUNTBASE_H__
#include "networkaccount.h"
#include <qtimer.h>
#include <kio/global.h>
class KMAcctMgr;
class KMFolder;
class KConfig/*Base*/;
class KMessage;
class KMMessagePart;
class DwBodyPart;
class DwMessage;
namespace KIO {
class Job;
}
namespace KMail {
class AttachmentStrategy;
class ImapAccountBase : public KMail::NetworkAccount {
Q_OBJECT
protected:
ImapAccountBase( KMAcctMgr * parent, const QString & name );
public:
virtual ~ImapAccountBase();
/** Set the config options to a decent state */
virtual void init();
/** A weak assignment operator */
virtual void pseudoAssign( const KMAccount * a );
/** IMAP folder prefix */
QString prefix() const { return mPrefix; }
virtual void setPrefix( const QString & prefix );
/** @return whether to automatically expunge deleted messages when
leaving the folder */
bool autoExpunge() const { return mAutoExpunge; }
virtual void setAutoExpunge( bool expunge );
/** @return whether to show hidden files on the server */
bool hiddenFolders() const { return mHiddenFolders; }
virtual void setHiddenFolders( bool show );
/** @return whether to show only subscribed folders */
bool onlySubscribedFolders() const { return mOnlySubscribedFolders; }
virtual void setOnlySubscribedFolders( bool show );
/** @return whether to load attachments on demand */
bool loadOnDemand() const { return mLoadOnDemand; }
virtual void setLoadOnDemand( bool load );
/** Configure the slave by adding to the meta data map */
virtual KIO::MetaData slaveConfig() const;
virtual void readConfig( /*const*/ KConfig/*Base*/ & config );
virtual void writeConfig( KConfig/*Base*/ & config ) /*const*/;
enum ConnectionState { Error = 0, Connected, Connecting };
/**
* Connect to the server, if no connection is active
* Returns Connected (ok), Error (ko) or Connecting - which means
* that one should wait for the slaveConnected signal from KIO::Scheduler
* before proceeding.
*/
ConnectionState makeConnection();
/**
* Info Data for the Job
*/
struct jobData
{
// Needed by QMap, don't use
jobData() : url(QString::null), parent(0), total(1), done(0), offset(0), inboxOnly(false), quiet(false) {}
// Real constructor
jobData( const QString& _url, KMFolder *_parent = 0,
int _total = 1, int _done = 0, bool _quiet = false, bool _inboxOnly = false )
: url(_url), parent(_parent), total(_total), done(_done), offset(0),
inboxOnly(_inboxOnly), quiet(_quiet)
{}
// Return "url" in a form that can be displayed in HTML (w/o password)
QString htmlURL() const;
QString path;
QString url;
QByteArray data;
QCString cdata;
QStringList items;
KMFolder *parent;
QPtrList<KMMessage> msgList;
int total, done, offset;
bool inboxOnly, quiet, onlySubscribed;
};
typedef QMap<KIO::Job *, jobData>::Iterator JobIterator;
/**
* Call this when starting a new job
*/
void insertJob( KIO::Job* job, const jobData& data ) {
mapJobData.insert( job, data );
displayProgress();
}
/**
* Look for the jobData related to a given job. Compare with end()
*/
JobIterator findJob( KIO::Job* job ) { return mapJobData.find( job ); }
JobIterator jobsEnd() { return mapJobData.end(); }
/**
* Call this when a job is finished.
* Don't use @p *it afterwards!
*/
void removeJob( JobIterator& it ) {
mapJobData.remove( it );
displayProgress();
}
// for KMImapJob::ignoreJobsForMessage...
void removeJob( KIO::Job* job ) {
mapJobData.remove( job );
displayProgress();
}
/**
* Lists the directory starting from @p path
* All parameters (onlySubscribed, secondStep, parent) are included
* in the jobData
* connects to slotListResult and slotListEntries
*/
void listDirectory(QString path, bool onlySubscribed,
bool secondStep = FALSE, KMFolder* parent = NULL, bool reset = false);
/**
* Starts the folderlisting for the root folder
*/
virtual void listDirectory() = 0;
/**
* Subscribe (@p subscribe = TRUE) / Unsubscribe the folder
* identified by @p imapPath
*/
void changeSubscription(bool subscribe, QString imapPath);
/**
* The KIO-Slave died
*/
void slaveDied() { mSlave = 0; killAllJobs(); }
/**
* Kill the slave if any jobs are active
*/
void killAllJobs( bool disconnectSlave=false ) = 0;
/**
* Init a new-mail-check for a single folder
*/
void processNewMailSingleFolder(KMFolder* folder);
/**
* Set whether the current listDirectory should create an INBOX
*/
bool createInbox() { return mCreateInbox; }
void setCreateInbox( bool create ) { mCreateInbox = create; }
/**
* Handles the result from a BODYSTRUCTURE fetch
*/
void handleBodyStructure( QDataStream & stream, KMMessage * msg,
const AttachmentStrategy *as );
public slots:
/**
* gets the results of listDirectory
* it includes the folder-information in mSubfolderNames, -Paths and -MIMETypes
*/
void slotListEntries(KIO::Job * job, const KIO::UDSEntryList & uds);
/**
* is called when listDirectory has finished
* emits receivedFolders
*/
void slotListResult(KIO::Job * job);
/**
* is called when the changeSubscription has finished
* emits subscriptionChanged
*/
void slotSubscriptionResult(KIO::Job * job);
/**
* Update the progress bar
*/
virtual void displayProgress();
/**
* Display an error message
*/
void slotSlaveError(KIO::Slave *aSlave, int, const QString &errorMsg);
/** Helper method to set the status on the server */
void setImapStatus(QString path, QCString flags);
protected slots:
/**
* new-mail-notification for not-selected folders (is called via
* numUnreadMsgsChanged)
*/
virtual void postProcessNewMail( KMFolder * );
void slotCheckQueuedFolders();
void slotSchedulerSlaveConnected(KIO::Slave *aSlave);
void slotSchedulerSlaveError(KIO::Slave *aSlave, int, const QString &errorMsg);
/**
* Only delete information about the job and ignore write errors
*/
void slotSetStatusResult(KIO::Job * job);
protected:
virtual QString protocol() const;
virtual unsigned short int defaultPort() const;
// ### Hacks
virtual void setPrefixHook() = 0;
/**
* Build KMMessageParts and DwBodyParts from the bodystructure-stream
*/
void constructParts( QDataStream & stream, int count, KMMessagePart* parentKMPart,
DwBodyPart * parent, const DwMessage * dwmsg );
protected:
QPtrList<QGuardedPtr<KMFolder> > mOpenFolders;
QStringList mSubfolderNames, mSubfolderPaths,
mSubfolderMimeTypes;
QMap<KIO::Job *, jobData> mapJobData;
QTimer mIdleTimer;
QString mPrefix;
int mTotal, mCountUnread, mCountLastUnread, mCountRemainChecks;
bool mAutoExpunge : 1;
bool mHiddenFolders : 1;
bool mOnlySubscribedFolders : 1;
bool mLoadOnDemand : 1;
bool mProgressEnabled : 1;
bool mIdle : 1;
bool mErrorDialogIsActive : 1;
bool mPasswordDialogIsActive : 1;
// folders that should be checked for new mails
QValueList<QGuardedPtr<KMFolder> > mMailCheckFolders;
// folders that should be checked after the current check is done
QValueList<QGuardedPtr<KMFolder> > mFoldersQueuedForChecking;
bool mCreateInbox;
// holds messageparts from the bodystructure
QPtrList<KMMessagePart> mBodyPartList;
// the current message for the bodystructure
KMMessage* mCurrentMsg;
signals:
/**
* Emitted when the slave managed or failed to connect
* This is always emitted at some point after makeConnection returned Connecting.
* @param errorCode 0 for success, != 0 in case of error
*/
void connectionResult( int errorCode );
/**
* Emitted when new folders have been received
*/
void receivedFolders(QStringList, QStringList,
QStringList, const ImapAccountBase::jobData &);
/**
* Emitted when the subscription has changed
*/
void subscriptionChanged(QString imapPath, bool subscribed);
};
} // namespace KMail
#endif // __KMAIL_IMAPACCOUNTBASE_H__