rdp/model/data.rs
1use std::io::{Write, Read, Cursor};
2use model::error::{RdpResult, RdpErrorKind, RdpError, Error};
3use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian, BigEndian};
4use indexmap::IndexMap;
5use std::collections::{HashSet, HashMap};
6
7
8/// All data type used
9///
10/// Allow us to retrieve correct data
11/// Into the message tree via cast! or cast_optional! macro
12///
13/// # Examples
14/// ```
15/// # #[macro_use]
16/// # extern crate rdp;
17/// # use rdp::model::data::{DataType, Component, U32};
18/// # fn main() {
19/// let message = component!(
20/// "header" => U32::LE(1234)
21/// );
22/// if let DataType::U32(header) = message["header"].visit() {
23/// assert_eq!(header, 1234)
24/// }
25/// else {
26/// panic!("Invalid cast")
27/// }
28/// # }
29/// ```
30pub enum DataType<'a> {
31 /// ALl component messages
32 /// Component is key value message
33 Component(&'a Component),
34 /// A trame message is vector of messages
35 Trame(&'a Trame),
36 /// Unsigned 32 bits integer
37 U32(u32),
38 /// Unsigned 16 bits integer
39 U16(u16),
40 /// 8 bits integer
41 U8(u8),
42 /// A slice is just a raw u8 of vector
43 Slice(&'a [u8]),
44 /// Optional value can be absent
45 None
46}
47
48
49/// Retrieve leaf value into a type tree
50///
51/// This is a facilitate macro use to visit a type tree
52/// and check and retrieve the inner value
53///
54/// # Example
55/// ```
56/// # #[macro_use]
57/// # extern crate rdp;
58/// # use rdp::model::data::{Component, DataType, U32};
59/// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
60/// # fn main() {
61/// let message = component!(
62/// "header" => U32::LE(1234)
63/// );
64/// let header = cast!(DataType::U32, message["header"]).unwrap();
65/// assert_eq!(header, 1234)
66/// # }
67/// ```
68#[macro_export]
69macro_rules! cast {
70 ($ident:path, $expr:expr) => (match $expr.visit() {
71 $ident(e) => Ok(e),
72 _ => Err(Error::RdpError(RdpError::new(RdpErrorKind::InvalidCast, "Invalid Cast")))
73 })
74}
75
76/// Allow to a son to inform parent of something special
77///
78/// IN tree type a son can control parser of a parent node
79/// by providing some type depend fields
80///
81/// This is control by the options function of Message Trait
82pub enum MessageOption {
83 /// You ask to skip a field
84 /// during reading operation
85 SkipField(String),
86 /// You ask to limit the size of reading buffer
87 /// for a particular field
88 Size(String, usize),
89 /// Non option
90 None
91}
92
93/// All is a message
94///
95/// A message can be Read or Write from a Stream
96///
97pub trait Message : Send {
98 /// Write node to the Stream
99 ///
100 /// Write current element into a writable stream
101 fn write(&self, writer: &mut dyn Write) -> RdpResult<()>;
102
103 /// Read node from stream
104 ///
105 /// Read and set current variable from readable stream
106 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()>;
107
108 /// Length in bytes of current element
109 fn length(&self) -> u64;
110
111 /// Cast value on Message Tree
112 ///
113 /// Visit value and try to return inner type
114 /// This is based on Tree visitor pattern
115 fn visit(&self) -> DataType;
116
117 /// Retrieve options of a subtype
118 ///
119 /// Allow subtype to show some options
120 /// That will impact current operation on parent
121 /// like skipping some fields of a component
122 fn options(&self) -> MessageOption;
123}
124
125/// u8 message
126///
127/// Implement Message trait for basic type u8
128impl Message for u8 {
129
130 /// Write u8 value into stream
131 /// # Example
132 ///
133 /// ```
134 /// # extern crate rdp;
135 /// # use rdp::model::data::Message;
136 /// # use std::io::Cursor;
137 /// # fn main() {
138 /// let mut s = Cursor::new(Vec::new());
139 /// let value : u8 = 8;
140 /// value.write(&mut s);
141 /// assert_eq!(*s.get_ref(), vec![8 as u8]);
142 /// # }
143 /// ```
144 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
145 Ok(writer.write_u8(*self)?)
146 }
147
148 /// Read u8 value from stream
149 /// # Example
150 ///
151 /// ```
152 /// # extern crate rdp;
153 /// # use rdp::model::data::Message;
154 /// # use std::io::Cursor;
155 /// # fn main () {
156 /// let mut stream = Cursor::new(vec![8]);
157 /// let mut value = 0 as u8;
158 /// value.read(&mut stream); // set the value according to stream content
159 /// assert_eq!(value, 8);
160 /// # }
161 /// ```
162 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
163 *self = reader.read_u8()?;
164 Ok(())
165 }
166
167 /// Size in byte of wrapped value
168 /// 1 in case of u8
169 /// # Example
170 /// ```
171 /// # extern crate rdp;
172 /// # use rdp::model::data::Message;
173 /// # fn main() {
174 /// let x : u8 = 0;
175 /// assert_eq!(x.length(), 1);
176 /// # }
177 /// ```
178 fn length(&self) -> u64 {
179 1
180 }
181
182 /// Use visitor pattern to retrieve
183 /// leaf value in case of node component
184 ///
185 /// # Example
186 ///
187 /// ```
188 /// # extern crate rdp;
189 /// # use rdp::model::data::{Message, DataType};
190 /// # fn main() {
191 /// let x : u8 = 8;
192 /// if let DataType::U8(value) = x.visit() {
193 /// assert_eq!(value, 8)
194 /// }
195 /// else {
196 /// panic!("Invalid cast");
197 /// }
198 /// # }
199 /// ```
200 fn visit(&self) -> DataType {
201 DataType::U8(*self)
202 }
203
204 /// Retrieve option of a subnode
205 ///
206 /// Allow a parent to retrieve some optional value
207 /// That will influence the current node operation
208 /// like skipping field of a component
209 ///
210 /// This kind of node have no option
211 fn options(&self) -> MessageOption {
212 MessageOption::None
213 }
214}
215
216/// Trame is just a list of boxed Message
217/// # Example
218///
219/// ```
220/// # #[macro_use]
221/// # extern crate rdp;
222/// # use rdp::model::data::{Trame, U32};
223/// # fn main() {
224/// let t = trame! [0 as u8, U32::BE(4)];
225/// # }
226/// ```
227pub type Trame = Vec<Box<dyn Message>>;
228
229/// Macro to easily init a new Trame of message
230/// # Example
231///
232/// ```
233/// # #[macro_use]
234/// # extern crate rdp;
235/// # use rdp::model::data::{Trame, U32};
236/// # fn main() {
237/// let t = trame! [0 as u8, U32::BE(4)];
238/// # }
239/// ```
240#[macro_export]
241macro_rules! trame {
242 () => { Trame::new() };
243 ($( $val: expr ),*) => {{
244 let mut vec = Trame::new();
245 $( vec.push(Box::new($val)); )*
246 vec
247 }}
248}
249/// Trame is a Message too
250impl Message for Trame {
251 /// Write a trame to a stream
252 ///
253 /// Write all subnode of the trame to the stream
254 /// This can be view as anonymous node
255 ///
256 /// # Example
257 ///
258 /// ```
259 /// # #[macro_use]
260 /// # extern crate rdp;
261 /// # use rdp::model::data::{Trame, U32, Message};
262 /// # use std::io::Cursor;
263 /// # fn main() {
264 /// let mut s = Cursor::new(Vec::new());
265 /// let x = trame![0 as u8, U32::LE(2)];
266 /// x.write(&mut s);
267 /// assert_eq!(s.into_inner(), [0, 2, 0, 0, 0])
268 /// # }
269 /// ```
270 fn write(&self, writer: &mut dyn Write) -> RdpResult<()>{
271 for v in self {
272 v.write(writer)?;
273 }
274 Ok(())
275 }
276
277 /// Read a trame from a stream
278 ///
279 /// Read all subnode from a stream
280 ///
281 /// # Example
282 ///
283 /// ```
284 /// # #[macro_use]
285 /// # extern crate rdp;
286 /// # use rdp::model::data::{Trame, U32, Message, DataType};
287 /// # use rdp::model::error::{RdpErrorKind, RdpError, Error, RdpResult};
288 /// # use std::io::Cursor;
289 /// # fn main() {
290 /// let mut s = Cursor::new(vec![8, 3, 0, 0, 0]);
291 /// let mut x = trame![0 as u8, U32::LE(0)];
292 /// x.read(&mut s);
293 /// assert_eq!(cast!(DataType::U8, x[0]).unwrap(), 8);
294 /// assert_eq!(cast!(DataType::U32, x[1]).unwrap(), 3);
295 /// # }
296 /// ```
297 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()>{
298 for v in self {
299 v.read(reader)?;
300 }
301 Ok(())
302 }
303
304 /// Length in byte of the entire trame
305 ///
306 /// # Example
307 /// ```
308 /// # #[macro_use]
309 /// # extern crate rdp;
310 /// # use rdp::model::data::{Trame, U32, Message};
311 /// # use std::io::Cursor;
312 /// # fn main() {
313 /// let mut s = Cursor::new(Vec::new());
314 /// let x = trame![0 as u8, U32::LE(2)];
315 /// x.write(&mut s);
316 /// assert_eq!(x.length(), 5)
317 /// # }
318 /// ```
319 fn length(&self) -> u64 {
320 let mut sum : u64 = 0;
321 for v in self {
322 sum += v.length();
323 }
324 sum
325 }
326
327 /// Allow to cast a message into trame
328 ///
329 /// # Example
330 /// ```
331 /// # #[macro_use]
332 /// # extern crate rdp;
333 /// # use rdp::model::data::{Trame, U32, Message, DataType};
334 /// # use rdp::model::error::{RdpErrorKind, RdpError, RdpResult, Error};
335 /// # use std::io::Cursor;
336 /// # fn main() {
337 /// let mut s = Cursor::new(vec![8, 3, 0, 0, 0, 0]);
338 /// let mut x = trame![trame![0 as u8, U32::LE(0)], 0 as u8];
339 /// x.read(&mut s);
340 /// let y = cast!(DataType::Trame, x[0]).unwrap();
341 /// assert_eq!(cast!(DataType::U32, y[1]).unwrap(), 3)
342 /// # }
343 /// ```
344 fn visit(&self) -> DataType {
345 DataType::Trame(self)
346 }
347
348 /// A trame have no options
349 fn options(&self) -> MessageOption {
350 MessageOption::None
351 }
352}
353
354/// A component is key value ordered
355pub type Component = IndexMap<String, Box<dyn Message>>;
356
357#[macro_export]
358macro_rules! component {
359 () => { Component::new() };
360 ($( $key: expr => $val: expr ),*) => {{
361 let mut map = Component::new();
362 $( map.insert($key.to_string(), Box::new($val)) ; )*
363 map
364 }}
365}
366
367impl Message for Component {
368 /// Write a component message
369 /// Useful to better reading structure
370 /// and have some dynamic option
371 ///
372 /// # Example
373 /// ```
374 /// # #[macro_use]
375 /// # extern crate rdp;
376 /// # use rdp::model::data::{Component, U32, Message, DataType};
377 /// # use std::io::Cursor;
378 /// # fn main() {
379 /// let mut s = Cursor::new(vec![]);
380 /// let mut x = component![
381 /// "field1" => 3 as u8,
382 /// "field2" => U32::LE(6)
383 /// ];
384 /// x.write(&mut s);
385 /// assert_eq!(s.into_inner(), [3, 6, 0, 0, 0])
386 /// # }
387 /// ```
388 fn write(&self, writer: &mut dyn Write) -> RdpResult<()>{
389 let mut filtering_key = HashSet::new();
390 for (name, value) in self.iter() {
391 // ignore filtering keys
392 if filtering_key.contains(name) {
393 continue;
394 }
395 value.write(writer)?;
396 if let MessageOption::SkipField(field) = value.options() {
397 filtering_key.insert(field);
398 }
399 }
400 Ok(())
401 }
402
403 /// Read a component base pattern
404 /// from a valid stream
405 ///
406 /// # Example
407 /// ```
408 /// # #[macro_use]
409 /// # extern crate rdp;
410 /// # use rdp::model::data::{Component, U32, Message, DataType};
411 /// # use rdp::model::error::{RdpError, Error, RdpResult, RdpErrorKind};
412 /// # use std::io::Cursor;
413 /// # fn main() {
414 /// let mut s = Cursor::new(vec![3, 6, 0, 0, 0]);
415 /// let mut x = component![
416 /// "field1" => 0 as u8,
417 /// "field2" => U32::LE(0)
418 /// ];
419 /// x.read(&mut s);
420 /// assert_eq!(cast!(DataType::U32, x["field2"]).unwrap(), 6)
421 /// # }
422 /// ```
423 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()>{
424 let mut filtering_key = HashSet::new();
425 let mut dynamic_size = HashMap::new();
426 for (name, value) in self.into_iter() {
427 // ignore filtering keys
428 if filtering_key.contains(name) {
429 continue;
430 }
431
432 if dynamic_size.contains_key(name) {
433 let mut local =vec![0; dynamic_size[name]];
434 reader.read_exact(&mut local)?;
435 value.read(&mut Cursor::new(local))?;
436 }
437 else {
438 value.read(reader)?;
439 }
440
441 match value.options() {
442 MessageOption::SkipField(field) => { filtering_key.insert(field); },
443 MessageOption::Size(field, size) => { dynamic_size.insert(field, size); },
444 MessageOption::None => ()
445 }
446
447 }
448 Ok(())
449 }
450
451 /// Compute the length in byte of the component
452 ///
453 /// # Example
454 /// ```
455 /// # #[macro_use]
456 /// # extern crate rdp;
457 /// # use rdp::model::data::{Component, U32, Message, DataType};
458 /// # use rdp::model::error::{RdpError, Error, RdpResult, RdpErrorKind};
459 /// # use std::io::Cursor;
460 /// # fn main() {
461 /// let mut s = Cursor::new(vec![3, 6, 0, 0, 0]);
462 /// let mut x = component![
463 /// "field1" => 0 as u8,
464 /// "field2" => U32::LE(0)
465 /// ];
466 /// x.read(&mut s);
467 /// assert_eq!(x.length(), 5)
468 /// # }
469 /// ```
470 fn length(&self) -> u64 {
471 let mut sum : u64 = 0;
472 let mut filtering_key = HashSet::new();
473 for (name, value) in self.iter() {
474 // ignore filtering keys
475 if filtering_key.contains(name) {
476 continue;
477 }
478 if let MessageOption::SkipField(field) = value.options() {
479 filtering_key.insert(field);
480 }
481 sum += value.length();
482 }
483 sum
484 }
485
486 /// Cast a dyn Message into component
487 ///
488 /// # Example
489 /// ```
490 /// # #[macro_use]
491 /// # extern crate rdp;
492 /// # use rdp::model::data::{Trame, Component, U32, Message, DataType};
493 /// # use rdp::model::error::{RdpErrorKind, RdpError, RdpResult, Error};
494 /// # use std::io::Cursor;
495 /// # fn main() {
496 /// let mut s = Cursor::new(vec![8, 3, 0, 0, 0, 0]);
497 /// let mut x = trame![
498 /// component![
499 /// "field1" => 0 as u8,
500 /// "field2" => U32::LE(0)
501 /// ],
502 /// 0 as u8
503 /// ];
504 /// x.read(&mut s);
505 /// let y = cast!(DataType::Component, x[0]).unwrap();
506 /// assert_eq!(cast!(DataType::U32, y["field2"]).unwrap(), 3)
507 /// # }
508 /// ```
509 fn visit(&self) -> DataType {
510 DataType::Component(self)
511 }
512
513 /// A component have no option by default
514 fn options(&self) -> MessageOption {
515 MessageOption::None
516 }
517}
518
519#[derive(Copy, Clone)]
520pub enum Value<Type> {
521 /// Big Endianness
522 BE(Type),
523 /// Little Endianness
524 LE(Type)
525}
526
527impl<Type: Copy + PartialEq> Value<Type> {
528 /// Return the inner value
529 ///
530 /// # Example
531 /// ```
532 /// use rdp::model::data::U32;
533 /// let x = U32::LE(4);
534 /// assert_eq!(x.inner(), 4);
535 /// ```
536 pub fn inner(&self) -> Type {
537 match self {
538 Value::<Type>::BE(e) | Value::<Type>::LE(e) => *e
539 }
540 }
541}
542
543impl<Type: Copy + PartialEq> PartialEq for Value<Type> {
544 /// Equality between all type
545 fn eq(&self, other: &Self) -> bool {
546 return self.inner() == other.inner()
547 }
548}
549
550/// Unsigned 16 bits message
551pub type U16 = Value<u16>;
552
553impl Message for U16 {
554
555 /// Write an unsigned 16 bits value
556 ///
557 /// # Example
558 /// ```
559 /// use std::io::Cursor;
560 /// use rdp::model::data::{U16, Message};
561 /// let mut s1 = Cursor::new(vec![]);
562 /// U16::LE(4).write(&mut s1).unwrap();
563 /// assert_eq!(s1.into_inner(), [4, 0]);
564 /// let mut s2 = Cursor::new(vec![]);
565 /// U16::BE(4).write(&mut s2).unwrap();
566 /// assert_eq!(s2.into_inner(), [0, 4]);
567 /// ```
568 fn write(&self, writer: &mut dyn Write) -> RdpResult<()>{
569 match self {
570 U16::BE(value) => Ok(writer.write_u16::<BigEndian>(*value)?),
571 U16::LE(value) => Ok(writer.write_u16::<LittleEndian>(*value)?)
572 }
573 }
574
575 /// Read an Unsigned 16 bits value
576 /// from a stream
577 ///
578 /// # Example
579 /// ```
580 /// use std::io::Cursor;
581 /// use rdp::model::data::{U16, Message};
582 /// let mut s1 = Cursor::new(vec![4, 0]);
583 /// let mut v1 = U16::LE(0);
584 /// v1.read(&mut s1).unwrap();
585 /// assert_eq!(v1.inner(), 4);
586 /// let mut s2 = Cursor::new(vec![0, 4]);
587 /// let mut v2 = U16::BE(0);
588 /// v2.read(&mut s2).unwrap();
589 /// assert_eq!(v2.inner(), 4);
590 /// ```
591 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()>{
592 match self {
593 U16::BE(value) => *value = reader.read_u16::<BigEndian>()?,
594 U16::LE(value) => *value = reader.read_u16::<LittleEndian>()?
595 }
596 Ok(())
597 }
598
599 /// Length of U16 is 2
600 fn length(&self) -> u64 {
601 2
602 }
603
604 /// Use to cast an anonymous Message into U16
605 ///
606 /// # Example
607 /// ```
608 /// # #[macro_use]
609 /// # extern crate rdp;
610 /// # use rdp::model::data::{Trame, Component, U16, Message, DataType};
611 /// # use rdp::model::error::{RdpErrorKind, RdpError, RdpResult, Error};
612 /// # use std::io::Cursor;
613 /// # fn main() {
614 /// let mut s = Cursor::new(vec![8, 0, 3]);
615 /// let mut x = trame![
616 /// U16::LE(0),
617 /// 0 as u8
618 /// ];
619 /// x.read(&mut s);
620 /// assert_eq!(cast!(DataType::U16, x[0]).unwrap(), 8)
621 /// # }
622 /// ```
623 fn visit(&self) -> DataType {
624 DataType::U16(self.inner())
625 }
626
627 /// No options
628 fn options(&self) -> MessageOption {
629 MessageOption::None
630 }
631}
632
633/// Unsigned 32 bits message
634pub type U32 = Value<u32>;
635
636impl Message for U32 {
637
638 /// Write an unsigned 32 bits value
639 ///
640 /// # Example
641 /// ```
642 /// use std::io::Cursor;
643 /// use rdp::model::data::{U32, Message};
644 /// let mut s1 = Cursor::new(vec![]);
645 /// U32::LE(4).write(&mut s1).unwrap();
646 /// assert_eq!(s1.into_inner(), [4, 0, 0, 0]);
647 /// let mut s2 = Cursor::new(vec![]);
648 /// U32::BE(4).write(&mut s2).unwrap();
649 /// assert_eq!(s2.into_inner(), [0, 0, 0, 4]);
650 /// ```
651 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
652 match self {
653 U32::BE(value) => Ok(writer.write_u32::<BigEndian>(*value)?),
654 U32::LE(value) => Ok(writer.write_u32::<LittleEndian>(*value)?)
655 }
656 }
657
658 /// Read an Unsigned 16 bits value
659 /// from a stream
660 ///
661 /// # Example
662 /// ```
663 /// use std::io::Cursor;
664 /// use rdp::model::data::{U32, Message};
665 /// let mut s1 = Cursor::new(vec![4, 0, 0, 0]);
666 /// let mut v1 = U32::LE(0);
667 /// v1.read(&mut s1).unwrap();
668 /// assert_eq!(v1.inner(), 4);
669 /// let mut s2 = Cursor::new(vec![0, 0, 0, 4]);
670 /// let mut v2 = U32::BE(0);
671 /// v2.read(&mut s2).unwrap();
672 /// assert_eq!(v2.inner(), 4);
673 /// ```
674 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
675 match self {
676 U32::BE(value) => *value = reader.read_u32::<BigEndian>()?,
677 U32::LE(value) => *value = reader.read_u32::<LittleEndian>()?
678 }
679 Ok(())
680 }
681
682 /// Length of the 32 bits is four
683 fn length(&self) -> u64 {
684 4
685 }
686
687 /// Use to cast an anonymous Message into U32
688 ///
689 /// # Example
690 /// ```
691 /// # #[macro_use]
692 /// # extern crate rdp;
693 /// # use rdp::model::data::{Trame, Component, U32, Message, DataType};
694 /// # use rdp::model::error::{RdpErrorKind, RdpError, RdpResult, Error};
695 /// # use std::io::Cursor;
696 /// # fn main() {
697 /// let mut s = Cursor::new(vec![8, 0, 0, 0, 3]);
698 /// let mut x = trame![
699 /// U32::LE(0),
700 /// 0 as u8
701 /// ];
702 /// x.read(&mut s);
703 /// assert_eq!(cast!(DataType::U32, x[0]).unwrap(), 8)
704 /// # }
705 /// ```
706 fn visit(&self) -> DataType {
707 DataType::U32(self.inner())
708 }
709
710 /// No options
711 fn options(&self) -> MessageOption {
712 MessageOption::None
713 }
714}
715
716/// This is a wrapper around
717/// a copyable message to check constness
718pub struct Check<T> {
719 value: T
720}
721
722impl<T> Check<T> {
723 /// Create a new check for a Message
724 ///
725 /// # Example
726 /// ```
727 /// use rdp::model::data::{Check, U16, Message};
728 /// use std::io::Cursor;
729 /// let mut s = Cursor::new(vec![4, 0]);
730 /// let mut x = Check::new(U16::LE(4));
731 /// assert!(!x.read(&mut s).is_err());
732 ///
733 /// let mut s2 = Cursor::new(vec![5, 0]);
734 /// assert!(x.read(&mut s2).is_err());
735 /// ```
736 pub fn new(value: T) -> Self{
737 Check {
738 value
739 }
740 }
741}
742
743impl<T: Message + Clone + PartialEq> Message for Check<T> {
744
745 /// Check values doesn't happen during write steps
746 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
747 self.value.write(writer)
748 }
749
750 /// Check value will be made during reading steps
751 ///
752 /// # Example
753 /// ```
754 /// use rdp::model::data::{Check, U16, Message};
755 /// use std::io::Cursor;
756 /// let mut s = Cursor::new(vec![4, 0]);
757 /// let mut x = Check::new(U16::LE(4));
758 /// assert!(!x.read(&mut s).is_err());
759 ///
760 /// let mut s2 = Cursor::new(vec![5, 0]);
761 /// assert!(x.read(&mut s2).is_err());
762 /// ```
763 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
764 let old = self.value.clone();
765 self.value.read(reader)?;
766 if old != self.value {
767 return Err(Error::RdpError(RdpError::new(RdpErrorKind::InvalidConst, "Invalid constness of data")))
768 }
769 Ok(())
770 }
771
772 /// This is the length of the inner value
773 fn length(&self) -> u64 {
774 self.value.length()
775 }
776
777 /// Same as visit of the inner value
778 ///
779 /// # Example
780 /// ```
781 /// # #[macro_use]
782 /// # extern crate rdp;
783 /// # use rdp::model::data::{Trame, Component, U32, Message, DataType, Check};
784 /// # use rdp::model::error::{RdpErrorKind, RdpError, RdpResult, Error};
785 /// # use std::io::Cursor;
786 /// # fn main() {
787 /// let mut s = Cursor::new(vec![8, 0, 0, 0, 3]);
788 /// let mut x = trame![
789 /// Check::new(U32::LE(8)),
790 /// 0 as u8
791 /// ];
792 /// x.read(&mut s);
793 /// assert_eq!(cast!(DataType::U32, x[0]).unwrap(), 8)
794 /// # }
795 /// ```
796 fn visit(&self) -> DataType {
797 self.value.visit()
798 }
799
800 /// No option
801 fn options(&self) -> MessageOption {
802 MessageOption::None
803 }
804}
805
806impl Message for Vec<u8> {
807 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
808 writer.write(self)?;
809 Ok(())
810 }
811
812 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
813 if self.len() == 0 {
814 reader.read_to_end(self)?;
815 }
816 else {
817 reader.read_exact(self)?;
818 }
819 Ok(())
820 }
821
822 fn length(&self) -> u64 {
823 self.len() as u64
824 }
825
826 fn visit(&self) -> DataType {
827 DataType::Slice(self.as_slice())
828 }
829
830 fn options(&self) -> MessageOption {
831 MessageOption::None
832 }
833}
834
835/// Add dynamic filtering capability for parent Node
836///
837/// Use by component node to create a filtering relationship
838/// between two or more fields
839///
840/// # Example
841/// ```
842/// # #[macro_use]
843/// # extern crate rdp;
844/// # use rdp::model::data::{Message, DynOption, Component, U32, DataType, MessageOption};
845/// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
846/// # use std::io::Cursor;
847/// # fn main() {
848/// let mut node = component![
849/// "flag" => DynOption::new(U32::LE(0), |flag| {
850/// if flag.inner() == 1 {
851/// return MessageOption::SkipField("depend".to_string());
852/// }
853/// return MessageOption::None;
854/// }),
855/// "depend" => U32::LE(0)
856/// ];
857/// let mut stream = Cursor::new(vec![0,0,0,0,1,0,0,0]);
858/// node.read(&mut stream).unwrap();
859/// assert_eq!(cast!(DataType::U32, node["depend"]).unwrap(), 1);
860///
861/// let mut stream = Cursor::new(vec![1,0,0,0,2,0,0,0]);
862/// node.read(&mut stream).unwrap();
863/// assert_ne!(cast!(DataType::U32, node["depend"]).unwrap(), 2);
864/// }
865/// ```
866pub type DynOptionFnSend<T> = dyn Fn(&T) -> MessageOption + Send;
867pub struct DynOption<T> {
868 inner: T,
869 filter: Box<DynOptionFnSend<T>>
870}
871
872/// The filter impl
873/// A filter work like a proxy pattern for an inner object
874impl<T> DynOption<T> {
875 /// Create a new filter from a callback
876 /// Callback may return a list of field name taht will be skip
877 /// by the component reader
878 ///
879 /// The following example add a dynamic skip option
880 /// # Example
881 /// ```
882 /// #[macro_use]
883 /// # extern crate rdp;
884 /// # use rdp::model::data::{Message, Component, DynOption, U32, MessageOption};
885 /// # fn main() {
886 /// let message = component![
887 /// "flag" => DynOption::new(U32::LE(1), |flag| {
888 /// if flag.inner() == 1 {
889 /// return MessageOption::SkipField("depend".to_string());
890 /// }
891 /// else {
892 /// return MessageOption::None;
893 /// }
894 /// }),
895 /// "depend" => U32::LE(0)
896 /// ];
897 /// assert_eq!(message.length(), 4);
898 /// # }
899 /// ```
900 ///
901 /// The next example use dynamic option to set a size to a value
902 ///
903 /// # Example
904 /// ```
905 /// #[macro_use]
906 /// # extern crate rdp;
907 /// # use rdp::model::data::{Message, Component, DynOption, U32, MessageOption, DataType};
908 /// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
909 /// # use std::io::Cursor;
910 /// # fn main() {
911 /// let mut message = component![
912 /// "Type" => DynOption::new(U32::LE(0), |flag| {
913 /// MessageOption::Size("Value".to_string(), flag.inner() as usize)
914 /// }),
915 /// "Value" => Vec::<u8>::new()
916 /// ];
917 /// let mut stream = Cursor::new(vec![1,0,0,0,1]);
918 /// message.read(&mut stream).unwrap();
919 /// assert_eq!(cast!(DataType::Slice, message["Value"]).unwrap().len(), 1);
920 /// # }
921 /// ```
922 pub fn new<F: 'static>(current: T, filter: F) -> Self
923 where F: Fn(&T) -> MessageOption, F: Send {
924 DynOption {
925 inner: current,
926 filter : Box::new(filter)
927 }
928 }
929}
930
931/// Dynamic option
932/// is a transparent object for the inner
933impl<T: Message> Message for DynOption<T> {
934 /// Transparent
935 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
936 self.inner.write(writer)
937 }
938
939 /// Transparent
940 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
941 self.inner.read(reader)
942 }
943
944 /// Transparent
945 fn length(&self) -> u64 {
946 self.inner.length()
947 }
948
949 /// Transparent
950 fn visit(&self) -> DataType {
951 self.inner.visit()
952 }
953
954 /// Transparent
955 fn options(&self) -> MessageOption {
956 (self.filter)(&self.inner)
957 }
958}
959
960/// Serialize a message into Vector
961pub fn to_vec(message: &dyn Message) -> Vec<u8> {
962 let mut stream = Cursor::new(Vec::new());
963 message.write(&mut stream).unwrap();
964 stream.into_inner()
965}
966
967
968#[macro_export]
969macro_rules! is_none {
970 ($expr:expr) => (match $expr.visit() {
971 DataType::None => true,
972 _ => false
973 })
974}
975
976
977/// This is an optional fields
978/// Actually always write but read if and only if the reader
979/// buffer could read the size of inner Message
980impl<T: Message> Message for Option<T> {
981 /// Write an optional message
982 /// Actually always try to write
983 ///
984 /// # Example
985 /// ```
986 /// use std::io::Cursor;
987 /// use rdp::model::data::Message;
988 /// let mut s1 = Cursor::new(vec![]);
989 /// Some(4).write(&mut s1);
990 /// assert_eq!(s1.into_inner(), [4]);
991 /// let mut s2 = Cursor::new(vec![]);
992 /// Option::<u8>::None.write(&mut s2);
993 /// assert_eq!(s2.into_inner(), [])
994 /// ```
995 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
996 Ok(if let Some(value) = self {
997 value.write(writer)?
998 })
999 }
1000
1001 /// Read an optional field
1002 /// Read the value if and only if there is enough space in the
1003 /// reader
1004 ///
1005 /// # Example
1006 /// ```
1007 /// #[macro_use]
1008 /// # extern crate rdp;
1009 /// # use std::io::Cursor;
1010 /// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
1011 /// # use rdp::model::data::{U32, Message, DataType, Component};
1012 /// # fn main() {
1013 /// let mut s1 = Cursor::new(vec![1, 0, 0, 0]);
1014 /// let mut x = Some(U32::LE(0));
1015 /// x.read(&mut s1);
1016 /// assert_eq!(1, cast!(DataType::U32, x).unwrap());
1017 ///
1018 /// let mut s2 = Cursor::new(vec![1, 0, 0]);
1019 /// let mut y = Some(U32::LE(0));
1020 /// y.read(&mut s2);
1021 /// assert!(y == None);
1022 ///
1023 /// let mut s3 = Cursor::new(vec![1, 0, 0]);
1024 /// // case in component
1025 /// let mut z = component![
1026 /// "optional" => Some(U32::LE(0))
1027 /// ];
1028 /// z.read(&mut s3);
1029 /// assert!(is_none!(z["optional"]))
1030 /// # }
1031 /// ```
1032 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
1033 if let Some(value) = self {
1034 if value.read(reader).is_err() {
1035 *self = None
1036 }
1037 }
1038 Ok(())
1039 }
1040
1041 /// This compute the length of the optionaln field
1042 /// # Example
1043 /// ```
1044 /// use rdp::model::data::{U32, Message};
1045 /// assert_eq!(Some(U32::LE(4)).length(), 4);
1046 /// assert_eq!(Option::<U32>::None.length(), 0);
1047 /// ```
1048 fn length(&self) -> u64 {
1049 if let Some(value) = self {
1050 value.length()
1051 }
1052 else {
1053 0
1054 }
1055 }
1056
1057 /// Visitor pattern for optional field
1058 /// # Example
1059 /// ```
1060 /// #[macro_use]
1061 /// # extern crate rdp;
1062 /// # use rdp::model::data::{U32, Message, DataType};
1063 /// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
1064 /// # fn main() {
1065 /// assert_eq!(4, cast!(DataType::U32, Some(U32::LE(4))).unwrap());
1066 /// assert!(is_none!(Option::<U32>::None));
1067 /// # }
1068 /// ```
1069 fn visit(&self) -> DataType {
1070 if let Some(value) = self {
1071 value.visit()
1072 }
1073 else {
1074 DataType::None
1075 }
1076 }
1077
1078 fn options(&self) -> MessageOption {
1079 MessageOption::None
1080 }
1081}
1082
1083/// Array dynamic trame
1084/// Means during read operation it will call
1085/// A factory callback to fill the result trame
1086pub type ArrayFnSend<T> = dyn Fn() -> T + Send;
1087pub struct Array<T> {
1088 /// This is the inner trame
1089 inner: Trame,
1090 /// function call to build each element of the array
1091 factory: Box<ArrayFnSend<T>>
1092}
1093
1094impl<T: Message> Array<T> {
1095 /// Create a new dynamic array
1096 /// This kind of array array are filled until the end
1097 /// of the stream, or sub stream if you use DynOption
1098 /// # Example
1099 /// ```
1100 /// #[macro_use]
1101 /// # extern crate rdp;
1102 /// # use std::io::Cursor;
1103 /// # use rdp::model::data::{U16, Array, Message, DataType};
1104 /// # use rdp::model::error::{Error, RdpError, RdpResult, RdpErrorKind};
1105 /// # fn main() {
1106 /// let mut s = Cursor::new(vec![0, 0, 1, 0]);
1107 /// let mut dyn_array = Array::new(|| U16::LE(0));
1108 /// dyn_array.read(&mut s);
1109 /// assert_eq!(dyn_array.as_ref().len(), 2);
1110 /// assert_eq!(cast!(DataType::U16, dyn_array.as_ref()[0]).unwrap(), 0);
1111 /// assert_eq!(cast!(DataType::U16, dyn_array.as_ref()[1]).unwrap(), 1);
1112 /// # }
1113 /// ```
1114 pub fn new<F: 'static>(factory: F) -> Self
1115 where F: Fn() -> T, F: Send {
1116 Array {
1117 inner: trame![],
1118 factory: Box::new(factory)
1119 }
1120 }
1121
1122 /// This is to be symmetric
1123 /// We can instanciate an array directly from a trame
1124 /// This is for the write side of the pattern
1125 pub fn from_trame(inner: Trame) -> Self {
1126 Array {
1127 inner,
1128 factory: Box::new(|| panic!("Try reading a non empty array"))
1129 }
1130 }
1131
1132 pub fn inner(&self) -> &Trame {
1133 &self.inner
1134 }
1135}
1136
1137/// Implement the message trait for Array
1138impl<T: 'static + Message> Message for Array<T> {
1139 /// Write an array
1140 /// You may not use even if it works prefer using trame object
1141 fn write(&self, writer: &mut dyn Write) -> RdpResult<()> {
1142 self.inner.write(writer)
1143 }
1144
1145 /// Read a dynamic array
1146 ///
1147 /// # Example
1148 /// ```
1149 /// use std::io::Cursor;
1150 /// use rdp::model::data::{U16, Array, Message};
1151 /// let mut s = Cursor::new(vec![0, 0, 1, 0]);
1152 /// let mut dyn_array = Array::new(|| U16::LE(0));
1153 /// dyn_array.read(&mut s);
1154 /// assert_eq!(dyn_array.as_ref().len(), 2)
1155 /// ```
1156 fn read(&mut self, reader: &mut dyn Read) -> RdpResult<()> {
1157 // Read dynamically until the end
1158 loop {
1159 let mut element = Some((self.factory)());
1160 element.read(reader)?;
1161 if let Some(e) = element {
1162 self.inner.push(Box::new(e))
1163 } else {
1164 break;
1165 }
1166 }
1167 Ok(())
1168 }
1169
1170 /// This is the length of the inner trame
1171 ///
1172 /// # Example
1173 /// ```
1174 /// use std::io::Cursor;
1175 /// use rdp::model::data::{U16, Array, Message};
1176 /// let mut s = Cursor::new(vec![0, 0, 1, 0]);
1177 /// let mut dyn_array = Array::new(|| U16::LE(0));
1178 /// dyn_array.read(&mut s);
1179 /// assert_eq!(dyn_array.length(), 4)
1180 /// ```
1181 fn length(&self) -> u64 {
1182 self.inner.length()
1183 }
1184
1185 /// Visit the inner trame
1186 /// It's means always return a slice
1187 /// Prefer using as_ref and visit
1188 fn visit(&self) -> DataType {
1189 self.inner.visit()
1190 }
1191
1192 /// This kind of message have no option
1193 fn options(&self) -> MessageOption {
1194 MessageOption::None
1195 }
1196}
1197
1198/// Convenient method to get access to the inner type
1199impl<T> AsRef<Trame> for Array<T> {
1200 fn as_ref(&self) -> &Trame {
1201 &self.inner
1202 }
1203}
1204
1205#[cfg(test)]
1206mod test {
1207 use super::*;
1208 use std::io::Cursor;
1209
1210 #[test]
1211 fn test_data_u8_write() {
1212 let mut stream = Cursor::new(Vec::<u8>::new());
1213 let x = 1 as u8;
1214 x.write(&mut stream).unwrap();
1215 assert_eq!(stream.get_ref().as_slice(), [1])
1216 }
1217}