avtp_protocol/
tcp_communication.rs1use std::{net::TcpStream, error::Error, io::{Write, Read, self, ErrorKind}, u32, usize};
2use crate::header::Header;
3
4fn parse_header(data_header: String) -> Result<Header, io::Error> {
5 if data_header.is_empty() {
6 return Err(io::Error::new(
7 ErrorKind::InvalidData,
8 "An error occurred while trying to parse AVTP header, header is empty!",
9 ));
10 }
11
12 let parts: Vec<&str> = data_header.splitn(2, '\n').collect();
13 if parts.len() != 2 {
14 return Err(io::Error::new(
15 ErrorKind::InvalidData,
16 "Header does not contain expected format",
17 ));
18 }
19
20 let length = match parts[0].parse::<u32>() {
21 Ok(l) => l,
22 Err(_) => {
23 return Err(io::Error::new(
24 ErrorKind::InvalidData,
25 "Failed to parse length from header",
26 ))
27 }
28 };
29
30 let data_type = parts[1].to_owned();
31
32 Ok(Header {
33 length,
34 data_type,
35 })
36}
37
38pub fn send_data(mut stream: TcpStream, data: &[u8], data_type: &str) -> Result<(), Box<dyn Error>> {
39 let header = format!("Length: {}\nType: {}\n\n", data.len(), data_type);
40 stream.write_all(header.as_bytes())?;
41 stream.write_all(data)?;
42 Ok(())
43}
44
45pub fn receive_data(mut stream: TcpStream) -> Result<(Vec<u8>, Header), Box<dyn Error>> {
46 let mut data_header = String::new();
47 stream.read_to_string(&mut data_header)?;
48
49 let header = parse_header(data_header)?;
50
51 let mut data = vec![0u8; header.length as usize];
52 stream.read_exact(&mut data)?;
53
54 Ok((data, header))
55}