aboutsummaryrefslogtreecommitdiff
path: root/src/message/handshake/sessioninit.rs
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2020-09-26 12:01:27 +0200
committerMax Audron <audron@cocaine.farm>2020-09-26 12:03:01 +0200
commit3bdae21716d10032f70a0a889070766bbbe4d141 (patch)
tree78a1ddf98601fbbc03a9375626dfa7923ab85521 /src/message/handshake/sessioninit.rs
parentadd parsing of signalproxy messages (diff)
split handshake.rs
Diffstat (limited to 'src/message/handshake/sessioninit.rs')
-rw-r--r--src/message/handshake/sessioninit.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/message/handshake/sessioninit.rs b/src/message/handshake/sessioninit.rs
new file mode 100644
index 0000000..eca4c10
--- /dev/null
+++ b/src/message/handshake/sessioninit.rs
@@ -0,0 +1,61 @@
+use crate::error::ProtocolError;
+use crate::primitive::{Variant, VariantList, VariantMap};
+use crate::{HandshakeDeserialize, HandshakeSerialize};
+
+use failure::Error;
+
+/// SessionInit is received along with ClientLoginAck to initialize that user Session
+// TODO Replace with proper types
+#[derive(Debug)]
+pub struct SessionInit {
+ /// List of all configured identities
+ identities: VariantList,
+ /// List of all existing buffers
+ buffers: VariantList,
+ /// Ids of all networks
+ network_ids: VariantList,
+}
+
+impl HandshakeSerialize for SessionInit {
+ fn serialize(&self) -> Result<Vec<u8>, Error> {
+ let mut values: VariantMap = VariantMap::with_capacity(1);
+ values.insert(
+ "MsgType".to_string(),
+ Variant::String("SessionInit".to_string()),
+ );
+ values.insert(
+ "Identities".to_string(),
+ Variant::VariantList(self.identities.clone()),
+ );
+ values.insert(
+ "BufferInfos".to_string(),
+ Variant::VariantList(self.buffers.clone()),
+ );
+ values.insert(
+ "NetworkIds".to_string(),
+ Variant::VariantList(self.network_ids.clone()),
+ );
+ return HandshakeSerialize::serialize(&values);
+ }
+}
+
+impl HandshakeDeserialize for SessionInit {
+ fn parse(b: &[u8]) -> Result<(usize, Self), Error> {
+ let (len, values): (usize, VariantMap) = HandshakeDeserialize::parse(b)?;
+
+ let msgtype = match_variant!(&values["MsgType"], Variant::StringUTF8);
+
+ if msgtype == "ClientLogin" {
+ return Ok((
+ len,
+ Self {
+ identities: match_variant!(values["Identities"], Variant::VariantList),
+ buffers: match_variant!(values["BufferInfos"], Variant::VariantList),
+ network_ids: match_variant!(values["NetworkIds"], Variant::VariantList),
+ },
+ ));
+ } else {
+ bail!(ProtocolError::WrongMsgType);
+ }
+ }
+}
>2021-10-20add async docs to macro crate and bump versionMax Audron-9/+10 2021-10-20change hook errors to be logged as warningsMax Audron-3/+3 2021-10-20fix configuration not loading correctly on release buildsMax Audron-8/+23 2021-10-19replace sedregex crate8-rework-sedMax Audron-20/+358 2021-10-19add formatting trait for irc codesMax Audron-0/+129 2021-10-17fix links in readmeMax Audron-2/+2