1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use std::ops::{Deref, DerefMut};
use bip_util::bt::{self, InfoHash};
use bytes::{Bytes, BytesMut};
#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug)]
pub struct BlockMetadata {
info_hash: InfoHash,
piece_index: u64,
block_offset: u64,
block_length: usize
}
impl BlockMetadata {
pub fn new(info_hash: InfoHash, piece_index: u64, block_offset: u64, block_length: usize) -> BlockMetadata {
BlockMetadata{ info_hash: info_hash, piece_index: piece_index,
block_offset: block_offset, block_length: block_length }
}
pub fn with_default_hash(piece_index: u64, block_offset: u64, block_length: usize) -> BlockMetadata {
BlockMetadata::new([0u8; bt::INFO_HASH_LEN].into(), piece_index, block_offset, block_length)
}
pub fn info_hash(&self) -> InfoHash {
self.info_hash
}
pub fn piece_index(&self) -> u64 {
self.piece_index
}
pub fn block_offset(&self) -> u64 {
self.block_offset
}
pub fn block_length(&self) -> usize {
self.block_length
}
}
impl Default for BlockMetadata {
fn default() -> BlockMetadata {
BlockMetadata::new([0u8; bt::INFO_HASH_LEN].into(), 0, 0, 0)
}
}
#[derive(Debug)]
pub struct Block {
metadata: BlockMetadata,
block_data: Bytes
}
impl Block {
pub fn new(metadata: BlockMetadata, block_data: Bytes) -> Block {
Block{ metadata: metadata, block_data: block_data }
}
pub fn metadata(&self) -> BlockMetadata {
self.metadata
}
pub fn into_parts(self) -> (BlockMetadata, Bytes) {
(self.metadata, self.block_data)
}
}
impl From<BlockMut> for Block {
fn from(block: BlockMut) -> Block {
Block::new(block.metadata(), block.block_data.freeze())
}
}
impl Deref for Block {
type Target = [u8];
fn deref(&self) -> &[u8] {
&self.block_data
}
}
#[derive(Debug)]
pub struct BlockMut {
metadata: BlockMetadata,
block_data: BytesMut
}
impl BlockMut {
pub fn new(metadata: BlockMetadata, block_data: BytesMut) -> BlockMut {
BlockMut{ metadata: metadata, block_data: block_data }
}
pub fn metadata(&self) -> BlockMetadata {
self.metadata
}
pub fn into_parts(self) -> (BlockMetadata, BytesMut) {
(self.metadata, self.block_data)
}
}
impl Deref for BlockMut {
type Target = [u8];
fn deref(&self) -> &[u8] {
&self.block_data
}
}
impl DerefMut for BlockMut {
fn deref_mut(&mut self) -> &mut [u8] {
&mut self.block_data
}
}