summaryrefslogtreecommitdiff
path: root/src/tracker-indexer/tracker-dbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker-indexer/tracker-dbus.c')
-rw-r--r--src/tracker-indexer/tracker-dbus.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/tracker-indexer/tracker-dbus.c b/src/tracker-indexer/tracker-dbus.c
new file mode 100644
index 000000000..935c9338b
--- /dev/null
+++ b/src/tracker-indexer/tracker-dbus.c
@@ -0,0 +1,206 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org)
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+
+#include <libtracker-common/tracker-log.h>
+
+#include "tracker-dbus.h"
+#include "tracker-indexer.h"
+#include "tracker-indexer-glue.h"
+
+#define THUMBNAILER_SERVICE "org.freedesktop.thumbnailer"
+#define THUMBNAILER_PATH "/org/freedesktop/thumbnailer/Generic"
+#define THUMBNAILER_INTERFACE "org.freedesktop.thumbnailer.Generic"
+
+static DBusGConnection *connection;
+static DBusGProxy *proxy;
+static DBusGProxy *thumb_proxy;
+
+static gboolean
+dbus_register_service (DBusGProxy *proxy,
+ const gchar *name)
+{
+ GError *error = NULL;
+ guint result;
+
+ g_message ("Registering DBus service...\n"
+ " Name:'%s'",
+ name);
+
+ if (!org_freedesktop_DBus_request_name (proxy,
+ name,
+ DBUS_NAME_FLAG_DO_NOT_QUEUE,
+ &result, &error)) {
+ g_critical ("Could not aquire name:'%s', %s",
+ name,
+ error ? error->message : "no error given");
+ g_error_free (error);
+
+ return FALSE;
+ }
+
+ if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+ g_critical ("DBus service name:'%s' is already taken, "
+ "perhaps the application is already running?",
+ name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+name_owner_changed_cb (DBusGProxy *proxy,
+ gchar *name,
+ gchar *old_owner,
+ gchar *new_owner,
+ gpointer user_data)
+{
+ if (strcmp (name, TRACKER_DAEMON_SERVICE) == 0 && (!new_owner || !*new_owner)) {
+ /* Tracker daemon has dissapeared from
+ * the bus, shutdown the indexer.
+ */
+ tracker_indexer_stop (TRACKER_INDEXER (user_data));
+ }
+}
+
+static gboolean
+dbus_register_object (GObject *object,
+ DBusGConnection *connection,
+ DBusGProxy *proxy,
+ const DBusGObjectInfo *info,
+ const gchar *path)
+{
+ g_message ("Registering DBus object...");
+ g_message (" Path:'%s'", path);
+ g_message (" Object Type:'%s'", G_OBJECT_TYPE_NAME (object));
+
+ dbus_g_object_type_install_info (G_OBJECT_TYPE (object), info);
+ dbus_g_connection_register_g_object (connection, path, object);
+
+ dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_INVALID);
+
+ dbus_g_proxy_connect_signal (proxy, "NameOwnerChanged",
+ G_CALLBACK (name_owner_changed_cb),
+ object, NULL);
+ return TRUE;
+}
+
+DBusGProxy*
+tracker_dbus_get_thumbnailer (void)
+{
+ return thumb_proxy;
+}
+
+static gboolean
+dbus_register_names (void)
+{
+ GError *error = NULL;
+
+ if (connection) {
+ g_critical ("The DBusGConnection is already set, have we already initialized?");
+ return FALSE;
+ }
+
+ if (proxy) {
+ g_critical ("The DBusGProxy is already set, have we already initialized?");
+ return FALSE;
+ }
+
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+ if (!connection) {
+ g_critical ("Could not connect to the DBus session bus, %s",
+ error ? error->message : "no error given.");
+ g_clear_error (&error);
+ return FALSE;
+ }
+
+ /* The definitions below (DBUS_SERVICE_DBUS, etc) are
+ * predefined for us to just use (dbus_g_proxy_...)
+ */
+ proxy = dbus_g_proxy_new_for_name (connection,
+ DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS);
+
+ /* Register the service name for org.freedesktop.Tracker */
+ if (!dbus_register_service (proxy, TRACKER_INDEXER_SERVICE)) {
+ return FALSE;
+ }
+
+ thumb_proxy = dbus_g_proxy_new_for_name (connection,
+ THUMBNAILER_SERVICE,
+ THUMBNAILER_PATH,
+ THUMBNAILER_INTERFACE);
+ return TRUE;
+}
+
+gboolean
+tracker_dbus_init (void)
+{
+ /* Don't reinitialize */
+ if (connection && proxy) {
+ return TRUE;
+ }
+
+ /* Register names and get proxy/connection details */
+ if (!dbus_register_names ()) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void
+tracker_dbus_shutdown (void)
+{
+ if (proxy) {
+ g_object_unref (proxy);
+ proxy = NULL;
+ }
+
+ connection = NULL;
+}
+
+gboolean
+tracker_dbus_register_object (GObject *object)
+{
+ if (!connection || !proxy) {
+ g_critical ("DBus support must be initialized before registering objects!");
+ return FALSE;
+ }
+
+ if (TRACKER_IS_INDEXER (object)) {
+ return dbus_register_object (object,
+ connection,
+ proxy,
+ &dbus_glib_tracker_indexer_object_info,
+ TRACKER_INDEXER_PATH);
+ } else {
+ g_warning ("Object not handled by DBus");
+ }
+
+ return FALSE;
+}