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 return start( KUniqueApplication::StartFlags() );
00076 }
00077
00078 bool PimUniqueApplication::start( KUniqueApplication::StartFlags flags )
00079 {
00080 const QString appName = KCmdLineArgs::aboutData()->appName();
00081
00082
00083
00084
00085 const QString serviceName = "org.kde." + appName;
00086 if ( tryToInitDBusConnection().interface()->isServiceRegistered( serviceName ) ) {
00087 QByteArray saved_args;
00088 QDataStream ds( &saved_args, QIODevice::WriteOnly );
00089 KCmdLineArgs::saveAppArgs( ds );
00090
00091 QByteArray new_asn_id;
00092 #if defined Q_WS_X11
00093 KStartupInfoId id;
00094 if( kapp ) {
00095 id.initId( kapp->startupId() );
00096 } else {
00097 id = KStartupInfo::currentStartupIdEnv();
00098 }
00099 if( !id.none() ) {
00100 new_asn_id = id.id();
00101 }
00102 #endif
00103
00104 KWindowSystem::allowExternalProcessWindowActivation();
00105
00106 const QString objectName = QString( '/' ) + appName + "_PimApplication";
00107
00108 QDBusInterface iface(
00109 serviceName, objectName, "org.kde.KUniqueApplication", QDBusConnection::sessionBus() );
00110 QDBusReply<int> reply;
00111 if ( iface.isValid() &&
00112 ( reply = iface.call( "newInstance", new_asn_id, saved_args ) ).isValid() ) {
00113 return false;
00114 }
00115 }
00116
00117 QDBusConnection::disconnectFromBus( _k_sessionBusName );
00118
00119
00120
00121 return KUniqueApplication::start(flags);
00122 }