| 1 | // Take a look at the license at the top of the repository in the LICENSE file. |
| 2 | |
| 3 | use std::ptr; |
| 4 | |
| 5 | use glib::{prelude::*, translate::*}; |
| 6 | |
| 7 | use crate::ChildProxy; |
| 8 | |
| 9 | mod sealed { |
| 10 | pub trait Sealed {} |
| 11 | impl<T: super::IsA<super::ChildProxy>> Sealed for T {} |
| 12 | } |
| 13 | |
| 14 | pub trait ChildProxyExtManual: sealed::Sealed + IsA<ChildProxy> + 'static { |
| 15 | #[doc (alias = "gst_child_proxy_lookup" )] |
| 16 | fn lookup(&self, name: &str) -> Result<(glib::Object, glib::ParamSpec), glib::BoolError> { |
| 17 | unsafe { |
| 18 | let mut target = ptr::null_mut(); |
| 19 | let mut pspec = ptr::null_mut(); |
| 20 | let ret = from_glib(crate::ffi::gst_child_proxy_lookup( |
| 21 | self.as_ref().to_glib_none().0, |
| 22 | name.to_glib_none().0, |
| 23 | &mut target, |
| 24 | &mut pspec, |
| 25 | )); |
| 26 | if ret { |
| 27 | Ok((from_glib_full(target), from_glib_none(pspec))) |
| 28 | } else { |
| 29 | Err(glib::bool_error!("Failed to find child property ' {name}'" )) |
| 30 | } |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | #[doc (alias = "get_child_property" )] |
| 35 | #[doc (alias = "gst_child_proxy_get" )] |
| 36 | #[track_caller ] |
| 37 | fn child_property<V: for<'b> glib::value::FromValue<'b> + 'static>(&self, name: &str) -> V { |
| 38 | let (child, pspec) = self.lookup(name).unwrap(); |
| 39 | child.property(pspec.name()) |
| 40 | } |
| 41 | |
| 42 | #[doc (alias = "get_child_property" )] |
| 43 | #[doc (alias = "gst_child_proxy_get" )] |
| 44 | #[track_caller ] |
| 45 | fn child_property_value(&self, name: &str) -> glib::Value { |
| 46 | let (child, pspec) = self.lookup(name).unwrap(); |
| 47 | child.property_value(pspec.name()) |
| 48 | } |
| 49 | |
| 50 | #[doc (alias = "gst_child_proxy_set" )] |
| 51 | #[track_caller ] |
| 52 | fn set_child_property(&self, name: &str, value: impl Into<glib::Value>) { |
| 53 | let (child, pspec) = self.lookup(name).unwrap(); |
| 54 | child.set_property(pspec.name(), value) |
| 55 | } |
| 56 | |
| 57 | #[doc (alias = "gst_child_proxy_set_property" )] |
| 58 | #[track_caller ] |
| 59 | fn set_child_property_from_value(&self, name: &str, value: &glib::Value) { |
| 60 | let (child, pspec) = self.lookup(name).unwrap(); |
| 61 | child.set_property_from_value(pspec.name(), value) |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | impl<O: IsA<ChildProxy>> ChildProxyExtManual for O {} |
| 66 | |