extern crate log;
extern crate routing;
extern crate sodiumoxide;
extern crate maidsafe_utilities;
use std::sync::mpsc;
use sodiumoxide::crypto;
use routing::{FullId, Event, Data, DataIdentifier, Authority, Response, Client, MessageId, XorName};
#[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 = unwrap_result!(Client::new(sender, Some(full_id)));
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: DataIdentifier) -> Option<Data> {
let message_id = MessageId::new();
unwrap_result!(self.routing_client
.send_get_request(Authority::NaeManager(request.name()),
request.clone(),
message_id));
for it in self.receiver.iter() {
match it {
Event::Response { response: Response::GetSuccess(data, id), .. } => {
if message_id != id {
error!("GetSuccess for {:?}, but with wrong message_id {:?} instead of \
{:?}.",
data.name(),
id,
message_id);
}
return Some(data);
}
Event::Response {
response: Response::GetFailure { external_error_indicator, .. },
.. } => {
error!("Failed to Get {:?}: {:?}",
request.name(),
unwrap_result!(String::from_utf8(external_error_indicator)));
return None;
}
Event::Terminate | Event::RestartRequired => self.disconnected(),
_ => (),
}
}
None
}
pub fn put(&self, data: Data) -> Result<(), ()> {
let data_id = data.identifier();
let message_id = MessageId::new();
unwrap_result!(self.routing_client
.send_put_request(Authority::ClientManager(*self.name()), data, message_id));
for it in self.receiver.iter() {
match it {
Event::Response { response: Response::PutSuccess(rec_data_id, id), .. } => {
if message_id != id {
error!("Stored {:?}, but with wrong message_id {:?} instead of {:?}.",
data_id.name(),
id,
message_id);
return Err(());
} else if data_id == rec_data_id {
trace!("Successfully stored {:?}", data_id.name());
return Ok(());
} else {
error!("Stored {:?}, but with wrong name {:?}.",
data_id.name(),
rec_data_id.name());
return Err(());
}
}
Event::Response { response: Response::PutFailure { .. }, .. } => {
error!("Received PutFailure for {:?}.", data_id.name());
return Err(());
}
Event::Terminate | Event::RestartRequired => self.disconnected(),
_ => (),
}
}
Err(())
}
fn disconnected(&self) {
panic!("Disconnected from the network.");
}
#[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()
}
}
impl Default for ExampleClient {
fn default() -> ExampleClient {
ExampleClient::new()
}
}