Add support for Google Reader + RSS Reader
[feedhandler] / feedhandler.vala
index f36c392..e2e37cc 100644 (file)
 
 using Gtk;
 using GLib;
+using Osso;
+using Soup;
+
+public enum Reader {
+    RSS = 1,
+    GOOGLE,
+    GPODDER,
+}
 
 [DBus (name="org.maemo.garage.feedhandler")]
 public class FeedHandler : GLib.Object {
     private MainLoop loop;
+    private DBus.Connection conn;
+    private Context context;
+    private string args_url;
 
-    public FeedHandler(MainLoop loop) {
+    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;
     }
 
     [DBus (name = "mime_open")]
     public void mime_open(string url) {
+        int result;
+
         Gtk.Dialog dlg = new Gtk.Dialog();
-        dlg.add_button("Subscribe", Gtk.ResponseType.YES);
+        dlg.add_button("RSS Reader", Reader.RSS);
+        dlg.add_button("Google Reader", Reader.GOOGLE);
+        dlg.add_button("gPodder", Reader.GPODDER);
         dlg.add_button("Cancel", Gtk.ResponseType.CLOSE);
-        dlg.title = "feedhandler received a URL";
+        dlg.title = "Select application for handling this feed";
         dlg.vbox.add(new Gtk.Label(url));
         dlg.show_all();
-        if (dlg.run() == Gtk.ResponseType.YES) {
-            /* Example code for launching a RSS application */
-            try {
-                GLib.Process.spawn_async(null,
-                    {"gpodder",
-                    "--fremantle",
-                    "-s",
-                    url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
-            } catch (GLib.SpawnError e) {
-                stderr.printf("Can't launch: %s\n", e.message);
-            }
-        }
+        result = dlg.run();
         dlg.destroy();
+
+        switch (result) {
+            case Reader.RSS:
+                add_to_rss_reader(url);
+                break;
+            case Reader.GOOGLE:
+                add_to_google(url);
+                break;
+            case Reader.GPODDER:
+                try {
+                    GLib.Process.spawn_async(null,
+                        {"gpodder",
+                        "--fremantle",
+                        "-s",
+                        url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
+                } catch (GLib.SpawnError e) {
+                    stderr.printf("Can't launch: %s\n", e.message);
+                }
+                break;
+        }
+
         message("URL received: %s", url);
         loop.quit();
     }
+
+    private void add_to_google(string url)
+    {
+        open_browser("http://fusion.google.com/add?feedurl=" +
+            URI.encode(url, null));
+    }
+
+    private void add_to_rss_reader(string url)
+    {
+        dynamic DBus.Object obj = conn.get_object(
+            "com.nokia.osso_rss_feed_reader_refresh",
+            "/com/nokia/osso_rss_feed_reader_refresh",
+            "com.nokia.osso_rss_feed_reader_refresh");
+        obj.mime_open(url);
+    }
+
+    private void open_browser(string url)
+    {
+        context.rpc_run_with_defaults("osso_browser",
+                                      "open_new_window",
+                                      null,
+                                      (int)'s', url,
+                                      (int)'\0');
+        /* DBUS_TYPE_STRING is (int)'s' */
+        /* DBUS_TYPE_INVALID is (int)'\0' */
+    }
+
+    public void set_args_url(string url)
+    {
+        args_url = url;
+    }
+
+    public bool open_url_later()
+    {
+        mime_open(args_url);
+        return false;
+    }
 }
 
 static int main(string [] args) {
     MainLoop loop = new MainLoop(null, false);
     Gtk.init(ref args);
+    if (args.length != 1 && args.length != 2) {
+        stderr.printf("Usage: %s [URL]\n", args[0]);
+        return 1;
+    }
     try {
-        var conn = DBus.Bus.get(DBus.BusType.SESSION);
+        DBus.Connection conn = DBus.Bus.get(DBus.BusType.SESSION);
         dynamic DBus.Object bus = conn.get_object("org.freedesktop.DBus",
                                                   "/org/freedesktop/DBus",
                                                   "org.freedesktop.DBus");
         uint request_name_result = bus.RequestName(
                                  "org.maemo.garage.feedhandler", (uint)0);
         if (request_name_result == DBus.RequestNameReply.PRIMARY_OWNER) {
-            FeedHandler server = new FeedHandler(loop);
+            FeedHandler server = new FeedHandler(loop, conn);
             conn.register_object("/org/maemo/garage/feedhandler", server);
+            if (args.length == 2) {
+                /* Add URL when the main loop is running */
+                server.set_args_url(args[1]);
+                Idle.add(server.open_url_later);
+            }
             loop.run();
+        } else {
+            stderr.printf("feedhandler is already running.\n");
         }
-
     }
     catch (Error e) {
         stderr.printf("OOps: %s\n", e.message);