3 * Copyright © 2009 Thomas Perl <thp@thpinfo.com>
16 public class DesktopFile : GLib.KeyFile {
17 public DesktopFile(string basename) {
18 string filename = "/usr/share/applications/" + basename.replace("hildon-", "hildon/");
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);
28 public string get_name() {
29 return get_string("Desktop Entry", "Name");
33 public class MimeCache : GLib.KeyFile {
34 public MimeCache(string filename="/usr/share/applications/mimeinfo.cache") {
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);
44 public string [] get_desktop_files(string mimetype="application/news_reader") {
45 return get_string("MIME Cache", mimetype).split(";");
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;
56 public FeedHandler(MainLoop loop, DBus.Connection conn) {
59 this.context = new Osso.Context("feedhandler", "2.0", false, null);
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());
69 [DBus (name = "mime_open")]
70 public void mime_open(string url) {
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));
86 add_to_rss_reader(url);
93 GLib.Process.spawn_async(null,
97 url}, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
98 } catch (GLib.SpawnError e) {
99 stderr.printf("Can't launch: %s\n", e.message);
104 message("URL received: %s", url);
108 private void add_to_google(string url)
110 open_browser("http://fusion.google.com/add?feedurl=" +
111 Uri.escape_string(url, "", false));
114 private void add_to_rss_reader(string url)
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");
123 private void open_browser(string url)
125 context.rpc_run_with_defaults("osso_browser",
130 /* DBUS_TYPE_STRING is (int)'s' */
131 /* DBUS_TYPE_INVALID is (int)'\0' */
134 public void set_args_url(string url)
139 public bool open_url_later()
146 static int main(string [] args) {
147 MainLoop loop = new MainLoop(null, false);
149 if (args.length != 1 && args.length != 2) {
150 stderr.printf("Usage: %s [URL]\n", args[0]);
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);
170 stderr.printf("feedhandler is already running.\n");
174 stderr.printf("OOps: %s\n", e.message);