rqbit/crates/librqbit_core/src/peer_id.rs

60 lines
1.4 KiB
Rust
Raw Normal View History

2023-12-24 16:53:02 -06:00
use crate::hash_id::Id20;
2021-07-12 21:59:08 +01:00
2021-06-25 13:47:51 +01:00
#[derive(Debug)]
pub enum AzureusStyleKind {
Deluge,
LibTorrent,
Transmission,
Other([char; 2]),
}
#[derive(Debug)]
pub struct AzureusStyle {
pub kind: AzureusStyleKind,
pub version: [char; 4],
}
impl AzureusStyleKind {
pub const fn from_bytes(b1: u8, b2: u8) -> Self {
match &[b1, b2] {
b"DE" => AzureusStyleKind::Deluge,
b"lt" | b"LT" => AzureusStyleKind::LibTorrent,
b"TR" => AzureusStyleKind::Transmission,
_ => AzureusStyleKind::Other([b1 as char, b2 as char]),
}
}
}
2021-07-12 21:59:08 +01:00
fn try_decode_azureus_style(p: &Id20) -> Option<AzureusStyle> {
let p = p.0;
2021-06-25 13:47:51 +01:00
if !(p[0] == b'-' && p[7] == b'-') {
return None;
}
let mut version = ['0'; 4];
for (i, c) in p[3..7].iter().copied().enumerate() {
2021-06-25 13:47:51 +01:00
version[i] = c as char;
}
let kind = AzureusStyleKind::from_bytes(p[1], p[2]);
Some(AzureusStyle { kind, version })
}
#[derive(Debug)]
pub enum PeerId {
AzureusStyle(AzureusStyle),
}
2021-07-12 21:59:08 +01:00
pub fn try_decode_peer_id(p: Id20) -> Option<PeerId> {
2021-06-25 13:47:51 +01:00
Some(PeerId::AzureusStyle(try_decode_azureus_style(&p)?))
}
2021-07-02 01:38:07 +01:00
2021-07-12 21:59:08 +01:00
pub fn generate_peer_id() -> Id20 {
2021-07-02 01:38:07 +01:00
let mut peer_id = [0u8; 20];
let u = uuid::Uuid::new_v4();
peer_id[4..20].copy_from_slice(&u.as_bytes()[..]);
2021-07-02 01:38:07 +01:00
peer_id[..8].copy_from_slice(b"-rQ0001-");
2021-07-02 01:38:07 +01:00
2023-12-24 16:53:02 -06:00
Id20::new(peer_id)
2021-07-02 01:38:07 +01:00
}