use std::sync::Arc;
use jni::JNIEnv;
use jni::JavaVM;
use jni::objects::GlobalRef;
use tesseract::service::BoundTransport;
use tesseract::service::Transport;
use tesseract::service::TransportProcessor;
use super::processor::JProcessor;
pub struct IPCTransport {
channel: String,
vm: JavaVM
}
impl IPCTransport {
pub fn new<'a: 'b, 'b>(env: &'b JNIEnv<'a>, channel: &str) -> jni::errors::Result<Self> { Ok(Self {
channel: channel.to_owned(),
vm: env.get_java_vm()?
})
}
pub fn default<'a: 'b, 'b>(env: &'b JNIEnv<'a>) -> jni::errors::Result<Self> { Self::new(env, "default")
}
}
struct BoundIPCTransport {
_channel: GlobalRef }
impl BoundTransport for BoundIPCTransport {}
impl Transport for IPCTransport {
fn bind(self, processor: Arc<dyn TransportProcessor + Send + Sync>) -> Box<dyn BoundTransport + Send> {
debug!("!!!Binding");
let env = self.vm.get_env().unwrap();
debug!("!!!ENV");
let processor = JProcessor::new(&env, processor).unwrap();
debug!("!!!PROC");
let channel = env.new_string(&self.channel).unwrap();
debug!("!!!CHANNEL STRING");
let channel = env.call_method(*processor, "createChannel",
"(Ljava/lang/String;)Lone/tesseract/ipc/service/Channel;", &[channel.into()]).unwrap().l().unwrap();
debug!("!!!GOT CHANNEL");
let channel = env.new_global_ref(channel).unwrap();
debug!("!!!GLOBAL CHANNEL");
Box::new(BoundIPCTransport {_channel: channel})
}
}