Add connection_status signal to Client
This commit is contained in:
parent
10a7fe5c82
commit
708343c37f
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -8,14 +8,18 @@ namespace StudySystemClient {
|
||||
|
||||
private SessionFactory session_factory;
|
||||
private ReceiveCallback receive_callback;
|
||||
private Connection.StatusCallback status_callback;
|
||||
private Session? session;
|
||||
private AsyncQueue<OutgoingMessage> 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<OutgoingMessage>();
|
||||
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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user