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.__native_handle();
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(
48 raw_ptr.0,
49 drop_guard,
50 self.runtime().native_registry(),
51 ))
52 }
53
54 fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
55 id: T,
56 runtime: ObsRuntime,
57 ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
58 let id: ObsString = id.into();
59 let raw_ptr = run_with_obs!(runtime, (id), move || {
60 let id_ptr = id.as_ptr();
61 let property_ptr = unsafe {
62 libobs::obs_get_source_properties(id_ptr.0)
64 };
65
66 if property_ptr.is_null() {
67 Err(ObsError::NullPointer(None))
68 } else {
69 Ok(Sendable(property_ptr))
70 }
71 })??;
72
73 let drop_guard = _ObsPropertiesDropGuard {
74 properties: raw_ptr.clone(),
75 runtime: runtime.clone(),
76 };
77
78 let ptr =
79 SmartPointerSendable::new(raw_ptr.0, Arc::new(drop_guard), runtime.native_registry());
80 Ok(ptr)
81 }
82}
83
84impl ObsPropertyObject for ObsOutputRef {
85 fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
86 let properties_raw = self.get_properties_raw()?;
87 property_ptr_to_struct(properties_raw, self.runtime().clone())
88 }
89}
90
91impl ObsPropertyObjectPrivate for ObsOutputRef {
92 fn get_properties_raw(
93 &self,
94 ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
95 let output_ptr = self.__native_handle().clone();
96 let ptr = run_with_obs!(self.runtime(), (output_ptr), move || {
97 let property_ptr = unsafe {
98 libobs::obs_output_properties(output_ptr.get_ptr())
100 };
101
102 if property_ptr.is_null() {
103 Err(ObsError::NullPointer(None))
104 } else {
105 Ok(Sendable(property_ptr))
106 }
107 })??;
108
109 let drop_guard = Arc::new(_ObsPropertiesDropGuard {
110 properties: ptr.clone(),
111 runtime: self.runtime().clone(),
112 });
113
114 Ok(SmartPointerSendable::new(
115 ptr.0,
116 drop_guard,
117 self.runtime().native_registry(),
118 ))
119 }
120
121 fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
122 id: T,
123 runtime: ObsRuntime,
124 ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
125 let id: ObsString = id.into();
126 let ptr = run_with_obs!(runtime, (id), move || {
127 let id_ptr = id.as_ptr();
128 let property_ptr = unsafe {
129 libobs::obs_get_output_properties(id_ptr.0)
131 };
132
133 if property_ptr.is_null() {
134 Err(ObsError::NullPointer(None))
135 } else {
136 Ok(Sendable(property_ptr))
137 }
138 })??;
139
140 let drop_guard = _ObsPropertiesDropGuard {
141 properties: ptr.clone(),
142 runtime: runtime.clone(),
143 };
144
145 let ptr = SmartPointerSendable::new(ptr.0, Arc::new(drop_guard), runtime.native_registry());
146 Ok(ptr)
147 }
148}