1 /* GDBus - GLib D-Bus Library
2 *
3 * Copyright (C) 2008-2010 Red Hat, Inc.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General
18 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 *
20 * Author: David Zeuthen <davidz@redhat.com>
21 */
22
23 #include "config.h"
24
25 #include "gdbusobject.h"
26 #include "gdbusinterface.h"
27
28 #include "glibintl.h"
29
30 /**
31 * GDBusInterface:
32 *
33 * Base type for D-Bus interfaces.
34 *
35 * The `GDBusInterface` type is the base type for D-Bus interfaces both
36 * on the service side (see [class@Gio.DBusInterfaceSkeleton]) and client side
37 * (see [class@Gio.DBusProxy]).
38 *
39 * Since: 2.30
40 */
41
42 typedef GDBusInterfaceIface GDBusInterfaceInterface;
43 G_DEFINE_INTERFACE (GDBusInterface, g_dbus_interface, G_TYPE_OBJECT)
44
45 static void
46 g_dbus_interface_default_init (GDBusInterfaceIface *iface)
47 {
48 }
49
50 /* ---------------------------------------------------------------------------------------------------- */
51
52 /**
53 * g_dbus_interface_get_info:
54 * @interface_: An exported D-Bus interface.
55 *
56 * Gets D-Bus introspection information for the D-Bus interface
57 * implemented by @interface_.
58 *
59 * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
60 *
61 * Since: 2.30
62 */
63 GDBusInterfaceInfo *
64 g_dbus_interface_get_info (GDBusInterface *interface_)
65 {
66 g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL);
67 return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_info (interface_);
68 }
69
70 /**
71 * g_dbus_interface_get_object: (skip)
72 * @interface_: An exported D-Bus interface
73 *
74 * Gets the #GDBusObject that @interface_ belongs to, if any.
75 *
76 * It is not safe to use the returned object if @interface_ or
77 * the returned object is being used from other threads. See
78 * g_dbus_interface_dup_object() for a thread-safe alternative.
79 *
80 * Returns: (nullable) (transfer none): A #GDBusObject or %NULL. The returned
81 * reference belongs to @interface_ and should not be freed.
82 *
83 * Since: 2.30
84 */
85 GDBusObject *
86 g_dbus_interface_get_object (GDBusInterface *interface_)
87 {
88 g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL);
89 return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_);
90 }
91
92 /**
93 * g_dbus_interface_dup_object: (rename-to g_dbus_interface_get_object)
94 * @interface_: An exported D-Bus interface.
95 *
96 * Gets the #GDBusObject that @interface_ belongs to, if any.
97 *
98 * Returns: (nullable) (transfer full): A #GDBusObject or %NULL. The returned
99 * reference should be freed with g_object_unref().
100 *
101 * Since: 2.32
102 */
103 GDBusObject *
104 g_dbus_interface_dup_object (GDBusInterface *interface_)
105 {
106 GDBusObject *ret;
107 g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL);
108 if (G_LIKELY (G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object != NULL))
109 {
110 ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object (interface_);
111 }
112 else
113 {
114 g_warning ("No dup_object() vfunc on type %s - using get_object() in a way that is not thread-safe.",
115 g_type_name_from_instance ((GTypeInstance *) interface_));
116 ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_);
117 if (ret != NULL)
118 g_object_ref (ret);
119 }
120 return ret;
121 }
122
123 /**
124 * g_dbus_interface_set_object:
125 * @interface_: An exported D-Bus interface.
126 * @object: (nullable): A #GDBusObject or %NULL.
127 *
128 * Sets the #GDBusObject for @interface_ to @object.
129 *
130 * Note that @interface_ will hold a weak reference to @object.
131 *
132 * Since: 2.30
133 */
134 void
135 g_dbus_interface_set_object (GDBusInterface *interface_,
136 GDBusObject *object)
137 {
138 g_return_if_fail (G_IS_DBUS_INTERFACE (interface_));
139 g_return_if_fail (object == NULL || G_IS_DBUS_OBJECT (object));
140 G_DBUS_INTERFACE_GET_IFACE (interface_)->set_object (interface_, object);
141 }