diff options
-rw-r--r-- | libdino/src/application.vala | 36 | ||||
-rw-r--r-- | main/src/ui/application.vala | 21 |
2 files changed, 52 insertions, 5 deletions
diff --git a/libdino/src/application.vala b/libdino/src/application.vala index 4b5f3b64..a04f6897 100644 --- a/libdino/src/application.vala +++ b/libdino/src/application.vala @@ -15,6 +15,8 @@ public interface Dino.Application : GLib.Application { { null } }; + public abstract void handle_uri(string jid, string query, Gee.Map<string, string> options); + public void init() throws Error { if (DirUtils.create_with_parents(get_storage_dir(), 0700) == -1) { throw new Error(-1, 0, "Could not create storage dir \"%s\": %s", get_storage_dir(), FileUtils.error_from_errno(errno).to_string()); @@ -38,6 +40,40 @@ public interface Dino.Application : GLib.Application { stream_interaction.connection_manager.log_options = print_xmpp; restore(); }); + open.connect((files, hint) => { + if (files.length != 1) { + warning("Can't handle more than one URI at once."); + return; + } + File file = files[0]; + if (!file.has_uri_scheme("xmpp")) { + warning("xmpp:-URI expected"); + return; + } + string uri = file.get_uri(); + if (!uri.contains(":")) { + warning("Invalid URI"); + return; + } + string r = uri.split(":", 2)[1]; + string[] m = r.split("?", 2); + string jid = m[0]; + while (jid[0] == '/') { + jid = jid.substring(1); + } + string query = "message"; + Gee.Map<string, string> options = new Gee.HashMap<string,string>(); + if (m.length == 2) { + string[] cmds = m[1].split(";"); + query = cmds[0]; + for (int i = 1; i < cmds.length; ++i) { + string[] opt = cmds[i].split("=", 2); + options[opt[0]] = opt.length == 2 ? opt[1] : ""; + } + } + activate(); + handle_uri(jid, query, options); + }); add_main_option_entries(options); } diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala index 33208786..6b0db782 100644 --- a/main/src/ui/application.vala +++ b/main/src/ui/application.vala @@ -14,6 +14,7 @@ public class Dino.Ui.Application : Gtk.Application, Dino.Application { public SearchPathGenerator? search_path_generator { get; set; } public Application() throws Error { + Object(application_id: "im.dino.Dino", flags: ApplicationFlags.HANDLES_OPEN); init(); Notify.init("dino"); Environment.set_application_name("Dino"); @@ -21,15 +22,25 @@ public class Dino.Ui.Application : Gtk.Application, Dino.Application { IconTheme.get_default().add_resource_path("/im/dino/icons"); activate.connect(() => { - create_set_app_menu(); - window = new UnifiedWindow(this, stream_interaction); - notifications = new Notifications(stream_interaction, window); - notifications.start(); - notifications.conversation_selected.connect(window.on_conversation_selected); + if (window == null) { + create_set_app_menu(); + window = new UnifiedWindow(this, stream_interaction); + notifications = new Notifications(stream_interaction, window); + notifications.start(); + notifications.conversation_selected.connect(window.on_conversation_selected); + } window.present(); }); } + public void handle_uri(string jid, string query, Gee.Map<string, string> options) { + switch (query) { + case "message": + // TODO + break; + } + } + private void show_accounts_window() { ManageAccounts.Dialog dialog = new ManageAccounts.Dialog(stream_interaction, db); dialog.set_transient_for(window); |