aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/statetracker/Cargo.toml2
-rw-r--r--examples/statetracker/src/command.rs4
-rw-r--r--examples/statetracker/src/connect.rs18
-rw-r--r--examples/statetracker/src/main.rs32
-rw-r--r--examples/statetracker/src/server.rs16
5 files changed, 54 insertions, 18 deletions
diff --git a/examples/statetracker/Cargo.toml b/examples/statetracker/Cargo.toml
index d831544..3ac9668 100644
--- a/examples/statetracker/Cargo.toml
+++ b/examples/statetracker/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2018"
[dependencies]
-libquassel = { path = "../../", features = ["framing", "all-quassel-features"] }
+libquassel = { path = "../../", features = ["framing", "all-quassel-features", "client", "server"] }
druid = { git = "https://github.com/linebender/druid", features = ["im"] }
diff --git a/examples/statetracker/src/command.rs b/examples/statetracker/src/command.rs
index 2d83edf..09b49d7 100644
--- a/examples/statetracker/src/command.rs
+++ b/examples/statetracker/src/command.rs
@@ -7,11 +7,13 @@ use libquassel::{
primitive::VariantMap,
};
+use crate::server::Direction;
+
pub const CONNECT: Selector = Selector::new("connect");
pub const ADD_MESSAGE: Selector<SingleUse<crate::Message>> = Selector::new("add_message");
pub const ALIASMANAGER_INIT: Selector<SingleUse<AliasManager>> = Selector::new("aliasmanager_init");
-pub const ALIASMANAGER_UPDATE: Selector<SingleUse<SyncMessage>> =
+pub const ALIASMANAGER_UPDATE: Selector<SingleUse<(Direction, SyncMessage)>> =
Selector::new("aliasmanager_update");
pub const ALIASMANAGER_ADD_ALIAS: Selector<SingleUse<Alias>> =
Selector::new("aliasmanager_add_alias");
diff --git a/examples/statetracker/src/connect.rs b/examples/statetracker/src/connect.rs
index 9298b15..7b207cd 100644
--- a/examples/statetracker/src/connect.rs
+++ b/examples/statetracker/src/connect.rs
@@ -11,7 +11,7 @@ use tokio_util::codec::Framed;
use tracing::debug;
use crate::{
- server::{ClientState, Server},
+ server::{ClientState, Direction, Server},
StateTracker,
};
@@ -69,8 +69,20 @@ impl StateTracker {
let c_state = ClientState::Handshake;
tokio::join!(
- Server::run(s_stream, c_sink, s_state, ctx.clone(), "server -> client"),
- Server::run(c_stream, s_sink, c_state, ctx.clone(), "client -> server")
+ Server::run(
+ s_stream,
+ c_sink,
+ s_state,
+ ctx.clone(),
+ Direction::ServerToClient
+ ),
+ Server::run(
+ c_stream,
+ s_sink,
+ c_state,
+ ctx.clone(),
+ Direction::ClientToServer
+ )
);
});
});
diff --git a/examples/statetracker/src/main.rs b/examples/statetracker/src/main.rs
index 3177b39..65ee4ce 100644
--- a/examples/statetracker/src/main.rs
+++ b/examples/statetracker/src/main.rs
@@ -10,12 +10,15 @@ use druid::{
};
use druid::{AppLauncher, Data, Env, Lens, LocalizedString, Widget, WidgetExt, WindowDesc};
-use libquassel::message::objects::AliasManager;
-use libquassel::message::NetworkMap;
+use libquassel::message::{NetworkMap, StatefulSyncableServer};
+use libquassel::{
+ message::{objects::AliasManager, StatefulSyncableClient},
+ session::Session,
+};
use tracing::debug;
-use crate::server::{Message, ServerWidget};
+use crate::server::{Direction, Message, ServerWidget};
const SPACING: f64 = 10.0;
@@ -98,8 +101,6 @@ impl AppDelegate<StateTracker> for StateTrackerDelegate {
return druid::Handled::Yes;
} else if let Some(msg) = cmd.get(command::ADD_MESSAGE) {
- debug!("got ADD_MESSAGE command");
-
let list = Arc::make_mut(&mut data.messages);
list.push(msg.take().unwrap());
} else if let Some(alias) = cmd.get(command::ALIASMANAGER_ADD_ALIAS) {
@@ -109,9 +110,18 @@ impl AppDelegate<StateTracker> for StateTrackerDelegate {
} else if let Some(alias_manager) = cmd.get(command::ALIASMANAGER_INIT) {
data.alias_manager = Arc::new(alias_manager.take().unwrap());
} else if let Some(msg) = cmd.get(command::ALIASMANAGER_UPDATE) {
- let syncer = data.syncer.clone();
+ let (direction, msg) = msg.take().unwrap();
+
+ debug!("direction: {:#?}, msg: {:#?}", direction, msg);
+
let mut alias_manager = Arc::make_mut(&mut data.alias_manager).clone();
- alias_manager.handle_syncmessage(syncer, msg.take().unwrap());
+
+ if direction == Direction::ServerToClient {
+ StatefulSyncableClient::sync(&mut alias_manager, &data, msg);
+ } else {
+ StatefulSyncableServer::sync(&mut alias_manager, &data, msg);
+ }
+
data.alias_manager = Arc::new(alias_manager);
}
@@ -119,10 +129,16 @@ impl AppDelegate<StateTracker> for StateTrackerDelegate {
}
}
+// impl Session for StateTracker {
+// fn alias_manager(&mut self) -> &mut AliasManager {
+// &mut Arc::make_mut(&mut self.alias_manager).clone()
+// }
+// }
+
// TODO make this somehow deref or smth
#[derive(Clone)]
pub struct Syncer;
-impl libquassel::message::SyncProxy for Syncer {
+impl libquassel::message::SyncProxy for StateTracker {
fn sync(
&self,
class_name: &str,
diff --git a/examples/statetracker/src/server.rs b/examples/statetracker/src/server.rs
index 6d56662..63b36f7 100644
--- a/examples/statetracker/src/server.rs
+++ b/examples/statetracker/src/server.rs
@@ -93,6 +93,12 @@ impl Data for Message {
}
}
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum Direction {
+ ServerToClient,
+ ClientToServer,
+}
+
impl Server {
pub async fn init(
&self,
@@ -116,7 +122,7 @@ impl Server {
mut sink: SplitSink<Framed<TcpStream, QuasselCodec>, Vec<u8>>,
mut state: ClientState,
ctx: ExtEventSink,
- direction: &str,
+ direction: Direction,
) {
// Start event loop
while let Some(msg) = stream.next().await {
@@ -141,7 +147,7 @@ impl Server {
async fn handle_login_message(
buf: &[u8],
state: &mut ClientState,
- direction: &str,
+ direction: Direction,
_ctx: ExtEventSink,
) -> Result<Message, Error> {
use libquassel::HandshakeDeserialize;
@@ -149,7 +155,7 @@ impl Server {
trace!(target: "handshakemessage", "Received bytes: {:x?}", buf);
match HandshakeMessage::parse(buf) {
Ok((_size, res)) => {
- info!("{}: {:#?}", direction, res);
+ // info!("{}: {:#?}", direction, res);
match res {
HandshakeMessage::SessionInit(_) => *state = ClientState::Connected,
@@ -165,7 +171,7 @@ impl Server {
async fn handle_message(
buf: &[u8],
- _direction: &str,
+ direction: Direction,
ctx: ExtEventSink,
) -> Result<Message, Error> {
use libquassel::deserialize::*;
@@ -182,7 +188,7 @@ impl Server {
"update" => ctx
.submit_command(
command::ALIASMANAGER_UPDATE,
- SingleUse::new(msg),
+ SingleUse::new((direction, msg)),
Target::Global,
)
.unwrap(),