File r893626.diff of Package kdepim4

Subject: kalarm: Copying alarm to KOrganizer fails when embedded in Kontact
From: wstephenson@suse.de
Bug: kde#176759
Patch-upstream: 893626
--- kalarm/Changelog	(revision 893625)
+++ kalarm/Changelog	(revision 893626)
@@ -1,5 +1,9 @@
 KAlarm Change Log
 
+=== Version 2.0.7 --- 7 December 2008 ===
+- Fix failure to update alarms in KOrganizer when Kontact is running.
+- Fix toolbar configuration being lost after quitting KAlarm.
+
 === Version 2.0.6 (KDE 4.1.3) --- 22 October 2008 ===
 - Fix alarms not triggering correctly after laptop wakes from hibernation.
 - Fix inability to change or cancel alarm deferral times.
--- kalarm/functions.cpp	(revision 893625)
+++ kalarm/functions.cpp	(revision 893626)
@@ -44,6 +44,7 @@
 #include <kaction.h>
 #include <ktoggleaction.h>
 #include <kactioncollection.h>
+#include <kdbusservicestarter.h>
 #include <kglobal.h>
 #include <klocale.h>
 #include <kstandarddirs.h>
@@ -76,7 +77,9 @@ const char*   KMAIL_DBUS_SERVICE      =
 const char*   KMAIL_DBUS_WINDOW_PATH  = "/kmail/kmail_mainwindow_1";
 const char*   KORG_DBUS_SERVICE       = "org.kde.korganizer";
 const char*   KORG_DBUS_IFACE         = "org.kde.korganizer.Korganizer";
-const char*   KORG_DBUS_PATH          = "/Korganizer";    // D-Bus object path of KOrganizer's notification interface
+// D-Bus object path of KOrganizer's notification interface
+#define       KORG_DBUS_PATH            "/Korganizer"
+#define       KORG_DBUS_LOAD_PATH       "/korganizer_PimApplication"
 const char*   KORG_DBUS_WINDOW_PATH   = "/korganizer/MainWindow_1";
 const QString KORGANIZER_UID         = QString::fromLatin1("-korg");
 
@@ -1754,20 +1757,48 @@ bool deleteFromKOrganizer(const QString&
 }
 
 /******************************************************************************
-*  Start KOrganizer if not already running, and create its D-Bus interface.
+* Start KOrganizer if not already running, and create its D-Bus interface.
 */
 bool runKOrganizer()
 {
-	QString dbusService = KORG_DBUS_SERVICE;
-	if (!KAlarm::runProgram(QLatin1String("korganizer"), dbusService, KORG_DBUS_WINDOW_PATH, korgStartError))
+	QString error, dbusService;
+	int result = KDBusServiceStarter::self()->findServiceFor("DBUS/Organizer", QString(), &error, &dbusService);
+	if (result)
+	{
+		kWarning() << "Unable to start DBUS/Organizer:" << dbusService << error;
 		return false;
-	if (korgInterface  &&  !korgInterface->isValid())
+	}
+	// If Kontact is running, there is be a load() method which needs to be called
+	// to load KOrganizer into Kontact. But if KOrganizer is running independently,
+	// the load() method doesn't exist.
+	QDBusInterface iface(KORG_DBUS_SERVICE, KORG_DBUS_LOAD_PATH, "org.kde.KUniqueApplication");
+	if (!iface.isValid())
 	{
-		delete korgInterface;
-		korgInterface = 0;
+		kWarning() << "Unable to access "KORG_DBUS_LOAD_PATH" D-Bus interface:" << iface.lastError().message();
+		return false;
+	}
+	QDBusReply<bool> reply = iface.call("load");
+	if ((!reply.isValid() || !reply.value())
+	&&  iface.lastError().type() != QDBusError::UnknownMethod)
+	{
+		kWarning() << "Loading KOrganizer failed:" << iface.lastError().message();
+		return false;
 	}
-	if (!korgInterface)
+
+	// KOrganizer has been started, but it may not have the necessary
+	// D-Bus interface available yet.
+	if (!korgInterface  ||  !korgInterface->isValid())
+	{
+		delete korgInterface;
 		korgInterface = new QDBusInterface(KORG_DBUS_SERVICE, KORG_DBUS_PATH, KORG_DBUS_IFACE);
+		if (!korgInterface->isValid())
+		{
+			kWarning() << "Unable to access "KORG_DBUS_PATH" D-Bus interface:" << korgInterface->lastError().message();
+			delete korgInterface;
+			korgInterface = 0;
+			return false;
+		}
+	}
 	return true;
 }
 
Index: kalarm/Changelog
===================================================================
Index: kalarm/functions.cpp
===================================================================
openSUSE Build Service is sponsored by