1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use std::io::{Read, Write};
use cast::cast_channel;
use utils;
use errors::Error;
#[derive(Debug)]
pub enum CastMessagePayload {
String(String),
Binary(Vec<u8>),
}
#[derive(Debug)]
pub struct CastMessage {
pub namespace: String,
pub source: String,
pub destination: String,
pub payload: CastMessagePayload,
}
pub struct MessageManager;
impl MessageManager {
pub fn send<W>(writer: &mut W, message: CastMessage) -> Result<(), Error> where W: Write {
let mut raw_message = cast_channel::CastMessage::new();
raw_message.set_protocol_version(cast_channel::CastMessage_ProtocolVersion::CASTV2_1_0);
raw_message.set_namespace(message.namespace);
raw_message.set_source_id(message.source);
raw_message.set_destination_id(message.destination);
match message.payload {
CastMessagePayload::String(payload) => {
raw_message.set_payload_type(cast_channel::CastMessage_PayloadType::STRING);
raw_message.set_payload_utf8(payload);
},
CastMessagePayload::Binary(payload) => {
raw_message.set_payload_type(cast_channel::CastMessage_PayloadType::BINARY);
raw_message.set_payload_binary(payload);
},
};
let message_content_buffer = try!(utils::to_vec(&raw_message));
let message_length_buffer = try!(
utils::write_u32_to_buffer(message_content_buffer.len() as u32));
try!(writer.write(&message_length_buffer));
try!(writer.write(&message_content_buffer));
debug!("Message sent: {:?}", raw_message);
Ok(())
}
pub fn receive<T>(reader: &mut T) -> Result<CastMessage, Error> where T: Read {
let mut buffer: [u8; 4] = [0; 4];
try!(reader.read_exact(&mut buffer));
let length = try!(utils::read_u32_from_buffer(&buffer));
let mut buffer: Vec<u8> = Vec::with_capacity(length as usize);
let mut limited_reader = reader.take(length as u64);
try!(limited_reader.read_to_end(&mut buffer));
let raw_message = try!(
utils::from_vec::<cast_channel::CastMessage>(buffer.iter().cloned().collect()));
debug!("Message received: {:?}", raw_message);
Ok(CastMessage {
namespace: raw_message.get_namespace().to_owned(),
source: raw_message.get_source_id().to_owned(),
destination: raw_message.get_destination_id().to_owned(),
payload: match raw_message.get_payload_type() {
cast_channel::CastMessage_PayloadType::STRING => CastMessagePayload::String(
raw_message.get_payload_utf8().to_owned()),
cast_channel::CastMessage_PayloadType::BINARY => CastMessagePayload::Binary(
raw_message.get_payload_binary().to_owned()),
}
})
}
}