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