Add support for FeedingIt
[feedhandler] / feedhandler.vala
index e2e37cc..162009f 100644 (file)
@@ -6,26 +6,96 @@
 using Gtk;
 using GLib;
 using Osso;
-using Soup;
+using Pango;
+
+public static const string FEEDINGIT_SERVICE =
+    "/usr/share/dbus-1/services/feedingit.service";
 
 public enum Reader {
     RSS = 1,
     GOOGLE,
     GPODDER,
+    FEEDINGIT,
+}
+
+public class DesktopFile : GLib.KeyFile {
+    public DesktopFile(string basename) {
+        string filename = "/usr/share/applications/" + basename.replace("hildon-", "hildon/");
+        try {
+            load_from_file(filename, KeyFileFlags.NONE);
+        } catch (KeyFileError e) {
+            stderr.printf("Cannot open key file: %s\n", e.message);
+        } catch (FileError e) {
+            stderr.printf("Cannot open key file: %s\n", e.message);
+        }
+    }
+
+    public string? get_name() {
+        try {
+            return get_string("Desktop Entry", "Name");
+        } catch (KeyFileError e) {
+            stderr.printf("Cannot read exec key: %s\n", e.message);
+        }
+        return null;
+    }
+
+    public string? get_executable() {
+        try {
+            return get_string("Desktop Entry", "Exec");
+        } catch (KeyFileError e) {
+            stderr.printf("Cannot read exec key: %s\n", e.message);
+        }
+        return null;
+    }
+}
+
+public class MimeCache : GLib.KeyFile {
+    public MimeCache(string filename="/usr/share/applications/mimeinfo.cache") {
+        try {
+            load_from_file(filename, KeyFileFlags.NONE);
+        } catch (KeyFileError e) {
+            stderr.printf("Cannot open key file: %s\n", e.message);
+        } catch (FileError e) {
+            stderr.printf("Cannot open key file: %s\n", e.message);
+        }
+    }
+
+    public string [] get_desktop_files(string mimetype="application/news_reader") {
+        try {
+            return get_string("MIME Cache", mimetype).split(";");
+        } catch (KeyFileError e) {
+            stderr.printf("Cannot get desktop files for %s\n", mimetype);
+            return new string [0];
+        }
+    }
 }
 
 [DBus (name="org.maemo.garage.feedhandler")]
 public class FeedHandler : GLib.Object {
     private MainLoop loop;
     private DBus.Connection conn;
-    private Context context;
+    private Osso.Context context;
     private string args_url;
+    private MimeCache mime_cache;
 
     public FeedHandler(MainLoop loop, DBus.Connection conn) {
         this.loop = loop;
         this.conn = conn;
         this.context = new Osso.Context("feedhandler", "2.0", false, null);
         this.args_url = null;
+        this.mime_cache = new MimeCache();
+
+        foreach (string file in mime_cache.get_desktop_files("application/rss+xml")) {
+            if (file != "") {
+                var desktop_file = new DesktopFile(file);
+                var name = desktop_file.get_name();
+                var exec = desktop_file.get_executable();
+                if (name != null && exec != null) {
+                    stderr.printf("File in Mime CACHE: %s (%s)\n", name, exec);
+                    /* XXX: Add "Name" as option and on select, start exec + URL */
+                }
+            }
+        }
     }
 
     [DBus (name = "mime_open")]
@@ -35,10 +105,17 @@ public class FeedHandler : GLib.Object {
         Gtk.Dialog dlg = new Gtk.Dialog();
         dlg.add_button("RSS Reader", Reader.RSS);
         dlg.add_button("Google Reader", Reader.GOOGLE);
-        dlg.add_button("gPodder", Reader.GPODDER);
+        if (FileUtils.test("/usr/bin/gpodder", FileTest.EXISTS)) {
+            dlg.add_button("gPodder", Reader.GPODDER);
+        }
+        if (FileUtils.test(FEEDINGIT_SERVICE, FileTest.EXISTS)) {
+            dlg.add_button("FeedingIt", Reader.FEEDINGIT);
+        }
         dlg.add_button("Cancel", Gtk.ResponseType.CLOSE);
         dlg.title = "Select application for handling this feed";
-        dlg.vbox.add(new Gtk.Label(url));
+        var label = new Gtk.Label(url);
+        label.ellipsize = Pango.EllipsizeMode.END;
+        dlg.vbox.add(label);
         dlg.show_all();
         result = dlg.run();
         dlg.destroy();
@@ -61,6 +138,9 @@ public class FeedHandler : GLib.Object {
                     stderr.printf("Can't launch: %s\n", e.message);
                 }
                 break;
+            case Reader.FEEDINGIT:
+                add_to_feedingit(url);
+                break;
         }
 
         message("URL received: %s", url);
@@ -70,7 +150,7 @@ public class FeedHandler : GLib.Object {
     private void add_to_google(string url)
     {
         open_browser("http://fusion.google.com/add?feedurl=" +
-            URI.encode(url, null));
+            Uri.escape_string(url, "", false));
     }
 
     private void add_to_rss_reader(string url)
@@ -82,6 +162,15 @@ public class FeedHandler : GLib.Object {
         obj.mime_open(url);
     }
 
+    private void add_to_feedingit(string url)
+    {
+        dynamic DBus.Object obj = conn.get_object(
+            "org.maemo.feedingit",
+            "/org/maemo/feedingit",
+            "org.maemo.feedingit");
+        obj.AddFeed(url);
+    }
+
     private void open_browser(string url)
     {
         context.rpc_run_with_defaults("osso_browser",