extern crate log;
extern crate time;
extern crate routing;
extern crate xor_name;
extern crate sodiumoxide;
extern crate maidsafe_utilities;
use std::sync::mpsc;
use self::sodiumoxide::crypto;
use self::xor_name::XorName;
use self::routing::{FullId, Event, Data, DataRequest, Authority, ResponseContent, ResponseMessage,
Client};
#[allow(unused)]
pub struct ExampleClient {
routing_client: Client,
receiver: mpsc::Receiver<Event>,
full_id: FullId,
}
#[allow(unused)]
impl ExampleClient {
pub fn new() -> ExampleClient {
let (sender, receiver) = mpsc::channel::<Event>();
let sign_keys = crypto::sign::gen_keypair();
let encrypt_keys = crypto::box_::gen_keypair();
let full_id = FullId::with_keys(encrypt_keys.clone(), sign_keys.clone());
let routing_client = Client::new(sender, Some(full_id)).unwrap();
for it in receiver.iter() {
if let Event::Connected = it {
println!("Client Connected to network");
break;
}
}
ExampleClient {
routing_client: routing_client,
receiver: receiver,
full_id: FullId::with_keys(encrypt_keys, sign_keys),
}
}
pub fn get(&mut self, request: DataRequest) -> Option<Data> {
unwrap_result!(self.routing_client
.send_get_request(Authority::NaeManager(request.name()),
request.clone()));
for it in self.receiver.iter() {
match it {
Event::Response(ResponseMessage {
content: ResponseContent::GetSuccess(data, _), .. }) => return Some(data),
Event::Response(ResponseMessage {
content: ResponseContent::GetFailure { external_error_indicator, .. }, .. }) => {
{
error!("Failed to Get {:?}: {:?}",
request.name(),
unwrap_result!(String::from_utf8(external_error_indicator)));
return None;
}
}
_ => (),
}
}
None
}
pub fn put(&self, data: Data) {
let data_name = data.name();
unwrap_result!(self.routing_client
.send_put_request(Authority::ClientManager(*self.name()), data));
for it in self.receiver.iter() {
if let Event::Response(ResponseMessage {
content: ResponseContent::PutSuccess(..), .. }) = it {
println!("Successfully stored {:?}", data_name);
break;
}
}
}
#[allow(unused)]
pub fn post(&self) {
unimplemented!()
}
#[allow(unused)]
pub fn delete(&self) {
unimplemented!()
}
pub fn name(&self) -> &XorName {
self.full_id.public_id().name()
}
}