Add Pieces and Queue struct+impl
arnaucube root@arnaucube.com
Sat, 20 Jun 2020 19:16:50 +0200
2 files changed,
99 insertions(+),
0 deletions(-)
M
src/lib.rs
→
src/lib.rs
@@ -486,6 +486,105 @@ BigEndian::write_u16(&mut b[5..7], port);
b.to_vec() } +#[derive(Debug)] +struct Pieces { + requested: Vec<Vec<bool>>, + received: Vec<Vec<bool>>, +} +impl Pieces { + fn new(torrent: &Torrent) -> Pieces { + let sub_requested: Vec<bool> = vec![false; torrent.info.pieces.len()/20]; + let sub_received: Vec<bool> = vec![false; torrent.info.pieces.len()/20]; + let requested: Vec<Vec<bool>> = vec![sub_requested; torrent.info.pieces.len()/20]; + let received: Vec<Vec<bool>> = vec![sub_received; torrent.info.pieces.len()/20]; + Pieces{ + requested: requested, + received: received, + } + } + fn add_requested(&mut self, block: &Payload) { + let index = block.begin / BLOCK_LEN; + self.requested[block.index as usize][index as usize] = true; + } + fn add_received(&mut self, block: &Payload) { + let index = block.begin / BLOCK_LEN; + self.requested[block.index as usize][index as usize] = true; + } + fn needed(&mut self, block: &Payload) -> bool { + let mut n = 1; + for i in 0..self.requested.len() { + for j in 0..self.requested[i].len() { + if self.requested[i][j] == false { + n = n*0; + } + } + } + if n==1 { + self.requested = self.received.clone(); + } + let index = block.begin / BLOCK_LEN; + !self.requested[block.index as usize][index as usize] + + } + fn is_done(&self, ) -> bool { + let mut n = 1; + for i in 0..self.requested.len() { + for j in 0..self.requested[i].len() { + if self.requested[i][j] == false { + n = n*0; + } + } + } + if n==1 { + return true; + } + false + } + fn print_percent_done(&self, ) { + + } +} + +struct Queue<'a>{ + torrent: &'a Torrent, + queue: Vec<Payload>, + chocked: bool, +} +impl<'a> Queue<'a> { + fn new(torrent: &Torrent) -> Queue { + Queue{ + torrent: torrent, + queue: Vec::new(), + chocked: true, + } + } + fn queue(&mut self, index: u32) { + let n_blocks = self.torrent.blocks_per_piece(index); + for i in 0..n_blocks { + let piece_block: Payload = Payload{ + index: index, + begin: i*BLOCK_LEN, + length: self.torrent.block_len(index, i), + block: Block{ + length: 0, + bytes: Vec::new(), + } + }; + self.queue.push(piece_block); + } + + } + fn get_last(&mut self) -> Payload { + self.queue.remove(self.queue.len()) + } + fn peek(&self) -> &Payload { + &self.queue[0] + } + fn length(&self) -> usize { + self.queue.len() + } +} + #[cfg(test)] mod tests {