1use crate::{DBusInterface, ffi};
6use glib::{
7 object::ObjectType as _,
8 prelude::*,
9 signal::{SignalHandlerId, connect_raw},
10 translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15 #[doc(alias = "GDBusObject")]
38 pub struct DBusObject(Interface<ffi::GDBusObject, ffi::GDBusObjectIface>);
39
40 match fn {
41 type_ => || ffi::g_dbus_object_get_type(),
42 }
43}
44
45impl DBusObject {
46 pub const NONE: Option<&'static DBusObject> = None;
47}
48
49pub trait DBusObjectExt: IsA<DBusObject> + 'static {
55 #[doc(alias = "g_dbus_object_get_interface")]
65 #[doc(alias = "get_interface")]
66 fn interface(&self, interface_name: &str) -> Option<DBusInterface> {
67 unsafe {
68 from_glib_full(ffi::g_dbus_object_get_interface(
69 self.as_ref().to_glib_none().0,
70 interface_name.to_glib_none().0,
71 ))
72 }
73 }
74
75 #[doc(alias = "g_dbus_object_get_interfaces")]
83 #[doc(alias = "get_interfaces")]
84 fn interfaces(&self) -> Vec<DBusInterface> {
85 unsafe {
86 FromGlibPtrContainer::from_glib_full(ffi::g_dbus_object_get_interfaces(
87 self.as_ref().to_glib_none().0,
88 ))
89 }
90 }
91
92 #[doc(alias = "g_dbus_object_get_object_path")]
98 #[doc(alias = "get_object_path")]
99 fn object_path(&self) -> glib::GString {
100 unsafe {
101 from_glib_none(ffi::g_dbus_object_get_object_path(
102 self.as_ref().to_glib_none().0,
103 ))
104 }
105 }
106
107 #[doc(alias = "interface-added")]
111 fn connect_interface_added<F: Fn(&Self, &DBusInterface) + 'static>(
112 &self,
113 f: F,
114 ) -> SignalHandlerId {
115 unsafe extern "C" fn interface_added_trampoline<
116 P: IsA<DBusObject>,
117 F: Fn(&P, &DBusInterface) + 'static,
118 >(
119 this: *mut ffi::GDBusObject,
120 interface: *mut ffi::GDBusInterface,
121 f: glib::ffi::gpointer,
122 ) {
123 unsafe {
124 let f: &F = &*(f as *const F);
125 f(
126 DBusObject::from_glib_borrow(this).unsafe_cast_ref(),
127 &from_glib_borrow(interface),
128 )
129 }
130 }
131 unsafe {
132 let f: Box_<F> = Box_::new(f);
133 connect_raw(
134 self.as_ptr() as *mut _,
135 c"interface-added".as_ptr() as *const _,
136 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
137 interface_added_trampoline::<Self, F> as *const (),
138 )),
139 Box_::into_raw(f),
140 )
141 }
142 }
143
144 #[doc(alias = "interface-removed")]
148 fn connect_interface_removed<F: Fn(&Self, &DBusInterface) + 'static>(
149 &self,
150 f: F,
151 ) -> SignalHandlerId {
152 unsafe extern "C" fn interface_removed_trampoline<
153 P: IsA<DBusObject>,
154 F: Fn(&P, &DBusInterface) + 'static,
155 >(
156 this: *mut ffi::GDBusObject,
157 interface: *mut ffi::GDBusInterface,
158 f: glib::ffi::gpointer,
159 ) {
160 unsafe {
161 let f: &F = &*(f as *const F);
162 f(
163 DBusObject::from_glib_borrow(this).unsafe_cast_ref(),
164 &from_glib_borrow(interface),
165 )
166 }
167 }
168 unsafe {
169 let f: Box_<F> = Box_::new(f);
170 connect_raw(
171 self.as_ptr() as *mut _,
172 c"interface-removed".as_ptr() as *const _,
173 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
174 interface_removed_trampoline::<Self, F> as *const (),
175 )),
176 Box_::into_raw(f),
177 )
178 }
179 }
180}
181
182impl<O: IsA<DBusObject>> DBusObjectExt for O {}