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 0000000..82a9630 Binary files /dev/null and b/test.torrent differ