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}