Add some code for reading the mime cache
[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
10 public enum Reader {
11     RSS = 1,
12     GOOGLE,
13     GPODDER,
14 }
15
16 public class DesktopFile : GLib.KeyFile {
17     public DesktopFile(string basename) {
18         string filename = "/usr/share/applications/" + basename.replace("hildon-", "hildon/");
19         try {
20             load_from_file(filename, KeyFileFlags.NONE);
21         } catch (KeyFileError e) {
22             stderr.printf("Cannot open key file: %s\n", e.message);
23         } catch (FileError e) {
24             stderr.printf("Cannot open key file: %s\n", e.message);
25         }
26     }
27
28     public string get_name() {
29         return get_string("Desktop Entry", "Name");
30     }
31 }
32
33 public class MimeCache : GLib.KeyFile {
34     public MimeCache(string filename="/usr/share/applications/mimeinfo.cache") {
35         try {
36             load_from_file(filename, KeyFileFlags.NONE);
37         } catch (KeyFileError e) {
38             stderr.printf("Cannot open key file: %s\n", e.message);
39         } catch (FileError e) {
40             stderr.printf("Cannot open key file: %s\n", e.message);
41         }
42     }
43
44     public string [] get_desktop_files(string mimetype="application/news_reader") {
45         return get_string("MIME Cache", mimetype).split(";");
46     }
47 }
48
49 [DBus (name="org.maemo.garage.feedhandler")]
50 public class FeedHandler : GLib.Object {
51     private MainLoop loop;
52     private DBus.Connection conn;
53     private Context context;
54     private string args_url;
55
56     public FeedHandler(MainLoop loop, DBus.Connection conn) {
57         this.loop = loop;
58         this.conn = conn;
59         this.context = new Osso.Context("feedhandler", "2.0", false, null);
60         this.args_url = null;
61
62         foreach (string file in (new MimeCache().get_desktop_files("text/plain"))) {
63             if (file == "") continue;
64             var desktop_file = new DesktopFile(file);
65             stderr.printf("%s\n", desktop_file.get_name());
66         }
67     }
68
69     [DBus (name = "mime_open")]
70     public void mime_open(string url) {
71         int result;
72
73         Gtk.Dialog dlg = new Gtk.Dialog();
74         dlg.add_button("RSS Reader", Reader.RSS);
75         dlg.add_button("Google Reader", Reader.GOOGLE);
76         dlg.add_button("gPodder", Reader.GPODDER);
77         dlg.add_button("Cancel", Gtk.ResponseType.CLOSE);
78         dlg.title = "Select application for handling this feed";
79         dlg.vbox.add(new Gtk.Label(url));
80         dlg.show_all();
81         result = dlg.run();
82         dlg.destroy();
83
84         switch (result) {
85             case Reader.RSS:
86                 add_to_rss_reader(url);
87                 break;
88             case Reader.GOOGLE:
89                 add_to_google(url);
90                 break;
91             case Reader.GPODDER:
92                 try {
93                     GLib.Process.spawn_async(null,
94                         {"gpodder",
95                         "--fremantle",
96                         "-s",
97                         url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
98                 } catch (GLib.SpawnError e) {
99                     stderr.printf("Can't launch: %s\n", e.message);
100                 }
101                 break;
102         }
103
104         message("URL received: %s", url);
105         loop.quit();
106     }
107
108     private void add_to_google(string url)
109     {
110         open_browser("http://fusion.google.com/add?feedurl=" +
111             Uri.escape_string(url, "", false));
112     }
113
114     private void add_to_rss_reader(string url)
115     {
116         dynamic DBus.Object obj = conn.get_object(
117             "com.nokia.osso_rss_feed_reader_refresh",
118             "/com/nokia/osso_rss_feed_reader_refresh",
119             "com.nokia.osso_rss_feed_reader_refresh");
120         obj.mime_open(url);
121     }
122
123     private void open_browser(string url)
124     {
125         context.rpc_run_with_defaults("osso_browser",
126                                       "open_new_window",
127                                       null,
128                                       (int)'s', url,
129                                       (int)'\0');
130         /* DBUS_TYPE_STRING is (int)'s' */
131         /* DBUS_TYPE_INVALID is (int)'\0' */
132     }
133
134     public void set_args_url(string url)
135     {
136         args_url = url;
137     }
138
139     public bool open_url_later()
140     {
141         mime_open(args_url);
142         return false;
143     }
144 }
145
146 static int main(string [] args) {
147     MainLoop loop = new MainLoop(null, false);
148     Gtk.init(ref args);
149     if (args.length != 1 && args.length != 2) {
150         stderr.printf("Usage: %s [URL]\n", args[0]);
151         return 1;
152     }
153     try {
154         DBus.Connection conn = DBus.Bus.get(DBus.BusType.SESSION);
155         dynamic DBus.Object bus = conn.get_object("org.freedesktop.DBus",
156                                                   "/org/freedesktop/DBus",
157                                                   "org.freedesktop.DBus");
158         uint request_name_result = bus.RequestName(
159                                  "org.maemo.garage.feedhandler", (uint)0);
160         if (request_name_result == DBus.RequestNameReply.PRIMARY_OWNER) {
161             FeedHandler server = new FeedHandler(loop, conn);
162             conn.register_object("/org/maemo/garage/feedhandler", server);
163             if (args.length == 2) {
164                 /* Add URL when the main loop is running */
165                 server.set_args_url(args[1]);
166                 Idle.add(server.open_url_later);
167             }
168             loop.run();
169         } else {
170             stderr.printf("feedhandler is already running.\n");
171         }
172     }
173     catch (Error e) {
174         stderr.printf("OOps: %s\n", e.message);
175     }
176     return 0;
177 }
178