libobs_wrapper\data\properties/
prop_impl.rs1use 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 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 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 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 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}