* 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 <http://www.gnu.org/licenses/>.
*
* Author: David Zeuthen <davidz@redhat.com>
*/
#include "gdbusobject.h"
#include "gdbusinterface.h"
-#include "gio-marshal.h"
#include "glibintl.h"
* @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;
/**
* 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 <string.h>
-
-/**
- * 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);
}