"org.freedesktop.DBus.Introspectable",
"Introspect",
NULL,
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 secs */
NULL,
g_error_free (error);
goto out;
}
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)")))
- {
- g_printerr (_("Error: Result is type `%s', expected `(s)'\n"),
- g_variant_get_type_string (result));
- g_variant_unref (result);
- goto out;
- }
g_variant_get (result, "(&s)", &xml_data);
error = NULL;
"org.freedesktop.DBus.Introspectable",
"Introspect",
NULL,
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 secs */
NULL,
g_error_free (error);
goto out;
}
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)")))
- {
- g_printerr (_("Error: Result is type `%s', expected `(s)'\n"),
- g_variant_get_type_string (result));
- g_variant_unref (result);
- goto out;
- }
g_variant_get (result, "(&s)", &xml_data);
//g_printerr ("xml=`%s'", xml_data);
"org.freedesktop.DBus",
"ListNames",
NULL,
+ G_VARIANT_TYPE ("(as)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 secs */
NULL,
g_error_free (error);
goto out;
}
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)")))
- {
- g_printerr (_("Error: Result is type `%s', expected `(as)'\n"), g_variant_get_type_string (result));
- g_variant_unref (result);
- goto out;
- }
g_variant_get (result, "(as)", &iter);
while (g_variant_iter_loop (iter, "s", &str))
g_hash_table_insert (name_set, g_strdup (str), NULL);
"org.freedesktop.DBus",
"ListActivatableNames",
NULL,
+ G_VARIANT_TYPE ("(as)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 secs */
NULL,
g_error_free (error);
goto out;
}
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)")))
- {
- g_printerr (_("Error: Result is type `%s', expected `(as)'\n"), g_variant_get_type_string (result));
- g_variant_unref (result);
- goto out;
- }
g_variant_get (result, "(as)", &iter);
while (g_variant_iter_loop (iter, "s", &str))
g_hash_table_insert (name_set, g_strdup (str), NULL);
"org.freedesktop.DBus.Introspectable",
"Introspect",
NULL,
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 secs */
NULL,
if (result == NULL)
goto out;
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)")))
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Error: Result is type `%s', expected `(s)'\n"),
- g_variant_get_type_string (result));
- goto out;
- }
-
g_variant_get (result, "(&s)", &xml_data);
node_info = g_dbus_node_info_new_for_xml (xml_data, error);
if (node_info == NULL)
interface_name,
method_name,
parameters,
+ NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus.Properties",
"GetAll",
g_variant_new ("(s)", o->name),
+ NULL,
G_DBUS_CALL_FLAGS_NONE,
3000,
NULL,
"org.freedesktop.DBus.Properties",
"Get",
g_variant_new ("(ss)", o->name, o->properties[n]->name),
+ G_VARIANT_TYPE ("(v)"),
G_DBUS_CALL_FLAGS_NONE,
3000,
NULL,
"org.freedesktop.DBus.Introspectable",
"Introspect",
NULL,
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
3000, /* 3 sec */
NULL,
g_error_free (error);
goto out;
}
- if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)")))
- {
- g_printerr (_("Error: Result is type `%s', expected `(s)'\n"),
- g_variant_get_type_string (result));
- goto out;
- }
g_variant_get (result, "(&s)", &xml_data);
error = NULL;
"org.freedesktop.DBus", /* interface */
"Hello",
NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL, /* TODO: cancellable */
GVariant *parameters;
GSource *idle_source;
gboolean handled;
- gchar *in_signature;
+ GVariantType *in_type;
handled = FALSE;
goto out;
}
+ parameters = g_dbus_message_get_body (message);
+ if (parameters == NULL)
+ {
+ parameters = g_variant_new ("()");
+ g_variant_ref_sink (parameters);
+ }
+ else
+ {
+ g_variant_ref (parameters);
+ }
+
/* Check that the incoming args are of the right type - if they are not, return
* the org.freedesktop.DBus.Error.InvalidArgs error to the caller
- *
- * TODO: might also be worth caching the combined signature.
*/
- in_signature = _g_dbus_compute_complete_signature (method_info->in_args, FALSE);
- if (g_strcmp0 (g_dbus_message_get_signature (message), in_signature) != 0)
+ in_type = _g_dbus_compute_complete_signature (method_info->in_args);
+ if (!g_variant_is_of_type (parameters, in_type))
{
+ gchar *type_string;
+
+ type_string = g_variant_type_dup_string (in_type);
+
reply = g_dbus_message_new_method_error (message,
"org.freedesktop.DBus.Error.InvalidArgs",
- _("Signature of message, `%s', does not match expected signature `%s'"),
- g_dbus_message_get_signature (message),
- in_signature);
+ _("Type of message, `%s', does not match expected type `%s'"),
+ g_variant_get_type_string (parameters),
+ type_string);
g_dbus_connection_send_message_unlocked (connection, reply, NULL, NULL);
+ g_variant_type_free (in_type);
+ g_variant_unref (parameters);
g_object_unref (reply);
- g_free (in_signature);
+ g_free (type_string);
handled = TRUE;
goto out;
}
- g_free (in_signature);
-
- parameters = g_dbus_message_get_body (message);
- if (parameters == NULL)
- {
- parameters = g_variant_new ("()");
- g_variant_ref_sink (parameters);
- }
- else
- {
- g_variant_ref (parameters);
- }
+ g_variant_type_free (in_type);
/* schedule the call in idle */
invocation = g_dbus_method_invocation_new (g_dbus_message_get_sender (message),
g_dbus_message_set_flags (message, G_DBUS_MESSAGE_FLAGS_NO_AUTO_START);
}
+static GVariant *
+decode_method_reply (GDBusMessage *reply,
+ const gchar *method_name,
+ const GVariantType *reply_type,
+ GError **error)
+{
+ GVariant *result;
+
+ result = NULL;
+ switch (g_dbus_message_get_message_type (reply))
+ {
+ case G_DBUS_MESSAGE_TYPE_METHOD_RETURN:
+ result = g_dbus_message_get_body (reply);
+ if (result == NULL)
+ {
+ result = g_variant_new ("()");
+ g_variant_ref_sink (result);
+ }
+ else
+ {
+ g_variant_ref (result);
+ }
+
+ if (!g_variant_is_of_type (result, reply_type))
+ {
+ gchar *type_string = g_variant_type_dup_string (reply_type);
+
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ _("Method `%s' returned type `%s', but expected `%s'"),
+ method_name, g_variant_get_type_string (result), type_string);
+
+ g_variant_unref (result);
+ g_free (type_string);
+ result = NULL;
+ }
+ break;
+
+ case G_DBUS_MESSAGE_TYPE_ERROR:
+ g_dbus_message_to_gerror (reply, error);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return result;
+}
+
+
+typedef struct
+{
+ GSimpleAsyncResult *simple;
+ GVariantType *reply_type;
+ gchar *method_name; /* for error message */
+} CallState;
+
+static void
+g_dbus_connection_call_done (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GDBusConnection *connection = G_DBUS_CONNECTION (source);
+ CallState *state = user_data;
+ GError *error = NULL;
+ GDBusMessage *reply;
+ GVariant *value;
+
+ reply = g_dbus_connection_send_message_with_reply_finish (connection,
+ result, &error);
+
+ if (reply != NULL)
+ {
+ value = decode_method_reply (reply, state->method_name,
+ state->reply_type, &error);
+ g_object_unref (reply);
+ }
+ else
+ value = NULL;
+
+ if (value == NULL)
+ {
+ g_simple_async_result_set_from_error (state->simple, error);
+ g_error_free (error);
+ }
+ else
+ g_simple_async_result_set_op_res_gpointer (state->simple, value,
+ (GDestroyNotify) g_variant_unref);
+
+ g_simple_async_result_complete (state->simple);
+ g_variant_type_free (state->reply_type);
+ g_object_unref (state->simple);
+ g_free (state->method_name);
+
+ g_slice_free (CallState, state);
+}
+
/**
* g_dbus_connection_call:
* @connection: A #GDBusConnection.
* @interface_name: D-Bus interface to invoke method on.
* @method_name: The name of the method to invoke.
* @parameters: A #GVariant tuple with parameters for the method or %NULL if not passing parameters.
+ * @reply_type: The expected type of the reply, or %NULL.
* @flags: Flags from the #GDBusCallFlags enumeration.
* @timeout_msec: The timeout in milliseconds or -1 to use the default timeout.
* @cancellable: A #GCancellable or %NULL.
* not compatible with the D-Bus protocol, the operation fails with
* %G_IO_ERROR_INVALID_ARGUMENT.
*
+ * If @reply_type is non-%NULL then the reply will be checked for having this type and an
+ * error will be raised if it does not match. Said another way, if you give a @reply_type
+ * then any non-%NULL return value will be of this type.
+ *
* If the @parameters #GVariant is floating, it is consumed. This allows
* convenient 'inline' use of g_variant_new(), e.g.:
* |[
* g_variant_new ("(ss)",
* "Thing One",
* "Thing Two"),
+ * NULL,
* G_DBUS_CALL_FLAGS_NONE,
* -1,
* NULL,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
+ const GVariantType *reply_type,
GDBusCallFlags flags,
gint timeout_msec,
GCancellable *cancellable,
gpointer user_data)
{
GDBusMessage *message;
+ CallState *state;
g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
g_return_if_fail (bus_name == NULL || g_dbus_is_name (bus_name));
g_return_if_fail (timeout_msec >= 0 || timeout_msec == -1);
g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE));
+ state = g_slice_new (CallState);
+ state->simple = g_simple_async_result_new (G_OBJECT (connection),
+ callback, user_data,
+ g_dbus_connection_call);
+ state->method_name = g_strjoin (".", interface_name, method_name, NULL);
+
+ if (reply_type == NULL)
+ reply_type = G_VARIANT_TYPE_ANY;
+
+ state->reply_type = g_variant_type_copy (reply_type);
+
message = g_dbus_message_new_method_call (bus_name,
object_path,
interface_name,
timeout_msec,
NULL, /* volatile guint32 *out_serial */
cancellable,
- callback,
- user_data);
+ g_dbus_connection_call_done,
+ state);
if (message != NULL)
g_object_unref (message);
}
-static GVariant *
-decode_method_reply (GDBusMessage *reply,
- GError **error)
-{
- GVariant *result;
-
- result = NULL;
- switch (g_dbus_message_get_message_type (reply))
- {
- case G_DBUS_MESSAGE_TYPE_METHOD_RETURN:
- result = g_dbus_message_get_body (reply);
- if (result == NULL)
- {
- result = g_variant_new ("()");
- g_variant_ref_sink (result);
- }
- else
- {
- g_variant_ref (result);
- }
- break;
-
- case G_DBUS_MESSAGE_TYPE_ERROR:
- g_dbus_message_to_gerror (reply, error);
- break;
-
- default:
- g_assert_not_reached ();
- break;
- }
-
- return result;
-}
-
/**
* g_dbus_connection_call_finish:
* @connection: A #GDBusConnection.
GAsyncResult *res,
GError **error)
{
- GDBusMessage *reply;
- GVariant *result;
+ GSimpleAsyncResult *simple;
g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
- g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL);
+ g_return_val_if_fail (g_simple_async_result_is_valid (res, G_OBJECT (connection),
+ g_dbus_connection_call), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- result = NULL;
-
- reply = g_dbus_connection_send_message_with_reply_finish (connection, res, error);
- if (reply == NULL)
- goto out;
+ simple = G_SIMPLE_ASYNC_RESULT (res);
- result = decode_method_reply (reply, error);
-
- g_object_unref (reply);
+ if (g_simple_async_result_propagate_error (simple, error))
+ return FALSE;
- out:
- return result;
+ return g_variant_ref (g_simple_async_result_get_op_res_gpointer (simple));
}
/* ---------------------------------------------------------------------------------------------------- */
* @interface_name: D-Bus interface to invoke method on.
* @method_name: The name of the method to invoke.
* @parameters: A #GVariant tuple with parameters for the method or %NULL if not passing parameters.
+ * @reply_type: The expected type of the reply, or %NULL.
* @flags: Flags from the #GDBusCallFlags enumeration.
* @timeout_msec: The timeout in milliseconds or -1 to use the default timeout.
* @cancellable: A #GCancellable or %NULL.
* operation will fail with %G_IO_ERROR_CANCELLED. If @parameters
* contains a value not compatible with the D-Bus protocol, the operation
* fails with %G_IO_ERROR_INVALID_ARGUMENT.
+
+ * If @reply_type is non-%NULL then the reply will be checked for having
+ * this type and an error will be raised if it does not match. Said
+ * another way, if you give a @reply_type then any non-%NULL return
+ * value will be of this type.
*
* If the @parameters #GVariant is floating, it is consumed.
* This allows convenient 'inline' use of g_variant_new(), e.g.:
* g_variant_new ("(ss)",
* "Thing One",
* "Thing Two"),
+ * NULL,
* G_DBUS_CALL_FLAGS_NONE,
* -1,
* NULL,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
+ const GVariantType *reply_type,
GDBusCallFlags flags,
gint timeout_msec,
GCancellable *cancellable,
g_return_val_if_fail (timeout_msec >= 0 || timeout_msec == -1, NULL);
g_return_val_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), NULL);
+ if (reply_type == NULL)
+ reply_type = G_VARIANT_TYPE_ANY;
+
message = g_dbus_message_new_method_call (bus_name,
object_path,
interface_name,
if (reply == NULL)
goto out;
- result = decode_method_reply (reply, error);
+ result = decode_method_reply (reply, method_name, reply_type, error);
out:
if (message != NULL)
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
+ const GVariantType *reply_type,
GDBusCallFlags flags,
gint timeout_msec,
GCancellable *cancellable,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
+ const GVariantType *reply_type,
GDBusCallFlags flags,
gint timeout_msec,
GCancellable *cancellable,
g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation));
g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE));
- if (parameters != NULL)
- g_variant_ref_sink (parameters);
+ if (parameters == NULL)
+ parameters = g_variant_new_tuple (NULL, 0);
/* if we have introspection data, check that the signature of @parameters is correct */
if (invocation->priv->method_info != NULL)
{
- gchar *signature;
- const gchar *type_string;
+ GVariantType *type;
- type_string = "()";
- if (parameters != NULL)
- type_string = g_variant_get_type_string (parameters);
- signature = _g_dbus_compute_complete_signature (invocation->priv->method_info->out_args, TRUE);
+ type = _g_dbus_compute_complete_signature (invocation->priv->method_info->out_args);
- if (g_strcmp0 (type_string, signature) != 0)
+ if (!g_variant_is_of_type (parameters, type))
{
- g_warning (_("Type of return value is incorrect, got `%s', expected `%s'"),
- type_string,
- signature);
- g_free (signature);
+ gchar *type_string = g_variant_type_dup_string (type);
+
+ g_warning (_("Type of return value is incorrect, got `%s', expected `%s'"),
+ g_variant_get_type_string (parameters), type_string);
+ g_variant_type_free (type);
+ g_free (type_string);
goto out;
}
- g_free (signature);
+ g_variant_type_free (type);
}
reply = g_dbus_message_new_method_reply (invocation->priv->message);
out:
g_object_unref (invocation);
- if (parameters != NULL)
- g_variant_unref (parameters);
}
/* ---------------------------------------------------------------------------------------------------- */
g_variant_new ("(su)",
client->name,
client->flags),
+ G_VARIANT_TYPE ("(u)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus", /* interface name */
"ReleaseName", /* method name */
g_variant_new ("(s)", client->name),
+ G_VARIANT_TYPE ("(u)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus", /* interface name */
"GetNameOwner", /* method name */
g_variant_new ("(s)", client->name),
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus", /* interface name */
"StartServiceByName", /* method name */
g_variant_new ("(su)", client->name, 0),
+ G_VARIANT_TYPE ("(u)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
/* ---------------------------------------------------------------------------------------------------- */
-gchar *
-_g_dbus_compute_complete_signature (GDBusArgInfo **args,
- gboolean include_parentheses)
+GVariantType *
+_g_dbus_compute_complete_signature (GDBusArgInfo **args)
{
- GString *s;
+ const GVariantType *arg_types[256];
guint n;
- if (include_parentheses)
- s = g_string_new ("(");
- else
- s = g_string_new ("");
- if (args != NULL)
+ if (args)
for (n = 0; args[n] != NULL; n++)
- g_string_append (s, args[n]->signature);
+ {
+ /* DBus places a hard limit of 255 on signature length.
+ * therefore number of args must be less than 256.
+ */
+ g_assert (n < 256);
- if (include_parentheses)
- g_string_append_c (s, ')');
+ arg_types[n] = G_VARIANT_TYPE (args[n]->signature);
+
+ if G_UNLIKELY (arg_types[n] == NULL)
+ return NULL;
+ }
+ else
+ n = 0;
- return g_string_free (s, FALSE);
+ return g_variant_type_new_tuple (arg_types, n);
}
/* ---------------------------------------------------------------------------------------------------- */
GHashTable **out_key_value_pairs,
GError **error);
-gchar * _g_dbus_compute_complete_signature (GDBusArgInfo **args,
- gboolean include_parentheses);
+GVariantType * _g_dbus_compute_complete_signature (GDBusArgInfo **args);
/* ---------------------------------------------------------------------------------------------------- */
"org.freedesktop.DBus.Properties",
"GetAll",
g_variant_new ("(s)", proxy->priv->interface_name),
+ G_VARIANT_TYPE ("(a{sv})"),
G_DBUS_CALL_FLAGS_NONE,
-1, /* timeout */
cancellable,
"org.freedesktop.DBus.Properties",
"GetAll",
g_variant_new ("(s)", proxy->priv->interface_name),
+ G_VARIANT_TYPE ("(a{sv})"),
G_DBUS_CALL_FLAGS_NONE,
-1, /* timeout */
cancellable,
return info;
}
-static gboolean
-validate_method_return (const char *method_name,
- GVariant *value,
- const GDBusMethodInfo *expected_method_info,
- GError **error)
-{
- const gchar *type_string;
- gchar *signature;
- gboolean ret;
-
- ret = TRUE;
- signature = NULL;
-
- if (value == NULL || expected_method_info == NULL)
- goto out;
-
- /* Shouldn't happen... */
- if (g_variant_classify (value) != G_VARIANT_CLASS_TUPLE)
- goto out;
-
- type_string = g_variant_get_type_string (value);
- signature = _g_dbus_compute_complete_signature (expected_method_info->out_args, TRUE);
- if (g_strcmp0 (type_string, signature) != 0)
- {
- g_set_error (error,
- G_IO_ERROR,
- G_IO_ERROR_INVALID_ARGUMENT,
- _("Method `%s' returned signature `%s', but expected `%s'"),
- method_name,
- type_string,
- signature);
- ret = FALSE;
- }
-
- out:
- g_free (signature);
- return ret;
-}
-
/**
* g_dbus_proxy_call:
* @proxy: A #GDBusProxy.
const GDBusMethodInfo *expected_method_info;
const gchar *target_method_name;
const gchar *target_interface_name;
+ GVariantType *reply_type;
g_return_if_fail (G_IS_DBUS_PROXY (proxy));
g_return_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name));
/* Just warn here */
expected_method_info = lookup_method_info_or_warn (proxy, target_method_name);
+ if (expected_method_info)
+ reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
+ else
+ reply_type = NULL;
+
g_dbus_connection_call (proxy->priv->connection,
proxy->priv->unique_bus_name,
proxy->priv->object_path,
target_interface_name,
target_method_name,
parameters,
+ reply_type,
flags,
timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec,
cancellable,
(GAsyncReadyCallback) reply_cb,
simple);
+ if (reply_type != NULL)
+ g_variant_type_free (reply_type);
+
g_free (split_interface_name);
}
GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
GVariant *value;
const char *method_name;
- const GDBusMethodInfo *expected_method_info;
g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL);
g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL);
value = g_simple_async_result_get_op_res_gpointer (simple);
method_name = g_object_get_data (G_OBJECT (simple), "-gdbus-proxy-method-name");
- /* We may not have a method name for internally-generated proxy calls like GetAll */
- if (value && method_name && proxy->priv->expected_interface)
- {
- expected_method_info = g_dbus_interface_info_lookup_method (proxy->priv->expected_interface, method_name);
- if (!validate_method_return (method_name, value, expected_method_info, error))
- {
- g_variant_unref (value);
- value = NULL;
- }
- }
-
out:
return value;
}
const GDBusMethodInfo *expected_method_info;
const gchar *target_method_name;
const gchar *target_interface_name;
+ GVariantType *reply_type;
g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL);
g_return_val_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name), NULL);
expected_method_info = NULL;
}
+ if (expected_method_info)
+ reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
+ else
+ reply_type = NULL;
+
ret = g_dbus_connection_call_sync (proxy->priv->connection,
proxy->priv->unique_bus_name,
proxy->priv->object_path,
target_interface_name,
target_method_name,
parameters,
+ reply_type,
flags,
timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec,
cancellable,
error);
- if (!validate_method_return (target_method_name, ret, expected_method_info, error))
- {
- g_variant_unref (ret);
- ret = NULL;
- }
+
+ if (reply_type != NULL)
+ g_variant_type_free (reply_type);
g_free (split_interface_name);
session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
g_dbus_connection_call_sync (session, "org.gtk.DoesNotExist", "/",
"org.gtk.DoesNotExist", "Workaround",
- g_variant_new ("()"), 0, -1, NULL, NULL);
+ g_variant_new ("()"), NULL, 0, -1, NULL, NULL);
}
out:
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
ca,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"NonExistantMethod", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
ca,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
NULL, /* parameters */
+ NULL, /* return type */
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.gtk.GDBus.TestPeerInterface",
"HelloWorld",
g_variant_new ("(s)", greeting),
+ G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL,
&error);
g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS);
- g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Signature of message, `s', does not match expected signature `'");
+ g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Type of message, `(s)', does not match expected type `()'");
g_error_free (error);
g_assert (value == NULL);
"org.freedesktop.DBus", /* interface name */
"NameHasOwner", /* method name */
g_variant_new ("(s)", name),
+ G_VARIANT_TYPE ("(b)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"org.freedesktop.DBus", /* interface name */
"NameHasOwner", /* method name */
g_variant_new ("(s)", name),
+ G_VARIANT_TYPE ("(b)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
ca,
"/org/freedesktop/DBus", /* object path */
"org.freedesktop.DBus", /* interface name */
"GetId", /* method name */
- NULL,
+ NULL, NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
ca,