diff --git a/client/src/client.vala b/client/src/client.vala index e383616..35a552d 100644 --- a/client/src/client.vala +++ b/client/src/client.vala @@ -5,10 +5,14 @@ namespace StudySystemClient { } public class Client { + public signal void connection_status(bool connected); + private Connection connection; public Client(string cert_dir) throws Error { - connection = new Connection(cert_dir); + connection = new Connection(cert_dir, (connected) => { + connection_status(connected); + }); } public async void ping() throws ClientError { diff --git a/client/src/connection.vala b/client/src/connection.vala index 1102dea..4e57af1 100644 --- a/client/src/connection.vala +++ b/client/src/connection.vala @@ -1,15 +1,22 @@ namespace StudySystemClient { public class Connection { + public delegate void StatusCallback(bool connected); + + private StatusCallback status_callback; private SessionManager session_manager; private TransactionManager transaction_manager; private Worker worker; - public Connection(string cert_dir) throws Error { + public Connection(string cert_dir, + owned StatusCallback status_callback) + throws Error { var loopback = new InetAddress.loopback(SocketFamily.IPV6); var session_factory = new SessionFactory(loopback, 12888, cert_dir); + this.status_callback = (owned) status_callback; session_manager = new SessionManager( - session_factory, (msg) => receive(msg)); + session_factory, (msg) => receive(msg), + (connected) => status_changed(connected)); transaction_manager = new TransactionManager(); worker = new Worker(session_manager); } @@ -35,6 +42,13 @@ namespace StudySystemClient { return false; }, GLib.Priority.DEFAULT_IDLE); } + + private void status_changed(bool connected) { + Idle.add(() => { + status_callback(connected); + return false; + }, GLib.Priority.DEFAULT_IDLE); + } } private class Continuation { diff --git a/client/src/session_manager.vala b/client/src/session_manager.vala index 61807d7..ac8dd04 100644 --- a/client/src/session_manager.vala +++ b/client/src/session_manager.vala @@ -8,14 +8,18 @@ namespace StudySystemClient { private SessionFactory session_factory; private ReceiveCallback receive_callback; + private Connection.StatusCallback status_callback; private Session? session; private AsyncQueue queue; private uint reconnect_wait_ms; - public SessionManager(SessionFactory session_factory, - owned ReceiveCallback receive_callback) { + public SessionManager( + SessionFactory session_factory, + owned ReceiveCallback receive_callback, + owned Connection.StatusCallback status_callback) { this.session_factory = session_factory; this.receive_callback = (owned) receive_callback; + this.status_callback = (owned) status_callback; this.session = null; queue = new AsyncQueue(); reconnect_wait_ms = INIT_RECONNECT_WAIT_MS; @@ -40,6 +44,7 @@ namespace StudySystemClient { if (msg.should_retry()) queue.push(msg); session = null; + status_callback(false); } private void try_start_session() { @@ -47,7 +52,9 @@ namespace StudySystemClient { session = session_factory.start_session(); session.received.connect((msg) => receive_callback(msg)); reconnect_wait_ms = INIT_RECONNECT_WAIT_MS; + status_callback(true); } catch (Error _) { + status_callback(false); Thread.usleep(1000 * reconnect_wait_ms); update_reconnect_wait(); }