avtp_protocol/
tcp_communication.rs

1use 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}