use std::{sync::Mutex, thread, time::Duration};
use quickfix::*;
use super::{build_news, build_settings, ServerType};
static GLOBAL_LOCK: Mutex<u8> = Mutex::new(0);
pub fn run(
communication_port: u16,
logger: impl LogCallback + 'static,
sender: impl ApplicationCallback + 'static,
message_store_factory_sender: impl FfiMessageStoreFactory + 'static,
receiver: impl ApplicationCallback + 'static,
message_store_factory_receiver: impl FfiMessageStoreFactory + 'static,
) -> Result<(), QuickFixError> {
let _lock = GLOBAL_LOCK.lock().expect("GLOBAL_LOCK poisoned");
let settings_sender = build_settings(ServerType::Sender, communication_port)?;
let settings_receiver = build_settings(ServerType::Receiver, communication_port)?;
let log_factory = LogFactory::try_new(&logger)?;
let app_sender = Application::try_new(&sender)?;
let app_receiver = Application::try_new(&receiver)?;
let mut socket_sender = Initiator::try_new(
&settings_sender,
&app_sender,
&message_store_factory_sender,
&log_factory,
FixSocketServerKind::default(),
)?;
let mut socket_receiver = Acceptor::try_new(
&settings_receiver,
&app_receiver,
&message_store_factory_receiver,
&log_factory,
FixSocketServerKind::default(),
)?;
socket_receiver.start()?;
socket_sender.start()?;
while !socket_sender.is_logged_on()? && !socket_receiver.is_logged_on()? {
thread::sleep(Duration::from_millis(50));
}
let news = build_news("Hello", &[])?;
send_to_target(news, &ServerType::Sender.session_id())?;
thread::sleep(Duration::from_millis(50));
let news = build_news("Anyone here ?", &["Yeah"])?;
send_to_target(news, &ServerType::Receiver.session_id())?;
thread::sleep(Duration::from_millis(50));
socket_receiver.stop()?;
socket_sender.stop()?;
Ok(())
}