hook gvariant vectors up to kdbus
[platform/upstream/glib.git] / gio / ginitable.c
1 /* GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright (C) 2009 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, see <http://www.gnu.org/licenses/>.
17  *
18  * Author: Alexander Larsson <alexl@redhat.com>
19  */
20
21 #include "config.h"
22 #include "ginitable.h"
23 #include "glibintl.h"
24
25
26 /**
27  * SECTION:ginitable
28  * @short_description: Failable object initialization interface
29  * @include: gio/gio.h
30  * @see_also: #GAsyncInitable
31  *
32  * #GInitable is implemented by objects that can fail during
33  * initialization. If an object implements this interface then
34  * it must be initialized as the first thing after construction,
35  * either via g_initable_init() or g_async_initable_init_async()
36  * (the latter is only available if it also implements #GAsyncInitable).
37  *
38  * If the object is not initialized, or initialization returns with an
39  * error, then all operations on the object except g_object_ref() and
40  * g_object_unref() are considered to be invalid, and have undefined
41  * behaviour. They will often fail with g_critical() or g_warning(), but
42  * this must not be relied on.
43  *
44  * Users of objects implementing this are not intended to use
45  * the interface method directly, instead it will be used automatically
46  * in various ways. For C applications you generally just call
47  * g_initable_new() directly, or indirectly via a foo_thing_new() wrapper.
48  * This will call g_initable_init() under the cover, returning %NULL and
49  * setting a #GError on failure (at which point the instance is
50  * unreferenced).
51  *
52  * For bindings in languages where the native constructor supports
53  * exceptions the binding could check for objects implemention %GInitable
54  * during normal construction and automatically initialize them, throwing
55  * an exception on failure.
56  */
57
58 typedef GInitableIface GInitableInterface;
59 G_DEFINE_INTERFACE (GInitable, g_initable, G_TYPE_OBJECT)
60
61 static void
62 g_initable_default_init (GInitableInterface *iface)
63 {
64 }
65
66 /**
67  * g_initable_init:
68  * @initable: a #GInitable.
69  * @cancellable: optional #GCancellable object, %NULL to ignore.
70  * @error: a #GError location to store the error occurring, or %NULL to
71  * ignore.
72  *
73  * Initializes the object implementing the interface.
74  *
75  * The object must be initialized before any real use after initial
76  * construction, either with this function or g_async_initable_init_async().
77  *
78  * Implementations may also support cancellation. If @cancellable is not %NULL,
79  * then initialization can be cancelled by triggering the cancellable object
80  * from another thread. If the operation was cancelled, the error
81  * %G_IO_ERROR_CANCELLED will be returned. If @cancellable is not %NULL and
82  * the object doesn't support cancellable initialization the error
83  * %G_IO_ERROR_NOT_SUPPORTED will be returned.
84  *
85  * If the object is not initialized, or initialization returns with an
86  * error, then all operations on the object except g_object_ref() and
87  * g_object_unref() are considered to be invalid, and have undefined
88  * behaviour. See the [introduction][ginitable] for more details.
89  *
90  * Implementations of this method must be idempotent, i.e. multiple calls
91  * to this function with the same argument should return the same results.
92  * Only the first call initializes the object, further calls return the result
93  * of the first call. This is so that it's safe to implement the singleton
94  * pattern in the GObject constructor function.
95  *
96  * Returns: %TRUE if successful. If an error has occurred, this function will
97  *     return %FALSE and set @error appropriately if present.
98  *
99  * Since: 2.22
100  */
101 gboolean
102 g_initable_init (GInitable     *initable,
103                  GCancellable  *cancellable,
104                  GError       **error)
105 {
106   GInitableIface *iface;
107
108   g_return_val_if_fail (G_IS_INITABLE (initable), FALSE);
109
110   iface = G_INITABLE_GET_IFACE (initable);
111
112   return (* iface->init) (initable, cancellable, error);
113 }
114
115 /**
116  * g_initable_new:
117  * @object_type: a #GType supporting #GInitable.
118  * @cancellable: optional #GCancellable object, %NULL to ignore.
119  * @error: a #GError location to store the error occurring, or %NULL to
120  *    ignore.
121  * @first_property_name: (allow-none): the name of the first property, or %NULL if no
122  *     properties
123  * @...:  the value if the first property, followed by and other property
124  *    value pairs, and ended by %NULL.
125  *
126  * Helper function for constructing #GInitable object. This is
127  * similar to g_object_new() but also initializes the object
128  * and returns %NULL, setting an error on failure.
129  *
130  * Returns: (type GObject.Object) (transfer full): a newly allocated
131  *      #GObject, or %NULL on error
132  *
133  * Since: 2.22
134  */
135 gpointer
136 g_initable_new (GType          object_type,
137                 GCancellable  *cancellable,
138                 GError       **error,
139                 const gchar   *first_property_name,
140                 ...)
141 {
142   GObject *object;
143   va_list var_args;
144
145   va_start (var_args, first_property_name);
146   object = g_initable_new_valist (object_type,
147                                   first_property_name, var_args,
148                                   cancellable, error);
149   va_end (var_args);
150
151   return object;
152 }
153
154 /**
155  * g_initable_newv:
156  * @object_type: a #GType supporting #GInitable.
157  * @n_parameters: the number of parameters in @parameters
158  * @parameters: (array length=n_parameters): the parameters to use to construct the object
159  * @cancellable: optional #GCancellable object, %NULL to ignore.
160  * @error: a #GError location to store the error occurring, or %NULL to
161  *     ignore.
162  *
163  * Helper function for constructing #GInitable object. This is
164  * similar to g_object_newv() but also initializes the object
165  * and returns %NULL, setting an error on failure.
166  *
167  * Returns: (type GObject.Object) (transfer full): a newly allocated
168  *      #GObject, or %NULL on error
169  *
170  * Since: 2.22
171  */
172 gpointer
173 g_initable_newv (GType          object_type,
174                  guint          n_parameters,
175                  GParameter    *parameters,
176                  GCancellable  *cancellable,
177                  GError       **error)
178 {
179   GObject *obj;
180
181   g_return_val_if_fail (G_TYPE_IS_INITABLE (object_type), NULL);
182
183   obj = g_object_newv (object_type, n_parameters, parameters);
184
185   if (!g_initable_init (G_INITABLE (obj), cancellable, error))
186     {
187       g_object_unref (obj);
188       return NULL;
189     }
190
191   return (gpointer)obj;
192 }
193
194 /**
195  * g_initable_new_valist:
196  * @object_type: a #GType supporting #GInitable.
197  * @first_property_name: the name of the first property, followed by
198  * the value, and other property value pairs, and ended by %NULL.
199  * @var_args: The var args list generated from @first_property_name.
200  * @cancellable: optional #GCancellable object, %NULL to ignore.
201  * @error: a #GError location to store the error occurring, or %NULL to
202  *     ignore.
203  *
204  * Helper function for constructing #GInitable object. This is
205  * similar to g_object_new_valist() but also initializes the object
206  * and returns %NULL, setting an error on failure.
207  *
208  * Returns: (type GObject.Object) (transfer full): a newly allocated
209  *      #GObject, or %NULL on error
210  *
211  * Since: 2.22
212  */
213 GObject*
214 g_initable_new_valist (GType          object_type,
215                        const gchar   *first_property_name,
216                        va_list        var_args,
217                        GCancellable  *cancellable,
218                        GError       **error)
219 {
220   GObject *obj;
221
222   g_return_val_if_fail (G_TYPE_IS_INITABLE (object_type), NULL);
223
224   obj = g_object_new_valist (object_type,
225                              first_property_name,
226                              var_args);
227
228   if (!g_initable_init (G_INITABLE (obj), cancellable, error))
229     {
230       g_object_unref (obj);
231       return NULL;
232     }
233
234   return obj;
235 }