~ubuntu-branches/ubuntu/oneiric/kdepim/oneiric-updates

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* -*- mode: C++; c-file-style: "gnu" -*-
 * kmail: KDE mail client
 * Copyright (c) 1996-1998 Stefan Taferner <taferner@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; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#include <kontactinterface/pimuniqueapplication.h>
#include <kglobal.h>
#include "kmkernel.h" //control center
#include "kmmainwidget.h"
#include "kmail_options.h"

#include <kdebug.h>
#include <kmessagebox.h>
#undef Status // stupid X headers

#include "aboutdata.h"

#include "kmstartup.h"

#ifdef Q_WS_WIN
#include <unistd.h>
#include <windows.h>
#endif

//-----------------------------------------------------------------------------

class KMailApplication : public KontactInterface::PimUniqueApplication
{
public:
  KMailApplication() : KontactInterface::PimUniqueApplication(),
                       mDelayedInstanceCreation( false ),
                       mEventLoopReached( false ) { }
  virtual int newInstance();
  void commitData(QSessionManager& sm);
  void setEventLoopReached();
  void delayedInstanceCreation();
protected:
  bool mDelayedInstanceCreation;
  bool mEventLoopReached;

};

void KMailApplication::commitData(QSessionManager& sm) {
  kmkernel->dumpDeadLetters();
  kmkernel->setShuttingDown( true ); // Prevent further dumpDeadLetters calls
  KApplication::commitData( sm );
}

void KMailApplication::setEventLoopReached() {
  mEventLoopReached = true;
}

int KMailApplication::newInstance()
{
  kDebug();

  // If the event loop hasn't been reached yet, the kernel is probably not
  // fully initialized. Creating an instance would therefore fail, this is why
  // that is delayed until delayedInstanceCreation() is called.
  if ( !mEventLoopReached ) {
    kDebug() << "Delaying instance creation.";
    mDelayedInstanceCreation = true;
    return 0;
  }

  if (!kmkernel)
     return 0;

  if (!kmkernel->firstInstance() || !kapp->isSessionRestored())
    kmkernel->handleCommandLine( true );
  kmkernel->setFirstInstance(false);
  return 0;
}

void KMailApplication::delayedInstanceCreation() {
  if ( mDelayedInstanceCreation )
    newInstance();
}

int main(int argc, char *argv[])
{
  // WABA: KMail is a KUniqueApplication. Unfortunately this makes debugging
  // a bit harder: You should pass --nofork as commandline argument when using
  // a debugger. In gdb you can do this by typing "set args --nofork" before
  // typing "run".
#if 0 // for testing KUniqueAppliaction on Windows
  MessageBoxA(NULL,
             QString("main() %1 pid=%2").arg(argv[0]).arg(getpid()).toLatin1(),
             QString("main() \"%1\"").arg(argv[0]).toLatin1(), MB_OK|MB_ICONINFORMATION|MB_TASKMODAL);
#endif
  KMail::AboutData about;

  KCmdLineArgs::init(argc, argv, &about);
  KCmdLineArgs::addCmdLineOptions( kmail_options() ); // Add kmail options
  if (!KMailApplication::start())
     return 0;

  KMailApplication app;

  // Qt doesn't treat the system tray as a window, and therefore Qt would quit
  // the event loop when an error message is clicked away while KMail is in the
  // tray.
  // Rely on KGlobal::ref() and KGlobal::deref() instead, like we did in KDE3.
  // See http://bugs.kde.org/show_bug.cgi?id=163479
  QApplication::setQuitOnLastWindowClosed( false );

  // import i18n data and icons from libraries:
  KMail::insertLibraryCataloguesAndIcons();

  KMail::lockOrDie();

  //local, do the init
  KMKernel kmailKernel;
  kmailKernel.init();

  // and session management
  kmailKernel.doSessionManagement();

  // any dead letters?
  kmailKernel.recoverDeadLetters();

  kmkernel->setupDBus(); // Ok. We are ready for D-Bus requests.
  kmkernel->setStartingUp( false ); // Starting up is finished

  //If the instance hasn't been created yet, do that now
  app.setEventLoopReached();
  app.delayedInstanceCreation();

  // Go!
  int ret = qApp->exec();
  // clean up
  kmailKernel.cleanup();
  KMail::cleanup(); // pid file (see kmstartup.cpp)
  return ret;
}