libobs_wrapper\data\properties/
prop_impl.rs

1use std::{collections::HashMap, sync::Arc};
2
3use crate::{
4    data::{object::ObsObjectTrait, output::ObsOutputRef, properties::_ObsPropertiesDropGuard},
5    run_with_obs,
6    runtime::ObsRuntime,
7    sources::ObsSourceTrait,
8    unsafe_send::{Sendable, SmartPointerSendable},
9    utils::{ObsError, ObsString},
10};
11
12use super::{property_ptr_to_struct, ObsProperty, ObsPropertyObject, ObsPropertyObjectPrivate};
13
14impl<K: ObsSourceTrait> ObsPropertyObject for K {
15    fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
16        let properties_raw = self.get_properties_raw()?;
17        property_ptr_to_struct(properties_raw, self.runtime().clone())
18    }
19}
20
21impl<K: ObsSourceTrait> ObsPropertyObjectPrivate for K {
22    fn get_properties_raw(
23        &self,
24    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
25        let source_ptr = self.as_ptr();
26        let runtime = self.runtime().clone();
27
28        let raw_ptr = run_with_obs!(runtime, (source_ptr), move || {
29            let source_ptr = source_ptr;
30            let property_ptr = unsafe {
31                // Safety: Safe because of smart pointer
32                libobs::obs_source_properties(source_ptr.get_ptr())
33            };
34
35            if property_ptr.is_null() {
36                Err(ObsError::NullPointer(None))
37            } else {
38                Ok(Sendable(property_ptr))
39            }
40        })??;
41
42        let drop_guard = Arc::new(_ObsPropertiesDropGuard {
43            properties: raw_ptr.clone(),
44            runtime: self.runtime().clone(),
45        });
46
47        Ok(SmartPointerSendable::new(raw_ptr.0, drop_guard))
48    }
49
50    fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
51        id: T,
52        runtime: ObsRuntime,
53    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
54        let id: ObsString = id.into();
55        let raw_ptr = run_with_obs!(runtime, (id), move || {
56            let id_ptr = id.as_ptr();
57            let property_ptr = unsafe {
58                // Safety: Safe because of smart pointer
59                libobs::obs_get_source_properties(id_ptr.0)
60            };
61
62            if property_ptr.is_null() {
63                Err(ObsError::NullPointer(None))
64            } else {
65                Ok(Sendable(property_ptr))
66            }
67        })??;
68
69        let drop_guard = _ObsPropertiesDropGuard {
70            properties: raw_ptr.clone(),
71            runtime: runtime.clone(),
72        };
73
74        let ptr = SmartPointerSendable::new(raw_ptr.0, Arc::new(drop_guard));
75        Ok(ptr)
76    }
77}
78
79impl ObsPropertyObject for ObsOutputRef {
80    fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
81        let properties_raw = self.get_properties_raw()?;
82        property_ptr_to_struct(properties_raw, self.runtime().clone())
83    }
84}
85
86impl ObsPropertyObjectPrivate for ObsOutputRef {
87    fn get_properties_raw(
88        &self,
89    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
90        let output_ptr = self.as_ptr().clone();
91        let ptr = run_with_obs!(self.runtime(), (output_ptr), move || {
92            let property_ptr = unsafe {
93                // Safety: Safe because of smart pointer
94                libobs::obs_output_properties(output_ptr.get_ptr())
95            };
96
97            if property_ptr.is_null() {
98                Err(ObsError::NullPointer(None))
99            } else {
100                Ok(Sendable(property_ptr))
101            }
102        })??;
103
104        let drop_guard = Arc::new(_ObsPropertiesDropGuard {
105            properties: ptr.clone(),
106            runtime: self.runtime().clone(),
107        });
108
109        Ok(SmartPointerSendable::new(ptr.0, drop_guard))
110    }
111
112    fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
113        id: T,
114        runtime: ObsRuntime,
115    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
116        let id: ObsString = id.into();
117        let ptr = run_with_obs!(runtime, (id), move || {
118            let id_ptr = id.as_ptr();
119            let property_ptr = unsafe {
120                // Safety: Safe because of smart pointer
121                libobs::obs_get_output_properties(id_ptr.0)
122            };
123
124            if property_ptr.is_null() {
125                Err(ObsError::NullPointer(None))
126            } else {
127                Ok(Sendable(property_ptr))
128            }
129        })??;
130
131        let drop_guard = _ObsPropertiesDropGuard {
132            properties: ptr.clone(),
133            runtime: runtime.clone(),
134        };
135
136        let ptr = SmartPointerSendable::new(ptr.0, Arc::new(drop_guard));
137        Ok(ptr)
138    }
139}