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, MessageId};
#[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), false));
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> {
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(ResponseMessage {
content: ResponseContent::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(ResponseMessage {
content: ResponseContent::GetFailure {
external_error_indicator,
..
}, .. }) => {
error!("Failed to Get {:?}: {:?}",
request.name(),
unwrap_result!(String::from_utf8(external_error_indicator)));
return None;
}
Event::Disconnected => self.disconnected(),
_ => (),
}
}
None
}
pub fn put(&self, data: Data) -> Result<(), ()> {
let data_name = data.name();
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(ResponseMessage {
content: ResponseContent::PutSuccess(id),
..
}) => {
if message_id == id {
trace!("Successfully stored {:?}", data_name);
return Ok(());
} else {
error!("Stored {:?}, but with wrong message_id {:?} instead of {:?}.",
data_name,
id,
message_id);
return Err(());
}
}
Event::Response(ResponseMessage {
content: ResponseContent::PutFailure { .. },
..
}) => {
error!("Received PutFailure for {:?}.", data_name);
return Err(());
}
Event::Disconnected => 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()
}
}