use std::io;
use std::net::{SocketAddr, UdpSocket};
use std::sync::mpsc;
use bip_handshake::Handshaker;
use bip_util::bt::InfoHash;
use mio;
use router::Router;
use routing::table::{self, RoutingTable};
use transaction::TransactionID;
pub mod bootstrap;
pub mod handler;
pub mod lookup;
pub mod messenger;
pub mod refresh;
#[derive(Clone)]
pub enum OneshotTask {
Incoming(Vec<u8>, SocketAddr),
RegisterSender(mpsc::Sender<DhtEvent>),
StartBootstrap(Vec<Router>, Vec<SocketAddr>),
StartLookup(InfoHash, bool),
Shutdown(ShutdownCause),
}
#[derive(Copy, Clone, Debug)]
pub enum ScheduledTask {
CheckTableRefresh(TransactionID),
CheckBootstrapTimeout(TransactionID),
CheckLookupTimeout(TransactionID),
CheckLookupEndGame(TransactionID),
}
#[derive(Copy, Clone, Debug)]
pub enum DhtEvent {
BootstrapCompleted,
LookupCompleted(InfoHash),
ShuttingDown(ShutdownCause),
}
#[derive(Copy, Clone, Debug)]
pub enum ShutdownCause {
BootstrapFailed,
ClientInitiated,
Unspecified,
}
pub fn start_mainline_dht<H>(send_socket: UdpSocket,
recv_socket: UdpSocket,
read_only: bool,
_: Option<SocketAddr>,
handshaker: H,
kill_sock: UdpSocket,
kill_addr: SocketAddr)
-> io::Result<mio::Sender<OneshotTask>>
where H: Handshaker + 'static
{
let outgoing = messenger::create_outgoing_messenger(send_socket);
let routing_table = RoutingTable::new(table::random_node_id());
let message_sender = try!(handler::create_dht_handler(routing_table,
outgoing,
read_only,
handshaker,
kill_sock,
kill_addr));
messenger::create_incoming_messenger(recv_socket, message_sender.clone());
Ok(message_sender)
}