[rygel] Only load Tracker plugin if service is available



commit f16740b8bb8fc4889a8f40e0cf8162b013fd8d4f
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Mon May 25 19:08:23 2009 +0300

    Only load Tracker plugin if service is available
    
    Try to launch the tracker service by name and if we fail, don't load
    the Tracker plugin. This should setisfy some tracker-haters. :)
---
 src/plugins/tracker/Makefile.am                    |    7 ++-
 .../tracker/rygel-tracker-plugin-factory.vala      |   76 ++++++++++++++++++++
 src/plugins/tracker/rygel-tracker-plugin.vala      |   46 ++++++------
 3 files changed, 105 insertions(+), 24 deletions(-)

diff --git a/src/plugins/tracker/Makefile.am b/src/plugins/tracker/Makefile.am
index 5fb26e5..106a5ab 100644
--- a/src/plugins/tracker/Makefile.am
+++ b/src/plugins/tracker/Makefile.am
@@ -23,7 +23,8 @@ BUILT_SOURCES = rygel-media-tracker.stamp \
 		rygel-tracker-video-item.c \
 		rygel-tracker-music-item.c \
 		rygel-tracker-image-item.c \
-		rygel-tracker-plugin.c
+		rygel-tracker-plugin.c \
+		rygel-tracker-plugin-factory.c
 
 librygel_media_tracker_la_SOURCES = rygel-media-tracker.c \
 				    rygel-media-tracker.vala \
@@ -50,7 +51,9 @@ librygel_media_tracker_la_SOURCES = rygel-media-tracker.c \
 				    rygel-tracker-image-item.c \
 				    rygel-tracker-image-item.vala \
 				    rygel-tracker-plugin.c \
-				    rygel-tracker-plugin.vala
+				    rygel-tracker-plugin.vala \
+				    rygel-tracker-plugin-factory.c \
+				    rygel-tracker-plugin-factory.vala
 
 rygel-media-tracker.stamp: $(filter %.vala,$(librygel_media_tracker_la_SOURCES))
 	$(VALAC) -C --vapidir=$(top_srcdir)/src/rygel \
diff --git a/src/plugins/tracker/rygel-tracker-plugin-factory.vala b/src/plugins/tracker/rygel-tracker-plugin-factory.vala
new file mode 100644
index 0000000..5e738c7
--- /dev/null
+++ b/src/plugins/tracker/rygel-tracker-plugin-factory.vala
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 Zeeshan Ali (Khattak) <zeeshanak gnome org>.
+ * Copyright (C) 2009 Nokia Corporation, all rights reserved.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+using Rygel;
+using Gee;
+using CStuff;
+
+private TrackerPluginFactory plugin_factory;
+
+[ModuleInit]
+public void module_init (PluginLoader loader) {
+    try {
+        plugin_factory = new TrackerPluginFactory (loader);
+    } catch (DBus.Error error) {
+        critical ("Failed to fetch list of external services: %s\n",
+                error.message);
+    }
+}
+
+public class TrackerPluginFactory {
+    private const string DBUS_SERVICE = "org.freedesktop.DBus";
+    private const string DBUS_OBJECT = "/org/freedesktop/DBus";
+    private const string DBUS_IFACE = "org.freedesktop.DBus";
+
+    private const string TRACKER_SERVICE = "org.freedesktop.Tracker";
+
+    dynamic DBus.Object dbus_obj;
+    PluginLoader        loader;
+
+    public TrackerPluginFactory (PluginLoader loader) throws DBus.Error {
+        var connection = DBus.Bus.get (DBus.BusType.SESSION);
+
+        this.dbus_obj = connection.get_object (DBUS_SERVICE,
+                                               DBUS_OBJECT,
+                                               DBUS_IFACE);
+        this.loader = loader;
+
+        dbus_obj.StartServiceByName (TRACKER_SERVICE,
+                                     (uint32) 0,
+                                     this.start_service_cb);
+    }
+
+    private void start_service_cb (uint32 status, GLib.Error err) {
+        if (err != null) {
+            warning ("Failed to start Tracker service: %s\n",
+                     err.message);
+            warning ("Tracker plugin disabled.\n");
+
+            return;
+        }
+
+        this.loader.add_plugin (new TrackerPlugin ());
+    }
+}
+
diff --git a/src/plugins/tracker/rygel-tracker-plugin.vala b/src/plugins/tracker/rygel-tracker-plugin.vala
index 23105e9..498bf4a 100644
--- a/src/plugins/tracker/rygel-tracker-plugin.vala
+++ b/src/plugins/tracker/rygel-tracker-plugin.vala
@@ -24,27 +24,29 @@ using Rygel;
 using Gee;
 using CStuff;
 
-[ModuleInit]
-public void module_init (PluginLoader loader) {
-    Plugin plugin = new Plugin ("Tracker", "@REALNAME@'s media");
-
-    // We only implement a ContentDirectory service
-    var resource_info = new ResourceInfo (ContentDirectory.UPNP_ID,
-                                          ContentDirectory.UPNP_TYPE,
-                                          ContentDirectory.DESCRIPTION_PATH,
-                                          typeof (MediaTracker));
-
-    plugin.add_resource (resource_info);
-
-    var icon_info = new IconInfo ("image/png", // Mimetype
-                                  48, // width
-                                  48, // height
-                                  24, // depth
-                                  BuildConfig.DATA_DIR + // Path
-                                  "/icons/hicolor/48x48/apps/tracker.png");
-
-    plugin.add_icon (icon_info);
-
-    loader.add_plugin (plugin);
+public class TrackerPlugin : Plugin {
+    // class-wide constants
+    private const string ICON = BuildConfig.DATA_DIR + // Path
+                                "/icons/hicolor/48x48/apps/tracker.png";
+
+    public TrackerPlugin () {
+        base ("Tracker", "@REALNAME@'s media");
+
+        // We only implement a ContentDirectory service
+        var resource_info = new ResourceInfo (ContentDirectory.UPNP_ID,
+                                              ContentDirectory.UPNP_TYPE,
+                                              ContentDirectory.DESCRIPTION_PATH,
+                                              typeof (MediaTracker));
+
+        this.add_resource (resource_info);
+
+        var icon_info = new IconInfo ("image/png", // Mimetype
+                                      48,          // width
+                                      48,          // height
+                                      24,          // depth
+                                      ICON);       // Icon Path
+
+        this.add_icon (icon_info);
+    }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]