1 | // Take a look at the license at the top of the repository in the LICENSE file. |
2 | |
3 | use glib::{prelude::*, subclass::prelude::*, translate::*}; |
4 | |
5 | use super::prelude::*; |
6 | use crate::ChildProxy; |
7 | |
8 | pub trait ChildProxyImpl: GstObjectImpl + Send + Sync { |
9 | fn child_by_name(&self, name: &str) -> Option<glib::Object> { |
10 | self.parent_child_by_name(name) |
11 | } |
12 | |
13 | fn child_by_index(&self, index: u32) -> Option<glib::Object>; |
14 | fn children_count(&self) -> u32; |
15 | |
16 | fn child_added(&self, child: &glib::Object, name: &str) { |
17 | self.parent_child_added(child, name); |
18 | } |
19 | fn child_removed(&self, child: &glib::Object, name: &str) { |
20 | self.parent_child_removed(child, name); |
21 | } |
22 | } |
23 | |
24 | mod sealed { |
25 | pub trait Sealed {} |
26 | impl<T: super::ChildProxyImplExt> Sealed for T {} |
27 | } |
28 | |
29 | pub trait ChildProxyImplExt: sealed::Sealed + ObjectSubclass { |
30 | fn parent_child_by_name(&self, name: &str) -> Option<glib::Object> { |
31 | unsafe { |
32 | let type_data = Self::type_data(); |
33 | let parent_iface = type_data.as_ref().parent_interface::<ChildProxy>() |
34 | as *const ffi::GstChildProxyInterface; |
35 | |
36 | let func = (*parent_iface) |
37 | .get_child_by_name |
38 | .expect("no parent \"child_by_name \" implementation" ); |
39 | let ret = func( |
40 | self.obj().unsafe_cast_ref::<ChildProxy>().to_glib_none().0, |
41 | name.to_glib_none().0, |
42 | ); |
43 | from_glib_full(ret) |
44 | } |
45 | } |
46 | |
47 | fn parent_child_by_index(&self, index: u32) -> Option<glib::Object> { |
48 | unsafe { |
49 | let type_data = Self::type_data(); |
50 | let parent_iface = type_data.as_ref().parent_interface::<ChildProxy>() |
51 | as *const ffi::GstChildProxyInterface; |
52 | |
53 | let func = (*parent_iface) |
54 | .get_child_by_index |
55 | .expect("no parent \"child_by_index \" implementation" ); |
56 | let ret = func( |
57 | self.obj().unsafe_cast_ref::<ChildProxy>().to_glib_none().0, |
58 | index, |
59 | ); |
60 | from_glib_full(ret) |
61 | } |
62 | } |
63 | |
64 | fn parent_children_count(&self) -> u32 { |
65 | unsafe { |
66 | let type_data = Self::type_data(); |
67 | let parent_iface = type_data.as_ref().parent_interface::<ChildProxy>() |
68 | as *const ffi::GstChildProxyInterface; |
69 | |
70 | let func = (*parent_iface) |
71 | .get_children_count |
72 | .expect("no parent \"children_count \" implementation" ); |
73 | func(self.obj().unsafe_cast_ref::<ChildProxy>().to_glib_none().0) |
74 | } |
75 | } |
76 | |
77 | fn parent_child_added(&self, child: &glib::Object, name: &str) { |
78 | unsafe { |
79 | let type_data = Self::type_data(); |
80 | let parent_iface = type_data.as_ref().parent_interface::<ChildProxy>() |
81 | as *const ffi::GstChildProxyInterface; |
82 | |
83 | if let Some(func) = (*parent_iface).child_added { |
84 | func( |
85 | self.obj().unsafe_cast_ref::<ChildProxy>().to_glib_none().0, |
86 | child.to_glib_none().0, |
87 | name.to_glib_none().0, |
88 | ); |
89 | } |
90 | } |
91 | } |
92 | |
93 | fn parent_child_removed(&self, child: &glib::Object, name: &str) { |
94 | unsafe { |
95 | let type_data = Self::type_data(); |
96 | let parent_iface = type_data.as_ref().parent_interface::<ChildProxy>() |
97 | as *const ffi::GstChildProxyInterface; |
98 | |
99 | if let Some(func) = (*parent_iface).child_removed { |
100 | func( |
101 | self.obj().unsafe_cast_ref::<ChildProxy>().to_glib_none().0, |
102 | child.to_glib_none().0, |
103 | name.to_glib_none().0, |
104 | ); |
105 | } |
106 | } |
107 | } |
108 | } |
109 | |
110 | impl<T: ChildProxyImpl> ChildProxyImplExt for T {} |
111 | |
112 | unsafe impl<T: ChildProxyImpl> IsImplementable<T> for ChildProxy { |
113 | fn interface_init(iface: &mut glib::Interface<Self>) { |
114 | let iface: &mut GstChildProxyInterface = iface.as_mut(); |
115 | |
116 | iface.get_child_by_name = Some(child_proxy_get_child_by_name::<T>); |
117 | iface.get_child_by_index = Some(child_proxy_get_child_by_index::<T>); |
118 | iface.get_children_count = Some(child_proxy_get_children_count::<T>); |
119 | iface.child_added = Some(child_proxy_child_added::<T>); |
120 | iface.child_removed = Some(child_proxy_child_removed::<T>); |
121 | } |
122 | } |
123 | |
124 | unsafe extern "C" fn child_proxy_get_child_by_name<T: ChildProxyImpl>( |
125 | child_proxy: *mut ffi::GstChildProxy, |
126 | name: *const libc::c_char, |
127 | ) -> *mut glib::gobject_ffi::GObject { |
128 | let instance: &::Instance = &*(child_proxy as *mut T::Instance); |
129 | let imp: &T = instance.imp(); |
130 | |
131 | impOption.child_by_name(&glib::GString::from_glib_borrow(_ptr:name)) |
132 | .into_glib_ptr() |
133 | } |
134 | |
135 | unsafe extern "C" fn child_proxy_get_child_by_index<T: ChildProxyImpl>( |
136 | child_proxy: *mut ffi::GstChildProxy, |
137 | index: u32, |
138 | ) -> *mut glib::gobject_ffi::GObject { |
139 | let instance: &::Instance = &*(child_proxy as *mut T::Instance); |
140 | let imp: &T = instance.imp(); |
141 | |
142 | imp.child_by_index(index).into_glib_ptr() |
143 | } |
144 | |
145 | unsafe extern "C" fn child_proxy_get_children_count<T: ChildProxyImpl>( |
146 | child_proxy: *mut ffi::GstChildProxy, |
147 | ) -> u32 { |
148 | let instance: &::Instance = &*(child_proxy as *mut T::Instance); |
149 | let imp: &T = instance.imp(); |
150 | |
151 | imp.children_count() |
152 | } |
153 | |
154 | unsafe extern "C" fn child_proxy_child_added<T: ChildProxyImpl>( |
155 | child_proxy: *mut ffi::GstChildProxy, |
156 | child: *mut glib::gobject_ffi::GObject, |
157 | name: *const libc::c_char, |
158 | ) { |
159 | let instance: &::Instance = &*(child_proxy as *mut T::Instance); |
160 | let imp: &T = instance.imp(); |
161 | |
162 | imp.child_added( |
163 | &from_glib_borrow(child), |
164 | &glib::GString::from_glib_borrow(_ptr:name), |
165 | ) |
166 | } |
167 | |
168 | unsafe extern "C" fn child_proxy_child_removed<T: ChildProxyImpl>( |
169 | child_proxy: *mut ffi::GstChildProxy, |
170 | child: *mut glib::gobject_ffi::GObject, |
171 | name: *const libc::c_char, |
172 | ) { |
173 | let instance: &::Instance = &*(child_proxy as *mut T::Instance); |
174 | let imp: &T = instance.imp(); |
175 | |
176 | imp.child_removed( |
177 | &from_glib_borrow(child), |
178 | &glib::GString::from_glib_borrow(_ptr:name), |
179 | ) |
180 | } |
181 | |