Add connection_status signal to Client

This commit is contained in:
Camden Dixie O'Brien 2025-03-02 15:12:19 +00:00
parent 10a7fe5c82
commit 708343c37f
3 changed files with 30 additions and 5 deletions

View File

@ -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 {

View File

@ -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 {

View File

@ -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();
}