extern crate libc;
use api::ErrorCode;
use commands::{Command, CommandExecutor};
use commands::agent::AgentCommand;
use errors::ToErrorCode;
use utils::cstring::CStringUtils;
use self::libc::c_char;
#[no_mangle]
pub extern fn indy_agent_connect(command_handle: i32,
pool_handle: i32,
wallet_handle: i32,
sender_did: *const c_char,
receiver_did: *const c_char,
connection_cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode,
connection_handle: i32)>,
message_cb: Option<extern fn(xconnection_handle: i32,
err: ErrorCode,
message: *const c_char)>) -> ErrorCode {
check_useful_c_str!(sender_did, ErrorCode::CommonInvalidParam3);
check_useful_c_str!(receiver_did, ErrorCode::CommonInvalidParam4);
check_useful_c_callback!(connection_cb, ErrorCode::CommonInvalidParam5);
check_useful_c_callback!(message_cb, ErrorCode::CommonInvalidParam6);
let result = CommandExecutor::instance().send(
Command::Agent(
AgentCommand::Connect(
pool_handle,
wallet_handle,
sender_did,
receiver_did,
Box::new(move |result| {
let (err, handle) = result_to_err_code_1!(result, 0);
connection_cb(command_handle, err, handle);
}),
Box::new(move |result| {
let (err, handle, msg) = result_to_err_code_2!(result, 0, String::new());
let msg = CStringUtils::string_to_cstring(msg);
message_cb(handle, err, msg.as_ptr());
})
)
)
);
result_to_err_code!(result)
}
#[no_mangle]
pub extern fn indy_agent_listen(command_handle: i32,
endpoint: *const c_char,
listener_cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode,
listener_handle: i32)>,
connection_cb: Option<extern fn(xlistener_handle: i32,
err: ErrorCode,
connection_handle: i32,
sender_did: *const c_char,
receiver_did: *const c_char)>,
message_cb: Option<extern fn(xconnection_handle: i32,
err: ErrorCode,
message: *const c_char)>) -> ErrorCode {
check_useful_c_str!(endpoint, ErrorCode::CommonInvalidParam2);
check_useful_c_callback!(listener_cb, ErrorCode::CommonInvalidParam3);
check_useful_c_callback!(connection_cb, ErrorCode::CommonInvalidParam4);
check_useful_c_callback!(message_cb, ErrorCode::CommonInvalidParam5);
let cmd = Command::Agent(AgentCommand::Listen(
endpoint,
Box::new(move |result| {
let (err, handle) = result_to_err_code_1!(result, 0);
listener_cb(command_handle, err, handle);
}),
Box::new(move |result| {
let (err, listener_handle, conn_handle, sender_did, receiver_did) =
result_to_err_code_4!(result, 0, 0, String::new(), String::new());
connection_cb(listener_handle, err, conn_handle,
CStringUtils::string_to_cstring(sender_did).as_ptr(),
CStringUtils::string_to_cstring(receiver_did).as_ptr());
}),
Box::new(move |result| {
let (err, handle, msg) = result_to_err_code_2!(result, 0, String::new());
let msg = CStringUtils::string_to_cstring(msg);
message_cb(handle, err, msg.as_ptr());
})
));
let result = CommandExecutor::instance().send(cmd);
result_to_err_code!(result)
}
#[no_mangle]
pub extern fn indy_agent_add_identity(command_handle: i32,
listener_handle: i32,
pool_handle: i32,
wallet_handle: i32,
did: *const c_char,
add_identity_cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode)>) -> ErrorCode {
check_useful_c_str!(did, ErrorCode::CommonInvalidParam5);
check_useful_c_callback!(add_identity_cb, ErrorCode::CommonInvalidParam6);
let cmd = Command::Agent(AgentCommand::ListenerAddIdentity(
listener_handle,
pool_handle,
wallet_handle,
did,
Box::new(move |result| {
let result = result_to_err_code!(result);
add_identity_cb(command_handle, result);
}),
));
let result = CommandExecutor::instance().send(cmd);
result_to_err_code!(result)
}
#[no_mangle]
pub extern fn indy_agent_remove_identity(command_handle: i32,
listener_handle: i32,
wallet_handle: i32,
did: *const c_char,
rm_identity_cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode)>) -> ErrorCode {
check_useful_c_str!(did, ErrorCode::CommonInvalidParam4);
check_useful_c_callback!(rm_identity_cb, ErrorCode::CommonInvalidParam5);
let cmd = Command::Agent(AgentCommand::ListenerRmIdentity(
listener_handle,
wallet_handle,
did,
Box::new(move |result| {
let result = result_to_err_code!(result);
rm_identity_cb(command_handle, result);
}),
));
let result = CommandExecutor::instance().send(cmd);
result_to_err_code!(result)
}
#[no_mangle]
pub extern fn indy_agent_send(command_handle: i32,
connection_handle: i32,
message: *const c_char,
cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode)>) -> ErrorCode {
check_useful_opt_c_str!(message, ErrorCode::CommonInvalidParam3);
check_useful_c_callback!(cb, ErrorCode::CommonInvalidParam4);
let cmd = Command::Agent(AgentCommand::Send(
connection_handle,
message,
Box::new(move |result| {
cb(command_handle, result_to_err_code!(result))
})
));
let res = CommandExecutor::instance().send(cmd);
result_to_err_code!(res)
}
#[no_mangle]
pub extern fn indy_agent_close_connection(command_handle: i32,
connection_handle: i32,
cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode)>) -> ErrorCode {
check_useful_c_callback!(cb, ErrorCode::CommonInvalidParam4);
let cmd = Command::Agent(AgentCommand::CloseConnection(
connection_handle,
Box::new(move |result| {
cb(command_handle, result_to_err_code!(result))
})
));
let res = CommandExecutor::instance().send(cmd);
result_to_err_code!(res)
}
#[no_mangle]
pub extern fn indy_agent_close_listener(command_handle: i32,
listener_handle: i32,
cb: Option<extern fn(xcommand_handle: i32,
err: ErrorCode)>) -> ErrorCode {
check_useful_c_callback!(cb, ErrorCode::CommonInvalidParam4);
let cmd = Command::Agent(AgentCommand::CloseListener(
listener_handle,
Box::new(move |result| {
cb(command_handle, result_to_err_code!(result))
})
));
let res = CommandExecutor::instance().send(cmd);
result_to_err_code!(res)
}