3 * Copyright © 2009 Thomas Perl <thp@thpinfo.com>
17 public class DesktopFile : GLib.KeyFile {
18 public DesktopFile(string basename) {
19 string filename = "/usr/share/applications/" + basename.replace("hildon-", "hildon/");
21 load_from_file(filename, KeyFileFlags.NONE);
22 } catch (KeyFileError e) {
23 stderr.printf("Cannot open key file: %s\n", e.message);
24 } catch (FileError e) {
25 stderr.printf("Cannot open key file: %s\n", e.message);
29 public string? get_name() {
31 return get_string("Desktop Entry", "Name");
32 } catch (KeyFileError e) {
33 stderr.printf("Cannot read exec key: %s\n", e.message);
38 public string? get_executable() {
40 return get_string("Desktop Entry", "Exec");
41 } catch (KeyFileError e) {
42 stderr.printf("Cannot read exec key: %s\n", e.message);
48 public class MimeCache : GLib.KeyFile {
49 public MimeCache(string filename="/usr/share/applications/mimeinfo.cache") {
51 load_from_file(filename, KeyFileFlags.NONE);
52 } catch (KeyFileError e) {
53 stderr.printf("Cannot open key file: %s\n", e.message);
54 } catch (FileError e) {
55 stderr.printf("Cannot open key file: %s\n", e.message);
59 public string [] get_desktop_files(string mimetype="application/news_reader") {
61 return get_string("MIME Cache", mimetype).split(";");
62 } catch (KeyFileError e) {
63 stderr.printf("Cannot get desktop files for %s\n", mimetype);
64 return new string [0];
69 [DBus (name="org.maemo.garage.feedhandler")]
70 public class FeedHandler : GLib.Object {
71 private MainLoop loop;
72 private DBus.Connection conn;
73 private Osso.Context context;
74 private string args_url;
75 private MimeCache mime_cache;
77 public FeedHandler(MainLoop loop, DBus.Connection conn) {
80 this.context = new Osso.Context("feedhandler", "2.0", false, null);
82 this.mime_cache = new MimeCache();
84 foreach (string file in mime_cache.get_desktop_files("application/rss+xml")) {
86 var desktop_file = new DesktopFile(file);
87 var name = desktop_file.get_name();
88 var exec = desktop_file.get_executable();
89 if (name != null && exec != null) {
90 stderr.printf("File in Mime CACHE: %s (%s)\n", name, exec);
91 /* XXX: Add "Name" as option and on select, start exec + URL */
97 [DBus (name = "mime_open")]
98 public void mime_open(string url) {
101 Gtk.Dialog dlg = new Gtk.Dialog();
102 dlg.add_button("RSS Reader", Reader.RSS);
103 dlg.add_button("Google Reader", Reader.GOOGLE);
104 if (FileUtils.test("/usr/bin/gpodder", FileTest.EXISTS)) {
105 dlg.add_button("gPodder", Reader.GPODDER);
107 dlg.add_button("Cancel", Gtk.ResponseType.CLOSE);
108 dlg.title = "Select application for handling this feed";
109 var label = new Gtk.Label(url);
110 label.ellipsize = Pango.EllipsizeMode.END;
118 add_to_rss_reader(url);
125 GLib.Process.spawn_async(null,
129 url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
130 } catch (GLib.SpawnError e) {
131 stderr.printf("Can't launch: %s\n", e.message);
136 message("URL received: %s", url);
140 private void add_to_google(string url)
142 open_browser("http://fusion.google.com/add?feedurl=" +
143 Uri.escape_string(url, "", false));
146 private void add_to_rss_reader(string url)
148 dynamic DBus.Object obj = conn.get_object(
149 "com.nokia.osso_rss_feed_reader_refresh",
150 "/com/nokia/osso_rss_feed_reader_refresh",
151 "com.nokia.osso_rss_feed_reader_refresh");
155 private void open_browser(string url)
157 context.rpc_run_with_defaults("osso_browser",
162 /* DBUS_TYPE_STRING is (int)'s' */
163 /* DBUS_TYPE_INVALID is (int)'\0' */
166 public void set_args_url(string url)
171 public bool open_url_later()
178 static int main(string [] args) {
179 MainLoop loop = new MainLoop(null, false);
181 if (args.length != 1 && args.length != 2) {
182 stderr.printf("Usage: %s [URL]\n", args[0]);
186 DBus.Connection conn = DBus.Bus.get(DBus.BusType.SESSION);
187 dynamic DBus.Object bus = conn.get_object("org.freedesktop.DBus",
188 "/org/freedesktop/DBus",
189 "org.freedesktop.DBus");
190 uint request_name_result = bus.RequestName(
191 "org.maemo.garage.feedhandler", (uint)0);
192 if (request_name_result == DBus.RequestNameReply.PRIMARY_OWNER) {
193 FeedHandler server = new FeedHandler(loop, conn);
194 conn.register_object("/org/maemo/garage/feedhandler", server);
195 if (args.length == 2) {
196 /* Add URL when the main loop is running */
197 server.set_args_url(args[1]);
198 Idle.add(server.open_url_later);
202 stderr.printf("feedhandler is already running.\n");
206 stderr.printf("OOps: %s\n", e.message);