File evolution-dbus.diff of Package evolution
Index: plugins/default-mailer/Makefile.am
===================================================================
--- plugins/default-mailer/Makefile.am (revision 33656)
+++ plugins/default-mailer/Makefile.am (working copy)
@@ -1,6 +1,10 @@
INCLUDES = \
-I$(top_srcdir) \
- $(EVOLUTION_MAIL_CFLAGS)
+ $(EVOLUTION_MAIL_CFLAGS) \
+ -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include
+
+LIBS = \
+ -ldbus-1
@EVO_PLUGIN_RULE@
Index: plugins/default-mailer/default-mailer.c
===================================================================
--- plugins/default-mailer/default-mailer.c (revision 33656)
+++ plugins/default-mailer/default-mailer.c (working copy)
@@ -22,11 +22,19 @@
#include <stdlib.h>
#include <string.h>
+
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
#include <gconf/gconf-client.h>
#include <e-util/e-error.h>
#include <mail/em-utils.h>
#include <shell/es-event.h>
+#include <camel/camel.h>
+
+#define d(x) x
#define GCONF_KEY_CHECKDEFAULT "/apps/evolution/mail/prompts/checkdefault"
#define GCONF_KEY_MAILTO_ENABLED "/desktop/gnome/url-handlers/mailto/enabled"
@@ -34,6 +42,7 @@
#define EVOLUTION_MAILTO_COMMAND "evolution --component=mail %s"
void org_gnome_default_mailer_check_default (EPlugin *ep, ESEventTargetUpgrade *target);
+void org_gnome_shell_started (EPlugin *ep, ESEventTargetShell *target);
static gboolean
evolution_is_default_mailer (const gchar *mailto_command)
@@ -65,6 +74,132 @@ evolution_is_default_mailer (const gchar
return is_default;
}
+/* DBus Connection code */
+
+#define DBUS_SERVER_OBJECT_PATH "/org/gnome/myle"
+#define DBUS_BUS "org.gnome.myle"
+static DBusHandlerResult
+dbus_listener_message_handler (DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data);
+
+static DBusConnection *dbus = NULL;
+static DBusObjectPathVTable dbus_listener_vtable =
+{
+ NULL, /* unregister_function */
+ &dbus_listener_message_handler /* message_function */
+};
+
+static DBusConnection *
+e_dbus_connection_get ()
+{
+ DBusError error;
+
+ if (dbus)
+ return dbus;
+
+ dbus_error_init (&error);
+
+ if ((dbus = dbus_bus_get (DBUS_BUS_SESSION, &error))) {
+ dbus_connection_setup_with_g_main (dbus, NULL);
+ dbus_connection_set_exit_on_disconnect (dbus, FALSE);
+ } else {
+ g_printerr (("Failed to open connection to bus: %s\n"),
+ error.message);
+ dbus_error_free (&error);
+ return NULL;
+ }
+
+ dbus_bus_request_name (dbus,
+ DBUS_BUS,
+ 0,
+ &error);
+
+ if (dbus_error_is_set (&error)) {
+ fprintf (stderr, "%s: dbus_bus_request_name error: %s\n",
+ "EDS", error.message);
+
+ dbus_error_free (&error);
+
+ return NULL;
+ }
+
+ dbus_error_free (&error);
+
+ return dbus;
+}
+
+static void
+e_dbus_connection_close ()
+{
+ if (dbus)
+ dbus_connection_unref (dbus);
+ dbus = NULL;
+}
+
+static void
+e_dbus_setup_handlers ()
+{
+ if (!dbus) {
+ if (!(dbus = e_dbus_connection_get ())) {
+ printf("Error setting up dbus handlers\n");
+ return;
+ }
+ }
+
+ if (!dbus_connection_register_object_path (dbus,
+ DBUS_SERVER_OBJECT_PATH,
+ &dbus_listener_vtable,
+ NULL)) {
+ g_error (("Out of memory registering object path '%s'"), DBUS_SERVER_OBJECT_PATH);
+ return;
+ }
+
+ printf("DBUS Handlers setup successfully\n");
+}
+
+static void
+prepare_offline(void *key, void *value, void *data)
+{
+ CamelService *service = key;
+
+ if (CAMEL_IS_DISCO_STORE(service)
+ || CAMEL_IS_OFFLINE_STORE(service)) {
+ mail_store_prepare_offline((CamelStore *)service);
+ }
+}
+
+static DBusHandlerResult
+dbus_listener_message_handler (DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data)
+{
+ const char *method = dbus_message_get_member (message);
+
+ d(printf ("D-Bus message: obj_path = '%s' interface = '%s' method = '%s' destination = '%s'\n",
+ dbus_message_get_path (message),
+ dbus_message_get_interface (message),
+ dbus_message_get_member (message),
+ dbus_message_get_destination (message)));
+ if (strcmp(dbus_message_get_member (message), "idle") == 0) {
+ /* The system is idle */
+ mail_component_stores_foreach(mail_component_peek(), prepare_offline, NULL);
+
+ } else if (strcmp(dbus_message_get_member (message), "active") == 0) {
+ /* The system has gone active */
+ mail_cancel_all ();
+ }
+ return DBUS_HANDLER_RESULT_HANDLED;
+
+}
+
+void
+org_gnome_shell_started (EPlugin *ep, ESEventTargetShell *target)
+{
+ printf("Setting up DBUS handler for Evolution ------------------------------------------------\n");
+ e_dbus_setup_handlers ();
+}
+
void
org_gnome_default_mailer_check_default (EPlugin *ep, ESEventTargetUpgrade *target)
{
@@ -76,9 +211,10 @@ org_gnome_default_mailer_check_default (
/* See whether the check default mailer key has already been set */
is_key = gconf_client_get(client, GCONF_KEY_CHECKDEFAULT, NULL);
- if(!is_key)
+ if(!is_key) {
gconf_client_set_bool(client, GCONF_KEY_CHECKDEFAULT, TRUE, NULL);
- gconf_value_free (is_key);
+ gconf_value_free (is_key);
+ }
/* Check whether we're supposed to check whether or not we are the default mailer */
if(gconf_client_get_bool(client, GCONF_KEY_CHECKDEFAULT, NULL)) {
Index: plugins/default-mailer/org-gnome-default-mailer.eplug.xml
===================================================================
--- plugins/default-mailer/org-gnome-default-mailer.eplug.xml (revision 33656)
+++ plugins/default-mailer/org-gnome-default-mailer.eplug.xml (working copy)
@@ -15,6 +15,14 @@
handle="org_gnome_default_mailer_check_default"
target="upgrade"
/>
+ </hook>
+ <hook class="org.gnome.evolution.shell.events:1.0">
+ <event
+ id="started.done"
+ handle="org_gnome_shell_started"
+ target="shell"
+ />
</hook>
+
</e-plugin>
</e-plugin-list>