use std::sync::Arc;
use std::sync::Mutex;
use std::sync::mpsc::Receiver;
use crate::controller_node::ControllerNode;
use crate::node::Node;
use crate::node_profile::*;
use crate::object::*;
use crate::protocol::Message;
use crate::remote_node::*;
use crate::transport::ObserverObject;
pub struct Controller {
node: Arc<Mutex<ControllerNode>>,
}
impl Controller {
pub fn new() -> Controller {
Controller {
node: ControllerNode::new(),
}
}
pub fn new_with_node(node: Arc<Mutex<Node>>) -> Controller {
Controller {
node: ControllerNode::new_with_node(node),
}
}
pub fn add_observer(&mut self, observer: ObserverObject) -> bool {
let mut ctrl = self.node.lock().unwrap();
ctrl.add_observer(observer.clone())
}
pub fn nodes(&mut self) -> Vec<RemoteNode> {
let mut nodes = Vec::new();
let ctrl = self.node.lock().unwrap();
for node in ctrl.nodes() {
nodes.push(node.clone());
}
nodes
}
pub fn search_object(&mut self, obj_code: ObjectCode) -> bool {
let mut ctrl = self.node.lock().unwrap();
ctrl.search_object(obj_code)
}
pub fn search(&mut self) -> bool {
self.search_object(NODE_PROFILE_OBJECT_CODE)
}
pub fn send_message(&self, remote_node: &RemoteNode, msg: &mut Message) -> bool {
if self.node.try_lock().is_err() {
return false;
}
let node = self.node.lock().unwrap();
node.send_message(remote_node, msg)
}
pub fn post_message(&self, remote_node: &RemoteNode, msg: &mut Message) -> Receiver<Message> {
let node = self.node.lock().unwrap();
node.post_message(remote_node, msg)
}
pub fn start(&mut self) -> bool {
let mut node = self.node.lock().unwrap();
if !node.start() {
return false;
}
true
}
pub fn stop(&mut self) -> bool {
let mut node = self.node.lock().unwrap();
node.stop()
}
}
impl Drop for Controller {
fn drop(&mut self) {
self.stop();
}
}