From 3d33932aed7990d58b5a3d652062563d8f8f3759 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Sat, 20 Jun 2020 19:16:50 +0200 Subject: [PATCH] Add Pieces and Queue struct+impl --- src/lib.rs | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ test.torrent | Bin 0 -> 21857 bytes 2 files changed, 99 insertions(+) create mode 100644 test.torrent diff --git a/src/lib.rs b/src/lib.rs index 459a8d6..7da92eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -486,6 +486,105 @@ fn msg_port(port: u16) -> Vec { b.to_vec() } +#[derive(Debug)] +struct Pieces { + requested: Vec>, + received: Vec>, +} +impl Pieces { + fn new(torrent: &Torrent) -> Pieces { + let sub_requested: Vec = vec![false; torrent.info.pieces.len()/20]; + let sub_received: Vec = vec![false; torrent.info.pieces.len()/20]; + let requested: Vec> = vec![sub_requested; torrent.info.pieces.len()/20]; + let received: Vec> = 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, + 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 { diff --git a/test.torrent b/test.torrent new file mode 100644 index 0000000000000000000000000000000000000000..82a9630cda90b34eaef84016289a848ba31988f1 GIT binary patch literal 21857 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 RX>TudZ*p>FZgg`mWo4g@9t;2g literal 0 HcmV?d00001