aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdino/src/application.vala36
-rw-r--r--main/src/ui/application.vala21
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);