kmail

kmkernel.h
00001 // -*- mode: C++; c-file-style: "gnu" -*-
00002 
00003 #ifndef _KMCONTROL
00004 #define _KMCONTROL
00005 
00006 #include <tqobject.h>
00007 #include <tqstring.h>
00008 #include <tqguardedptr.h>
00009 #include <weaver.h>
00010 #include <weaverlogger.h>
00011 
00012 #include <kconfig.h>
00013 #include <kdeversion.h>
00014 #include <kimproxy.h>
00015 #include <kdepimmacros.h>
00016 
00017 #include "kmailIface.h"
00018 #include "kmmsgbase.h"
00019 #include "globalsettings.h"
00020 
00021 #define kmkernel KMKernel::self()
00022 #define kmconfig KMKernel::config()
00023 
00024 namespace KIO {
00025   class Job;
00026 }
00027 namespace KWallet {
00028   class Wallet;
00029 }
00030 
00035 namespace KMail {
00036   class MailServiceImpl;
00037   class UndoStack;
00038   class JobScheduler;
00039   class MessageSender;
00040   class AccountManager;
00041 }
00042 namespace KPIM { class ProgressDialog; }
00043 using KMail::MailServiceImpl;
00044 using KMail::AccountManager;
00045 using KMail::UndoStack;
00046 using KMail::JobScheduler;
00047 using KPIM::ProgressDialog;
00048 class KMMsgIndex;
00049 class TQLabel;
00050 class KMFolder;
00051 class KMFolderMgr;
00052 class KMFilterMgr;
00053 class KMFilterActionDict;
00054 class KMSender;
00055 namespace KPIM {
00056   class Identity;
00057   class IdentityManager;
00058 }
00059 class KMKernel;
00060 class KProcess;
00061 class KProgressDialog;
00062 class KInstance;
00063 class TQTimer;
00064 class KProgress;
00065 class KPassivePopup;
00066 class KMMainWin;
00067 class KMainWindow;
00068 class KMailICalIfaceImpl;
00069 class KMReaderWin;
00070 class KSystemTray;
00071 class KMMainWidget;
00072 class ConfigureDialog;
00073 
00083 class KDE_EXPORT KMKernel : public TQObject, virtual public KMailIface
00084 {
00085   Q_OBJECT
00086   TQ_OBJECT
00087 
00088 public:
00089   KMKernel (TQObject *parent=0, const char *name=0);
00090   ~KMKernel ();
00091 
00094   void checkMail ();
00095   TQStringList accounts();
00096   void checkAccount (const TQString &account);
00098   int openComposer (const TQString &to, const TQString &cc, const TQString &bcc,
00099                     const TQString &subject, const TQString &body, int hidden,
00100                     const KURL &messageFile, const KURL::List &attachURLs,
00101                     const QCStringList &customHeaders);
00103   int openComposer (const TQString &to, const TQString &cc, const TQString &bcc,
00104                     const TQString &subject, const TQString &body, int hidden,
00105                     const KURL &messageFile, const KURL::List &attachURLs)
00106   {
00107     QCStringList noCustomHeaders;
00108     return openComposer(to, cc, bcc, subject, body, hidden, messageFile, attachURLs, noCustomHeaders);
00109   }
00111   int openComposer (const TQString &to, const TQString &cc, const TQString &bcc,
00112                     const TQString &subject, const TQString &body, int hidden,
00113                     const KURL &messageFile, const KURL& attachURL)
00114   {
00115     return openComposer(to, cc, bcc, subject, body, hidden, messageFile, KURL::List(attachURL));
00116   }
00118   int openComposer (const TQString &to, const TQString &cc, const TQString &bcc,
00119                     const TQString &subject, const TQString &body, int hidden,
00120                     const KURL &messageFile)
00121   {
00122     return openComposer(to, cc, bcc, subject, body, hidden, messageFile, KURL::List());
00123   }
00127   int openComposer (const TQString &to, const TQString &cc,
00128                     const TQString &bcc, const TQString &subject,
00129                     const TQString &body, int hidden,
00130                     const TQString &attachName,
00131                     const TQCString &attachCte,
00132                     const TQCString &attachData,
00133                     const TQCString &attachType,
00134                     const TQCString &attachSubType,
00135                     const TQCString &attachParamAttr,
00136                     const TQString &attachParamValue,
00137                     const TQCString &attachContDisp);
00138 
00142   int openComposer (const TQString &to, const TQString &cc,
00143                     const TQString &bcc, const TQString &subject,
00144                     const TQString &body, int hidden,
00145                     const TQString &attachName,
00146                     const TQCString &attachCte,
00147                     const TQCString &attachData,
00148                     const TQCString &attachType,
00149                     const TQCString &attachSubType,
00150                     const TQCString &attachParamAttr,
00151                     const TQString &attachParamValue,
00152                     const TQCString &attachContDisp,
00153                     const TQCString &attachCharset);
00154 
00155   int openComposer (const TQString &to, const TQString &cc,
00156                     const TQString &bcc, const TQString &subject,
00157                     const TQString &body, int hidden,
00158                     const TQString &attachName,
00159                     const TQCString &attachCte,
00160                     const TQCString &attachData,
00161                     const TQCString &attachType,
00162                     const TQCString &attachSubType,
00163                     const TQCString &attachParamAttr,
00164                     const TQString &attachParamValue,
00165                     const TQCString &attachContDisp,
00166                     const TQCString &attachCharset,
00167                     unsigned int identity);
00168 
00169   DCOPRef openComposer(const TQString &to, const TQString &cc,
00170                        const TQString &bcc, const TQString &subject,
00171                        const TQString &body,bool hidden);
00172 
00175   void setDefaultTransport( const TQString & transport );
00176 
00178   DCOPRef newMessage(const TQString &to,
00179                      const TQString &cc,
00180                      const TQString &bcc,
00181                      bool hidden,
00182                      bool useFolderId,
00183                      const KURL &messageFile,
00184                      const KURL &attachURL);
00185 
00186   int sendCertificate( const TQString& to, const TQByteArray& certData );
00187 
00188   void openReader() { openReader( false ); }
00189 
00190   int dcopAddMessage(const TQString & foldername, const TQString & messagefile,
00191                      const TQString & MsgStatusFlags = TQString());
00192   int dcopAddMessage(const TQString & foldername, const KURL & messagefile,
00193                      const TQString & MsgStatusFlags = TQString());
00194   void dcopResetAddMessage();
00196   int dcopAddMessage_fastImport(const TQString & foldername, const TQString & messagefile,
00197                                 const TQString & MsgStatusFlags = TQString());
00198   int dcopAddMessage_fastImport(const TQString & foldername, const KURL & messagefile,
00199                                 const TQString & MsgStatusFlags = TQString());
00200   void showImportArchiveDialog();
00201 
00202   TQStringList folderList() const;
00203   DCOPRef getFolder( const TQString& vpath );
00204   void selectFolder( TQString folder );
00205   int timeOfLastMessageCountChange() const;
00206   virtual bool showMail( TQ_UINT32 serialNumber, TQString messageId );
00207   virtual TQString getFrom( TQ_UINT32 serialNumber );
00208   virtual TQString debugScheduler();
00209   virtual TQString debugSernum( TQ_UINT32 serialNumber );
00210   int viewMessage( const KURL & messageFile );
00211 
00216   virtual void pauseBackgroundJobs();
00217 
00222   virtual void resumeBackgroundJobs();
00223 
00228   void stopNetworkJobs();
00229 
00234   void resumeNetworkJobs();
00235 
00241   static bool askToGoOnline();
00242 
00247   static bool isOffline();
00248 
00251   static KMKernel *self() { return mySelf; }
00252   static KConfig *config();
00253 
00254   void init();
00255   void readConfig();
00256   void cleanupImapFolders();
00257   void recreateCorruptIndexFiles();
00258   void testDir(const char *_name);
00259   void recoverDeadLetters();
00260   void initFolders(KConfig* cfg);
00261   void closeAllKMailWindows();
00262   void cleanup(void);
00263   void quit();
00269   bool transferMail( TQString & destinationDir );
00270   void ungrabPtrKb(void);
00271   void kmailMsgHandler(TQtMsgType aType, const char* aMsg);
00272   bool doSessionManagement();
00273   bool firstInstance() { return the_firstInstance; }
00274   void setFirstInstance(bool value) { the_firstInstance = value; }
00275   void action (bool mailto, bool check, const TQString &to, const TQString &cc,
00276                const TQString &bcc, const TQString &subj, const TQString &body,
00277                const KURL &messageFile, const KURL::List &attach,
00278                const QCStringList &customHeaders);
00279   void byteArrayToRemoteFile(const TQByteArray&, const KURL&,
00280                  bool overwrite = FALSE);
00281   bool folderIsDraftOrOutbox( const KMFolder * );
00282   bool folderIsDrafts( const KMFolder * );
00283   bool folderIsTemplates( const KMFolder * );
00284   bool folderIsTrash( KMFolder * );
00288   bool folderIsSentMailFolder( const KMFolder * );
00292   KMFolder* findFolderById( const TQString& idString );
00293 
00294   KInstance *xmlGuiInstance() { return mXmlGuiInstance; }
00295   void setXmlGuiInstance( KInstance *instance ) { mXmlGuiInstance = instance; }
00296 
00297   KMFolder *inboxFolder() { return the_inboxFolder; }
00298   KMFolder *outboxFolder() { return the_outboxFolder; }
00299   KMFolder *sentFolder() { return the_sentFolder; }
00300   KMFolder *trashFolder() { return the_trashFolder; }
00301   KMFolder *draftsFolder() { return the_draftsFolder; }
00302   KMFolder *templatesFolder() { return the_templatesFolder; }
00303 
00304   KMFolderMgr *folderMgr() { return the_folderMgr; }
00305   KMFolderMgr *imapFolderMgr() { return the_imapFolderMgr; }
00306   KMFolderMgr *dimapFolderMgr() { return the_dimapFolderMgr; }
00307   KMFolderMgr *searchFolderMgr() { return the_searchFolderMgr; }
00308   UndoStack *undoStack() { return the_undoStack; }
00309   AccountManager *acctMgr() { return the_acctMgr; }
00310   KMFilterMgr *filterMgr() { return the_filterMgr; }
00311   KMFilterMgr *popFilterMgr() { return the_popFilterMgr; }
00312   KMFilterActionDict *filterActionDict() { return the_filterActionDict; }
00313   KMail::MessageSender *msgSender();
00314   KMMsgIndex *msgIndex();
00315 
00316   KPIM::ThreadWeaver::Weaver *weaver() { return the_weaver; }
00318   KPIM::IdentityManager *identityManager();
00319 
00320   JobScheduler* jobScheduler() { return mJobScheduler; }
00321 
00323   void compactAllFolders();
00325   void expireAllFoldersNow();
00326 
00327   KMailICalIfaceImpl& iCalIface();
00328 
00329   bool firstStart() { return the_firstStart; }
00330   TQString previousVersion() { return the_previousVersion; }
00331   bool startingUp() { return the_startingUp; }
00332   void setStartingUp (bool flag) { the_startingUp = flag; }
00333   bool shuttingDown() { return the_shuttingDown; }
00334   void setShuttingDown(bool flag) { the_shuttingDown = flag; }
00335   void serverReady (bool flag) { the_server_is_ready = flag; }
00336 
00340   static TQString localDataPath();
00341 
00346   bool haveSystemTrayApplet();
00347 
00348   bool registerSystemTrayApplet( const KSystemTray* );
00349   bool unregisterSystemTrayApplet( const KSystemTray* );
00350 
00352   bool handleCommandLine( bool noArgsOpensReader );
00353   void emergencyExit( const TQString& reason );
00354 
00356   unsigned long getNextMsgSerNum();
00357   TQTextCodec *networkCodec() { return netCodec; }
00358 
00360   KMainWindow* mainWin();
00361 
00362   // ### The mContextMenuShown flag is necessary to work around bug# 56693
00363   // ### (kmail freeze with the complete desktop while pinentry-qt appears)
00364   // ### FIXME: Once the encryption support is asynchron this can be removed
00365   // ### again.
00366   void setContextMenuShown( bool flag ) { mContextMenuShown = flag; }
00367   bool contextMenuShown() const { return mContextMenuShown; }
00368 
00373   ::KIMProxy* imProxy();
00374 
00379   bool mailCheckAborted() const;
00383   void enableMailCheck();
00389   void abortMailCheck();
00390 
00391   bool canQueryClose();
00392 
00396   void messageCountChanged();
00397 
00399   KWallet::Wallet *wallet();
00400 
00402   KMMainWidget *getKMMainWidget();
00403 
00405   TQValueList< TQGuardedPtr<KMFolder> > allFolders();
00406 
00407   void raise();
00408 
00409   void loadProfile( const TQString& path );
00410 
00411   void saveToProfile( const TQString& path ) const;
00412 
00413   bool isCodecAsciiCompatible( const TQTextCodec *codec );
00414 public slots:
00415 
00417   void dumpDeadLetters();
00418 
00424   void slotRequestConfigSync();
00425 
00427   void slotEmptyTrash();
00428 
00429   void slotShowConfigurationDialog();
00430   void slotRunBackgroundTasks();
00431 
00432   void slotConfigChanged();
00433 
00434 protected slots:
00435   void slotDataReq(KIO::Job*,TQByteArray&);
00436   void slotResult(KIO::Job*);
00437 
00438 signals:
00439   void configChanged();
00440   void folderRemoved( KMFolder* aFolder );
00441   void onlineStatusChanged( GlobalSettings::EnumNetworkState::type );
00442 
00443 private:
00444   void openReader( bool onlyCheck );
00445   KMMsgStatus strToStatus(const TQString &flags);
00446   KMFolder *currentFolder();
00447 
00448   KMFolder *the_inboxFolder;
00449   KMFolder *the_outboxFolder;
00450   KMFolder *the_sentFolder;
00451   KMFolder *the_trashFolder;
00452   KMFolder *the_draftsFolder;
00453   KMFolder *the_templatesFolder;
00454 
00455   KMFolderMgr *the_folderMgr;
00456   KMFolderMgr *the_imapFolderMgr;
00457   KMFolderMgr *the_dimapFolderMgr;
00458   KMFolderMgr *the_searchFolderMgr;
00459   UndoStack *the_undoStack;
00460   AccountManager *the_acctMgr;
00461   KMFilterMgr *the_filterMgr;
00462   KMFilterMgr *the_popFilterMgr;
00463   KMFilterActionDict *the_filterActionDict;
00464   mutable KPIM::IdentityManager *mIdentityManager;
00465   KMSender *the_msgSender;
00466   KMMsgIndex *the_msgIndex;
00467   struct putData
00468   {
00469     KURL url;
00470     TQByteArray data;
00471     int offset;
00472   };
00473   TQMap<KIO::Job *, putData> mPutJobs;
00476   TQString the_previousVersion;
00478   bool the_firstStart;
00480   bool the_startingUp;
00482   bool the_shuttingDown;
00484   bool the_server_is_ready;
00486   bool closed_by_user;
00487   bool the_firstInstance;
00488   bool mMailCheckAborted;
00489   static KMKernel *mySelf;
00490   KSharedConfig::Ptr mConfig;
00491   TQTextCodec *netCodec;
00492   KInstance* mXmlGuiInstance;
00493   ConfigureDialog *mConfigureDialog;
00494 
00495   TQTimer *mBackgroundTasksTimer;
00496   KMailICalIfaceImpl* mICalIface;
00497   JobScheduler* mJobScheduler;
00498   // temporary mainwin
00499   KMMainWin *mWin;
00500   MailServiceImpl *mMailService;
00501 
00502   // the time of the last change of the unread or total count of a folder;
00503   // this can be queried via DCOP in order to determine whether the counts
00504   // need to be updated (e.g. in the Summary in Kontact)
00505   int mTimeOfLastMessageCountChange;
00506 
00507   // true if the context menu of KMFolderTree or KMHeaders is shown
00508   // this is necessary to know in order to prevent a dead lock between the
00509   // context menus and the pinentry program
00510   bool mContextMenuShown;
00511 
00512   TQValueList<const KSystemTray*> systemTrayApplets;
00513   TQValueList<const TQTextCodec*> mNonAsciiCompatibleCodecs;
00514 
00515   /* Weaver */
00516   KPIM::ThreadWeaver::Weaver *the_weaver;
00517   KPIM::ThreadWeaver::WeaverThreadLogger *the_weaverLogger;
00518 
00519   KWallet::Wallet *mWallet;
00520 
00521   // variables used by dcopAddMessage()
00522   TQStringList mAddMessageMsgIds;
00523   TQString     mAddMessageLastFolder;
00524   KMFolder    *mAddMsgCurrentFolder;
00525 };
00526 
00527 #endif