diff --git a/src/mconnect/device.vala b/src/mconnect/device.vala index 5d6877a..0a059b7 100644 --- a/src/mconnect/device.vala +++ b/src/mconnect/device.vala @@ -25,6 +25,8 @@ using Gee; */ class Device : Object { + public const uint PAIR_TIMEOUT = 30; + public signal void paired(bool pair); public signal void connected(); public signal void disconnected(); @@ -53,9 +55,11 @@ class Device : Object { private set; default = null; } + public string public_key {get; private set; default = ""; } // set to true if pair request was sent private bool _pair_in_progress = false; + private uint _pair_timeout_source = 0; private DeviceChannel _channel = null; @@ -179,10 +183,27 @@ class Device : Object { if (expect_response == true) _pair_in_progress = true; + + // pairing timeout + _pair_timeout_source = Timeout.add_seconds(PAIR_TIMEOUT, + this.pair_timeout); + // send request yield _channel.send(Packet.new_pair(pubkey)); } } + private bool pair_timeout() { + warning("pair request timeout"); + + _pair_timeout_source = 0; + + // handle failed pairing + handle_pair(false, ""); + + // remove timeout source + return false; + } + public void pair_if_needed() { if (is_paired == false && _pair_in_progress == false) this.pair.begin(); @@ -299,6 +320,26 @@ class Device : Object { assert(pkt.pkt_type == Packet.PAIR); bool pair = pkt.body.get_boolean_member("pair"); + string public_key = ""; + if (pair) { + public_key = pkt.body.get_string_member("publicKey"); + } + + handle_pair(pair, public_key); + } + + /** + * handle_pair: + * @pair: pairing status + * @public_key: device public key + * + * Update device pair status. + */ + private void handle_pair(bool pair, string public_key) { + if (this._pair_timeout_source != 0) { + Source.remove(_pair_timeout_source); + this._pair_timeout_source = 0; + } debug("pair in progress: %s is paired: %s pair: %s", _pair_in_progress.to_string(), this.is_paired.to_string(), @@ -325,6 +366,13 @@ class Device : Object { } } + if (pair) { + // update public key + this.public_key = public_key; + } else { + this.public_key = ""; + } + // emit signal paired(is_paired); }