X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgapplicationimpl-dbus.c;h=4b1b5c915f4ca1e40a7af4ea78cf8b3767ed6699;hb=037bdb1b7ec89f9ddc0d40cabc78bb194b52fafb;hp=68b0d288a4b2956be6fca8786c00655b65779790;hpb=db325cd6a3ed3e95d497d7a4087c0f37f155ef01;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c index 68b0d28..4b1b5c9 100644 --- a/gio/gapplicationimpl-dbus.c +++ b/gio/gapplicationimpl-dbus.c @@ -12,9 +12,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 . * * Authors: Ryan Lortie */ @@ -48,7 +46,7 @@ /* DBus Interface definition {{{1 */ /* For documentation of these interfaces, see - * http://live.gnome.org/GTK+/GApplication-dbus-apis + * https://wiki.gnome.org/Projects/GLib/GApplication/DBusAPI */ static const gchar org_gtk_Application_xml[] = "" @@ -73,6 +71,26 @@ static const gchar org_gtk_Application_xml[] = static GDBusInterfaceInfo *org_gtk_Application; +static const gchar org_freedesktop_Application_xml[] = + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static GDBusInterfaceInfo *org_freedesktop_Application; + static const gchar org_gtk_private_CommandLine_xml[] = "" "" @@ -96,6 +114,7 @@ struct _GApplicationImpl gchar *object_path; guint object_id; + guint fdo_object_id; guint actions_id; gboolean properties_live; @@ -168,7 +187,10 @@ g_application_impl_method_call (GDBusConnection *connection, { GVariant *platform_data; + /* Completely the same for both freedesktop and gtk interfaces */ + g_variant_get (parameters, "(@a{sv})", &platform_data); + class->before_emit (impl->app, platform_data); g_signal_emit_by_name (impl->app, "activate"); class->after_emit (impl->app, platform_data); @@ -179,14 +201,28 @@ g_application_impl_method_call (GDBusConnection *connection, else if (strcmp (method_name, "Open") == 0) { + GApplicationFlags flags; GVariant *platform_data; const gchar *hint; GVariant *array; GFile **files; gint n, i; - g_variant_get (parameters, "(@ass@a{sv})", - &array, &hint, &platform_data); + flags = g_application_get_flags (impl->app); + if ((flags & G_APPLICATION_HANDLES_OPEN) == 0) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED, "Application does not open files"); + return; + } + + /* freedesktop interface has no hint parameter */ + if (g_str_equal (interface_name, "org.freedesktop.Application")) + { + g_variant_get (parameters, "(@as@a{sv})", &array, &platform_data); + hint = ""; + } + else + g_variant_get (parameters, "(@as&s@a{sv})", &array, &hint, &platform_data); n = g_variant_n_children (array); files = g_new (GFile *, n + 1); @@ -216,10 +252,21 @@ g_application_impl_method_call (GDBusConnection *connection, else if (strcmp (method_name, "CommandLine") == 0) { + GApplicationFlags flags; GApplicationCommandLine *cmdline; GVariant *platform_data; int status; + flags = g_application_get_flags (impl->app); + if ((flags & G_APPLICATION_HANDLES_COMMAND_LINE) == 0) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED, + "Application does not handle command line arguments"); + return; + } + + /* Only on the GtkApplication interface */ + cmdline = g_dbus_command_line_new (invocation); platform_data = g_variant_get_child_value (parameters, 2); class->before_emit (impl->app, platform_data); @@ -229,6 +276,30 @@ g_application_impl_method_call (GDBusConnection *connection, g_variant_unref (platform_data); g_object_unref (cmdline); } + else if (g_str_equal (method_name, "ActivateAction")) + { + GVariant *parameter = NULL; + GVariant *platform_data; + GVariantIter *iter; + const gchar *name; + + /* Only on the freedesktop interface */ + + g_variant_get (parameters, "(&sav@a{sv})", &name, &iter, &platform_data); + g_variant_iter_next (iter, "v", ¶meter); + g_variant_iter_free (iter); + + class->before_emit (impl->app, platform_data); + g_action_group_activate_action (impl->exported_actions, name, parameter); + class->after_emit (impl->app, platform_data); + + if (parameter) + g_variant_unref (parameter); + + g_variant_unref (platform_data); + + g_dbus_method_invocation_return_value (invocation, NULL); + } else g_assert_not_reached (); } @@ -290,6 +361,14 @@ g_application_impl_attempt_primary (GApplicationImpl *impl, g_assert (org_gtk_Application != NULL); g_dbus_interface_info_ref (org_gtk_Application); g_dbus_node_info_unref (info); + + info = g_dbus_node_info_new_for_xml (org_freedesktop_Application_xml, &error); + if G_UNLIKELY (info == NULL) + g_error ("%s", error->message); + org_freedesktop_Application = g_dbus_node_info_lookup_interface (info, "org.freedesktop.Application"); + g_assert (org_freedesktop_Application != NULL); + g_dbus_interface_info_ref (org_freedesktop_Application); + g_dbus_node_info_unref (info); } /* We could possibly have been D-Bus activated as a result of incoming @@ -312,6 +391,12 @@ g_application_impl_attempt_primary (GApplicationImpl *impl, if (impl->object_id == 0) return FALSE; + impl->fdo_object_id = g_dbus_connection_register_object (impl->session_bus, impl->object_path, + org_freedesktop_Application, &vtable, impl, NULL, error); + + if (impl->fdo_object_id == 0) + return FALSE; + impl->actions_id = g_dbus_connection_export_action_group (impl->session_bus, impl->object_path, impl->exported_actions, error); @@ -380,6 +465,12 @@ g_application_impl_stop_primary (GApplicationImpl *impl) impl->object_id = 0; } + if (impl->fdo_object_id) + { + g_dbus_connection_unregister_object (impl->session_bus, impl->fdo_object_id); + impl->fdo_object_id = 0; + } + if (impl->actions_id) { g_dbus_connection_unexport_action_group (impl->session_bus, impl->actions_id); @@ -476,7 +567,7 @@ g_application_impl_register (GApplication *application, if (flags & G_APPLICATION_IS_SERVICE) { g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, - "Unable to acquire bus name `%s'", appid); + "Unable to acquire bus name '%s'", appid); g_application_impl_destroy (impl); return NULL; @@ -609,9 +700,9 @@ g_application_impl_cmdline_done (GObject *source, } int -g_application_impl_command_line (GApplicationImpl *impl, - gchar **arguments, - GVariant *platform_data) +g_application_impl_command_line (GApplicationImpl *impl, + const gchar * const *arguments, + GVariant *platform_data) { const static GDBusInterfaceVTable vtable = { g_application_impl_cmdline_method_call @@ -662,6 +753,7 @@ g_application_impl_command_line (GApplicationImpl *impl, g_variant_new ("(o^aay@a{sv})", object_path, arguments, platform_data), G_VARIANT_TYPE ("(i)"), 0, G_MAXINT, fd_list, NULL, g_application_impl_cmdline_done, &data); + g_object_unref (fd_list); } #else g_dbus_connection_call (impl->session_bus, impl->bus_name, impl->object_path, @@ -760,13 +852,13 @@ g_dbus_command_line_get_stdin (GApplicationCommandLine *cmdline) if (fd_list && g_unix_fd_list_get_length (fd_list)) { - gint *fds, n_fds, i; + gint *fds, i; - fds = g_unix_fd_list_steal_fds (fd_list, &n_fds); - result = g_unix_input_stream_new (fds[0], TRUE); - for (i = 1; i < n_fds; i++) - (void) g_close (fds[i], NULL); - g_free (fds); + fds = g_unix_fd_list_peek_fds (fd_list, NULL); + result = g_unix_input_stream_new (fds[0], FALSE); + g_object_weak_ref (G_OBJECT (result), + (GWeakNotify) g_object_unref, + g_object_ref (fd_list)); } return result; @@ -813,13 +905,19 @@ g_dbus_command_line_new (GDBusMethodInvocation *invocation) { GDBusCommandLine *gdbcl; GVariant *args; + GVariant *arguments, *platform_data; args = g_dbus_method_invocation_get_parameters (invocation); + arguments = g_variant_get_child_value (args, 1); + platform_data = g_variant_get_child_value (args, 2); gdbcl = g_object_new (g_dbus_command_line_get_type (), - "arguments", g_variant_get_child_value (args, 1), - "platform-data", g_variant_get_child_value (args, 2), + "arguments", arguments, + "platform-data", platform_data, NULL); + g_variant_unref (arguments); + g_variant_unref (platform_data); + gdbcl->connection = g_dbus_method_invocation_get_connection (invocation); gdbcl->bus_name = g_dbus_method_invocation_get_sender (invocation); g_variant_get_child (args, 0, "&o", &gdbcl->object_path);