#![allow(non_snake_case)]
pub mod client;
pub mod conf;
pub mod debug;
mod iter;
pub mod runtime;
pub mod strings;
pub mod sync;
use std::sync::{Arc, Condvar, Mutex};
use log::info;
use mssf_com::FabricCommon::{
IFabricAsyncOperationCallback, IFabricAsyncOperationCallback_Impl,
IFabricAsyncOperationContext, IFabricAsyncOperationContext_Impl,
};
use windows::core::implement;
pub use windows_core::{Error, Result, GUID, HSTRING, PCWSTR};
#[derive(Debug)]
#[implement(IFabricAsyncOperationCallback)]
pub struct WaitableCallback {
pair_: Arc<(Mutex<bool>, Condvar)>,
}
pub struct WaitableToken {
pair_: Arc<(Mutex<bool>, Condvar)>,
}
impl Default for WaitableCallback {
fn default() -> Self {
Self::new()
}
}
impl WaitableCallback {
pub fn channel() -> (WaitableToken, IFabricAsyncOperationCallback) {
let callback = WaitableCallback::new();
let token = WaitableToken {
pair_: callback.pair_.clone(),
};
let i_callbaack = callback.into();
(token, i_callbaack)
}
pub fn new() -> WaitableCallback {
WaitableCallback {
pair_: Arc::new((Mutex::new(false), Condvar::new())),
}
}
}
impl IFabricAsyncOperationCallback_Impl for WaitableCallback {
fn Invoke(&self, _context: ::core::option::Option<&IFabricAsyncOperationContext>) {
let (lock, cvar) = &*self.pair_;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_one();
}
}
impl WaitableToken {
pub fn wait(&self) {
let (lock, cvar) = &*self.pair_;
let mut started = lock.lock().unwrap();
while !*started {
started = cvar.wait(started).unwrap();
}
}
}
#[derive(Debug)]
#[implement(IFabricAsyncOperationContext)]
pub struct AsyncContext {
callback_: IFabricAsyncOperationCallback,
}
impl AsyncContext {
pub fn new(callback: core::option::Option<&IFabricAsyncOperationCallback>) -> AsyncContext {
info!("AsyncContext::new");
let callback_copy: IFabricAsyncOperationCallback = callback.expect("msg").clone();
AsyncContext {
callback_: callback_copy,
}
}
}
impl IFabricAsyncOperationContext_Impl for AsyncContext {
fn IsCompleted(&self) -> windows::Win32::Foundation::BOOLEAN {
windows::Win32::Foundation::BOOLEAN::from(true)
}
fn CompletedSynchronously(&self) -> windows::Win32::Foundation::BOOLEAN {
windows::Win32::Foundation::BOOLEAN::from(true)
}
fn Callback(&self) -> windows::core::Result<IFabricAsyncOperationCallback> {
info!("AsyncContext::Callback");
let callback_copy: IFabricAsyncOperationCallback = self.callback_.clone();
Ok(callback_copy)
}
fn Cancel(&self) -> windows::core::Result<()> {
info!("AsyncContext::Cancel");
Ok(())
}
}