From 277f86a04bc133e900e24b7ab45b478f20318537 Mon Sep 17 00:00:00 2001 From: Avii Date: Sun, 20 Oct 2024 20:02:23 +0200 Subject: [PATCH] sendsyncmaybe --- simconnect-sdk/src/simconnect/base.rs | 33 +++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/simconnect-sdk/src/simconnect/base.rs b/simconnect-sdk/src/simconnect/base.rs index c0aa4a2..c445b74 100644 --- a/simconnect-sdk/src/simconnect/base.rs +++ b/simconnect-sdk/src/simconnect/base.rs @@ -1,3 +1,4 @@ +use std::ops::{Deref, DerefMut}; use std::{collections::HashMap, ffi::c_void}; use tracing::{error, span, trace, warn, Level}; @@ -83,9 +84,8 @@ use crate::{as_c_string, bindings, ok_if_fail, success, SimConnectError}; /// Ok(()) /// } /// ``` -#[derive(Debug)] pub struct SimConnect { - pub(crate) handle: std::ptr::NonNull, + pub(crate) handle: SimConnectHandle, pub(crate) next_request_id: u32, pub(crate) registered_objects: HashMap, pub(crate) system_event_register: EventRegister, @@ -105,15 +105,34 @@ impl RegisteredObject { } } +pub struct SimConnectHandle(std::ptr::NonNull); + +impl DerefMut for SimConnectHandle { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Deref for SimConnectHandle { + type Target = std::ptr::NonNull; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +unsafe impl Send for SimConnectHandle {} +unsafe impl Sync for SimConnectHandle {} + impl SimConnect { /// Create a new SimConnect SDK client. #[tracing::instrument(name = "SimConnect::new", level = "debug")] pub fn new(name: &str) -> Result { - let mut handle = std::ptr::null_mut(); + let mut g = std::ptr::null_mut(); success!(unsafe { bindings::SimConnect_Open( - &mut handle, + &mut g, as_c_string!(name), std::ptr::null_mut(), 0, @@ -123,11 +142,11 @@ impl SimConnect { })?; Ok(Self { - handle: std::ptr::NonNull::new(handle).ok_or_else(|| { + handle: SimConnectHandle(std::ptr::NonNull::new(g).ok_or_else(|| { SimConnectError::UnexpectedError( "SimConnect_Open returned null pointer on success".to_string(), ) - })?, + })?), next_request_id: 0, registered_objects: HashMap::new(), system_event_register: EventRegister::new(), @@ -148,7 +167,7 @@ impl SimConnect { unsafe { ok_if_fail!( bindings::SimConnect_GetNextDispatch( - self.handle.as_ptr(), + self.handle.0.as_ptr(), &mut data_buf, size_buf_pointer ),