Uploading chunks now reads straight into write buffer

This commit is contained in:
Igor Katson 2021-06-28 16:09:20 +01:00
parent 2192842099
commit fab43a8d23
5 changed files with 470 additions and 50 deletions

View file

@ -1,10 +1,11 @@
use bincode::Options;
use byteorder::ByteOrder;
use byteorder::{ByteOrder, BE};
use serde::{Deserialize, Serialize};
use crate::{
buffers::{ByteBuf, ByteString},
clone_to_owned::CloneToOwned,
lengths::ChunkInfo,
};
const PREAMBLE_LEN: usize = 5;
@ -18,6 +19,7 @@ const LEN_PREFIX_UNCHOKE: u32 = 1;
const LEN_PREFIX_INTERESTED: u32 = 1;
const LEN_PREFIX_NOT_INTERESTED: u32 = 1;
const LEN_PREFIX_HAVE: u32 = 5;
const LEN_PREFIX_PIECE: u32 = 9;
const LEN_PREFIX_REQUEST: u32 = 13;
const MSGID_CHOKE: u8 = 0;
@ -46,6 +48,17 @@ pub enum MessageDeserializeError {
},
}
pub fn serialize_piece_preamble(chunk: &ChunkInfo, mut buf: &mut [u8]) -> usize {
BE::write_u32(&mut buf[0..4], LEN_PREFIX_PIECE + chunk.size);
buf[4] = MSGID_PIECE;
buf = &mut buf[PREAMBLE_LEN..];
BE::write_u32(&mut buf[0..4], chunk.piece_index.get());
BE::write_u32(&mut buf[4..8], chunk.offset);
PREAMBLE_LEN + 8
}
#[derive(Debug)]
pub struct Piece<ByteBuf> {
pub index: u32,
@ -209,7 +222,10 @@ where
Message::Unchoke => (LEN_PREFIX_UNCHOKE, MSGID_UNCHOKE),
Message::Interested => (LEN_PREFIX_INTERESTED, MSGID_INTERESTED),
Message::NotInterested => (LEN_PREFIX_NOT_INTERESTED, MSGID_NOT_INTERESTED),
Message::Piece(p) => (9 + p.block.as_ref().len() as u32, MSGID_PIECE),
Message::Piece(p) => (
LEN_PREFIX_PIECE + p.block.as_ref().len() as u32,
MSGID_PIECE,
),
Message::KeepAlive => (LEN_PREFIX_KEEPALIVE, 0),
Message::Have(_) => (LEN_PREFIX_HAVE, MSGID_HAVE),
}
@ -260,7 +276,7 @@ where
Message::Have(v) => {
let msg_len = PREAMBLE_LEN + 4;
out.resize(msg_len, 0);
byteorder::BE::write_u32(&mut out[PREAMBLE_LEN..], *v);
BE::write_u32(&mut out[PREAMBLE_LEN..], *v);
msg_len
}
}
@ -332,10 +348,7 @@ where
MSGID_HAVE => {
let expected_len = 4;
match rest.get(..expected_len as usize) {
Some(h) => Ok((
Message::Have(byteorder::BE::read_u32(&h)),
PREAMBLE_LEN + expected_len,
)),
Some(h) => Ok((Message::Have(BE::read_u32(&h)), PREAMBLE_LEN + expected_len)),
None => {
let missing = expected_len - rest.len();
Err(MessageDeserializeError::NotEnoughData(missing, "have"))