X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdbusinterface.c;h=5c1b3552c74997539619d54ddfe90d1dc290057d;hb=d9ad40b4eaf1a9197ab363de4346a8d84f45f5c1;hp=d8f85943b1b9612a49411e6ce2d4cf2ef00f6d0a;hpb=94b907134426e26393a86630dae5ce53baee6ae6;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdbusinterface.c b/gio/gdbusinterface.c index d8f8594..5c1b355 100644 --- a/gio/gdbusinterface.c +++ b/gio/gdbusinterface.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: David Zeuthen */ @@ -24,7 +22,6 @@ #include "gdbusobject.h" #include "gdbusinterface.h" -#include "gio-marshal.h" #include "glibintl.h" @@ -34,8 +31,8 @@ * @include: gio/gio.h * * The #GDBusInterface type is the base type for D-Bus interfaces both - * on the service side (see #GDBusInterfaceStub) and client side (see - * #GDBusProxy). + * on the service side (see #GDBusInterfaceSkeleton) and client side + * (see #GDBusProxy). */ typedef GDBusInterfaceIface GDBusInterfaceInterface; @@ -50,361 +47,93 @@ g_dbus_interface_default_init (GDBusInterfaceIface *iface) /** * g_dbus_interface_get_info: - * @interface: An exported D-Bus interface. + * @interface_: An exported D-Bus interface. * * Gets D-Bus introspection information for the D-Bus interface - * implemented by @interface. + * implemented by @interface_. * * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + * + * Since: 2.30 */ GDBusInterfaceInfo * -g_dbus_interface_get_info (GDBusInterface *interface) +g_dbus_interface_get_info (GDBusInterface *interface_) { - g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface), NULL); - return G_DBUS_INTERFACE_GET_IFACE (interface)->get_info (interface); + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_info (interface_); } /** - * g_dbus_interface_get_object: - * @interface: An exported D-Bus interface. + * g_dbus_interface_get_object: (skip) + * @interface_: An exported D-Bus interface + * + * Gets the #GDBusObject that @interface_ belongs to, if any. * - * Gets the #GDBusObject that @interface belongs to, if any. + * It is not safe to use the returned object if @interface_ or + * the returned object is being used from other threads. See + * g_dbus_interface_dup_object() for a thread-safe alternative. * * Returns: (transfer none): A #GDBusObject or %NULL. The returned - * reference belongs to @interface and should not be freed. + * reference belongs to @interface_ and should not be freed. + * + * Since: 2.30 */ GDBusObject * -g_dbus_interface_get_object (GDBusInterface *interface) +g_dbus_interface_get_object (GDBusInterface *interface_) { - g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface), NULL); - return G_DBUS_INTERFACE_GET_IFACE (interface)->get_object (interface); + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); } /** - * g_dbus_interface_set_object: - * @interface: An exported D-Bus interface. - * @object: A #GDBusObject or %NULL. + * g_dbus_interface_dup_object: + * @interface_: An exported D-Bus interface. * - * Sets the #GDBusObject for @interface to @object. + * Gets the #GDBusObject that @interface_ belongs to, if any. * - * Note that @interface will hold a weak reference to @object. - */ -void -g_dbus_interface_set_object (GDBusInterface *interface, - GDBusObject *object) -{ - g_return_if_fail (G_IS_DBUS_INTERFACE (interface)); - g_return_if_fail (object == NULL || G_IS_DBUS_OBJECT (object)); - G_DBUS_INTERFACE_GET_IFACE (interface)->set_object (interface, object); -} - -/* Keep it here for now. TODO: move */ - -#include - -/** - * g_dbus_gvariant_to_gvalue: - * @value: A #GVariant. - * @out_gvalue: Return location for the #GValue. + * Returns: (transfer full): A #GDBusObject or %NULL. The returned + * reference should be freed with g_object_unref(). * - * Convert a #GVariant to a #GValue. If @value is floating, it is consumed. + * Since: 2.32 * - * Note that the passed @out_gvalue does not have to have a #GType set. - * - * Returns: %TRUE if the conversion succeeded, %FALSE otherwise. + * Rename to: g_dbus_interface_get_object */ -gboolean -g_dbus_gvariant_to_gvalue (GVariant *value, - GValue *out_gvalue) +GDBusObject * +g_dbus_interface_dup_object (GDBusInterface *interface_) { - gboolean ret; - const GVariantType *type; - gchar **array; - - g_return_val_if_fail (value != NULL, FALSE); - g_return_val_if_fail (out_gvalue != NULL, FALSE); - - ret = FALSE; - - memset (out_gvalue, '\0', sizeof (GValue)); - - switch (g_variant_classify (value)) + GDBusObject *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + if (G_LIKELY (G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object != NULL)) { - case G_VARIANT_CLASS_BOOLEAN: - g_value_init (out_gvalue, G_TYPE_BOOLEAN); - g_value_set_boolean (out_gvalue, g_variant_get_boolean (value)); - break; - - case G_VARIANT_CLASS_BYTE: - g_value_init (out_gvalue, G_TYPE_UCHAR); - g_value_set_uchar (out_gvalue, g_variant_get_byte (value)); - break; - - case G_VARIANT_CLASS_INT16: - g_value_init (out_gvalue, G_TYPE_INT); - g_value_set_int (out_gvalue, g_variant_get_int16 (value)); - break; - - case G_VARIANT_CLASS_UINT16: - g_value_init (out_gvalue, G_TYPE_UINT); - g_value_set_uint (out_gvalue, g_variant_get_uint16 (value)); - break; - - case G_VARIANT_CLASS_INT32: - g_value_init (out_gvalue, G_TYPE_INT); - g_value_set_int (out_gvalue, g_variant_get_int32 (value)); - break; - - case G_VARIANT_CLASS_UINT32: - g_value_init (out_gvalue, G_TYPE_UINT); - g_value_set_uint (out_gvalue, g_variant_get_uint32 (value)); - break; - - case G_VARIANT_CLASS_INT64: - g_value_init (out_gvalue, G_TYPE_INT64); - g_value_set_int64 (out_gvalue, g_variant_get_int64 (value)); - break; - - case G_VARIANT_CLASS_UINT64: - g_value_init (out_gvalue, G_TYPE_UINT64); - g_value_set_uint64 (out_gvalue, g_variant_get_uint64 (value)); - break; - - case G_VARIANT_CLASS_HANDLE: - g_value_init (out_gvalue, G_TYPE_INT); - g_value_set_int (out_gvalue, g_variant_get_int32 (value)); - break; - - case G_VARIANT_CLASS_DOUBLE: - g_value_init (out_gvalue, G_TYPE_DOUBLE); - g_value_set_double (out_gvalue, g_variant_get_double (value)); - break; - - case G_VARIANT_CLASS_STRING: - g_value_init (out_gvalue, G_TYPE_STRING); - g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); - break; - - case G_VARIANT_CLASS_OBJECT_PATH: - g_value_init (out_gvalue, G_TYPE_STRING); - g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); - break; - - case G_VARIANT_CLASS_SIGNATURE: - g_value_init (out_gvalue, G_TYPE_STRING); - g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); - break; - - case G_VARIANT_CLASS_ARRAY: - type = g_variant_get_type (value); - switch (g_variant_type_peek_string (type)[1]) - { - case G_VARIANT_CLASS_BYTE: - g_value_init (out_gvalue, G_TYPE_STRING); - g_value_set_string (out_gvalue, g_variant_get_bytestring (value)); - break; - - case G_VARIANT_CLASS_STRING: - g_value_init (out_gvalue, G_TYPE_STRV); - array = g_variant_dup_strv (value, NULL); - g_value_take_boxed (out_gvalue, array); - break; - - case G_VARIANT_CLASS_ARRAY: - switch (g_variant_type_peek_string (type)[2]) - { - case G_VARIANT_CLASS_BYTE: - g_value_init (out_gvalue, G_TYPE_STRV); - array = g_variant_dup_bytestring_array (value, NULL); - g_value_take_boxed (out_gvalue, array); - break; - - default: - g_value_init (out_gvalue, G_TYPE_VARIANT); - g_value_set_variant (out_gvalue, value); - break; - } - break; - - default: - g_value_init (out_gvalue, G_TYPE_VARIANT); - g_value_set_variant (out_gvalue, value); - break; - } - break; - - case G_VARIANT_CLASS_VARIANT: - case G_VARIANT_CLASS_MAYBE: - case G_VARIANT_CLASS_TUPLE: - case G_VARIANT_CLASS_DICT_ENTRY: - g_value_init (out_gvalue, G_TYPE_VARIANT); - g_value_set_variant (out_gvalue, value); - break; + ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object (interface_); + } + else + { + g_warning ("No dup_object() vfunc on type %s - using get_object() in a way that is not thread-safe.", + g_type_name_from_instance ((GTypeInstance *) interface_)); + ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); + if (ret != NULL) + g_object_ref (ret); } - - ret = TRUE; - return ret; } - /** - * g_dbus_gvalue_to_gvariant: - * @gvalue: A #GValue to convert to a #GVariant. - * @expected_type: The #GVariantType to create. + * g_dbus_interface_set_object: + * @interface_: An exported D-Bus interface. + * @object: (allow-none): A #GDBusObject or %NULL. + * + * Sets the #GDBusObject for @interface_ to @object. * - * Convert a #GValue to #GVariant. + * Note that @interface_ will hold a weak reference to @object. * - * Returns: A #GVariant (never floating) holding the data from @gvalue - * or %NULL in case of error. Free with g_variant_unref(). + * Since: 2.30 */ -GVariant * -g_dbus_gvalue_to_gvariant (const GValue *gvalue, - const GVariantType *expected_type) +void +g_dbus_interface_set_object (GDBusInterface *interface_, + GDBusObject *object) { - GVariant *ret; - const gchar *s; - const gchar * const *as; - const gchar *empty_strv[1] = {NULL}; - - g_return_val_if_fail (gvalue != NULL, NULL); - g_return_val_if_fail (expected_type != NULL, NULL); - - ret = NULL; - - /* The expected type could easily be e.g. "s" with the GValue holding a string. - * because of the UseGVariant annotation - */ - if (G_VALUE_TYPE (gvalue) == G_TYPE_VARIANT) - { - ret = g_value_dup_variant (gvalue); - } - else - { - switch (g_variant_type_peek_string (expected_type)[0]) - { - case G_VARIANT_CLASS_BOOLEAN: - ret = g_variant_ref_sink (g_variant_new_boolean (g_value_get_boolean (gvalue))); - break; - - case G_VARIANT_CLASS_BYTE: - ret = g_variant_ref_sink (g_variant_new_byte (g_value_get_uchar (gvalue))); - break; - - case G_VARIANT_CLASS_INT16: - ret = g_variant_ref_sink (g_variant_new_int16 (g_value_get_int (gvalue))); - break; - - case G_VARIANT_CLASS_UINT16: - ret = g_variant_ref_sink (g_variant_new_uint16 (g_value_get_uint (gvalue))); - break; - - case G_VARIANT_CLASS_INT32: - ret = g_variant_ref_sink (g_variant_new_int32 (g_value_get_int (gvalue))); - break; - - case G_VARIANT_CLASS_UINT32: - ret = g_variant_ref_sink (g_variant_new_uint32 (g_value_get_uint (gvalue))); - break; - - case G_VARIANT_CLASS_INT64: - ret = g_variant_ref_sink (g_variant_new_int64 (g_value_get_int64 (gvalue))); - break; - - case G_VARIANT_CLASS_UINT64: - ret = g_variant_ref_sink (g_variant_new_uint64 (g_value_get_uint64 (gvalue))); - break; - - case G_VARIANT_CLASS_HANDLE: - ret = g_variant_ref_sink (g_variant_new_handle (g_value_get_int (gvalue))); - break; - - case G_VARIANT_CLASS_DOUBLE: - ret = g_variant_ref_sink (g_variant_new_double (g_value_get_double (gvalue))); - break; - - case G_VARIANT_CLASS_STRING: - s = g_value_get_string (gvalue); - if (s == NULL) - s = ""; - ret = g_variant_ref_sink (g_variant_new_string (s)); - break; - - case G_VARIANT_CLASS_OBJECT_PATH: - s = g_value_get_string (gvalue); - if (s == NULL) - s = "/"; - ret = g_variant_ref_sink (g_variant_new_object_path (s)); - break; - - case G_VARIANT_CLASS_SIGNATURE: - s = g_value_get_string (gvalue); - if (s == NULL) - s = ""; - ret = g_variant_ref_sink (g_variant_new_signature (s)); - break; - - case G_VARIANT_CLASS_ARRAY: - switch (g_variant_type_peek_string (expected_type)[1]) - { - case G_VARIANT_CLASS_BYTE: - s = g_value_get_string (gvalue); - if (s == NULL) - s = ""; - ret = g_variant_ref_sink (g_variant_new_bytestring (s)); - break; - - case G_VARIANT_CLASS_STRING: - as = g_value_get_boxed (gvalue); - if (as == NULL) - as = empty_strv; - ret = g_variant_ref_sink (g_variant_new_strv (as, -1)); - break; - - case G_VARIANT_CLASS_ARRAY: - switch (g_variant_type_peek_string (expected_type)[2]) - { - case G_VARIANT_CLASS_BYTE: - as = g_value_get_boxed (gvalue); - if (as == NULL) - as = empty_strv; - ret = g_variant_ref_sink (g_variant_new_bytestring_array (as, -1)); - break; - - default: - ret = g_value_dup_variant (gvalue); - break; - } - break; - - default: - ret = g_value_dup_variant (gvalue); - break; - } - break; - - default: - case G_VARIANT_CLASS_VARIANT: - case G_VARIANT_CLASS_MAYBE: - case G_VARIANT_CLASS_TUPLE: - case G_VARIANT_CLASS_DICT_ENTRY: - ret = g_value_dup_variant (gvalue); - break; - } - } - - /* Could be that the GValue is holding a NULL GVariant - in that case, - * we return an "empty" GVariant instead of a NULL GVariant - */ - if (ret == NULL) - { - GVariant *untrusted_empty; - untrusted_empty = g_variant_new_from_data (expected_type, NULL, 0, FALSE, NULL, NULL); - ret = g_variant_ref_sink (g_variant_get_normal_form (untrusted_empty)); - g_variant_unref (untrusted_empty); - } - - g_assert (!g_variant_is_floating (ret)); - - return ret; + g_return_if_fail (G_IS_DBUS_INTERFACE (interface_)); + g_return_if_fail (object == NULL || G_IS_DBUS_OBJECT (object)); + G_DBUS_INTERFACE_GET_IFACE (interface_)->set_object (interface_, object); }