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 class Client {
|
||||||
|
public signal void connection_status(bool connected);
|
||||||
|
|
||||||
private Connection connection;
|
private Connection connection;
|
||||||
|
|
||||||
public Client(string cert_dir) throws Error {
|
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 {
|
public async void ping() throws ClientError {
|
||||||
|
@ -1,15 +1,22 @@
|
|||||||
namespace StudySystemClient {
|
namespace StudySystemClient {
|
||||||
public class Connection {
|
public class Connection {
|
||||||
|
public delegate void StatusCallback(bool connected);
|
||||||
|
|
||||||
|
private StatusCallback status_callback;
|
||||||
private SessionManager session_manager;
|
private SessionManager session_manager;
|
||||||
private TransactionManager transaction_manager;
|
private TransactionManager transaction_manager;
|
||||||
private Worker worker;
|
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 loopback = new InetAddress.loopback(SocketFamily.IPV6);
|
||||||
var session_factory
|
var session_factory
|
||||||
= new SessionFactory(loopback, 12888, cert_dir);
|
= new SessionFactory(loopback, 12888, cert_dir);
|
||||||
|
this.status_callback = (owned) status_callback;
|
||||||
session_manager = new SessionManager(
|
session_manager = new SessionManager(
|
||||||
session_factory, (msg) => receive(msg));
|
session_factory, (msg) => receive(msg),
|
||||||
|
(connected) => status_changed(connected));
|
||||||
transaction_manager = new TransactionManager();
|
transaction_manager = new TransactionManager();
|
||||||
worker = new Worker(session_manager);
|
worker = new Worker(session_manager);
|
||||||
}
|
}
|
||||||
@ -35,6 +42,13 @@ namespace StudySystemClient {
|
|||||||
return false;
|
return false;
|
||||||
}, GLib.Priority.DEFAULT_IDLE);
|
}, GLib.Priority.DEFAULT_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void status_changed(bool connected) {
|
||||||
|
Idle.add(() => {
|
||||||
|
status_callback(connected);
|
||||||
|
return false;
|
||||||
|
}, GLib.Priority.DEFAULT_IDLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Continuation {
|
private class Continuation {
|
||||||
|
@ -8,14 +8,18 @@ namespace StudySystemClient {
|
|||||||
|
|
||||||
private SessionFactory session_factory;
|
private SessionFactory session_factory;
|
||||||
private ReceiveCallback receive_callback;
|
private ReceiveCallback receive_callback;
|
||||||
|
private Connection.StatusCallback status_callback;
|
||||||
private Session? session;
|
private Session? session;
|
||||||
private AsyncQueue<OutgoingMessage> queue;
|
private AsyncQueue<OutgoingMessage> queue;
|
||||||
private uint reconnect_wait_ms;
|
private uint reconnect_wait_ms;
|
||||||
|
|
||||||
public SessionManager(SessionFactory session_factory,
|
public SessionManager(
|
||||||
owned ReceiveCallback receive_callback) {
|
SessionFactory session_factory,
|
||||||
|
owned ReceiveCallback receive_callback,
|
||||||
|
owned Connection.StatusCallback status_callback) {
|
||||||
this.session_factory = session_factory;
|
this.session_factory = session_factory;
|
||||||
this.receive_callback = (owned) receive_callback;
|
this.receive_callback = (owned) receive_callback;
|
||||||
|
this.status_callback = (owned) status_callback;
|
||||||
this.session = null;
|
this.session = null;
|
||||||
queue = new AsyncQueue<OutgoingMessage>();
|
queue = new AsyncQueue<OutgoingMessage>();
|
||||||
reconnect_wait_ms = INIT_RECONNECT_WAIT_MS;
|
reconnect_wait_ms = INIT_RECONNECT_WAIT_MS;
|
||||||
@ -40,6 +44,7 @@ namespace StudySystemClient {
|
|||||||
if (msg.should_retry())
|
if (msg.should_retry())
|
||||||
queue.push(msg);
|
queue.push(msg);
|
||||||
session = null;
|
session = null;
|
||||||
|
status_callback(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void try_start_session() {
|
private void try_start_session() {
|
||||||
@ -47,7 +52,9 @@ namespace StudySystemClient {
|
|||||||
session = session_factory.start_session();
|
session = session_factory.start_session();
|
||||||
session.received.connect((msg) => receive_callback(msg));
|
session.received.connect((msg) => receive_callback(msg));
|
||||||
reconnect_wait_ms = INIT_RECONNECT_WAIT_MS;
|
reconnect_wait_ms = INIT_RECONNECT_WAIT_MS;
|
||||||
|
status_callback(true);
|
||||||
} catch (Error _) {
|
} catch (Error _) {
|
||||||
|
status_callback(false);
|
||||||
Thread.usleep(1000 * reconnect_wait_ms);
|
Thread.usleep(1000 * reconnect_wait_ms);
|
||||||
update_reconnect_wait();
|
update_reconnect_wait();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user