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.
 
 
 

529 lines
17 KiB

// -*- mode: C++; c-file-style: "gnu" -*-
#ifndef _KMKERNEL_H
#define _KMKERNEL_H
#include <QByteArray>
#include <QList>
#include <QObject>
#include <QString>
#include <QPointer>
#include <QDBusObjectPath>
#include <threadweaver/ThreadWeaver.h>
#include <kconfig.h>
#include <kurl.h>
#include "kmfoldertype.h"
#include "kmail_export.h"
#include "kmmessagetag.h"
#include "globalsettings.h"
#include <kcomponentdata.h>
#include <akonadi/kmime/specialmailcollections.h>
#define kmkernel KMKernel::self()
#define kmconfig KMKernel::config()
Q_DECLARE_METATYPE(QVector<QStringList>)
namespace Akonadi {
class Collection;
class ChangeRecorder;
}
namespace KIO {
class Job;
}
class KJob;
/** The KMail namespace contains classes used for KMail.
* This is to keep them out of the way from all the other
* un-namespaced classes in libs and the rest of PIM.
*/
namespace KMail {
class MailServiceImpl;
class MailManagerImpl;
class UndoStack;
class JobScheduler;
class MessageSender;
}
namespace KPIM { class ProgressDialog; }
using KMail::MailServiceImpl;
using KMail::MailManagerImpl;
using KMail::UndoStack;
using KMail::JobScheduler;
using KPIM::ProgressDialog;
class KMFilterMgr;
class KMFilterActionDict;
class AkonadiSender;
class FolderCollection;
namespace KPIMIdentities {
class Identity;
class IdentityManager;
}
class KMKernel;
class KComponentData;
class QTimer;
class KMMainWin;
class KMainWindow;
class KSystemTrayIcon;
class KMMainWidget;
class ConfigureDialog;
class KMMessageTagMgr;
class FolderCollectionMonitor;
class KMAgentManager;
/**
* @short Central point of coordination in KMail
*
* The KMKernel class represents the core of KMail, where the different parts
* come together and are coordinated. It is currently also the class which exports
* KMail's main D-BUS interfaces. The kernel is responsible for creating various
* (singleton) objects such as the UndoStack, the folder managers and filter
* manager, etc.
*/
class KMAIL_EXPORT KMKernel : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.kmail.kmail")
public:
explicit KMKernel (QObject *parent=0, const char *name=0);
~KMKernel ();
/**
* Start of D-Bus callable stuff. The D-Bus methods need to be public slots,
* otherwise they can't be accessed.
*/
public Q_SLOTS:
Q_SCRIPTABLE void checkMail();
Q_SCRIPTABLE void openReader() { openReader( false ); }
/**
* Compact all folders, used for the GUI action (and from D-Bus)
*/
Q_SCRIPTABLE void compactAllFolders();
/**
* Pauses all background jobs and does not
* allow new background jobs to be started.
*/
Q_SCRIPTABLE void pauseBackgroundJobs();
/**
* Resumes all background jobs and allows
* new jobs to be started.
*/
Q_SCRIPTABLE void resumeBackgroundJobs();
/**
* Stops all network related jobs and enter offline mode
* New network jobs cannot be started.
*/
Q_SCRIPTABLE void stopNetworkJobs();
/**
* Resumes all network related jobs and enter online mode
* New network jobs can be started.
*/
Q_SCRIPTABLE void resumeNetworkJobs();
Q_SCRIPTABLE QStringList folderList() const;
Q_SCRIPTABLE QStringList accounts();
/**
* Checks the account with the specified name for new mail.
* If the account name is empty, all accounts not excluded from manual
* mail check will be checked.
*/
Q_SCRIPTABLE void checkAccount( const QString & account );
Q_SCRIPTABLE void selectFolder( const QString & folder );
Q_SCRIPTABLE QString getFolder( const QString & vpath );
Q_SCRIPTABLE void showImportArchiveDialog();
Q_SCRIPTABLE bool canQueryClose();
/**
* D-Bus call used to set the default transport.
*/
Q_SCRIPTABLE void setDefaultTransport( const QString & transport );
Q_SCRIPTABLE int timeOfLastMessageCountChange() const;
Q_SCRIPTABLE int dbusAddMessage( const QString & foldername,
const QString & messageFile,
const QString & MsgStatusFlags = QString() );
/**
* Add messages without rejecting duplicates
*/
Q_SCRIPTABLE int dbusAddMessage_fastImport( const QString & foldername,
const QString & messageFile,
const QString & MsgStatusFlags = QString() );
Q_SCRIPTABLE void dbusResetAddMessage();
Q_SCRIPTABLE int sendCertificate( const QString & to,
const QByteArray & certData );
Q_SCRIPTABLE bool handleCommandLine( bool noArgsOpensReader );
Q_SCRIPTABLE QString debugScheduler();
/**
* returns id of composer if more are opened
*/
Q_SCRIPTABLE int openComposer( const QString & to,
const QString & cc,
const QString & bcc,
const QString & subject,
const QString & body,
bool hidden,
const QString & messageFile,
const QStringList & attachmentPaths,
const QStringList & customHeaders );
Q_SCRIPTABLE int openComposer( const QString & to,
const QString & cc,
const QString & bcc,
const QString & subject,
const QString & body,
bool hidden,
const QString & attachName,
const QByteArray & attachCte,
const QByteArray &attachData,
const QByteArray & attachType,
const QByteArray & attachSubType,
const QByteArray & attachParamAttr,
const QString & attachParamValue,
const QByteArray & attachContDisp,
const QByteArray & attachCharset,
unsigned int identity );
Q_SCRIPTABLE QDBusObjectPath openComposer( const QString & to,
const QString & cc,
const QString & bcc,
const QString & subject,
const QString & body,
bool hidden );
/**
* D-Bus call used by the Kontact plugin to create a new message.
*/
Q_SCRIPTABLE QDBusObjectPath newMessage( const QString & to,
const QString & cc,
const QString & bcc,
bool hidden,
bool useFolderId,
const QString & messageFile,
const QString & attachURL );
Q_SCRIPTABLE bool showMail( quint32 serialNumber, const QString & messageId );
Q_SCRIPTABLE QString getFrom( quint32 serialNumber );
Q_SCRIPTABLE QString debugSernum( quint32 serialNumber );
Q_SCRIPTABLE int viewMessage( const KUrl & messageFile );
Q_SIGNALS:
Q_SCRIPTABLE void unreadCountChanged();
/**
* End of D-Bus callable stuff
*/
public:
/** A static helper function that asks the user
* if they want to go online.
* @return true if the user wants to go online
* @return false if the user wants to stay offline
*/
static bool askToGoOnline();
/** Checks if the current network state is online or offline
* @return true if the network state is offline
* @return false if the network state is online
*/
static bool isOffline();
/** normal control stuff */
static KMKernel *self();
static KSharedConfig::Ptr config();
static int storageDebug();
void init();
void setupDBus();
void readConfig();
KMAgentManager *agentManager();
Akonadi::ChangeRecorder *monitor();
//TODO port to akonadi void cleanupImapFolders();
void testDir(const char *_name);
void recoverDeadLetters();
void initFolders();
void closeAllKMailWindows();
void cleanup(void);
void quit();
/**
* Returns true if the transfer was successful, otherwise false. In any case
* destinationDir contains the path to the current mail storage when the
* method returns.
*/
bool transferMail( QString & destinationDir );
bool doSessionManagement();
bool firstInstance() { return the_firstInstance; }
void setFirstInstance(bool value) { the_firstInstance = value; }
void action( bool mailto, bool check, const QString &to, const QString &cc,
const QString &bcc, const QString &subj, const QString &body,
const KUrl &messageFile, const KUrl::List &attach,
const QStringList &customHeaders );
void byteArrayToRemoteFile( const QByteArray&, const KUrl&,
bool overwrite = false );
bool folderIsDraftOrOutbox(const Akonadi::Collection &);
bool folderIsDrafts(const Akonadi::Collection&);
bool folderIsTemplates(const Akonadi::Collection &);
bool folderIsTrash( const Akonadi::Collection & );
KMFolderType folderType( const Akonadi::Collection &col );
Akonadi::Collection trashCollectionFromResource( const Akonadi::Collection & col );
/**
* Returns true if the folder is one of the sent-mail folders.
*/
bool folderIsSentMailFolder( const Akonadi::Collection& );
Akonadi::Collection findFolderCollectionById( const QString& id );
bool isImapFolder( const Akonadi::Collection& );
const KComponentData &xmlGuiInstance() { return mXmlGuiInstance; }
void setXmlGuiInstance( const KComponentData &instance ) { mXmlGuiInstance = instance; }
Akonadi::Collection inboxCollectionFolder();
Akonadi::Collection outboxCollectionFolder();
Akonadi::Collection sentCollectionFolder();
Akonadi::Collection trashCollectionFolder();
Akonadi::Collection draftsCollectionFolder();
Akonadi::Collection templatesCollectionFolder();
bool isSystemFolderCollection( const Akonadi::Collection &col);
UndoStack *undoStack() { return the_undoStack; }
KMFilterMgr *filterMgr() { return the_filterMgr; }
KMFilterMgr *popFilterMgr() { return the_popFilterMgr; }
KMFilterActionDict *filterActionDict() { return the_filterActionDict; }
KMail::MessageSender *msgSender();
KMMessageTagMgr *msgTagMgr() { return the_msgTagMgr; }
ThreadWeaver::Weaver *weaver() { return the_weaver; }
/** return the pointer to the identity manager */
KPIMIdentities::IdentityManager *identityManager();
JobScheduler* jobScheduler() { return mJobScheduler; }
/** Expire all folders, used for the gui action */
void expireAllFoldersNow();
bool smartQuote() const { return mSmartQuote; }
bool wordWrap() const { return mWordWrap;}
int wrapCol() const { return mWrapCol;}
#if 0 //TODO port to akonadi
KMailICalIfaceImpl& iCalIface();
#endif
bool firstStart() const { return the_firstStart; }
/** Mark first start as done */
void firstStartDone() { the_firstStart = false; }
QString previousVersion() const { return the_previousVersion; }
bool startingUp() const { return the_startingUp; }
void setStartingUp (bool flag) { the_startingUp = flag; }
bool shuttingDown() const { return the_shuttingDown; }
void setShuttingDown(bool flag) { the_shuttingDown = flag; }
void serverReady (bool flag) { the_server_is_ready = flag; }
/** Returns the full path of the user's local data directory for KMail.
The path ends with '/'.
*/
static QString localDataPath();
/** Returns true if we have a system tray applet. This is needed in order
* to know whether the application should be allowed to exit in case the
* last visible composer or separate message window is closed.
*/
bool haveSystemTrayApplet();
bool registerSystemTrayApplet( const KSystemTrayIcon* );
bool unregisterSystemTrayApplet( const KSystemTrayIcon* );
/// Reimplemented from KMailIface
void emergencyExit( const QString& reason );
/** Returns a message serial number that hasn't been used yet. */
unsigned long getNextMsgSerNum();
QTextCodec *networkCodec() { return netCodec; }
/** returns a reference to the first Mainwin or a temporary Mainwin */
KMainWindow* mainWin();
// ### The mContextMenuShown flag is necessary to work around bug# 56693
// ### (kmail freeze with the complete desktop while pinentry-qt appears)
// ### FIXME: Once the encryption support is asynchron this can be removed
// ### again.
void setContextMenuShown( bool flag ) { mContextMenuShown = flag; }
bool contextMenuShown() const { return mContextMenuShown; }
/**
* Called by the folder tree if the count of unread/total messages changed.
*/
void messageCountChanged();
/** Get first mainwidget */
KMMainWidget *getKMMainWidget();
/** @return a list of all folders from all folder managers. */
QList<Akonadi::Collection> allFoldersCollection();
void raise();
/** Custom templates have changed, so all windows using them need
to regenerate their menus */
void updatedTemplates();
void findCreateDefaultCollection( Akonadi::SpecialMailCollections::Type );
public slots:
/// Save contents of all open composer widnows to ~/dead.letter
void dumpDeadLetters();
/** Call this slot instead of directly KConfig::sync() to
minimize the overall config writes. Calling this slot will
schedule a sync of the application config file using a timer, so
that many consecutive calls can be condensed into a single
sync, which is more efficient. */
void slotRequestConfigSync();
/** empty all the trash bins */
void slotEmptyTrash();
void slotShowConfigurationDialog();
void slotRunBackgroundTasks();
void slotConfigChanged();
protected slots:
void slotDataReq(KIO::Job*,QByteArray&);
void slotResult(KJob*);
signals:
void configChanged();
void onlineStatusChanged( GlobalSettings::EnumNetworkState::type );
void customTemplatesChanged();
private slots:
/** Updates identities when a transport has been deleted. */
void transportRemoved( int id, const QString &name );
/** Updates identities when a transport has been renamed. */
void transportRenamed( int id, const QString &oldName, const QString &newName );
void createDefaultCollectionDone( KJob * job);
private:
void openReader( bool onlyCheck );
QSharedPointer<FolderCollection> currentFolderCollection();
Akonadi::Collection the_inboxCollectionFolder;
Akonadi::Collection the_outboxCollectionFolder;
Akonadi::Collection the_sentCollectionFolder;
Akonadi::Collection the_trashCollectionFolder;
Akonadi::Collection the_draftsCollectionFolder;
Akonadi::Collection the_templatesCollectionFolder;
UndoStack *the_undoStack;
KMFilterMgr *the_filterMgr;
KMFilterMgr *the_popFilterMgr;
KMFilterActionDict *the_filterActionDict;
mutable KPIMIdentities::IdentityManager *mIdentityManager;
AkonadiSender *the_msgSender;
KMMessageTagMgr *the_msgTagMgr;
struct putData
{
KUrl url;
QByteArray data;
int offset;
};
QMap<KIO::Job *, putData> mPutJobs;
/** previous KMail version. If different from current,
the user has just updated. read from config */
QString the_previousVersion;
/** is this the first start? read from config */
bool the_firstStart;
/** are we starting up? set in main.cpp directly before kapp->exec() */
bool the_startingUp;
/** are we going down? set from here */
bool the_shuttingDown;
/** are we in the middle of network operations (needed?) */
bool the_server_is_ready;
/** true unles kmail is closed by session management */
bool closed_by_user;
bool the_firstInstance;
KSharedConfig::Ptr mConfig;
QTextCodec *netCodec;
KComponentData mXmlGuiInstance;
ConfigureDialog *mConfigureDialog;
QTimer *mBackgroundTasksTimer;
JobScheduler* mJobScheduler;
// temporary mainwin
KMMainWin *mWin;
MailServiceImpl *mMailService;
MailManagerImpl *mMailManager;
// the time of the last change of the unread or total count of a folder;
// this can be queried via D-Bus in order to determine whether the counts
// need to be updated (e.g. in the Summary in Kontact)
int mTimeOfLastMessageCountChange;
// true if the context menu of KMFolderTree or KMHeaders is shown
// this is necessary to know in order to prevent a dead lock between the
// context menus and the pinentry program
bool mContextMenuShown;
QList<const KSystemTrayIcon*> systemTrayApplets;
/* Weaver */
ThreadWeaver::Weaver *the_weaver;
// variables used by dbusAddMessage()
QStringList mAddMessageMsgIds;
QString mAddMessageLastFolder;
FolderCollectionMonitor *mFolderCollectionMonitor;
KMAgentManager *mAgentManager;
// special debug area
int mStorageDebug;
bool mSmartQuote : 1, mWordWrap : 1;
int mWrapCol;
};
#endif // _KMKERNEL_H