22 #include "uniqueapphandler.h"
23 #include <qdbusabstractadaptor.h>
26 #include <kpimutils/processes.h>
28 #include <kapplication.h>
29 #include <kcmdlineargs.h>
31 #include <kstartupinfo.h>
32 #include <kuniqueapplication.h>
33 #include <kwindowsystem.h>
35 #include <QDBusConnection>
36 #include <QDBusConnectionInterface>
87 using namespace KontactInterface;
90 class UniqueAppHandler::Private
97 UniqueAppHandler::UniqueAppHandler(
Plugin *plugin )
98 : QObject( plugin ), d( new Private )
103 QDBusConnection session = QDBusConnection::sessionBus();
104 const QString appName = plugin->objectName();
105 session.registerService(
"org.kde." + appName );
106 const QString objectName = QString(
'/' ) + appName +
"_PimApplication";
107 session.registerObject( objectName,
this, QDBusConnection::ExportAllSlots );
110 UniqueAppHandler::~UniqueAppHandler()
112 QDBusConnection session = QDBusConnection::sessionBus();
113 const QString appName = parent()->objectName();
114 session.unregisterService(
"org.kde." + appName );
119 int UniqueAppHandler::newInstance(
const QByteArray &asn_id,
const QByteArray &args )
121 if ( !asn_id.isEmpty() ) {
122 kapp->setStartupId( asn_id );
125 KCmdLineArgs::reset();
129 QDataStream ds( args );
130 KCmdLineArgs::loadAppArgs( ds );
132 return newInstance();
135 static QWidget *s_mainWidget = 0;
138 int KontactInterface::UniqueAppHandler::newInstance()
140 if ( s_mainWidget ) {
141 s_mainWidget->show();
142 KWindowSystem::forceActiveWindow( s_mainWidget->winId() );
143 KStartupInfo::appStarted();
147 d->mPlugin->core()->selectPlugin( d->mPlugin );
151 Plugin *UniqueAppHandler::plugin()
const
156 bool KontactInterface::UniqueAppHandler::load()
158 (void)d->mPlugin->part();
163 class UniqueAppWatcher::Private
168 bool mRunningStandalone;
173 : QObject( plugin ), d( new Private )
175 d->mFactory = factory;
179 const QString serviceName =
"org.kde." + plugin->objectName();
182 d->mRunningStandalone =
183 QDBusConnection::sessionBus().interface()->isServiceRegistered( serviceName );
185 if ( d->mRunningStandalone ) {
187 KPIMUtils::getProcessesIdForName( plugin->objectName(), pids );
188 const int mypid = getpid();
189 bool processExits =
false;
190 foreach (
int pid, pids ) {
191 if ( mypid != pid ) {
196 if ( !processExits ) {
197 d->mRunningStandalone =
false;
202 QString owner = QDBusConnection::sessionBus().interface()->serviceOwner( serviceName );
203 if ( d->mRunningStandalone && ( owner == QDBusConnection::sessionBus().baseService() ) ) {
204 d->mRunningStandalone =
false;
209 if ( d->mRunningStandalone ) {
210 QObject::connect( QDBusConnection::sessionBus().interface(),
211 SIGNAL(serviceOwnerChanged(QString,QString,QString)),
212 this, SLOT(slotApplicationRemoved(QString,QString,QString)) );
214 d->mFactory->createHandler( d->mPlugin );
218 UniqueAppWatcher::~UniqueAppWatcher()
224 bool UniqueAppWatcher::isRunningStandalone()
const
226 return d->mRunningStandalone;
229 void KontactInterface::UniqueAppWatcher::slotApplicationRemoved(
const QString &name,
230 const QString &oldOwner,
231 const QString &newOwner )
233 if ( oldOwner.isEmpty() || !newOwner.isEmpty() ) {
237 const QString serviceName =
"org.kde." + d->mPlugin->objectName();
238 if ( name == serviceName && d->mRunningStandalone ) {
239 d->mFactory->createHandler( d->mPlugin );
240 d->mRunningStandalone =
false;
246 s_mainWidget = widget;