1use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
2use std::io::{self, Read, Write};
3
4use crate::proto::command_id::CommandID;
5use crate::proto::proto_traits::{ReadFrom, WriteTo};
6use crate::proto::request::{ReadRequest, ReadWriteRequest, WriteRequest};
7
8#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct SumupReadWriteRequest {
12 read_write_requests: Vec<ReadWriteRequest>,
13 command_id: CommandID,
14}
15
16#[derive(Debug, Clone, PartialEq)]
17struct ReadWriteAccessData {
18 index_group: u32,
19 index_offset: u32,
20 read_length: u32,
21 write_length: u32,
22}
23
24impl WriteTo for ReadWriteAccessData {
25 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
26 wtr.write_u32::<LittleEndian>(self.index_group)?;
27 wtr.write_u32::<LittleEndian>(self.index_offset)?;
28 wtr.write_u32::<LittleEndian>(self.read_length)?;
29 wtr.write_u32::<LittleEndian>(self.write_length)?;
30 Ok(())
31 }
32}
33
34impl ReadFrom for ReadWriteAccessData {
35 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
36 let index_group = read.read_u32::<LittleEndian>()?;
37 let index_offset = read.read_u32::<LittleEndian>()?;
38 let read_length = read.read_u32::<LittleEndian>()?;
39 let write_length = read.read_u32::<LittleEndian>()?;
40
41 Ok(ReadWriteAccessData {
42 index_group,
43 index_offset,
44 read_length,
45 write_length,
46 })
47 }
48}
49
50impl SumupReadWriteRequest {
51 pub fn new(read_write_requests: Vec<ReadWriteRequest>) -> Self {
52 SumupReadWriteRequest {
53 read_write_requests,
54 command_id: CommandID::ReadWrite,
55 }
56 }
57
58 pub fn expected_response_len(&self) -> u32 {
59 let mut result = 0;
60 for request in &self.read_write_requests {
61 result += request.read_length + 8; }
63 result
64 }
65
66 pub fn request_count(&self) -> u32 {
67 self.read_write_requests.len() as u32
68 }
69}
70
71impl WriteTo for SumupReadWriteRequest {
72 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
73 let mut access_data: Vec<u8> = Vec::new();
74 let mut data: Vec<u8> = Vec::new();
75 for request in &self.read_write_requests {
76 access_data.write_u32::<LittleEndian>(request.index_group)?;
77 access_data.write_u32::<LittleEndian>(request.index_offset)?;
78 access_data.write_u32::<LittleEndian>(request.read_length)?;
79 access_data.write_u32::<LittleEndian>(request.write_length)?;
80 data.write_all(request.data.as_slice())?;
81 }
82 access_data.append(&mut data);
83 wtr.write_all(&access_data)?;
84 Ok(())
85 }
86}
87
88impl ReadFrom for SumupReadWriteRequest {
89 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
90 let mut data_buf: Vec<u8> = Vec::new();
91 let mut read_write_access: Vec<ReadWriteAccessData> = Vec::new();
92
93 read.read_to_end(&mut data_buf)?;
95 let total_data_len = data_buf.len() as u32;
96 let mut access_data_length: u32 = 0;
97 let mut data_length: u32 = 0;
98 let mut data_buf = data_buf.as_slice();
99
100 for _ in 0..total_data_len / 16 {
102 let access_data = ReadWriteAccessData::read_from(&mut data_buf)?;
103 data_length += access_data.write_length;
104 read_write_access.push(access_data);
105 access_data_length += 16;
106 if (total_data_len - data_length - access_data_length) == 0 {
107 break;
108 }
109 }
110
111 let mut read_write_requests: Vec<ReadWriteRequest> = Vec::new();
113 for access in read_write_access {
114 let mut buf = vec![0; access.write_length as usize];
115 data_buf.read_exact(&mut buf)?;
116 read_write_requests.push(ReadWriteRequest::new(
117 access.index_group,
118 access.index_offset,
119 access.read_length,
120 buf,
121 ));
122 }
123 Ok(SumupReadWriteRequest::new(read_write_requests))
124 }
125}
126
127#[derive(Debug, Clone, PartialEq, Eq)]
130pub struct SumupReadRequest {
131 read_requests: Vec<ReadRequest>,
132 command_id: CommandID,
133}
134
135impl SumupReadRequest {
136 pub fn new(read_requests: Vec<ReadRequest>) -> Self {
137 SumupReadRequest {
138 read_requests,
139 command_id: CommandID::Read,
140 }
141 }
142
143 pub fn expected_response_len(&self) -> u32 {
144 let mut result = 0;
145 for request in &self.read_requests {
146 result += request.length + 8; }
148 result
149 }
150
151 pub fn request_count(&self) -> u32 {
152 self.read_requests.len() as u32
153 }
154}
155
156impl WriteTo for SumupReadRequest {
157 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
158 let mut access_data: Vec<u8> = Vec::new();
159 for request in &self.read_requests {
160 request.write_to(&mut access_data)?;
161 }
162 wtr.write_all(&access_data)?;
163 Ok(())
164 }
165}
166
167impl ReadFrom for SumupReadRequest {
168 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
169 let access_data_size: usize = 12; let mut read_requests: Vec<ReadRequest> = Vec::new();
171 loop {
172 let mut buf = vec![0; access_data_size];
173 match read.read_exact(&mut buf) {
174 Ok(_) => (),
175 Err(_) => {
176 break;
177 }
178 }
179 read_requests.push(ReadRequest::read_from(&mut buf.as_slice())?);
180 }
181 Ok(SumupReadRequest::new(read_requests))
182 }
183}
184
185#[derive(Debug, Clone, PartialEq, Eq)]
188pub struct SumupWriteRequest {
189 write_requests: Vec<WriteRequest>,
190 command_id: CommandID,
191}
192
193#[derive(Debug, Clone, PartialEq, Eq)]
194struct WriteAccessData {
195 index_group: u32,
196 index_offset: u32,
197 write_length: u32,
198}
199
200impl WriteTo for WriteAccessData {
201 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
202 wtr.write_u32::<LittleEndian>(self.index_group)?;
203 wtr.write_u32::<LittleEndian>(self.index_offset)?;
204 wtr.write_u32::<LittleEndian>(self.write_length)?;
205 Ok(())
206 }
207}
208
209impl ReadFrom for WriteAccessData {
210 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
211 let index_group = read.read_u32::<LittleEndian>()?;
212 let index_offset = read.read_u32::<LittleEndian>()?;
213 let write_length = read.read_u32::<LittleEndian>()?;
214
215 Ok(WriteAccessData {
216 index_group,
217 index_offset,
218 write_length,
219 })
220 }
221}
222
223impl SumupWriteRequest {
224 pub fn new(write_requests: Vec<WriteRequest>) -> Self {
225 SumupWriteRequest {
226 write_requests,
227 command_id: CommandID::Write,
228 }
229 }
230
231 pub fn request_count(&self) -> u32 {
232 self.write_requests.len() as u32
233 }
234
235 pub fn expected_response_len(&self) -> u32 {
236 self.request_count() * 4
237 }
238}
239
240impl WriteTo for SumupWriteRequest {
241 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
242 let mut access_data: Vec<u8> = Vec::new();
243 let mut data: Vec<u8> = Vec::new();
244 for request in &self.write_requests {
245 access_data.write_u32::<LittleEndian>(request.index_group)?;
246 access_data.write_u32::<LittleEndian>(request.index_offset)?;
247 access_data.write_u32::<LittleEndian>(request.length)?;
248 data.write_all(request.data.as_slice())?;
249 }
250 access_data.append(&mut data);
251 wtr.write_all(&access_data)?;
252 Ok(())
253 }
254}
255
256impl ReadFrom for SumupWriteRequest {
257 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
258 let mut data_buf: Vec<u8> = Vec::new();
259 let mut write_access: Vec<WriteAccessData> = Vec::new();
260
261 read.read_to_end(&mut data_buf)?;
263 let total_data_len = data_buf.len() as u32;
264 let mut access_data_length: u32 = 0;
265 let mut data_length: u32 = 0;
266 let mut data_buf = data_buf.as_slice();
267
268 for _ in 0..total_data_len / 12 {
270 let access_data = WriteAccessData::read_from(&mut data_buf)?;
271 data_length += access_data.write_length;
272 write_access.push(access_data);
273 access_data_length += 12;
274 if (total_data_len - data_length - access_data_length) == 0 {
275 break;
276 }
277 }
278
279 let mut write_requests: Vec<WriteRequest> = Vec::new();
281 for access in write_access {
282 let mut buf = vec![0; access.write_length as usize];
283 data_buf.read_exact(&mut buf)?;
284 write_requests.push(WriteRequest::new(
285 access.index_group,
286 access.index_offset,
287 buf,
288 ));
289 }
290 Ok(SumupWriteRequest::new(write_requests))
291 }
292}
293
294#[cfg(test)]
295mod tests {
296 use super::*;
297
298 #[test]
299 fn sumup_read_write_request_write_to_test() {
300 let mut rw_vec: Vec<ReadWriteRequest> = Vec::new();
301 let data: u32 = 111111;
302 let data: Vec<u8> = data.to_le_bytes().to_vec();
303 let rw_1 = ReadWriteRequest::new(259, 33, 4, data);
304 rw_vec.push(rw_1);
305
306 let data: u64 = 222222;
307 let data: Vec<u8> = data.to_le_bytes().to_vec();
308 let rw_2 = ReadWriteRequest::new(260, 22, 4, data);
309 rw_vec.push(rw_2);
310
311 let mut buffer: Vec<u8> = Vec::new();
312 SumupReadWriteRequest::new(rw_vec)
313 .write_to(&mut buffer)
314 .unwrap();
315
316 let compare = vec![
317 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0,
318 8, 0, 0, 0, 7, 178, 1, 0, 14, 100, 3, 0, 0, 0, 0, 0,
319 ];
320 assert_eq!(buffer, compare);
321 }
322
323 #[test]
324 fn sumup_read_write_request_read_from_test() {
325 let read_data = vec![
326 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0,
327 8, 0, 0, 0, 7, 178, 1, 0, 14, 100, 3, 0, 0, 0, 0, 0,
328 ];
329
330 let sum_read_write_request =
331 SumupReadWriteRequest::read_from(&mut read_data.as_slice()).unwrap();
332
333 let mut rw_vec: Vec<ReadWriteRequest> = Vec::new();
334 let data: u32 = 111111;
335 let data: Vec<u8> = data.to_le_bytes().to_vec();
336 let rw_1 = ReadWriteRequest::new(259, 33, 4, data);
337 rw_vec.push(rw_1);
338
339 let data: u64 = 222222;
340 let data: Vec<u8> = data.to_le_bytes().to_vec();
341 let rw_2 = ReadWriteRequest::new(260, 22, 4, data);
342 rw_vec.push(rw_2);
343
344 let compare = SumupReadWriteRequest::new(rw_vec);
345
346 assert_eq!(
347 sum_read_write_request, compare,
348 "comparing sum_read_write_request failed"
349 );
350 }
351
352 #[test]
353 fn sumup_read_write_request_expected_response_len_test() {
354 let mut rw_vec: Vec<ReadWriteRequest> = Vec::new();
355 let data: u32 = 111111;
356 let data: Vec<u8> = data.to_le_bytes().to_vec();
357 let rw_1 = ReadWriteRequest::new(259, 33, 4, data);
358 rw_vec.push(rw_1);
359
360 let data: u64 = 222222;
361 let data: Vec<u8> = data.to_le_bytes().to_vec();
362 let rw_2 = ReadWriteRequest::new(260, 22, 4, data);
363 rw_vec.push(rw_2);
364
365 let sum_up_request = SumupReadWriteRequest::new(rw_vec);
366
367 assert_eq!(sum_up_request.expected_response_len(), 24); }
369
370 #[test]
371 fn sumup_read_write_request_request_count_test() {
372 let mut rw_vec: Vec<ReadWriteRequest> = Vec::new();
373 let data: u32 = 111111;
374 let data: Vec<u8> = data.to_le_bytes().to_vec();
375 let rw_1 = ReadWriteRequest::new(259, 33, 4, data);
376 rw_vec.push(rw_1);
377
378 let data: u64 = 222222;
379 let data: Vec<u8> = data.to_le_bytes().to_vec();
380 let rw_2 = ReadWriteRequest::new(260, 22, 4, data);
381 rw_vec.push(rw_2);
382
383 let sum_up_request = SumupReadWriteRequest::new(rw_vec);
384
385 assert_eq!(sum_up_request.request_count(), 2);
386 }
387
388 #[test]
389 fn sumup_read_request_write_to_test() {
390 let mut r_vec: Vec<ReadRequest> = Vec::new();
391 let r_1 = ReadRequest::new(259, 33, 4);
392 r_vec.push(r_1);
393
394 let r_2 = ReadRequest::new(260, 22, 4);
395 r_vec.push(r_2);
396
397 let mut buffer: Vec<u8> = Vec::new();
398 SumupReadRequest::new(r_vec).write_to(&mut buffer).unwrap();
399
400 let compare = vec![
401 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0,
402 ];
403 assert_eq!(buffer, compare);
404 }
405
406 #[test]
407 fn sumup_read_request_read_from_test() {
408 let read_data = vec![
409 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0,
410 ];
411
412 let sum_read_request = SumupReadRequest::read_from(&mut read_data.as_slice()).unwrap();
413
414 let mut r_vec: Vec<ReadRequest> = Vec::new();
415 let rw_1 = ReadRequest::new(259, 33, 4);
416 r_vec.push(rw_1);
417
418 let rw_2 = ReadRequest::new(260, 22, 4);
419 r_vec.push(rw_2);
420
421 let compare = SumupReadRequest::new(r_vec);
422
423 assert_eq!(
424 sum_read_request, compare,
425 "comparing sum_read_write_request failed"
426 );
427
428 assert_eq!(
429 sum_read_request.command_id,
430 CommandID::Read,
431 "Wrong command ID"
432 );
433
434 for request in &sum_read_request.read_requests {
435 assert_eq!(request.command_id, CommandID::Read, "wrong command id");
436 assert_eq!(request.length, 4, "Wrong length");
437 }
438 assert_eq!(
439 sum_read_request.read_requests[0].index_group, 259,
440 "Wrong index group"
441 );
442 assert_eq!(
443 sum_read_request.read_requests[0].index_offset, 33,
444 "Wrong index offset"
445 );
446 assert_eq!(
447 sum_read_request.read_requests[1].index_group, 260,
448 "Wrong index group"
449 );
450 assert_eq!(
451 sum_read_request.read_requests[1].index_offset, 22,
452 "Wrong index offset"
453 );
454 }
455
456 #[test]
457 fn sumup_write_request_write_to_test() {
458 let mut rw_vec: Vec<WriteRequest> = Vec::new();
459 let data: u32 = 111111;
460 let data: Vec<u8> = data.to_le_bytes().to_vec();
461 let rw_1 = WriteRequest::new(259, 33, data);
462 rw_vec.push(rw_1);
463
464 let data: u64 = 222222;
465 let data: Vec<u8> = data.to_le_bytes().to_vec();
466 let rw_2 = WriteRequest::new(260, 22, data);
467 rw_vec.push(rw_2);
468
469 let mut buffer: Vec<u8> = Vec::new();
470 SumupWriteRequest::new(rw_vec)
471 .write_to(&mut buffer)
472 .unwrap();
473
474 let compare = vec![
475 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 8, 0, 0, 0, 7, 178, 1, 0,
476 14, 100, 3, 0, 0, 0, 0, 0,
477 ];
478 assert_eq!(buffer, compare);
479 }
480
481 #[test]
482 fn sumup_write_request_read_from_test() {
483 let read_data = vec![
484 3, 1, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 4, 1, 0, 0, 22, 0, 0, 0, 8, 0, 0, 0, 7, 178, 1, 0,
485 14, 100, 3, 0, 0, 0, 0, 0,
486 ];
487
488 let sum_write_request = SumupWriteRequest::read_from(&mut read_data.as_slice()).unwrap();
489
490 let mut rw_vec: Vec<WriteRequest> = Vec::new();
491 let data: u32 = 111111;
492 let data: Vec<u8> = data.to_le_bytes().to_vec();
493 let rw_1 = WriteRequest::new(259, 33, data);
494 rw_vec.push(rw_1);
495
496 let data: u64 = 222222;
497 let data: Vec<u8> = data.to_le_bytes().to_vec();
498 let rw_2 = WriteRequest::new(260, 22, data);
499 rw_vec.push(rw_2);
500
501 let compare = SumupWriteRequest::new(rw_vec);
502
503 assert_eq!(
504 sum_write_request, compare,
505 "comparing sum_read_write_request failed"
506 );
507 }
508}