Kontact Plugin Interface Library
pimuniqueapplication.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "pimuniqueapplication.h"
00023
00024 #include <kaboutdata.h>
00025 #include <kcmdlineargs.h>
00026 #include <kdebug.h>
00027 #include <kstartupinfo.h>
00028 #include <kwindowsystem.h>
00029
00030 #include <qdbusconnectioninterface.h>
00031 #include <qdbusinterface.h>
00032
00033 using namespace KontactInterface;
00034
00035
00036 class KontactInterface::PimUniqueApplication::Private
00037 {
00038 };
00039
00040
00041 PimUniqueApplication::PimUniqueApplication()
00042 : KUniqueApplication(), d( new Private() )
00043 {
00044
00045 const QString objectName = QString( '/' ) + applicationName() + "_PimApplication";
00046 QDBusConnection::sessionBus().registerObject(
00047 objectName, this,
00048 QDBusConnection::ExportScriptableSlots |
00049 QDBusConnection::ExportScriptableProperties |
00050 QDBusConnection::ExportAdaptors );
00051 }
00052
00053 static const char _k_sessionBusName[] = "kdepimapplication_session_bus";
00054
00055 PimUniqueApplication::~PimUniqueApplication()
00056 {
00057 delete d;
00058 }
00059
00060 static QDBusConnection tryToInitDBusConnection()
00061 {
00062
00063
00064 QDBusConnection connection = QDBusConnection::connectToBus(
00065 QDBusConnection::SessionBus, _k_sessionBusName );
00066 if ( !connection.isConnected() ) {
00067 kError() << "Cannot find the D-Bus session server" << endl;
00068 ::exit(255);
00069 }
00070 return connection;
00071 }
00072
00073 bool PimUniqueApplication::start()
00074 {
00075 const QString appName = KCmdLineArgs::aboutData()->appName();
00076
00077
00078
00079
00080 const QString serviceName = "org.kde." + appName;
00081 if ( tryToInitDBusConnection().interface()->isServiceRegistered( serviceName ) ) {
00082 QByteArray saved_args;
00083 QDataStream ds( &saved_args, QIODevice::WriteOnly );
00084 KCmdLineArgs::saveAppArgs( ds );
00085
00086 QByteArray new_asn_id;
00087 #if defined Q_WS_X11
00088 KStartupInfoId id;
00089 if( kapp ) {
00090 id.initId( kapp->startupId() );
00091 } else {
00092 id = KStartupInfo::currentStartupIdEnv();
00093 }
00094 if( !id.none() ) {
00095 new_asn_id = id.id();
00096 }
00097 #endif
00098
00099 KWindowSystem::allowExternalProcessWindowActivation();
00100
00101 const QString objectName = QString( '/' ) + appName + "_PimApplication";
00102
00103 QDBusInterface iface(
00104 serviceName, objectName, "org.kde.KUniqueApplication", QDBusConnection::sessionBus() );
00105 QDBusReply<int> reply;
00106 if ( iface.isValid() &&
00107 ( reply = iface.call( "newInstance", new_asn_id, saved_args ) ).isValid() ) {
00108 return false;
00109 }
00110 }
00111
00112 QDBusConnection::disconnectFromBus( _k_sessionBusName );
00113
00114
00115
00116 return KUniqueApplication::start();
00117 }