use dbus::Message;
use dbus_tree::{MTSync, MethodInfo, MethodResult};
use crate::{
dbus_api::{
api::shared::create_pool_shared,
consts,
types::{CreatePoolParams, TData},
util::{engine_to_dbus_err_tuple, get_next_arg, msg_code_ok, msg_string_ok},
},
engine::{DeleteAction, PoolUuid},
};
pub fn create_pool(m: &MethodInfo<MTSync<TData>, TData>) -> MethodResult {
create_pool_shared(m, CreatePoolParams::Neither)
}
pub fn destroy_pool(m: &MethodInfo<MTSync<TData>, TData>) -> MethodResult {
let message: &Message = m.msg;
let mut iter = message.iter_init();
let pool_path: dbus::Path<'static> = get_next_arg(&mut iter, 0)?;
let dbus_context = m.tree.get_data();
let default_return = (false, uuid_to_string!(PoolUuid::nil()));
let return_message = message.method_return();
let pool_uuid = match m
.tree
.get(&pool_path)
.and_then(|op| op.get_data().as_ref())
.map(|d| &d.uuid)
{
Some(uuid) => *typed_uuid!(uuid; Pool; default_return; return_message),
None => {
return Ok(vec![return_message.append3(
default_return,
msg_code_ok(),
msg_string_ok(),
)]);
}
};
let msg = match log_action!(dbus_context.engine.blocking_lock().destroy_pool(pool_uuid)) {
Ok(DeleteAction::Deleted(uuid)) => {
dbus_context.push_remove(&pool_path, consts::pool_interface_list());
return_message.append3(
(true, uuid_to_string!(uuid)),
msg_code_ok(),
msg_string_ok(),
)
}
Ok(DeleteAction::Identity) => {
return_message.append3(default_return, msg_code_ok(), msg_string_ok())
}
Err(err) => {
let (rc, rs) = engine_to_dbus_err_tuple(&err);
return_message.append3(default_return, rc, rs)
}
};
Ok(vec![msg])
}
pub fn configure_simulator(m: &MethodInfo<MTSync<TData>, TData>) -> MethodResult {
let message = m.msg;
let mut iter = message.iter_init();
let return_message = message.method_return();
let denominator: u32 = get_next_arg(&mut iter, 0)?;
let dbus_context = m.tree.get_data();
let mut mutex_lock = dbus_context.engine.blocking_lock();
let result = mutex_lock.configure_simulator(denominator);
let msg = match result {
Ok(_) => return_message.append2(msg_code_ok(), msg_string_ok()),
Err(err) => {
let (rc, rs) = engine_to_dbus_err_tuple(&err);
return_message.append2(rc, rs)
}
};
Ok(vec![msg])
}