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
98
99
100
101
102
103
104
105
106
107
108
use std::io::{Read, Write};
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use super::Result;
use io::read_full;
const DEFAULT_HEADER_LENGTH: u16 = 54;
#[derive(Clone, Debug, PartialEq)]
pub struct Vlr {
pub reserved: u16,
pub user_id: [u8; 16],
pub record_id: u16,
pub record_length_after_header: u16,
pub description: [u8; 32],
pub record: Vec<u8>,
}
impl Vlr {
pub fn read_from<R: Read>(reader: &mut R) -> Result<Vlr> {
let mut vlr = Vlr::new();
vlr.reserved = try!(reader.read_u16::<LittleEndian>());
try!(read_full(reader, &mut vlr.user_id));
vlr.record_id = try!(reader.read_u16::<LittleEndian>());
vlr.record_length_after_header = try!(reader.read_u16::<LittleEndian>());
try!(read_full(reader, &mut vlr.description));
vlr.record = vec![0; vlr.record_length_after_header as usize];
try!(read_full(reader, &mut vlr.record));
Ok(vlr)
}
pub fn new() -> Vlr {
Vlr {
reserved: 0,
user_id: [0; 16],
record_id: 0,
record_length_after_header: 0,
description: [0; 32],
record: Vec::new(),
}
}
pub fn len(&self) -> u32 {
DEFAULT_HEADER_LENGTH as u32 + self.record.len() as u32
}
pub fn write_to<W: Write>(&self, writer: &mut W) -> Result<u32> {
try!(writer.write_u16::<LittleEndian>(self.reserved));
try!(writer.write_all(&self.user_id));
try!(writer.write_u16::<LittleEndian>(self.record_id));
try!(writer.write_u16::<LittleEndian>(self.record_length_after_header));
try!(writer.write_all(&self.description));
try!(writer.write_all(&self.record[..]));
Ok(DEFAULT_HEADER_LENGTH as u32 + self.record_length_after_header as u32)
}
}