|
@@ -2,11 +2,16 @@ use crate::pubsub::change_listener::ChangeListener;
|
|
|
use crate::pubsub::protobuf::pbmessages::NetworkChange;
|
|
|
use prost::Message;
|
|
|
use serde_json;
|
|
|
+use std::io::Write;
|
|
|
+use std::os::raw::c_void;
|
|
|
+use std::sync::atomic::{AtomicPtr, Ordering};
|
|
|
use std::sync::Arc;
|
|
|
use std::time::Duration;
|
|
|
use tokio::sync::mpsc::Receiver;
|
|
|
use tokio::sync::Mutex;
|
|
|
|
|
|
+pub type NetworkListenerCallback = extern "C" fn(*mut c_void, *const u8, usize);
|
|
|
+
|
|
|
/**
|
|
|
* Network Listener listens for network changes and passes them back to the controller
|
|
|
*
|
|
@@ -16,10 +21,17 @@ use tokio::sync::Mutex;
|
|
|
pub struct NetworkListener {
|
|
|
change_listener: ChangeListener,
|
|
|
rx_channel: Mutex<Receiver<Vec<u8>>>,
|
|
|
+ callback: Mutex<NetworkListenerCallback>,
|
|
|
+ user_ptr: AtomicPtr<c_void>,
|
|
|
}
|
|
|
|
|
|
impl NetworkListener {
|
|
|
- pub async fn new(controller_id: &str, listen_timeout: Duration) -> Result<Arc<Self>, Box<dyn std::error::Error>> {
|
|
|
+ pub async fn new(
|
|
|
+ controller_id: &str,
|
|
|
+ listen_timeout: Duration,
|
|
|
+ callback: NetworkListenerCallback,
|
|
|
+ user_ptr: *mut c_void,
|
|
|
+ ) -> Result<Arc<Self>, Box<dyn std::error::Error>> {
|
|
|
let (tx, rx) = tokio::sync::mpsc::channel(64);
|
|
|
|
|
|
let change_listener = ChangeListener::new(
|
|
@@ -30,7 +42,13 @@ impl NetworkListener {
|
|
|
tx,
|
|
|
)
|
|
|
.await?;
|
|
|
- Ok(Arc::new(Self { change_listener, rx_channel: Mutex::new(rx) }))
|
|
|
+
|
|
|
+ Ok(Arc::new(Self {
|
|
|
+ change_listener,
|
|
|
+ rx_channel: Mutex::new(rx),
|
|
|
+ callback: Mutex::new(callback),
|
|
|
+ user_ptr: AtomicPtr::new(user_ptr as *mut c_void),
|
|
|
+ }))
|
|
|
}
|
|
|
|
|
|
pub async fn listen(&self) -> Result<(), Box<dyn std::error::Error>> {
|
|
@@ -43,8 +61,22 @@ impl NetworkListener {
|
|
|
let mut rx = this.rx_channel.lock().await;
|
|
|
while let Some(change) = rx.recv().await {
|
|
|
if let Ok(m) = NetworkChange::decode(change.as_slice()) {
|
|
|
+ print!("Received change: {:?}", m);
|
|
|
+
|
|
|
let j = serde_json::to_string(&m).unwrap();
|
|
|
- print!("Received change: {:?}", j);
|
|
|
+ let mut buffer = [0; 16384];
|
|
|
+ let mut test: &mut [u8] = &mut buffer;
|
|
|
+ let mut size: usize = 0;
|
|
|
+ while let Ok(bytes) = test.write(j.as_bytes()) {
|
|
|
+ if bytes == 0 {
|
|
|
+ break; // No more space to write
|
|
|
+ }
|
|
|
+ size += bytes;
|
|
|
+ }
|
|
|
+ let callback = this.callback.lock().await;
|
|
|
+ let user_ptr = this.user_ptr.load(Ordering::Relaxed);
|
|
|
+
|
|
|
+ (callback)(user_ptr, test.as_ptr(), size);
|
|
|
}
|
|
|
}
|
|
|
});
|