e2e37cc1fbd18165fa650a0add4c5c03ac2ecbba
[feedhandler] / feedhandler.vala
1 /**
2  * Feed Handler
3  * Copyright © 2009 Thomas Perl <thp@thpinfo.com>
4  **/
5
6 using Gtk;
7 using GLib;
8 using Osso;
9 using Soup;
10
11 public enum Reader {
12     RSS = 1,
13     GOOGLE,
14     GPODDER,
15 }
16
17 [DBus (name="org.maemo.garage.feedhandler")]
18 public class FeedHandler : GLib.Object {
19     private MainLoop loop;
20     private DBus.Connection conn;
21     private Context context;
22     private string args_url;
23
24     public FeedHandler(MainLoop loop, DBus.Connection conn) {
25         this.loop = loop;
26         this.conn = conn;
27         this.context = new Osso.Context("feedhandler", "2.0", false, null);
28         this.args_url = null;
29     }
30
31     [DBus (name = "mime_open")]
32     public void mime_open(string url) {
33         int result;
34
35         Gtk.Dialog dlg = new Gtk.Dialog();
36         dlg.add_button("RSS Reader", Reader.RSS);
37         dlg.add_button("Google Reader", Reader.GOOGLE);
38         dlg.add_button("gPodder", Reader.GPODDER);
39         dlg.add_button("Cancel", Gtk.ResponseType.CLOSE);
40         dlg.title = "Select application for handling this feed";
41         dlg.vbox.add(new Gtk.Label(url));
42         dlg.show_all();
43         result = dlg.run();
44         dlg.destroy();
45
46         switch (result) {
47             case Reader.RSS:
48                 add_to_rss_reader(url);
49                 break;
50             case Reader.GOOGLE:
51                 add_to_google(url);
52                 break;
53             case Reader.GPODDER:
54                 try {
55                     GLib.Process.spawn_async(null,
56                         {"gpodder",
57                         "--fremantle",
58                         "-s",
59                         url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
60                 } catch (GLib.SpawnError e) {
61                     stderr.printf("Can't launch: %s\n", e.message);
62                 }
63                 break;
64         }
65
66         message("URL received: %s", url);
67         loop.quit();
68     }
69
70     private void add_to_google(string url)
71     {
72         open_browser("http://fusion.google.com/add?feedurl=" +
73             URI.encode(url, null));
74     }
75
76     private void add_to_rss_reader(string url)
77     {
78         dynamic DBus.Object obj = conn.get_object(
79             "com.nokia.osso_rss_feed_reader_refresh",
80             "/com/nokia/osso_rss_feed_reader_refresh",
81             "com.nokia.osso_rss_feed_reader_refresh");
82         obj.mime_open(url);
83     }
84
85     private void open_browser(string url)
86     {
87         context.rpc_run_with_defaults("osso_browser",
88                                       "open_new_window",
89                                       null,
90                                       (int)'s', url,
91                                       (int)'\0');
92         /* DBUS_TYPE_STRING is (int)'s' */
93         /* DBUS_TYPE_INVALID is (int)'\0' */
94     }
95
96     public void set_args_url(string url)
97     {
98         args_url = url;
99     }
100
101     public bool open_url_later()
102     {
103         mime_open(args_url);
104         return false;
105     }
106 }
107
108 static int main(string [] args) {
109     MainLoop loop = new MainLoop(null, false);
110     Gtk.init(ref args);
111     if (args.length != 1 && args.length != 2) {
112         stderr.printf("Usage: %s [URL]\n", args[0]);
113         return 1;
114     }
115     try {
116         DBus.Connection conn = DBus.Bus.get(DBus.BusType.SESSION);
117         dynamic DBus.Object bus = conn.get_object("org.freedesktop.DBus",
118                                                   "/org/freedesktop/DBus",
119                                                   "org.freedesktop.DBus");
120         uint request_name_result = bus.RequestName(
121                                  "org.maemo.garage.feedhandler", (uint)0);
122         if (request_name_result == DBus.RequestNameReply.PRIMARY_OWNER) {
123             FeedHandler server = new FeedHandler(loop, conn);
124             conn.register_object("/org/maemo/garage/feedhandler", server);
125             if (args.length == 2) {
126                 /* Add URL when the main loop is running */
127                 server.set_args_url(args[1]);
128                 Idle.add(server.open_url_later);
129             }
130             loop.run();
131         } else {
132             stderr.printf("feedhandler is already running.\n");
133         }
134     }
135     catch (Error e) {
136         stderr.printf("OOps: %s\n", e.message);
137     }
138     return 0;
139 }
140