ble_data_struct/windows/
buffer.rs

1#[cfg(target_os = "windows")]
2use windows::{
3    core::Error,
4    Storage::Streams::{DataReader, DataWriter, IBuffer},
5};
6
7/// Convert [`IBuffer`] to [`Vec<u8>`].
8///
9/// # Examples
10///
11/// ```
12/// use windows::Storage::Streams::DataWriter;
13/// use ble_data_struct::windows::buffer::i_buffer_to_vec;
14///
15/// let data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].to_vec();
16/// let data_writer = DataWriter::new().unwrap();
17/// data_writer.WriteBytes(&data).unwrap();
18/// let buffer = data_writer.DetachBuffer().unwrap();
19///
20/// let result = i_buffer_to_vec(buffer);
21/// assert!(result.is_ok());
22/// assert_eq!(data.to_vec(), result.unwrap());
23/// ```
24#[cfg(target_os = "windows")]
25pub fn i_buffer_to_vec(i_buffer: IBuffer) -> Result<Vec<u8>, Error> {
26    let reader = match DataReader::FromBuffer(&i_buffer) {
27        Ok(reader) => reader,
28        Err(error) => return Err(error),
29    };
30
31    let length = match reader.UnconsumedBufferLength() {
32        Ok(length) => length as u8,
33        Err(error) => return Err(error),
34    };
35
36    let mut read_buffer = vec![0u8; length as usize];
37    match reader.ReadBytes(read_buffer.as_mut()) {
38        Ok(_) => Ok(read_buffer),
39        Err(error) => Err(error),
40    }
41}
42
43/// Convert [`Vec<u8>`] to [`IBuffer`].
44///
45/// # Examples
46///
47/// ```
48/// use windows::Storage::Streams::{DataReader, DataWriter};
49/// use ble_data_struct::windows::buffer::vec_to_i_buffer;
50///
51/// let data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].to_vec();
52/// 
53/// let result = vec_to_i_buffer(&data);
54/// assert!(result.is_ok());
55/// 
56/// let i_buffer = result.unwrap();
57/// let reader = DataReader::FromBuffer(&i_buffer).unwrap();
58/// let length = reader.UnconsumedBufferLength().unwrap();
59/// let mut read_buffer = vec![0u8; length as usize];
60/// reader.ReadBytes(read_buffer.as_mut()).unwrap();
61/// assert_eq!(data.to_vec(), read_buffer);
62/// ```
63#[cfg(target_os = "windows")]
64pub fn vec_to_i_buffer(vec: &Vec<u8>) -> Result<IBuffer, Error> {
65    let data_writer = match DataWriter::new() {
66        Ok(writer) => writer,
67        Err(error) => return Err(error),
68    };
69
70    match data_writer.WriteBytes(&vec) {
71        Err(error) => return Err(error),
72        _ => {}
73    }
74
75    match data_writer.DetachBuffer() {
76        Ok(buffer) => Ok(buffer),
77        Err(error) => Err(error),
78    }
79}
80
81#[cfg(target_os = "windows")]
82#[cfg(test)]
83mod tests {
84    use windows::Storage::Streams::{DataReader, DataWriter};
85
86    use crate::windows::buffer::{i_buffer_to_vec, vec_to_i_buffer};
87
88    #[test]
89    fn test_i_buffer_to_vec() {
90        let data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].to_vec();
91        let data_writer = DataWriter::new().unwrap();
92        data_writer.WriteBytes(&data).unwrap();
93        let buffer = data_writer.DetachBuffer().unwrap();
94
95        let result = i_buffer_to_vec(buffer);
96        assert!(result.is_ok());
97        assert_eq!(data.to_vec(), result.unwrap());
98    }
99
100    #[test]
101    fn test_vec_to_i_buffer() {
102        let data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].to_vec();
103
104        let result = vec_to_i_buffer(&data);
105        assert!(result.is_ok());
106
107        let i_buffer = result.unwrap();
108        let reader = DataReader::FromBuffer(&i_buffer).unwrap();
109        let length = reader.UnconsumedBufferLength().unwrap();
110        let mut read_buffer = vec![0u8; length as usize];
111        reader.ReadBytes(read_buffer.as_mut()).unwrap();
112        assert_eq!(data.to_vec(), read_buffer);
113    }
114}