6b3b29164d36d4689e642f91c8e722b0ddd2a036
[platform/upstream/glib.git] / gio / gdbusobjectmanager.c
1 /* GDBus - GLib D-Bus Library
2  *
3  * Copyright (C) 2008-2010 Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General
16  * Public License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Author: David Zeuthen <davidz@redhat.com>
21  */
22
23 #include "config.h"
24
25 #include "gdbusobject.h"
26 #include "gdbusobjectmanager.h"
27 #include "gio-marshal.h"
28 #include "gdbusinterface.h"
29 #include "gdbusutils.h"
30
31 #include "glibintl.h"
32
33 /**
34  * SECTION:gdbusobjectmanager
35  * @short_description: Base type for D-Bus object managers
36  * @include: gio/gio.h
37  *
38  * The #GDBusObjectManager type is the base type for service- and
39  * client-side implementations of the standardized <ulink
40  * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">org.freedesktop.DBus.ObjectManager</ulink>
41  * interface.
42  *
43  * See #GDBusObjectManagerClient for the client-side implementation
44  * and #GDBusObjectManagerServer for the service-side implementation.
45  */
46
47 /**
48  * GDBusObjectManager:
49  *
50  * A D-Bus object.
51  */
52
53 typedef GDBusObjectManagerIface GDBusObjectManagerInterface;
54 G_DEFINE_INTERFACE (GDBusObjectManager, g_dbus_object_manager, G_TYPE_OBJECT)
55
56 static void
57 g_dbus_object_manager_default_init (GDBusObjectManagerIface *iface)
58 {
59   /**
60    * GDBusObjectManager::object-added:
61    * @manager: The #GDBusObjectManager emitting the signal.
62    * @object: The #GDBusObject that was added.
63    *
64    * Emitted when @object is added to @manager.
65    */
66   g_signal_new ("object-added",
67                 G_TYPE_FROM_INTERFACE (iface),
68                 G_SIGNAL_RUN_LAST,
69                 G_STRUCT_OFFSET (GDBusObjectManagerIface, object_added),
70                 NULL,
71                 NULL,
72                 g_cclosure_marshal_VOID__OBJECT,
73                 G_TYPE_NONE,
74                 1,
75                 G_TYPE_DBUS_OBJECT);
76
77   /**
78    * GDBusObjectManager::object-removed:
79    * @manager: The #GDBusObjectManager emitting the signal.
80    * @object: The #GDBusObject that was removed.
81    *
82    * Emitted when @object is removed from @manager.
83    */
84   g_signal_new ("object-removed",
85                 G_TYPE_FROM_INTERFACE (iface),
86                 G_SIGNAL_RUN_LAST,
87                 G_STRUCT_OFFSET (GDBusObjectManagerIface, object_removed),
88                 NULL,
89                 NULL,
90                 g_cclosure_marshal_VOID__OBJECT,
91                 G_TYPE_NONE,
92                 1,
93                 G_TYPE_DBUS_OBJECT);
94
95   /**
96    * GDBusObjectManager::interface-added:
97    * @manager: The #GDBusObjectManager emitting the signal.
98    * @object: The #GDBusObject on which an interface was added.
99    * @interface: The #GDBusInterface that was added.
100    *
101    * Emitted when @interface is added to @object.
102    *
103    * This signal exists purely as a convenience to avoid having to
104    * connect signals to all objects managed by @manager.
105    */
106   g_signal_new ("interface-added",
107                 G_TYPE_FROM_INTERFACE (iface),
108                 G_SIGNAL_RUN_LAST,
109                 G_STRUCT_OFFSET (GDBusObjectManagerIface, interface_added),
110                 NULL,
111                 NULL,
112                 _gio_marshal_VOID__OBJECT_OBJECT,
113                 G_TYPE_NONE,
114                 2,
115                 G_TYPE_DBUS_OBJECT,
116                 G_TYPE_DBUS_INTERFACE);
117
118   /**
119    * GDBusObjectManager::interface-removed:
120    * @manager: The #GDBusObjectManager emitting the signal.
121    * @object: The #GDBusObject on which an interface was removed.
122    * @interface: The #GDBusInterface that was removed.
123    *
124    * Emitted when @interface has been removed from @object.
125    *
126    * This signal exists purely as a convenience to avoid having to
127    * connect signals to all objects managed by @manager.
128    */
129   g_signal_new ("interface-removed",
130                 G_TYPE_FROM_INTERFACE (iface),
131                 G_SIGNAL_RUN_LAST,
132                 G_STRUCT_OFFSET (GDBusObjectManagerIface, interface_removed),
133                 NULL,
134                 NULL,
135                 _gio_marshal_VOID__OBJECT_OBJECT,
136                 G_TYPE_NONE,
137                 2,
138                 G_TYPE_DBUS_OBJECT,
139                 G_TYPE_DBUS_INTERFACE);
140
141 }
142
143 /* ---------------------------------------------------------------------------------------------------- */
144
145 /**
146  * g_dbus_object_manager_get_object_path:
147  * @manager: A #GDBusObjectManager.
148  *
149  * Gets the object path that @manager is for.
150  *
151  * Returns: A string owned by @manager. Do not free.
152  */
153 const gchar *
154 g_dbus_object_manager_get_object_path (GDBusObjectManager *manager)
155 {
156   GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager);
157   return iface->get_object_path (manager);
158 }
159
160 /**
161  * g_dbus_object_manager_get_objects:
162  * @manager: A #GDBusObjectManager.
163  *
164  * Gets all #GDBusObject objects known to @manager.
165  *
166  * Returns: (transfer full) (element-type GDBusObject): A list of
167  *   #GDBusObject objects. The returned list should be freed with
168  *   g_list_free() after each element has been freed with
169  *   g_object_unref().
170  */
171 GList *
172 g_dbus_object_manager_get_objects (GDBusObjectManager *manager)
173 {
174   GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager);
175   return iface->get_objects (manager);
176 }
177
178 /**
179  * g_dbus_object_manager_get_object:
180  * @manager: A #GDBusObjectManager.
181  * @object_path: Object path to lookup.
182  *
183  * Gets the #GDBusObjectProxy at @object_path, if any.
184  *
185  * Returns: A #GDBusObject or %NULL. Free with g_object_unref().
186  */
187 GDBusObject *
188 g_dbus_object_manager_get_object (GDBusObjectManager *manager,
189                                   const gchar        *object_path)
190 {
191   GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager);
192   g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
193   return iface->get_object (manager, object_path);
194 }
195
196 /**
197  * g_dbus_object_manager_get_interface:
198  * @manager: A #GDBusObjectManager.
199  * @object_path: Object path to lookup.
200  * @interface_name: D-Bus interface name to lookup.
201  *
202  * Gets the interface proxy for @interface_name at @object_path, if
203  * any.
204  *
205  * Returns: A #GDBusInterface instance or %NULL. Free with g_object_unref().
206  */
207 GDBusInterface *
208 g_dbus_object_manager_get_interface (GDBusObjectManager *manager,
209                                      const gchar        *object_path,
210                                      const gchar        *interface_name)
211 {
212   GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager);
213   g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
214   g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL);
215   return iface->get_interface (manager, object_path, interface_name);
216 }