cleanup
[platform/upstream/glib.git] / gio / gdbusinterface.c
index d8f8594..5c1b355 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
  *
  * Author: David Zeuthen <davidz@redhat.com>
  */
@@ -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 <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);
 }