mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-13 14:05:05 +01:00
Merge branch 'jsparber/dbus_multiple_parameters' into 'main'
GApplication: Allow multiple parameters for D-Bus activation Closes #3333 See merge request GNOME/glib!4026
This commit is contained in:
commit
740f2ea489
@ -291,8 +291,6 @@ g_application_impl_method_call (GDBusConnection *connection,
|
|||||||
/* Only on the freedesktop interface */
|
/* Only on the freedesktop interface */
|
||||||
|
|
||||||
g_variant_get (parameters, "(&sav@a{sv})", &name, &iter, &platform_data);
|
g_variant_get (parameters, "(&sav@a{sv})", &name, &iter, &platform_data);
|
||||||
g_variant_iter_next (iter, "v", ¶meter);
|
|
||||||
g_variant_iter_free (iter);
|
|
||||||
|
|
||||||
/* Check the action exists and the parameter type matches. */
|
/* Check the action exists and the parameter type matches. */
|
||||||
if (!g_action_group_query_action (impl->exported_actions,
|
if (!g_action_group_query_action (impl->exported_actions,
|
||||||
@ -306,6 +304,28 @@ g_application_impl_method_call (GDBusConnection *connection,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Accept multiple parameters as a tuple with the exact number of parameters */
|
||||||
|
if (g_variant_iter_n_children (iter) > 1)
|
||||||
|
{
|
||||||
|
GVariant *value = NULL;
|
||||||
|
GVariantBuilder builder;
|
||||||
|
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
||||||
|
|
||||||
|
while (g_variant_iter_loop (iter, "v", &value))
|
||||||
|
{
|
||||||
|
g_variant_builder_add_value (&builder, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
parameter = g_variant_ref_sink (g_variant_builder_end (&builder));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_variant_iter_next (iter, "v", ¶meter);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_variant_iter_free (iter);
|
||||||
|
|
||||||
if (!((parameter_type == NULL && parameter == NULL) ||
|
if (!((parameter_type == NULL && parameter == NULL) ||
|
||||||
(parameter_type != NULL && parameter != NULL && g_variant_is_of_type (parameter, parameter_type))))
|
(parameter_type != NULL && parameter != NULL && g_variant_is_of_type (parameter, parameter_type))))
|
||||||
{
|
{
|
||||||
|
@ -1734,7 +1734,7 @@ test_dbus_activate_action (void)
|
|||||||
{
|
{
|
||||||
GDBusMessage *message; /* (not nullable) (owned) */
|
GDBusMessage *message; /* (not nullable) (owned) */
|
||||||
guint n_expected_activations;
|
guint n_expected_activations;
|
||||||
} messages[6];
|
} messages[12];
|
||||||
gsize i;
|
gsize i;
|
||||||
|
|
||||||
g_test_summary ("Test that calling the ActivateAction D-Bus method works");
|
g_test_summary ("Test that calling the ActivateAction D-Bus method works");
|
||||||
@ -1796,6 +1796,79 @@ test_dbus_activate_action (void)
|
|||||||
g_dbus_message_set_body (messages[5].message, g_variant_new ("(sava{sv})", "nonexistent", NULL, NULL));
|
g_dbus_message_set_body (messages[5].message, g_variant_new ("(sava{sv})", "nonexistent", NULL, NULL));
|
||||||
messages[5].n_expected_activations = 0;
|
messages[5].n_expected_activations = 0;
|
||||||
|
|
||||||
|
/* Action with tuple as parameter given as two items to the interface */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_string ("first"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_string ("second"));
|
||||||
|
|
||||||
|
messages[6].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
|
||||||
|
g_dbus_message_set_body (messages[6].message, g_variant_new ("(sava{sv})", "multi", &builder, NULL));
|
||||||
|
messages[6].n_expected_activations = 1;
|
||||||
|
|
||||||
|
/* Action with tuple as parameter given as two items to the interface but with a wrong type */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_string ("first"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_uint32 (42));
|
||||||
|
|
||||||
|
messages[7].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
g_dbus_message_set_body (messages[7].message, g_variant_new ("(sava{sv})", "multi", &builder, NULL));
|
||||||
|
messages[7].n_expected_activations = 0;
|
||||||
|
|
||||||
|
/* Action with tuple as parameter given as a single item to the interface */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new ("(ss)", "first", "second"));
|
||||||
|
|
||||||
|
messages[8].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
g_dbus_message_set_body (messages[8].message, g_variant_new ("(sava{sv})", "multi", &builder, NULL));
|
||||||
|
messages[8].n_expected_activations = 1;
|
||||||
|
|
||||||
|
/* Action with tuple as parameter given as a single item to the interface but with additional items */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new ("(ss)", "first", "second"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_uint32 (42));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_uint32 (42));
|
||||||
|
|
||||||
|
messages[9].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
g_dbus_message_set_body (messages[9].message, g_variant_new ("(sava{sv})", "multi", &builder, NULL));
|
||||||
|
messages[9].n_expected_activations = 0;
|
||||||
|
|
||||||
|
/* Action with tuple with single item as parameter */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new ("(s)", "first"));
|
||||||
|
|
||||||
|
messages[10].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
g_dbus_message_set_body (messages[10].message, g_variant_new ("(sava{sv})", "single", &builder, NULL));
|
||||||
|
messages[10].n_expected_activations = 1;
|
||||||
|
|
||||||
|
/* Action with tuple with single item as parameter with additional items */
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new ("(s)", "first"));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_uint32 (42));
|
||||||
|
g_variant_builder_add (&builder, "v", g_variant_new_uint32 (43));
|
||||||
|
|
||||||
|
messages[11].message = g_dbus_message_new_method_call ("org.gtk.TestApplication.ActivateAction",
|
||||||
|
"/org/gtk/TestApplication/ActivateAction",
|
||||||
|
"org.freedesktop.Application",
|
||||||
|
"ActivateAction");
|
||||||
|
g_dbus_message_set_body (messages[11].message, g_variant_new ("(sava{sv})", "single", &builder, NULL));
|
||||||
|
messages[11].n_expected_activations = 0;
|
||||||
|
|
||||||
/* Try each message */
|
/* Try each message */
|
||||||
bus = g_test_dbus_new (G_TEST_DBUS_NONE);
|
bus = g_test_dbus_new (G_TEST_DBUS_NONE);
|
||||||
g_test_dbus_up (bus);
|
g_test_dbus_up (bus);
|
||||||
@ -1808,6 +1881,8 @@ test_dbus_activate_action (void)
|
|||||||
{
|
{
|
||||||
{ "undo", dbus_activate_action_cb, NULL, NULL, NULL, { 0 } },
|
{ "undo", dbus_activate_action_cb, NULL, NULL, NULL, { 0 } },
|
||||||
{ "lang", dbus_activate_action_cb, "s", "'latin'", NULL, { 0 } },
|
{ "lang", dbus_activate_action_cb, "s", "'latin'", NULL, { 0 } },
|
||||||
|
{ "single", dbus_activate_action_cb, "(s)", NULL, NULL, { 0 } },
|
||||||
|
{ "multi", dbus_activate_action_cb, "(ss)", NULL, NULL, { 0 } },
|
||||||
};
|
};
|
||||||
guint n_activations = 0;
|
guint n_activations = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user