diff --git a/Makefile.am b/Makefile.am index cca7c3b0605bb7f38b98f2b34f0f8ec60087b4ef..d9b86bc8d634b9e671c812324b7ad7e473d85e5c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -78,13 +78,11 @@ appdatadir = $(datadir)/appdata appdata_DATA = $(appdata_in_files:.xml.in=.xml) appdata_in_files = thunar.appdata.xml.in -if HAVE_DBUS servicedir = $(datadir)/dbus-1/services service_in_files = org.xfce.FileManager.service.in org.xfce.Thunar.service.in service_DATA = $(service_in_files:.service.in=.service) %.service: %.service.in $(AM_V_GEN) $(SED) -e "s,\@bindir\@,$(bindir),g" < $< > $@ -endif polkit_policydir = $(datadir)/polkit-1/actions polkit_in_in_files = \ diff --git a/configure.ac.in b/configure.ac.in index 740c7f171da6746275f82724f1339f08be42d024..a56ece7ab5a2416e70f553e095c07b14c59c1e09 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -162,12 +162,6 @@ dnl ********************************** XDT_CHECK_OPTIONAL_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.30.0], [gio-unix], [GIO UNIX features]) -dnl ********************************** -dnl *** Optional support for D-BUS *** -dnl ********************************** -XDT_CHECK_OPTIONAL_PACKAGE([DBUS], [dbus-glib-1], - [0.34], [dbus], [D-BUS support]) - dnl *************************************************************** dnl *** Optional support for GUDev (required for thunar-volman) *** dnl *************************************************************** @@ -252,11 +246,6 @@ dnl *************************** echo echo "Build Configuration:" echo -if test x"$DBUS_FOUND" = x"yes"; then -echo "* D-BUS support: yes" -else -echo "* D-BUS support: no" -fi if test x"$GIO_UNIX_FOUND" = x"yes"; then echo "* GIO UNIX features: yes" else diff --git a/po/POTFILES.in b/po/POTFILES.in index 44e0d4ea066459321b44e6dc94c4291b01a26e72..4bc7e19a0728da0f98b58d104e788f80bdd5198b 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -12,7 +12,6 @@ thunar/thunar-column-model.c thunar/thunar-compact-view.c thunar/thunar-component.c thunar/thunar-create-dialog.c -thunar/thunar-dbus-client.c thunar/thunar-dbus-service.c thunar/thunar-deep-count-job.c thunar/thunar-details-view.c diff --git a/thunar/Makefile.am b/thunar/Makefile.am index 86cd09d13fc6be6339d89095329d719b7b005530..98bcbb622dd8e2ed6d687983353c4e9b1847017e 100644 --- a/thunar/Makefile.am +++ b/thunar/Makefile.am @@ -31,6 +31,12 @@ thunar_built_sources = \ thunar-renamer-dialog-ui.h \ thunar-standard-view-ui.h \ thunar-thumbnail-frame.c \ + thunar-dbus-service-infos.h \ + thunar-dbus-service-infos.c \ + thunar-thumbnailer-proxy.c \ + thunar-thumbnailer-proxy.h \ + thunar-thumbnail-cache-proxy.h \ + thunar-thumbnail-cache-proxy.c \ thunar-window-ui.h @@ -65,6 +71,8 @@ thunar_SOURCES = \ thunar-component.h \ thunar-create-dialog.c \ thunar-create-dialog.h \ + thunar-dbus-service.c \ + thunar-dbus-service.h \ thunar-deep-count-job.h \ thunar-deep-count-job.c \ thunar-details-view.c \ @@ -238,28 +246,6 @@ thunar_LDADD = \ thunar_DEPENDENCIES = \ $(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la -if HAVE_DBUS -thunar_built_sources += \ - thunar-dbus-service-infos.h \ - thunar-thumbnail-cache-proxy.h \ - thunar-thumbnailer-proxy.h - -thunar_dbus_sources = \ - thunar-dbus-client.c \ - thunar-dbus-client.h \ - thunar-dbus-service.c \ - thunar-dbus-service.h \ - thunar-thumbnail-cache-proxy.h \ - thunar-thumbnailer-proxy.h - -thunar_CFLAGS += \ - -DDBUS_API_SUBJECT_TO_CHANGE \ - $(DBUS_CFLAGS) - -thunar_LDADD += \ - $(DBUS_LIBS) -endif - if HAVE_GIO_UNIX thunar_CFLAGS += \ $(GIO_UNIX_CFLAGS) @@ -296,28 +282,14 @@ DISTCLEANFILES += \ BUILT_SOURCES = \ $(thunar_built_sources) -if HAVE_DBUS -thunar-dbus-service-infos.h: $(srcdir)/thunar-dbus-service-infos.xml Makefile - $(AM_V_GEN) dbus-binding-tool --prefix=thunar_dbus_service --mode=glib-server $(srcdir)/thunar-dbus-service-infos.xml > thunar-dbus-service-infos.h +thunar-dbus-service-infos.h thunar-dbus-service-infos.c: $(srcdir)/thunar-dbus-service-infos.xml Makefile + $(AM_V_GEN) gdbus-codegen --c-namespace Thunar --generate-c-code=thunar-dbus-service-infos $(srcdir)/thunar-dbus-service-infos.xml -thunar-thumbnailer-proxy.h: $(srcdir)/thunar-thumbnailer-dbus.xml Makefile - $(AM_V_GEN) ( \ - dbus-binding-tool --mode=glib-client \ - $(srcdir)/thunar-thumbnailer-dbus.xml > thunar-thumbnailer-proxy.h.tmp \ - && $(SED) -e 's/org_freedesktop_thumbnails_Thumbnailer1/thunar_thumbnailer_proxy/g' \ - thunar-thumbnailer-proxy.h.tmp > thunar-thumbnailer-proxy.h \ - && $(RM) thunar-thumbnailer-proxy.h.tmp \ - ) +thunar-thumbnailer-proxy.h thunar-thumbnailer-proxy.c: $(srcdir)/thunar-thumbnailer-dbus.xml Makefile + $(AM_V_GEN) gdbus-codegen --c-namespace Thunar --generate-c-code thunar-thumbnailer-proxy $(srcdir)/thunar-thumbnailer-dbus.xml -thunar-thumbnail-cache-proxy.h: $(srcdir)/thunar-thumbnail-cache-dbus.xml Makefile - $(AM_V_GEN) ( \ - dbus-binding-tool --mode=glib-client \ - $(srcdir)/thunar-thumbnail-cache-dbus.xml > thunar-thumbnail-cache-proxy.h.tmp \ - && $(SED) -e 's/org_freedesktop_thumbnails_Cache1/thunar_thumbnail_cache_proxy/g' \ - thunar-thumbnail-cache-proxy.h.tmp > thunar-thumbnail-cache-proxy.h \ - && $(RM) thunar-thumbnail-cache-proxy.h.tmp \ - ) -endif +thunar-thumbnail-cache-proxy.h thunar-thumbnail-cache-proxy.c: $(srcdir)/thunar-thumbnail-cache-dbus.xml Makefile + $(AM_V_GEN) gdbus-codegen --c-namespace Thunar --generate-c-code thunar-thumbnail-cache-proxy $(srcdir)/thunar-thumbnail-cache-dbus.xml thunar-thumbnail-frame.c: $(srcdir)/thunar-thumbnail-frame.png Makefile $(AM_V_GEN) (echo "#include <thunar/thunar-thumbnail-frame.h>" && gdk-pixbuf-csource --extern --raw --stream --name=thunar_thumbnail_frame $(srcdir)/thunar-thumbnail-frame.png) > thunar-thumbnail-frame.c diff --git a/thunar/main.c b/thunar/main.c index 9a31391b68ebee98dae744f7fb6786eda2c04a01..0e5ff2b3fa3debb2b086e1d41f0b909973f143d6 100644 --- a/thunar/main.c +++ b/thunar/main.c @@ -36,8 +36,6 @@ #include <xfconf/xfconf.h> #include <thunar/thunar-application.h> -#include <thunar/thunar-dbus-client.h> -#include <thunar/thunar-dbus-service.h> #include <thunar/thunar-gobject-extensions.h> #include <thunar/thunar-private.h> #include <thunar/thunar-notify.h> diff --git a/thunar/thunar-application.c b/thunar/thunar-application.c index 4c98ec6dfa0cc881da667a6325e5b544511352fc..95e52b20d07bbd597f88867f3d0c74973b678411 100644 --- a/thunar/thunar-application.c +++ b/thunar/thunar-application.c @@ -61,6 +61,7 @@ #include <thunar/thunar-util.h> #include <thunar/thunar-view.h> #include <thunar/thunar-session-client.h> +#include <thunar/thunar-dbus-service.h> #define ACCEL_MAP_PATH "Thunar/accels.scm" @@ -117,6 +118,10 @@ static int thunar_application_handle_local_options (GApplication GVariantDict *options); static int thunar_application_command_line (GApplication *application, GApplicationCommandLine *command_line); +static gboolean thunar_application_dbus_register (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error); static void thunar_application_accel_map_changed (ThunarApplication *application); static gboolean thunar_application_accel_map_save (gpointer user_data); static void thunar_application_collect_and_launch (ThunarApplication *application, @@ -175,6 +180,8 @@ struct _ThunarApplication ThunarThumbnailCache *thumbnail_cache; ThunarThumbnailer *thumbnailer; + ThunarDBusService *dbus_service; + gboolean daemon; guint accel_map_save_id; @@ -229,6 +236,7 @@ thunar_application_class_init (ThunarApplicationClass *klass) gapplication_class->shutdown = thunar_application_shutdown; gapplication_class->handle_local_options = thunar_application_handle_local_options; gapplication_class->command_line = thunar_application_command_line; + gapplication_class->dbus_register = thunar_application_dbus_register; /** * ThunarApplication:daemon: @@ -364,6 +372,9 @@ thunar_application_shutdown (GApplication *gapp) /* disconnect from the session manager */ g_object_unref (G_OBJECT (application->session_client)); + /* remove the dbus service */ + g_clear_pointer (&application->dbus_service, g_object_unref); + G_APPLICATION_CLASS (thunar_application_parent_class)->shutdown (gapp); } @@ -480,6 +491,24 @@ out: +static gboolean +thunar_application_dbus_register (GApplication *gapp, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + ThunarApplication *application = THUNAR_APPLICATION (gapp); + + if (application->dbus_service) /* WTF? */ + return TRUE; + + application->dbus_service = g_object_new (THUNAR_TYPE_DBUS_SERVICE, NULL); + + return thunar_dbus_service_export_on_connection (application->dbus_service, connection, error); +} + + + static void thunar_application_activate (GApplication *gapp) { diff --git a/thunar/thunar-dbus-client.c b/thunar/thunar-dbus-client.c deleted file mode 100644 index 535f6c81101ae0f354c86391bec3d3db36e36638..0000000000000000000000000000000000000000 --- a/thunar/thunar-dbus-client.c +++ /dev/null @@ -1,313 +0,0 @@ -/* vi:set et ai sw=2 sts=2 ts=2: */ -/*- - * Copyright (c) 2006 Benedikt Meurer <benny@xfce.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <dbus/dbus-glib-lowlevel.h> -#include <dbus/dbus.h> - -#include <thunar/thunar-dbus-client.h> -#include <thunar/thunar-private.h> - - - -/** - * thunar_dbus_client_bulk_rename: - * @working_directory : the default working directory for the bulk rename dialog. - * @filenames : the list of files that should be displayed by default or - * the empty list to start with an empty bulk rename dialog. - * @standalone : whether to run the bulk renamer in standalone mode. - * @screen : the #GdkScreen on which to display the dialog or %NULL to - * use the default #GdkScreen. - * @startup_id : startup id to properly finish startup notification and set - * the window timestamp or %NULL. - * @error : return location for errors or %NULL. - * - * Tries to invoke the BulkRename() method on a running Thunar instance, that is - * registered with the current D-BUS session bus. Returns %TRUE if the method was - * successfully invoked, else %FALSE. - * - * If %TRUE is returned, the current process may afterwards just terminate, as - * all @filenames will be handled by the remote instance. - * - * Return value: %TRUE on success, else %FALSE. - **/ -gboolean -thunar_dbus_client_bulk_rename (const gchar *working_directory, - gchar **filenames, - gboolean standalone, - GdkScreen *screen, - const gchar *startup_id, - GError **error) -{ - DBusConnection *connection; - DBusMessage *message; - DBusMessage *result; - DBusError derror; - gchar *display_name; - - _thunar_return_val_if_fail (screen == NULL || GDK_IS_SCREEN (screen), FALSE); - _thunar_return_val_if_fail (g_path_is_absolute (working_directory), FALSE); - _thunar_return_val_if_fail (error == NULL || *error == NULL, FALSE); - _thunar_return_val_if_fail (filenames != NULL, FALSE); - - /* initialize the DBusError struct */ - dbus_error_init (&derror); - - /* fallback to default screen if no other is specified */ - if (G_LIKELY (screen == NULL)) - screen = gdk_screen_get_default (); - - /* try to connect to the session bus */ - connection = dbus_bus_get (DBUS_BUS_SESSION, &derror); - if (G_UNLIKELY (connection == NULL)) - { - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* determine the display name for the screen */ - display_name = gdk_screen_make_display_name (screen); - - /* dbus does not like null values */ - if (startup_id == NULL) - startup_id = ""; - - /* generate the BulkRename() method (disable activation!) */ - message = dbus_message_new_method_call ("org.xfce.Thunar", "/org/xfce/FileManager", "org.xfce.Thunar", "BulkRename"); - dbus_message_set_auto_start (message, FALSE); - dbus_message_append_args (message, - DBUS_TYPE_STRING, &working_directory, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &filenames, g_strv_length (filenames), - DBUS_TYPE_BOOLEAN, &standalone, - DBUS_TYPE_STRING, &display_name, - DBUS_TYPE_STRING, &startup_id, - DBUS_TYPE_INVALID); - - /* release the display name */ - g_free (display_name); - - /* send the message and release our references on connection and message */ - dbus_error_init (&derror); - result = dbus_connection_send_with_reply_and_block (connection, message, -1, &derror); - dbus_message_unref (message); - - /* check if no reply was received */ - if (G_UNLIKELY (result == NULL)) - { - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* but maybe we received an error */ - if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR) - { - dbus_set_error_from_message (&derror, result); - dbus_set_g_error (error, &derror); - dbus_message_unref (result); - dbus_error_free (&derror); - return FALSE; - } - - /* let's asume that it worked */ - dbus_message_unref (result); - return TRUE; -} - - - -/** - * thunar_dbus_client_launch_files: - * @working_directory : the directory relative to which @filenames may be looked up. - * @filenames : the list of @filenames to launch. - * @screen : the #GdkScreen on which to launch the @filenames or %NULL - * to use the default #GdkScreen. - * @startup_id : startup id to properly finish startup notification and set - * the window timestamp or %NULL. - * @error : return location for errors or %NULL. - * - * Tries to invoke the LaunchFiles() method on a running Thunar instance, that is - * registered with the current D-BUS session bus. Returns %TRUE if the method was - * successfully invoked, else %FALSE. - * - * If %TRUE is returned, the current process may afterwards just terminate, as - * all @filenames will be handled by the remote instance. Else, if %FALSE is - * returned the current process should try to launch the @filenames itself. - * - * Return value: %TRUE on success, else %FALSE. - **/ -gboolean -thunar_dbus_client_launch_files (const gchar *working_directory, - gchar **filenames, - GdkScreen *screen, - const gchar *startup_id, - GError **error) -{ - DBusConnection *connection; - DBusMessage *message; - DBusMessage *result; - DBusError derror; - gchar *display_name; - - _thunar_return_val_if_fail (g_path_is_absolute (working_directory), FALSE); - _thunar_return_val_if_fail (filenames != NULL && *filenames != NULL, FALSE); - _thunar_return_val_if_fail (screen == NULL || GDK_IS_SCREEN (screen), FALSE); - _thunar_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - /* initialize the DBusError struct */ - dbus_error_init (&derror); - - /* fallback to default screen if no other is specified */ - if (G_LIKELY (screen == NULL)) - screen = gdk_screen_get_default (); - - /* try to connect to the session bus */ - connection = dbus_bus_get (DBUS_BUS_SESSION, &derror); - if (G_UNLIKELY (connection == NULL)) - { - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* determine the display name for the screen */ - display_name = gdk_screen_make_display_name (screen); - - /* dbus does not like null values */ - if (startup_id == NULL) - startup_id = ""; - - /* generate the LaunchFiles() method (disable activation!) */ - message = dbus_message_new_method_call ("org.xfce.Thunar", "/org/xfce/FileManager", "org.xfce.FileManager", "LaunchFiles"); - dbus_message_set_auto_start (message, FALSE); - dbus_message_append_args (message, - DBUS_TYPE_STRING, &working_directory, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &filenames, g_strv_length (filenames), - DBUS_TYPE_STRING, &display_name, - DBUS_TYPE_STRING, &startup_id, - DBUS_TYPE_INVALID); - - /* release the display name */ - g_free (display_name); - - /* send the message and release our references on connection and message */ - dbus_error_init (&derror); - result = dbus_connection_send_with_reply_and_block (connection, message, -1, &derror); - dbus_message_unref (message); - - /* check if no reply was received */ - if (G_UNLIKELY (result == NULL)) - { - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* but maybe we received an error */ - if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR) - { - dbus_set_error_from_message (&derror, result); - dbus_set_g_error (error, &derror); - dbus_message_unref (result); - dbus_error_free (&derror); - return FALSE; - } - - /* let's asume that it worked */ - dbus_message_unref (result); - return TRUE; -} - - - -/** - * thunar_dbus_client_terminate: - * @error : Return location for errors or %NULL. - * - * Tells a running Thunar instance, connected to the D-BUS - * session bus, to terminate immediately. - * - * Return value: %TRUE if any instance was terminated, else - * %FALSE and @error is set. - **/ -gboolean -thunar_dbus_client_terminate (GError **error) -{ - DBusConnection *connection; - DBusMessage *message; - DBusMessage *result; - DBusError derror; - - _thunar_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - /* initialize the DBusError struct */ - dbus_error_init (&derror); - - /* try to connect to the session bus */ - connection = dbus_bus_get (DBUS_BUS_SESSION, &derror); - if (G_UNLIKELY (connection == NULL)) - { - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* generate the LaunchFiles() method (disable activation!) */ - message = dbus_message_new_method_call ("org.xfce.Thunar", "/org/xfce/FileManager", "org.xfce.Thunar", "Terminate"); - dbus_message_set_auto_start (message, FALSE); - - /* send the message and release our references on connection and message */ - dbus_error_init (&derror); - result = dbus_connection_send_with_reply_and_block (connection, message, -1, &derror); - dbus_message_unref (message); - - /* check if no reply was received */ - if (G_UNLIKELY (result == NULL)) - { - /* check if there was nothing to terminate */ - if (dbus_error_has_name (&derror, DBUS_ERROR_NAME_HAS_NO_OWNER)) - { - dbus_error_free (&derror); - return TRUE; - } - - /* Looks like there was a real error */ - dbus_set_g_error (error, &derror); - dbus_error_free (&derror); - return FALSE; - } - - /* but maybe we received an error */ - if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR) - { - dbus_set_error_from_message (&derror, result); - dbus_set_g_error (error, &derror); - dbus_message_unref (result); - dbus_error_free (&derror); - return FALSE; - } - - /* let's asume that it worked */ - dbus_message_unref (result); - return TRUE; -} diff --git a/thunar/thunar-dbus-client.h b/thunar/thunar-dbus-client.h deleted file mode 100644 index fd872b14bc155e3c12813f80eb22b83547b0eb96..0000000000000000000000000000000000000000 --- a/thunar/thunar-dbus-client.h +++ /dev/null @@ -1,44 +0,0 @@ -/* vi:set et ai sw=2 sts=2 ts=2: */ -/*- - * Copyright (c) 2006 Benedikt Meurer <benny@xfce.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __THUNAR_DBUS_CLIENT_H__ -#define __THUNAR_DBUS_CLIENT_H__ - -#include <gdk/gdk.h> - -G_BEGIN_DECLS; - -gboolean thunar_dbus_client_bulk_rename (const gchar *working_directory, - gchar **filenames, - gboolean standalone, - GdkScreen *screen, - const gchar *startup_id, - GError **error); - -gboolean thunar_dbus_client_launch_files (const gchar *working_directory, - gchar **filenames, - GdkScreen *screen, - const gchar *startup_id, - GError **error); - -gboolean thunar_dbus_client_terminate (GError **error); - -G_END_DECLS; - -#endif /* !__THUNAR_DBUS_CLIENT_H__ */ diff --git a/thunar/thunar-dbus-service-infos.c b/thunar/thunar-dbus-service-infos.c new file mode 100644 index 0000000000000000000000000000000000000000..a82461062d2b6db95627726e2feff292c5c0d026 --- /dev/null +++ b/thunar/thunar-dbus-service-infos.c @@ -0,0 +1,7156 @@ +/* + * Generated by gdbus-codegen 2.44.1. DO NOT EDIT. + * + * The license of this code is the same as for the source it was derived from. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "thunar-dbus-service-infos.h" + +#include <string.h> +#ifdef G_OS_UNIX +# include <gio/gunixfdlist.h> +#endif + +typedef struct +{ + GDBusArgInfo parent_struct; + gboolean use_gvariant; +} _ExtendedGDBusArgInfo; + +typedef struct +{ + GDBusMethodInfo parent_struct; + const gchar *signal_name; + gboolean pass_fdlist; +} _ExtendedGDBusMethodInfo; + +typedef struct +{ + GDBusSignalInfo parent_struct; + const gchar *signal_name; +} _ExtendedGDBusSignalInfo; + +typedef struct +{ + GDBusPropertyInfo parent_struct; + const gchar *hyphen_name; + gboolean use_gvariant; +} _ExtendedGDBusPropertyInfo; + +typedef struct +{ + GDBusInterfaceInfo parent_struct; + const gchar *hyphen_name; +} _ExtendedGDBusInterfaceInfo; + +typedef struct +{ + const _ExtendedGDBusPropertyInfo *info; + guint prop_id; + GValue orig_value; /* the value before the change */ +} ChangedProperty; + +static void +_changed_property_free (ChangedProperty *data) +{ + g_value_unset (&data->orig_value); + g_free (data); +} + +static gboolean +_g_strv_equal0 (gchar **a, gchar **b) +{ + gboolean ret = FALSE; + guint n; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + if (g_strv_length (a) != g_strv_length (b)) + goto out; + for (n = 0; a[n] != NULL; n++) + if (g_strcmp0 (a[n], b[n]) != 0) + goto out; + ret = TRUE; +out: + return ret; +} + +static gboolean +_g_variant_equal0 (GVariant *a, GVariant *b) +{ + gboolean ret = FALSE; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + ret = g_variant_equal (a, b); +out: + return ret; +} + +G_GNUC_UNUSED static gboolean +_g_value_equal (const GValue *a, const GValue *b) +{ + gboolean ret = FALSE; + g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); + switch (G_VALUE_TYPE (a)) + { + case G_TYPE_BOOLEAN: + ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); + break; + case G_TYPE_UCHAR: + ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); + break; + case G_TYPE_INT: + ret = (g_value_get_int (a) == g_value_get_int (b)); + break; + case G_TYPE_UINT: + ret = (g_value_get_uint (a) == g_value_get_uint (b)); + break; + case G_TYPE_INT64: + ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); + break; + case G_TYPE_UINT64: + ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); + break; + case G_TYPE_DOUBLE: + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } + break; + case G_TYPE_STRING: + ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); + break; + case G_TYPE_VARIANT: + ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); + break; + default: + if (G_VALUE_TYPE (a) == G_TYPE_STRV) + ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); + else + g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); + break; + } + return ret; +} + +/* ------------------------------------------------------------------------ + * Code for interface org.xfce.FileManager + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:ThunarDBusFileManager + * @title: ThunarDBusFileManager + * @short_description: Generated C code for the org.xfce.FileManager D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.xfce.FileManager ---- */ + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_open = +{ + { + -1, + (gchar *) "open", + (gchar *) "b", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_open, + &_thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_display_chooser_dialog = +{ + { + -1, + (gchar *) "DisplayChooserDialog", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_display_chooser_dialog_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-chooser-dialog", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_display_folder_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_folder_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_display_folder_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_display_folder_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_display_folder = +{ + { + -1, + (gchar *) "DisplayFolder", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_display_folder_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-folder", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_filename = +{ + { + -1, + (gchar *) "filename", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_filename, + &_thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_display_folder_and_select = +{ + { + -1, + (gchar *) "DisplayFolderAndSelect", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_display_folder_and_select_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-folder-and-select", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_display_file_properties = +{ + { + -1, + (gchar *) "DisplayFileProperties", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_display_file_properties_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-file-properties", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_launch_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_launch_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_launch_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_launch_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_launch = +{ + { + -1, + (gchar *) "Launch", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_launch_IN_ARG_pointers, + NULL, + NULL + }, + "handle-launch", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_execute_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_execute_IN_ARG_uri = +{ + { + -1, + (gchar *) "uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_execute_IN_ARG_files = +{ + { + -1, + (gchar *) "files", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_execute_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_execute_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_execute_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_execute_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_execute_IN_ARG_uri, + &_thunar_dbus_file_manager_method_info_execute_IN_ARG_files, + &_thunar_dbus_file_manager_method_info_execute_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_execute_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_execute = +{ + { + -1, + (gchar *) "Execute", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_execute_IN_ARG_pointers, + NULL, + NULL + }, + "handle-execute", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_display_preferences_dialog = +{ + { + -1, + (gchar *) "DisplayPreferencesDialog", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_display_preferences_dialog_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-preferences-dialog", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_source_filenames = +{ + { + -1, + (gchar *) "source_filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_target_filenames = +{ + { + -1, + (gchar *) "target_filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_copy_to_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_source_filenames, + &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_target_filenames, + &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_copy_to = +{ + { + -1, + (gchar *) "CopyTo", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_copy_to_IN_ARG_pointers, + NULL, + NULL + }, + "handle-copy-to", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_source_filenames = +{ + { + -1, + (gchar *) "source_filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_target_filename = +{ + { + -1, + (gchar *) "target_filename", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_copy_into_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_source_filenames, + &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_target_filename, + &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_copy_into = +{ + { + -1, + (gchar *) "CopyInto", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_copy_into_IN_ARG_pointers, + NULL, + NULL + }, + "handle-copy-into", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_move_into_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_move_into_IN_ARG_source_filenames = +{ + { + -1, + (gchar *) "source_filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_move_into_IN_ARG_target_filename = +{ + { + -1, + (gchar *) "target_filename", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_move_into_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_move_into_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_move_into_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_source_filenames, + &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_target_filename, + &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_move_into = +{ + { + -1, + (gchar *) "MoveInto", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_move_into_IN_ARG_pointers, + NULL, + NULL + }, + "handle-move-into", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_link_into_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_link_into_IN_ARG_source_filenames = +{ + { + -1, + (gchar *) "source_filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_link_into_IN_ARG_target_filename = +{ + { + -1, + (gchar *) "target_filename", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_link_into_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_link_into_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_link_into_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_source_filenames, + &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_target_filename, + &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_link_into = +{ + { + -1, + (gchar *) "LinkInto", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_link_into_IN_ARG_pointers, + NULL, + NULL + }, + "handle-link-into", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_filenames = +{ + { + -1, + (gchar *) "filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_filenames, + &_thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_unlink_files = +{ + { + -1, + (gchar *) "UnlinkFiles", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_unlink_files_IN_ARG_pointers, + NULL, + NULL + }, + "handle-unlink-files", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_files_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_files_IN_ARG_filenames = +{ + { + -1, + (gchar *) "filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_files_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_launch_files_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_launch_files_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_launch_files_IN_ARG_working_directory, + &_thunar_dbus_file_manager_method_info_launch_files_IN_ARG_filenames, + &_thunar_dbus_file_manager_method_info_launch_files_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_launch_files_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_launch_files = +{ + { + -1, + (gchar *) "LaunchFiles", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_launch_files_IN_ARG_pointers, + NULL, + NULL + }, + "handle-launch-files", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_rename_file_IN_ARG_filename = +{ + { + -1, + (gchar *) "filename", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_rename_file_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_rename_file_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_rename_file_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_rename_file_IN_ARG_filename, + &_thunar_dbus_file_manager_method_info_rename_file_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_rename_file_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_rename_file = +{ + { + -1, + (gchar *) "RenameFile", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_rename_file_IN_ARG_pointers, + NULL, + NULL + }, + "handle-rename-file", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_IN_ARG_parent_directory = +{ + { + -1, + (gchar *) "parent_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_IN_ARG_content_type = +{ + { + -1, + (gchar *) "content_type", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_create_file_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_create_file_IN_ARG_parent_directory, + &_thunar_dbus_file_manager_method_info_create_file_IN_ARG_content_type, + &_thunar_dbus_file_manager_method_info_create_file_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_create_file_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_create_file = +{ + { + -1, + (gchar *) "CreateFile", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_create_file_IN_ARG_pointers, + NULL, + NULL + }, + "handle-create-file", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_parent_directory = +{ + { + -1, + (gchar *) "parent_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_template_uri = +{ + { + -1, + (gchar *) "template_uri", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_parent_directory, + &_thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_template_uri, + &_thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_display, + &_thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_file_manager_method_info_create_file_from_template = +{ + { + -1, + (gchar *) "CreateFileFromTemplate", + (GDBusArgInfo **) &_thunar_dbus_file_manager_method_info_create_file_from_template_IN_ARG_pointers, + NULL, + NULL + }, + "handle-create-file-from-template", + FALSE +}; + +static const _ExtendedGDBusMethodInfo * const _thunar_dbus_file_manager_method_info_pointers[] = +{ + &_thunar_dbus_file_manager_method_info_display_chooser_dialog, + &_thunar_dbus_file_manager_method_info_display_folder, + &_thunar_dbus_file_manager_method_info_display_folder_and_select, + &_thunar_dbus_file_manager_method_info_display_file_properties, + &_thunar_dbus_file_manager_method_info_launch, + &_thunar_dbus_file_manager_method_info_execute, + &_thunar_dbus_file_manager_method_info_display_preferences_dialog, + &_thunar_dbus_file_manager_method_info_copy_to, + &_thunar_dbus_file_manager_method_info_copy_into, + &_thunar_dbus_file_manager_method_info_move_into, + &_thunar_dbus_file_manager_method_info_link_into, + &_thunar_dbus_file_manager_method_info_unlink_files, + &_thunar_dbus_file_manager_method_info_launch_files, + &_thunar_dbus_file_manager_method_info_rename_file, + &_thunar_dbus_file_manager_method_info_create_file, + &_thunar_dbus_file_manager_method_info_create_file_from_template, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _thunar_dbus_file_manager_interface_info = +{ + { + -1, + (gchar *) "org.xfce.FileManager", + (GDBusMethodInfo **) &_thunar_dbus_file_manager_method_info_pointers, + NULL, + NULL, + NULL + }, + "dbus-file-manager", +}; + + +/** + * thunar_dbus_file_manager_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +thunar_dbus_file_manager_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct; +} + +/** + * thunar_dbus_file_manager_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #ThunarDBusFileManager interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +thunar_dbus_file_manager_override_properties (GObjectClass *klass, guint property_id_begin) +{ + return property_id_begin - 1; +} + + + +/** + * ThunarDBusFileManager: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link>. + */ + +/** + * ThunarDBusFileManagerIface: + * @parent_iface: The parent interface. + * @handle_copy_into: Handler for the #ThunarDBusFileManager::handle-copy-into signal. + * @handle_copy_to: Handler for the #ThunarDBusFileManager::handle-copy-to signal. + * @handle_create_file: Handler for the #ThunarDBusFileManager::handle-create-file signal. + * @handle_create_file_from_template: Handler for the #ThunarDBusFileManager::handle-create-file-from-template signal. + * @handle_display_chooser_dialog: Handler for the #ThunarDBusFileManager::handle-display-chooser-dialog signal. + * @handle_display_file_properties: Handler for the #ThunarDBusFileManager::handle-display-file-properties signal. + * @handle_display_folder: Handler for the #ThunarDBusFileManager::handle-display-folder signal. + * @handle_display_folder_and_select: Handler for the #ThunarDBusFileManager::handle-display-folder-and-select signal. + * @handle_display_preferences_dialog: Handler for the #ThunarDBusFileManager::handle-display-preferences-dialog signal. + * @handle_execute: Handler for the #ThunarDBusFileManager::handle-execute signal. + * @handle_launch: Handler for the #ThunarDBusFileManager::handle-launch signal. + * @handle_launch_files: Handler for the #ThunarDBusFileManager::handle-launch-files signal. + * @handle_link_into: Handler for the #ThunarDBusFileManager::handle-link-into signal. + * @handle_move_into: Handler for the #ThunarDBusFileManager::handle-move-into signal. + * @handle_rename_file: Handler for the #ThunarDBusFileManager::handle-rename-file signal. + * @handle_unlink_files: Handler for the #ThunarDBusFileManager::handle-unlink-files signal. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link>. + */ + +typedef ThunarDBusFileManagerIface ThunarDBusFileManagerInterface; +G_DEFINE_INTERFACE (ThunarDBusFileManager, thunar_dbus_file_manager, G_TYPE_OBJECT); + +static void +thunar_dbus_file_manager_default_init (ThunarDBusFileManagerIface *iface) +{ + /* GObject signals for incoming D-Bus method calls: */ + /** + * ThunarDBusFileManager::handle-display-chooser-dialog: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_uri: Argument passed by remote caller. + * @arg_open: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.DisplayChooserDialog">DisplayChooserDialog()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_display_chooser_dialog() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-chooser-dialog", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_display_chooser_dialog), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-display-folder: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_uri: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolder">DisplayFolder()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_display_folder() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-folder", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_display_folder), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-display-folder-and-select: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_uri: Argument passed by remote caller. + * @arg_filename: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolderAndSelect">DisplayFolderAndSelect()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_display_folder_and_select() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-folder-and-select", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_display_folder_and_select), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-display-file-properties: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_uri: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFileProperties">DisplayFileProperties()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_display_file_properties() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-file-properties", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_display_file_properties), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-launch: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_uri: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.Launch">Launch()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_launch() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-launch", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_launch), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-execute: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_uri: Argument passed by remote caller. + * @arg_files: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.Execute">Execute()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_execute() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-execute", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_execute), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-display-preferences-dialog: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.DisplayPreferencesDialog">DisplayPreferencesDialog()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_display_preferences_dialog() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-preferences-dialog", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_display_preferences_dialog), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-copy-to: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_source_filenames: Argument passed by remote caller. + * @arg_target_filenames: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.CopyTo">CopyTo()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_copy_to() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-copy-to", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_copy_to), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-copy-into: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_source_filenames: Argument passed by remote caller. + * @arg_target_filename: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.CopyInto">CopyInto()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_copy_into() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-copy-into", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_copy_into), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-move-into: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_source_filenames: Argument passed by remote caller. + * @arg_target_filename: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.MoveInto">MoveInto()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_move_into() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-move-into", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_move_into), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-link-into: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_source_filenames: Argument passed by remote caller. + * @arg_target_filename: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.LinkInto">LinkInto()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_link_into() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-link-into", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_link_into), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-unlink-files: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_filenames: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.UnlinkFiles">UnlinkFiles()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_unlink_files() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-unlink-files", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_unlink_files), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-launch-files: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_filenames: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.LaunchFiles">LaunchFiles()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_launch_files() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-launch-files", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_launch_files), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-rename-file: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_filename: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.RenameFile">RenameFile()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_rename_file() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-rename-file", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_rename_file), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-create-file: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_parent_directory: Argument passed by remote caller. + * @arg_content_type: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.CreateFile">CreateFile()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_create_file() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-create-file", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_create_file), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusFileManager::handle-create-file-from-template: + * @object: A #ThunarDBusFileManager. + * @invocation: A #GDBusMethodInvocation. + * @arg_parent_directory: Argument passed by remote caller. + * @arg_template_uri: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-FileManager.CreateFileFromTemplate">CreateFileFromTemplate()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_file_manager_complete_create_file_from_template() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-create-file-from-template", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusFileManagerIface, handle_create_file_from_template), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 5, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + +} + +/** + * thunar_dbus_file_manager_call_display_chooser_dialog: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_open: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayChooserDialog">DisplayChooserDialog()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_display_chooser_dialog_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_display_chooser_dialog_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_display_chooser_dialog ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + gboolean arg_open, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayChooserDialog", + g_variant_new ("(sbss)", + arg_uri, + arg_open, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_display_chooser_dialog_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_display_chooser_dialog(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_display_chooser_dialog(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_chooser_dialog_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_chooser_dialog_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_open: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayChooserDialog">DisplayChooserDialog()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_display_chooser_dialog() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_chooser_dialog_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + gboolean arg_open, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayChooserDialog", + g_variant_new ("(sbss)", + arg_uri, + arg_open, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_folder: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolder">DisplayFolder()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_display_folder_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_display_folder_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_display_folder ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayFolder", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_display_folder_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_display_folder(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_display_folder(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_folder_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_folder_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolder">DisplayFolder()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_display_folder() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_folder_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayFolder", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_folder_and_select: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolderAndSelect">DisplayFolderAndSelect()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_display_folder_and_select_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_display_folder_and_select_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_display_folder_and_select ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayFolderAndSelect", + g_variant_new ("(ssss)", + arg_uri, + arg_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_display_folder_and_select_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_display_folder_and_select(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_display_folder_and_select(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_folder_and_select_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_folder_and_select_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolderAndSelect">DisplayFolderAndSelect()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_display_folder_and_select() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_folder_and_select_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayFolderAndSelect", + g_variant_new ("(ssss)", + arg_uri, + arg_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_file_properties: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFileProperties">DisplayFileProperties()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_display_file_properties_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_display_file_properties_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_display_file_properties ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayFileProperties", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_display_file_properties_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_display_file_properties(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_display_file_properties(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_file_properties_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_file_properties_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFileProperties">DisplayFileProperties()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_display_file_properties() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_file_properties_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayFileProperties", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_launch: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.Launch">Launch()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_launch_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_launch_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_launch ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Launch", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_launch_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_launch(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_launch(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_launch_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_launch_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.Launch">Launch()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_launch() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_launch_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Launch", + g_variant_new ("(sss)", + arg_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_execute: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_uri: Argument to pass with the method invocation. + * @arg_files: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.Execute">Execute()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_execute_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_execute_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_execute ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *arg_uri, + const gchar *const *arg_files, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Execute", + g_variant_new ("(ss^asss)", + arg_working_directory, + arg_uri, + arg_files, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_execute_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_execute(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_execute(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_execute_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_execute_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_uri: Argument to pass with the method invocation. + * @arg_files: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.Execute">Execute()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_execute() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_execute_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *arg_uri, + const gchar *const *arg_files, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Execute", + g_variant_new ("(ss^asss)", + arg_working_directory, + arg_uri, + arg_files, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_preferences_dialog: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayPreferencesDialog">DisplayPreferencesDialog()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_display_preferences_dialog_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_display_preferences_dialog_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_display_preferences_dialog ( + ThunarDBusFileManager *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayPreferencesDialog", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_display_preferences_dialog_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_display_preferences_dialog(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_display_preferences_dialog(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_preferences_dialog_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_display_preferences_dialog_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.DisplayPreferencesDialog">DisplayPreferencesDialog()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_display_preferences_dialog() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_display_preferences_dialog_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayPreferencesDialog", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_copy_to: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CopyTo">CopyTo()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_copy_to_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_copy_to_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_copy_to ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *const *arg_target_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "CopyTo", + g_variant_new ("(s^as^asss)", + arg_working_directory, + arg_source_filenames, + arg_target_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_copy_to_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_copy_to(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_copy_to(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_copy_to_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_copy_to_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CopyTo">CopyTo()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_copy_to() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_copy_to_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *const *arg_target_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "CopyTo", + g_variant_new ("(s^as^asss)", + arg_working_directory, + arg_source_filenames, + arg_target_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_copy_into: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CopyInto">CopyInto()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_copy_into_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_copy_into_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_copy_into ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "CopyInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_copy_into_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_copy_into(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_copy_into(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_copy_into_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_copy_into_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CopyInto">CopyInto()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_copy_into() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_copy_into_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "CopyInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_move_into: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.MoveInto">MoveInto()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_move_into_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_move_into_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_move_into ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "MoveInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_move_into_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_move_into(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_move_into(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_move_into_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_move_into_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.MoveInto">MoveInto()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_move_into() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_move_into_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "MoveInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_link_into: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.LinkInto">LinkInto()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_link_into_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_link_into_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_link_into ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "LinkInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_link_into_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_link_into(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_link_into(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_link_into_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_link_into_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_source_filenames: Argument to pass with the method invocation. + * @arg_target_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.LinkInto">LinkInto()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_link_into() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_link_into_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_source_filenames, + const gchar *arg_target_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "LinkInto", + g_variant_new ("(s^assss)", + arg_working_directory, + arg_source_filenames, + arg_target_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_unlink_files: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.UnlinkFiles">UnlinkFiles()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_unlink_files_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_unlink_files_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_unlink_files ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "UnlinkFiles", + g_variant_new ("(s^asss)", + arg_working_directory, + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_unlink_files_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_unlink_files(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_unlink_files(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_unlink_files_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_unlink_files_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.UnlinkFiles">UnlinkFiles()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_unlink_files() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_unlink_files_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "UnlinkFiles", + g_variant_new ("(s^asss)", + arg_working_directory, + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_launch_files: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.LaunchFiles">LaunchFiles()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_launch_files_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_launch_files_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_launch_files ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "LaunchFiles", + g_variant_new ("(s^asss)", + arg_working_directory, + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_launch_files_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_launch_files(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_launch_files(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_launch_files_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_launch_files_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.LaunchFiles">LaunchFiles()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_launch_files() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_launch_files_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "LaunchFiles", + g_variant_new ("(s^asss)", + arg_working_directory, + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_rename_file: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.RenameFile">RenameFile()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_rename_file_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_rename_file_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_rename_file ( + ThunarDBusFileManager *proxy, + const gchar *arg_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "RenameFile", + g_variant_new ("(sss)", + arg_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_rename_file_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_rename_file(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_rename_file(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_rename_file_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_rename_file_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_filename: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.RenameFile">RenameFile()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_rename_file() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_rename_file_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_filename, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "RenameFile", + g_variant_new ("(sss)", + arg_filename, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_create_file: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_parent_directory: Argument to pass with the method invocation. + * @arg_content_type: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CreateFile">CreateFile()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_create_file_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_create_file_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_create_file ( + ThunarDBusFileManager *proxy, + const gchar *arg_parent_directory, + const gchar *arg_content_type, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "CreateFile", + g_variant_new ("(ssss)", + arg_parent_directory, + arg_content_type, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_create_file_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_create_file(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_create_file(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_create_file_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_create_file_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_parent_directory: Argument to pass with the method invocation. + * @arg_content_type: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CreateFile">CreateFile()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_create_file() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_create_file_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_parent_directory, + const gchar *arg_content_type, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "CreateFile", + g_variant_new ("(ssss)", + arg_parent_directory, + arg_content_type, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_create_file_from_template: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_parent_directory: Argument to pass with the method invocation. + * @arg_template_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CreateFileFromTemplate">CreateFileFromTemplate()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_call_create_file_from_template_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_call_create_file_from_template_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_file_manager_call_create_file_from_template ( + ThunarDBusFileManager *proxy, + const gchar *arg_parent_directory, + const gchar *arg_template_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "CreateFileFromTemplate", + g_variant_new ("(ssss)", + arg_parent_directory, + arg_template_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_file_manager_call_create_file_from_template_finish: + * @proxy: A #ThunarDBusFileManagerProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_call_create_file_from_template(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_file_manager_call_create_file_from_template(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_create_file_from_template_finish ( + ThunarDBusFileManager *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_call_create_file_from_template_sync: + * @proxy: A #ThunarDBusFileManagerProxy. + * @arg_parent_directory: Argument to pass with the method invocation. + * @arg_template_uri: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-FileManager.CreateFileFromTemplate">CreateFileFromTemplate()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_call_create_file_from_template() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_file_manager_call_create_file_from_template_sync ( + ThunarDBusFileManager *proxy, + const gchar *arg_parent_directory, + const gchar *arg_template_uri, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "CreateFileFromTemplate", + g_variant_new ("(ssss)", + arg_parent_directory, + arg_template_uri, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_file_manager_complete_display_chooser_dialog: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.DisplayChooserDialog">DisplayChooserDialog()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_display_chooser_dialog ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_display_folder: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolder">DisplayFolder()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_display_folder ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_display_folder_and_select: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFolderAndSelect">DisplayFolderAndSelect()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_display_folder_and_select ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_display_file_properties: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.DisplayFileProperties">DisplayFileProperties()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_display_file_properties ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_launch: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.Launch">Launch()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_launch ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_execute: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.Execute">Execute()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_execute ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_display_preferences_dialog: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.DisplayPreferencesDialog">DisplayPreferencesDialog()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_display_preferences_dialog ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_copy_to: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.CopyTo">CopyTo()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_copy_to ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_copy_into: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.CopyInto">CopyInto()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_copy_into ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_move_into: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.MoveInto">MoveInto()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_move_into ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_link_into: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.LinkInto">LinkInto()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_link_into ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_unlink_files: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.UnlinkFiles">UnlinkFiles()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_unlink_files ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_launch_files: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.LaunchFiles">LaunchFiles()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_launch_files ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_rename_file: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.RenameFile">RenameFile()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_rename_file ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_create_file: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.CreateFile">CreateFile()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_create_file ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_file_manager_complete_create_file_from_template: + * @object: A #ThunarDBusFileManager. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-FileManager.CreateFileFromTemplate">CreateFileFromTemplate()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_file_manager_complete_create_file_from_template ( + ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusFileManagerProxy: + * + * The #ThunarDBusFileManagerProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusFileManagerProxyClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusFileManagerProxy. + */ + +struct _ThunarDBusFileManagerProxyPrivate +{ + GData *qdata; +}; + +static void thunar_dbus_file_manager_proxy_iface_init (ThunarDBusFileManagerIface *iface); + +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusFileManagerProxy, thunar_dbus_file_manager_proxy, G_TYPE_DBUS_PROXY, + G_ADD_PRIVATE (ThunarDBusFileManagerProxy) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_FILE_MANAGER, thunar_dbus_file_manager_proxy_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusFileManagerProxy, thunar_dbus_file_manager_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_FILE_MANAGER, thunar_dbus_file_manager_proxy_iface_init)); + +#endif +static void +thunar_dbus_file_manager_proxy_finalize (GObject *object) +{ + ThunarDBusFileManagerProxy *proxy = THUNAR_DBUS_FILE_MANAGER_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (thunar_dbus_file_manager_proxy_parent_class)->finalize (object); +} + +static void +thunar_dbus_file_manager_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_file_manager_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_file_manager_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], THUNAR_TYPE_DBUS_FILE_MANAGER); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_FILE_MANAGER); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +thunar_dbus_file_manager_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + ThunarDBusFileManagerProxy *proxy = THUNAR_DBUS_FILE_MANAGER_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static void +thunar_dbus_file_manager_proxy_init (ThunarDBusFileManagerProxy *proxy) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + proxy->priv = thunar_dbus_file_manager_proxy_get_instance_private (proxy); +#else + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, THUNAR_TYPE_DBUS_FILE_MANAGER_PROXY, ThunarDBusFileManagerProxyPrivate); +#endif + + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), thunar_dbus_file_manager_interface_info ()); +} + +static void +thunar_dbus_file_manager_proxy_class_init (ThunarDBusFileManagerProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_file_manager_proxy_finalize; + gobject_class->get_property = thunar_dbus_file_manager_proxy_get_property; + gobject_class->set_property = thunar_dbus_file_manager_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = thunar_dbus_file_manager_proxy_g_signal; + proxy_class->g_properties_changed = thunar_dbus_file_manager_proxy_g_properties_changed; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusFileManagerProxyPrivate)); +#endif +} + +static void +thunar_dbus_file_manager_proxy_iface_init (ThunarDBusFileManagerIface *iface) +{ +} + +/** + * thunar_dbus_file_manager_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_proxy_new_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_file_manager_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_FILE_MANAGER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.FileManager", NULL); +} + +/** + * thunar_dbus_file_manager_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_file_manager_proxy_new(). + * + * Returns: (transfer full) (type ThunarDBusFileManagerProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusFileManager * +thunar_dbus_file_manager_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_FILE_MANAGER (ret); + else + return NULL; +} + +/** + * thunar_dbus_file_manager_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusFileManagerProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusFileManager * +thunar_dbus_file_manager_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_FILE_MANAGER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.FileManager", NULL); + if (ret != NULL) + return THUNAR_DBUS_FILE_MANAGER (ret); + else + return NULL; +} + + +/** + * thunar_dbus_file_manager_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like thunar_dbus_file_manager_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_file_manager_proxy_new_for_bus_finish() to get the result of the operation. + * + * See thunar_dbus_file_manager_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_file_manager_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_FILE_MANAGER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.FileManager", NULL); +} + +/** + * thunar_dbus_file_manager_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_file_manager_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_file_manager_proxy_new_for_bus(). + * + * Returns: (transfer full) (type ThunarDBusFileManagerProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusFileManager * +thunar_dbus_file_manager_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_FILE_MANAGER (ret); + else + return NULL; +} + +/** + * thunar_dbus_file_manager_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like thunar_dbus_file_manager_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_file_manager_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusFileManagerProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusFileManager * +thunar_dbus_file_manager_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_FILE_MANAGER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.FileManager", NULL); + if (ret != NULL) + return THUNAR_DBUS_FILE_MANAGER (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusFileManagerSkeleton: + * + * The #ThunarDBusFileManagerSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusFileManagerSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusFileManagerSkeleton. + */ + +struct _ThunarDBusFileManagerSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_thunar_dbus_file_manager_skeleton_handle_method_call ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ThunarDBusFileManagerSkeleton *skeleton = THUNAR_DBUS_FILE_MANAGER_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], THUNAR_TYPE_DBUS_FILE_MANAGER); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_FILE_MANAGER); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_thunar_dbus_file_manager_skeleton_handle_get_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ThunarDBusFileManagerSkeleton *skeleton = THUNAR_DBUS_FILE_MANAGER_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_thunar_dbus_file_manager_skeleton_handle_set_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + ThunarDBusFileManagerSkeleton *skeleton = THUNAR_DBUS_FILE_MANAGER_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_file_manager_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _thunar_dbus_file_manager_skeleton_vtable = +{ + _thunar_dbus_file_manager_skeleton_handle_method_call, + _thunar_dbus_file_manager_skeleton_handle_get_property, + _thunar_dbus_file_manager_skeleton_handle_set_property, + {NULL} +}; + +static GDBusInterfaceInfo * +thunar_dbus_file_manager_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return thunar_dbus_file_manager_interface_info (); +} + +static GDBusInterfaceVTable * +thunar_dbus_file_manager_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return (GDBusInterfaceVTable *) &_thunar_dbus_file_manager_skeleton_vtable; +} + +static GVariant * +thunar_dbus_file_manager_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + ThunarDBusFileManagerSkeleton *skeleton = THUNAR_DBUS_FILE_MANAGER_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_thunar_dbus_file_manager_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _thunar_dbus_file_manager_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _thunar_dbus_file_manager_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _thunar_dbus_file_manager_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.xfce.FileManager", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static void +thunar_dbus_file_manager_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ +} + +static void thunar_dbus_file_manager_skeleton_iface_init (ThunarDBusFileManagerIface *iface); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusFileManagerSkeleton, thunar_dbus_file_manager_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_ADD_PRIVATE (ThunarDBusFileManagerSkeleton) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_FILE_MANAGER, thunar_dbus_file_manager_skeleton_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusFileManagerSkeleton, thunar_dbus_file_manager_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_FILE_MANAGER, thunar_dbus_file_manager_skeleton_iface_init)); + +#endif +static void +thunar_dbus_file_manager_skeleton_finalize (GObject *object) +{ + ThunarDBusFileManagerSkeleton *skeleton = THUNAR_DBUS_FILE_MANAGER_SKELETON (object); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (thunar_dbus_file_manager_skeleton_parent_class)->finalize (object); +} + +static void +thunar_dbus_file_manager_skeleton_init (ThunarDBusFileManagerSkeleton *skeleton) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + skeleton->priv = thunar_dbus_file_manager_skeleton_get_instance_private (skeleton); +#else + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, THUNAR_TYPE_DBUS_FILE_MANAGER_SKELETON, ThunarDBusFileManagerSkeletonPrivate); +#endif + + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); +} + +static void +thunar_dbus_file_manager_skeleton_class_init (ThunarDBusFileManagerSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_file_manager_skeleton_finalize; + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = thunar_dbus_file_manager_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = thunar_dbus_file_manager_skeleton_dbus_interface_get_properties; + skeleton_class->flush = thunar_dbus_file_manager_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = thunar_dbus_file_manager_skeleton_dbus_interface_get_vtable; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusFileManagerSkeletonPrivate)); +#endif +} + +static void +thunar_dbus_file_manager_skeleton_iface_init (ThunarDBusFileManagerIface *iface) +{ +} + +/** + * thunar_dbus_file_manager_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-xfce-FileManager.top_of_page">org.xfce.FileManager</link>. + * + * Returns: (transfer full) (type ThunarDBusFileManagerSkeleton): The skeleton object. + */ +ThunarDBusFileManager * +thunar_dbus_file_manager_skeleton_new (void) +{ + return THUNAR_DBUS_FILE_MANAGER (g_object_new (THUNAR_TYPE_DBUS_FILE_MANAGER_SKELETON, NULL)); +} + +/* ------------------------------------------------------------------------ + * Code for interface org.xfce.Trash + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:ThunarDBusTrash + * @title: ThunarDBusTrash + * @short_description: Generated C code for the org.xfce.Trash D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.xfce.Trash ---- */ + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_display_trash_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_display_trash_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_trash_method_info_display_trash_IN_ARG_pointers[] = +{ + &_thunar_dbus_trash_method_info_display_trash_IN_ARG_display, + &_thunar_dbus_trash_method_info_display_trash_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_trash_method_info_display_trash = +{ + { + -1, + (gchar *) "DisplayTrash", + (GDBusArgInfo **) &_thunar_dbus_trash_method_info_display_trash_IN_ARG_pointers, + NULL, + NULL + }, + "handle-display-trash", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_empty_trash_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_empty_trash_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_trash_method_info_empty_trash_IN_ARG_pointers[] = +{ + &_thunar_dbus_trash_method_info_empty_trash_IN_ARG_display, + &_thunar_dbus_trash_method_info_empty_trash_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_trash_method_info_empty_trash = +{ + { + -1, + (gchar *) "EmptyTrash", + (GDBusArgInfo **) &_thunar_dbus_trash_method_info_empty_trash_IN_ARG_pointers, + NULL, + NULL + }, + "handle-empty-trash", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_move_to_trash_IN_ARG_filenames = +{ + { + -1, + (gchar *) "filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_move_to_trash_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_move_to_trash_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_trash_method_info_move_to_trash_IN_ARG_pointers[] = +{ + &_thunar_dbus_trash_method_info_move_to_trash_IN_ARG_filenames, + &_thunar_dbus_trash_method_info_move_to_trash_IN_ARG_display, + &_thunar_dbus_trash_method_info_move_to_trash_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_trash_method_info_move_to_trash = +{ + { + -1, + (gchar *) "MoveToTrash", + (GDBusArgInfo **) &_thunar_dbus_trash_method_info_move_to_trash_IN_ARG_pointers, + NULL, + NULL + }, + "handle-move-to-trash", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_trash_method_info_query_trash_OUT_ARG_full = +{ + { + -1, + (gchar *) "full", + (gchar *) "b", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_trash_method_info_query_trash_OUT_ARG_pointers[] = +{ + &_thunar_dbus_trash_method_info_query_trash_OUT_ARG_full, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_trash_method_info_query_trash = +{ + { + -1, + (gchar *) "QueryTrash", + NULL, + (GDBusArgInfo **) &_thunar_dbus_trash_method_info_query_trash_OUT_ARG_pointers, + NULL + }, + "handle-query-trash", + FALSE +}; + +static const _ExtendedGDBusMethodInfo * const _thunar_dbus_trash_method_info_pointers[] = +{ + &_thunar_dbus_trash_method_info_display_trash, + &_thunar_dbus_trash_method_info_empty_trash, + &_thunar_dbus_trash_method_info_move_to_trash, + &_thunar_dbus_trash_method_info_query_trash, + NULL +}; + +static const _ExtendedGDBusSignalInfo _thunar_dbus_trash_signal_info_trash_changed = +{ + { + -1, + (gchar *) "TrashChanged", + NULL, + NULL + }, + "trash-changed" +}; + +static const _ExtendedGDBusSignalInfo * const _thunar_dbus_trash_signal_info_pointers[] = +{ + &_thunar_dbus_trash_signal_info_trash_changed, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _thunar_dbus_trash_interface_info = +{ + { + -1, + (gchar *) "org.xfce.Trash", + (GDBusMethodInfo **) &_thunar_dbus_trash_method_info_pointers, + (GDBusSignalInfo **) &_thunar_dbus_trash_signal_info_pointers, + NULL, + NULL + }, + "dbus-trash", +}; + + +/** + * thunar_dbus_trash_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +thunar_dbus_trash_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct; +} + +/** + * thunar_dbus_trash_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #ThunarDBusTrash interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +thunar_dbus_trash_override_properties (GObjectClass *klass, guint property_id_begin) +{ + return property_id_begin - 1; +} + + + +/** + * ThunarDBusTrash: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link>. + */ + +/** + * ThunarDBusTrashIface: + * @parent_iface: The parent interface. + * @handle_display_trash: Handler for the #ThunarDBusTrash::handle-display-trash signal. + * @handle_empty_trash: Handler for the #ThunarDBusTrash::handle-empty-trash signal. + * @handle_move_to_trash: Handler for the #ThunarDBusTrash::handle-move-to-trash signal. + * @handle_query_trash: Handler for the #ThunarDBusTrash::handle-query-trash signal. + * @trash_changed: Handler for the #ThunarDBusTrash::trash-changed signal. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link>. + */ + +typedef ThunarDBusTrashIface ThunarDBusTrashInterface; +G_DEFINE_INTERFACE (ThunarDBusTrash, thunar_dbus_trash, G_TYPE_OBJECT); + +static void +thunar_dbus_trash_default_init (ThunarDBusTrashIface *iface) +{ + /* GObject signals for incoming D-Bus method calls: */ + /** + * ThunarDBusTrash::handle-display-trash: + * @object: A #ThunarDBusTrash. + * @invocation: A #GDBusMethodInvocation. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Trash.DisplayTrash">DisplayTrash()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_trash_complete_display_trash() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-display-trash", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusTrashIface, handle_display_trash), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusTrash::handle-empty-trash: + * @object: A #ThunarDBusTrash. + * @invocation: A #GDBusMethodInvocation. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Trash.EmptyTrash">EmptyTrash()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_trash_complete_empty_trash() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-empty-trash", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusTrashIface, handle_empty_trash), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusTrash::handle-move-to-trash: + * @object: A #ThunarDBusTrash. + * @invocation: A #GDBusMethodInvocation. + * @arg_filenames: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Trash.MoveToTrash">MoveToTrash()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_trash_complete_move_to_trash() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-move-to-trash", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusTrashIface, handle_move_to_trash), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusTrash::handle-query-trash: + * @object: A #ThunarDBusTrash. + * @invocation: A #GDBusMethodInvocation. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Trash.QueryTrash">QueryTrash()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_trash_complete_query_trash() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-query-trash", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusTrashIface, handle_query_trash), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_METHOD_INVOCATION); + + /* GObject signals for received D-Bus signals: */ + /** + * ThunarDBusTrash::trash-changed: + * @object: A #ThunarDBusTrash. + * + * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-xfce-Trash.TrashChanged">"TrashChanged"</link> is received. + * + * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. + */ + g_signal_new ("trash-changed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusTrashIface, trash_changed), + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 0); + +} + +/** + * thunar_dbus_trash_emit_trash_changed: + * @object: A #ThunarDBusTrash. + * + * Emits the <link linkend="gdbus-signal-org-xfce-Trash.TrashChanged">"TrashChanged"</link> D-Bus signal. + */ +void +thunar_dbus_trash_emit_trash_changed ( + ThunarDBusTrash *object) +{ + g_signal_emit_by_name (object, "trash-changed"); +} + +/** + * thunar_dbus_trash_call_display_trash: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.DisplayTrash">DisplayTrash()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_call_display_trash_finish() to get the result of the operation. + * + * See thunar_dbus_trash_call_display_trash_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_trash_call_display_trash ( + ThunarDBusTrash *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "DisplayTrash", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_trash_call_display_trash_finish: + * @proxy: A #ThunarDBusTrashProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_call_display_trash(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_trash_call_display_trash(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_display_trash_finish ( + ThunarDBusTrash *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_display_trash_sync: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.DisplayTrash">DisplayTrash()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_call_display_trash() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_display_trash_sync ( + ThunarDBusTrash *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "DisplayTrash", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_empty_trash: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.EmptyTrash">EmptyTrash()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_call_empty_trash_finish() to get the result of the operation. + * + * See thunar_dbus_trash_call_empty_trash_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_trash_call_empty_trash ( + ThunarDBusTrash *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "EmptyTrash", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_trash_call_empty_trash_finish: + * @proxy: A #ThunarDBusTrashProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_call_empty_trash(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_trash_call_empty_trash(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_empty_trash_finish ( + ThunarDBusTrash *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_empty_trash_sync: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.EmptyTrash">EmptyTrash()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_call_empty_trash() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_empty_trash_sync ( + ThunarDBusTrash *proxy, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "EmptyTrash", + g_variant_new ("(ss)", + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_move_to_trash: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.MoveToTrash">MoveToTrash()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_call_move_to_trash_finish() to get the result of the operation. + * + * See thunar_dbus_trash_call_move_to_trash_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_trash_call_move_to_trash ( + ThunarDBusTrash *proxy, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "MoveToTrash", + g_variant_new ("(^asss)", + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_trash_call_move_to_trash_finish: + * @proxy: A #ThunarDBusTrashProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_call_move_to_trash(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_trash_call_move_to_trash(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_move_to_trash_finish ( + ThunarDBusTrash *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_move_to_trash_sync: + * @proxy: A #ThunarDBusTrashProxy. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.MoveToTrash">MoveToTrash()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_call_move_to_trash() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_move_to_trash_sync ( + ThunarDBusTrash *proxy, + const gchar *const *arg_filenames, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "MoveToTrash", + g_variant_new ("(^asss)", + arg_filenames, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_query_trash: + * @proxy: A #ThunarDBusTrashProxy. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.QueryTrash">QueryTrash()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_call_query_trash_finish() to get the result of the operation. + * + * See thunar_dbus_trash_call_query_trash_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_trash_call_query_trash ( + ThunarDBusTrash *proxy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "QueryTrash", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_trash_call_query_trash_finish: + * @proxy: A #ThunarDBusTrashProxy. + * @out_full: (out): Return location for return parameter or %NULL to ignore. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_call_query_trash(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_trash_call_query_trash(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_query_trash_finish ( + ThunarDBusTrash *proxy, + gboolean *out_full, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(b)", + out_full); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_call_query_trash_sync: + * @proxy: A #ThunarDBusTrashProxy. + * @out_full: (out): Return location for return parameter or %NULL to ignore. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Trash.QueryTrash">QueryTrash()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_call_query_trash() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_trash_call_query_trash_sync ( + ThunarDBusTrash *proxy, + gboolean *out_full, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "QueryTrash", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(b)", + out_full); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_trash_complete_display_trash: + * @object: A #ThunarDBusTrash. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Trash.DisplayTrash">DisplayTrash()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_trash_complete_display_trash ( + ThunarDBusTrash *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_trash_complete_empty_trash: + * @object: A #ThunarDBusTrash. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Trash.EmptyTrash">EmptyTrash()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_trash_complete_empty_trash ( + ThunarDBusTrash *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_trash_complete_move_to_trash: + * @object: A #ThunarDBusTrash. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Trash.MoveToTrash">MoveToTrash()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_trash_complete_move_to_trash ( + ThunarDBusTrash *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_trash_complete_query_trash: + * @object: A #ThunarDBusTrash. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @full: Parameter to return. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Trash.QueryTrash">QueryTrash()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_trash_complete_query_trash ( + ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + gboolean full) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(b)", + full)); +} + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusTrashProxy: + * + * The #ThunarDBusTrashProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusTrashProxyClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusTrashProxy. + */ + +struct _ThunarDBusTrashProxyPrivate +{ + GData *qdata; +}; + +static void thunar_dbus_trash_proxy_iface_init (ThunarDBusTrashIface *iface); + +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusTrashProxy, thunar_dbus_trash_proxy, G_TYPE_DBUS_PROXY, + G_ADD_PRIVATE (ThunarDBusTrashProxy) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_TRASH, thunar_dbus_trash_proxy_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusTrashProxy, thunar_dbus_trash_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_TRASH, thunar_dbus_trash_proxy_iface_init)); + +#endif +static void +thunar_dbus_trash_proxy_finalize (GObject *object) +{ + ThunarDBusTrashProxy *proxy = THUNAR_DBUS_TRASH_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (thunar_dbus_trash_proxy_parent_class)->finalize (object); +} + +static void +thunar_dbus_trash_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_trash_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_trash_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], THUNAR_TYPE_DBUS_TRASH); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_TRASH); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +thunar_dbus_trash_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + ThunarDBusTrashProxy *proxy = THUNAR_DBUS_TRASH_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static void +thunar_dbus_trash_proxy_init (ThunarDBusTrashProxy *proxy) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + proxy->priv = thunar_dbus_trash_proxy_get_instance_private (proxy); +#else + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, THUNAR_TYPE_DBUS_TRASH_PROXY, ThunarDBusTrashProxyPrivate); +#endif + + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), thunar_dbus_trash_interface_info ()); +} + +static void +thunar_dbus_trash_proxy_class_init (ThunarDBusTrashProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_trash_proxy_finalize; + gobject_class->get_property = thunar_dbus_trash_proxy_get_property; + gobject_class->set_property = thunar_dbus_trash_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = thunar_dbus_trash_proxy_g_signal; + proxy_class->g_properties_changed = thunar_dbus_trash_proxy_g_properties_changed; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusTrashProxyPrivate)); +#endif +} + +static void +thunar_dbus_trash_proxy_iface_init (ThunarDBusTrashIface *iface) +{ +} + +/** + * thunar_dbus_trash_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_proxy_new_finish() to get the result of the operation. + * + * See thunar_dbus_trash_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_trash_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_TRASH_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.Trash", NULL); +} + +/** + * thunar_dbus_trash_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_trash_proxy_new(). + * + * Returns: (transfer full) (type ThunarDBusTrashProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusTrash * +thunar_dbus_trash_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_TRASH (ret); + else + return NULL; +} + +/** + * thunar_dbus_trash_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusTrashProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusTrash * +thunar_dbus_trash_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_TRASH_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.Trash", NULL); + if (ret != NULL) + return THUNAR_DBUS_TRASH (ret); + else + return NULL; +} + + +/** + * thunar_dbus_trash_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like thunar_dbus_trash_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_trash_proxy_new_for_bus_finish() to get the result of the operation. + * + * See thunar_dbus_trash_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_trash_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_TRASH_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.Trash", NULL); +} + +/** + * thunar_dbus_trash_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_trash_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_trash_proxy_new_for_bus(). + * + * Returns: (transfer full) (type ThunarDBusTrashProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusTrash * +thunar_dbus_trash_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_TRASH (ret); + else + return NULL; +} + +/** + * thunar_dbus_trash_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like thunar_dbus_trash_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_trash_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusTrashProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusTrash * +thunar_dbus_trash_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_TRASH_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.Trash", NULL); + if (ret != NULL) + return THUNAR_DBUS_TRASH (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusTrashSkeleton: + * + * The #ThunarDBusTrashSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusTrashSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusTrashSkeleton. + */ + +struct _ThunarDBusTrashSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_thunar_dbus_trash_skeleton_handle_method_call ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], THUNAR_TYPE_DBUS_TRASH); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_TRASH); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_thunar_dbus_trash_skeleton_handle_get_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_thunar_dbus_trash_skeleton_handle_set_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_trash_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _thunar_dbus_trash_skeleton_vtable = +{ + _thunar_dbus_trash_skeleton_handle_method_call, + _thunar_dbus_trash_skeleton_handle_get_property, + _thunar_dbus_trash_skeleton_handle_set_property, + {NULL} +}; + +static GDBusInterfaceInfo * +thunar_dbus_trash_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return thunar_dbus_trash_interface_info (); +} + +static GDBusInterfaceVTable * +thunar_dbus_trash_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return (GDBusInterfaceVTable *) &_thunar_dbus_trash_skeleton_vtable; +} + +static GVariant * +thunar_dbus_trash_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_thunar_dbus_trash_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _thunar_dbus_trash_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _thunar_dbus_trash_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _thunar_dbus_trash_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.xfce.Trash", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static void +thunar_dbus_trash_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ +} + +static void +_thunar_dbus_trash_on_signal_trash_changed ( + ThunarDBusTrash *object) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (object); + + GList *connections, *l; + GVariant *signal_variant; + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + + signal_variant = g_variant_ref_sink (g_variant_new ("()")); + for (l = connections; l != NULL; l = l->next) + { + GDBusConnection *connection = l->data; + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.xfce.Trash", "TrashChanged", + signal_variant, NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); +} + +static void thunar_dbus_trash_skeleton_iface_init (ThunarDBusTrashIface *iface); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusTrashSkeleton, thunar_dbus_trash_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_ADD_PRIVATE (ThunarDBusTrashSkeleton) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_TRASH, thunar_dbus_trash_skeleton_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusTrashSkeleton, thunar_dbus_trash_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_TRASH, thunar_dbus_trash_skeleton_iface_init)); + +#endif +static void +thunar_dbus_trash_skeleton_finalize (GObject *object) +{ + ThunarDBusTrashSkeleton *skeleton = THUNAR_DBUS_TRASH_SKELETON (object); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (thunar_dbus_trash_skeleton_parent_class)->finalize (object); +} + +static void +thunar_dbus_trash_skeleton_init (ThunarDBusTrashSkeleton *skeleton) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + skeleton->priv = thunar_dbus_trash_skeleton_get_instance_private (skeleton); +#else + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, THUNAR_TYPE_DBUS_TRASH_SKELETON, ThunarDBusTrashSkeletonPrivate); +#endif + + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); +} + +static void +thunar_dbus_trash_skeleton_class_init (ThunarDBusTrashSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_trash_skeleton_finalize; + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = thunar_dbus_trash_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = thunar_dbus_trash_skeleton_dbus_interface_get_properties; + skeleton_class->flush = thunar_dbus_trash_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = thunar_dbus_trash_skeleton_dbus_interface_get_vtable; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusTrashSkeletonPrivate)); +#endif +} + +static void +thunar_dbus_trash_skeleton_iface_init (ThunarDBusTrashIface *iface) +{ + iface->trash_changed = _thunar_dbus_trash_on_signal_trash_changed; +} + +/** + * thunar_dbus_trash_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Trash.top_of_page">org.xfce.Trash</link>. + * + * Returns: (transfer full) (type ThunarDBusTrashSkeleton): The skeleton object. + */ +ThunarDBusTrash * +thunar_dbus_trash_skeleton_new (void) +{ + return THUNAR_DBUS_TRASH (g_object_new (THUNAR_TYPE_DBUS_TRASH_SKELETON, NULL)); +} + +/* ------------------------------------------------------------------------ + * Code for interface org.xfce.Thunar + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:ThunarDBusThunar + * @title: ThunarDBusThunar + * @short_description: Generated C code for the org.xfce.Thunar D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.xfce.Thunar ---- */ + +static const _ExtendedGDBusArgInfo _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_working_directory = +{ + { + -1, + (gchar *) "working_directory", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_filenames = +{ + { + -1, + (gchar *) "filenames", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_standalone = +{ + { + -1, + (gchar *) "standalone", + (gchar *) "b", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_display = +{ + { + -1, + (gchar *) "display", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_startup_id = +{ + { + -1, + (gchar *) "startup_id", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_pointers[] = +{ + &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_working_directory, + &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_filenames, + &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_standalone, + &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_display, + &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_startup_id, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_thunar_method_info_bulk_rename = +{ + { + -1, + (gchar *) "BulkRename", + (GDBusArgInfo **) &_thunar_dbus_thunar_method_info_bulk_rename_IN_ARG_pointers, + NULL, + NULL + }, + "handle-bulk-rename", + FALSE +}; + +static const _ExtendedGDBusMethodInfo _thunar_dbus_thunar_method_info_terminate = +{ + { + -1, + (gchar *) "Terminate", + NULL, + NULL, + NULL + }, + "handle-terminate", + FALSE +}; + +static const _ExtendedGDBusMethodInfo * const _thunar_dbus_thunar_method_info_pointers[] = +{ + &_thunar_dbus_thunar_method_info_bulk_rename, + &_thunar_dbus_thunar_method_info_terminate, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _thunar_dbus_thunar_interface_info = +{ + { + -1, + (gchar *) "org.xfce.Thunar", + (GDBusMethodInfo **) &_thunar_dbus_thunar_method_info_pointers, + NULL, + NULL, + NULL + }, + "dbus-thunar", +}; + + +/** + * thunar_dbus_thunar_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +thunar_dbus_thunar_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct; +} + +/** + * thunar_dbus_thunar_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #ThunarDBusThunar interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +thunar_dbus_thunar_override_properties (GObjectClass *klass, guint property_id_begin) +{ + return property_id_begin - 1; +} + + + +/** + * ThunarDBusThunar: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link>. + */ + +/** + * ThunarDBusThunarIface: + * @parent_iface: The parent interface. + * @handle_bulk_rename: Handler for the #ThunarDBusThunar::handle-bulk-rename signal. + * @handle_terminate: Handler for the #ThunarDBusThunar::handle-terminate signal. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link>. + */ + +typedef ThunarDBusThunarIface ThunarDBusThunarInterface; +G_DEFINE_INTERFACE (ThunarDBusThunar, thunar_dbus_thunar, G_TYPE_OBJECT); + +static void +thunar_dbus_thunar_default_init (ThunarDBusThunarIface *iface) +{ + /* GObject signals for incoming D-Bus method calls: */ + /** + * ThunarDBusThunar::handle-bulk-rename: + * @object: A #ThunarDBusThunar. + * @invocation: A #GDBusMethodInvocation. + * @arg_working_directory: Argument passed by remote caller. + * @arg_filenames: Argument passed by remote caller. + * @arg_standalone: Argument passed by remote caller. + * @arg_display: Argument passed by remote caller. + * @arg_startup_id: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Thunar.BulkRename">BulkRename()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_thunar_complete_bulk_rename() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-bulk-rename", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusThunarIface, handle_bulk_rename), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING); + + /** + * ThunarDBusThunar::handle-terminate: + * @object: A #ThunarDBusThunar. + * @invocation: A #GDBusMethodInvocation. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-xfce-Thunar.Terminate">Terminate()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_dbus_thunar_complete_terminate() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-terminate", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarDBusThunarIface, handle_terminate), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_METHOD_INVOCATION); + +} + +/** + * thunar_dbus_thunar_call_bulk_rename: + * @proxy: A #ThunarDBusThunarProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_standalone: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Thunar.BulkRename">BulkRename()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_thunar_call_bulk_rename_finish() to get the result of the operation. + * + * See thunar_dbus_thunar_call_bulk_rename_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_thunar_call_bulk_rename ( + ThunarDBusThunar *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + gboolean arg_standalone, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "BulkRename", + g_variant_new ("(s^asbss)", + arg_working_directory, + arg_filenames, + arg_standalone, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_thunar_call_bulk_rename_finish: + * @proxy: A #ThunarDBusThunarProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_thunar_call_bulk_rename(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_thunar_call_bulk_rename(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_thunar_call_bulk_rename_finish ( + ThunarDBusThunar *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_thunar_call_bulk_rename_sync: + * @proxy: A #ThunarDBusThunarProxy. + * @arg_working_directory: Argument to pass with the method invocation. + * @arg_filenames: Argument to pass with the method invocation. + * @arg_standalone: Argument to pass with the method invocation. + * @arg_display: Argument to pass with the method invocation. + * @arg_startup_id: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Thunar.BulkRename">BulkRename()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_thunar_call_bulk_rename() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_thunar_call_bulk_rename_sync ( + ThunarDBusThunar *proxy, + const gchar *arg_working_directory, + const gchar *const *arg_filenames, + gboolean arg_standalone, + const gchar *arg_display, + const gchar *arg_startup_id, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "BulkRename", + g_variant_new ("(s^asbss)", + arg_working_directory, + arg_filenames, + arg_standalone, + arg_display, + arg_startup_id), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_thunar_call_terminate: + * @proxy: A #ThunarDBusThunarProxy. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-xfce-Thunar.Terminate">Terminate()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_thunar_call_terminate_finish() to get the result of the operation. + * + * See thunar_dbus_thunar_call_terminate_sync() for the synchronous, blocking version of this method. + */ +void +thunar_dbus_thunar_call_terminate ( + ThunarDBusThunar *proxy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Terminate", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_dbus_thunar_call_terminate_finish: + * @proxy: A #ThunarDBusThunarProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_thunar_call_terminate(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_dbus_thunar_call_terminate(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_thunar_call_terminate_finish ( + ThunarDBusThunar *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_thunar_call_terminate_sync: + * @proxy: A #ThunarDBusThunarProxy. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-xfce-Thunar.Terminate">Terminate()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_dbus_thunar_call_terminate() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_dbus_thunar_call_terminate_sync ( + ThunarDBusThunar *proxy, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Terminate", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_dbus_thunar_complete_bulk_rename: + * @object: A #ThunarDBusThunar. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Thunar.BulkRename">BulkRename()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_thunar_complete_bulk_rename ( + ThunarDBusThunar *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_dbus_thunar_complete_terminate: + * @object: A #ThunarDBusThunar. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-xfce-Thunar.Terminate">Terminate()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_dbus_thunar_complete_terminate ( + ThunarDBusThunar *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusThunarProxy: + * + * The #ThunarDBusThunarProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusThunarProxyClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusThunarProxy. + */ + +struct _ThunarDBusThunarProxyPrivate +{ + GData *qdata; +}; + +static void thunar_dbus_thunar_proxy_iface_init (ThunarDBusThunarIface *iface); + +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusThunarProxy, thunar_dbus_thunar_proxy, G_TYPE_DBUS_PROXY, + G_ADD_PRIVATE (ThunarDBusThunarProxy) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_THUNAR, thunar_dbus_thunar_proxy_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusThunarProxy, thunar_dbus_thunar_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_THUNAR, thunar_dbus_thunar_proxy_iface_init)); + +#endif +static void +thunar_dbus_thunar_proxy_finalize (GObject *object) +{ + ThunarDBusThunarProxy *proxy = THUNAR_DBUS_THUNAR_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (thunar_dbus_thunar_proxy_parent_class)->finalize (object); +} + +static void +thunar_dbus_thunar_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_thunar_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_dbus_thunar_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], THUNAR_TYPE_DBUS_THUNAR); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_THUNAR); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +thunar_dbus_thunar_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + ThunarDBusThunarProxy *proxy = THUNAR_DBUS_THUNAR_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static void +thunar_dbus_thunar_proxy_init (ThunarDBusThunarProxy *proxy) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + proxy->priv = thunar_dbus_thunar_proxy_get_instance_private (proxy); +#else + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, THUNAR_TYPE_DBUS_THUNAR_PROXY, ThunarDBusThunarProxyPrivate); +#endif + + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), thunar_dbus_thunar_interface_info ()); +} + +static void +thunar_dbus_thunar_proxy_class_init (ThunarDBusThunarProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_thunar_proxy_finalize; + gobject_class->get_property = thunar_dbus_thunar_proxy_get_property; + gobject_class->set_property = thunar_dbus_thunar_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = thunar_dbus_thunar_proxy_g_signal; + proxy_class->g_properties_changed = thunar_dbus_thunar_proxy_g_properties_changed; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusThunarProxyPrivate)); +#endif +} + +static void +thunar_dbus_thunar_proxy_iface_init (ThunarDBusThunarIface *iface) +{ +} + +/** + * thunar_dbus_thunar_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_thunar_proxy_new_finish() to get the result of the operation. + * + * See thunar_dbus_thunar_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_thunar_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_THUNAR_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.Thunar", NULL); +} + +/** + * thunar_dbus_thunar_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_thunar_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_thunar_proxy_new(). + * + * Returns: (transfer full) (type ThunarDBusThunarProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusThunar * +thunar_dbus_thunar_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_THUNAR (ret); + else + return NULL; +} + +/** + * thunar_dbus_thunar_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_thunar_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusThunarProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusThunar * +thunar_dbus_thunar_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_THUNAR_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.xfce.Thunar", NULL); + if (ret != NULL) + return THUNAR_DBUS_THUNAR (ret); + else + return NULL; +} + + +/** + * thunar_dbus_thunar_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like thunar_dbus_thunar_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_dbus_thunar_proxy_new_for_bus_finish() to get the result of the operation. + * + * See thunar_dbus_thunar_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_dbus_thunar_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_DBUS_THUNAR_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.Thunar", NULL); +} + +/** + * thunar_dbus_thunar_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_dbus_thunar_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_dbus_thunar_proxy_new_for_bus(). + * + * Returns: (transfer full) (type ThunarDBusThunarProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusThunar * +thunar_dbus_thunar_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_DBUS_THUNAR (ret); + else + return NULL; +} + +/** + * thunar_dbus_thunar_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like thunar_dbus_thunar_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_dbus_thunar_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarDBusThunarProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarDBusThunar * +thunar_dbus_thunar_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_DBUS_THUNAR_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.xfce.Thunar", NULL); + if (ret != NULL) + return THUNAR_DBUS_THUNAR (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarDBusThunarSkeleton: + * + * The #ThunarDBusThunarSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarDBusThunarSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarDBusThunarSkeleton. + */ + +struct _ThunarDBusThunarSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_thunar_dbus_thunar_skeleton_handle_method_call ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ThunarDBusThunarSkeleton *skeleton = THUNAR_DBUS_THUNAR_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], THUNAR_TYPE_DBUS_THUNAR); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_DBUS_THUNAR); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_thunar_dbus_thunar_skeleton_handle_get_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ThunarDBusThunarSkeleton *skeleton = THUNAR_DBUS_THUNAR_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_thunar_dbus_thunar_skeleton_handle_set_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + ThunarDBusThunarSkeleton *skeleton = THUNAR_DBUS_THUNAR_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_dbus_thunar_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _thunar_dbus_thunar_skeleton_vtable = +{ + _thunar_dbus_thunar_skeleton_handle_method_call, + _thunar_dbus_thunar_skeleton_handle_get_property, + _thunar_dbus_thunar_skeleton_handle_set_property, + {NULL} +}; + +static GDBusInterfaceInfo * +thunar_dbus_thunar_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return thunar_dbus_thunar_interface_info (); +} + +static GDBusInterfaceVTable * +thunar_dbus_thunar_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return (GDBusInterfaceVTable *) &_thunar_dbus_thunar_skeleton_vtable; +} + +static GVariant * +thunar_dbus_thunar_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + ThunarDBusThunarSkeleton *skeleton = THUNAR_DBUS_THUNAR_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_thunar_dbus_thunar_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _thunar_dbus_thunar_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _thunar_dbus_thunar_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _thunar_dbus_thunar_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.xfce.Thunar", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static void +thunar_dbus_thunar_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ +} + +static void thunar_dbus_thunar_skeleton_iface_init (ThunarDBusThunarIface *iface); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarDBusThunarSkeleton, thunar_dbus_thunar_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_ADD_PRIVATE (ThunarDBusThunarSkeleton) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_THUNAR, thunar_dbus_thunar_skeleton_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarDBusThunarSkeleton, thunar_dbus_thunar_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_DBUS_THUNAR, thunar_dbus_thunar_skeleton_iface_init)); + +#endif +static void +thunar_dbus_thunar_skeleton_finalize (GObject *object) +{ + ThunarDBusThunarSkeleton *skeleton = THUNAR_DBUS_THUNAR_SKELETON (object); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (thunar_dbus_thunar_skeleton_parent_class)->finalize (object); +} + +static void +thunar_dbus_thunar_skeleton_init (ThunarDBusThunarSkeleton *skeleton) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + skeleton->priv = thunar_dbus_thunar_skeleton_get_instance_private (skeleton); +#else + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, THUNAR_TYPE_DBUS_THUNAR_SKELETON, ThunarDBusThunarSkeletonPrivate); +#endif + + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); +} + +static void +thunar_dbus_thunar_skeleton_class_init (ThunarDBusThunarSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_dbus_thunar_skeleton_finalize; + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = thunar_dbus_thunar_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = thunar_dbus_thunar_skeleton_dbus_interface_get_properties; + skeleton_class->flush = thunar_dbus_thunar_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = thunar_dbus_thunar_skeleton_dbus_interface_get_vtable; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarDBusThunarSkeletonPrivate)); +#endif +} + +static void +thunar_dbus_thunar_skeleton_iface_init (ThunarDBusThunarIface *iface) +{ +} + +/** + * thunar_dbus_thunar_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-xfce-Thunar.top_of_page">org.xfce.Thunar</link>. + * + * Returns: (transfer full) (type ThunarDBusThunarSkeleton): The skeleton object. + */ +ThunarDBusThunar * +thunar_dbus_thunar_skeleton_new (void) +{ + return THUNAR_DBUS_THUNAR (g_object_new (THUNAR_TYPE_DBUS_THUNAR_SKELETON, NULL)); +} + diff --git a/thunar/thunar-dbus-service-infos.xml b/thunar/thunar-dbus-service-infos.xml index 354a8ede1a8b9ac43557ccf3a58dd74154368d43..614d4eb0f9cdaffc31dd359f4c588749c57c78f8 100644 --- a/thunar/thunar-dbus-service-infos.xml +++ b/thunar/thunar-dbus-service-infos.xml @@ -26,7 +26,7 @@ File Managers. --> <interface name="org.xfce.FileManager"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="thunar_dbus_service" /> + <annotation name="org.gtk.GDBus.C.Name" value="DBusFileManager" /> <!-- DisplayChooserDialog (uri : STRING, open : BOOLEAN, display : STRING, startup_id : STRING) : VOID @@ -350,7 +350,7 @@ Managers that support a trash bin. --> <interface name="org.xfce.Trash"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="thunar_dbus_service" /> + <annotation name="org.gtk.GDBus.C.Name" value="DBusTrash" /> <!-- DisplayTrash (display : STRING, startup_id : STRING) : VOID @@ -441,7 +441,7 @@ do not use this interface, but use org.xfce.FileManager instead. --> <interface name="org.xfce.Thunar"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="thunar_dbus_service" /> + <annotation name="org.gtk.GDBus.C.Name" value="DBusThunar" /> <!-- BulkRename (working_directory : STRING, filenames : ARRAY OF STRING, standalone : BOOLEAN, display : STRING, startup_id : STRING) : VOID diff --git a/thunar/thunar-dbus-service.c b/thunar/thunar-dbus-service.c index baf0bb79a355c646b5a5b9e628123f662cd8b66e..5bf5336b232ec1cc688a788a88a39f87ed8814cb 100644 --- a/thunar/thunar-dbus-service.c +++ b/thunar/thunar-dbus-service.c @@ -30,10 +30,6 @@ #include <string.h> #endif -#include <dbus/dbus-glib-lowlevel.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus.h> - #include <glib/gstdio.h> #include <exo/exo.h> @@ -49,6 +45,12 @@ #include <thunar/thunar-util.h> + +/* include generate dbus infos */ +#include <thunar/thunar-dbus-service-infos.h> + + + typedef enum { THUNAR_DBUS_TRANSFER_MODE_COPY_TO, @@ -76,131 +78,147 @@ static gboolean thunar_dbus_service_transfer_files (ThunarDBusTrans GError **error); static void thunar_dbus_service_trash_bin_changed (ThunarDBusService *dbus_service, ThunarFile *trash_bin); -static gboolean thunar_dbus_service_display_chooser_dialog (ThunarDBusService *dbus_service, +static gboolean thunar_dbus_service_display_chooser_dialog (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, gboolean open, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_display_folder (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_display_folder (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_display_folder_and_select (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_display_folder_and_select (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, const gchar *filename, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_display_file_properties (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_display_file_properties (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_launch (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_launch (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_execute (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_execute (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, const gchar *uri, const gchar **files, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_display_preferences_dialog (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_display_preferences_dialog (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_display_trash (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_display_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_empty_trash (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_empty_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_move_to_trash (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_move_to_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, gchar **filenames, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_query_trash (ThunarDBusService *dbus_service, - gboolean *empty, - GError **error); -static gboolean thunar_dbus_service_bulk_rename (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_query_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_bulk_rename (ThunarDBusThunar *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **filenames, gboolean standalone, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_launch_files (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_launch_files (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **filenames, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_rename_file (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_rename_file (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *uri, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_create_file (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_create_file (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *parent_directory, const gchar *content_type, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_create_file_from_template (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_create_file_from_template (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *parent_directory, const gchar *template_uri, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_copy_to (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_copy_to (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **source_filenames, gchar **target_filenames, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_copy_into (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_copy_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **source_filenames, const gchar *target_filename, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_move_into (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_move_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **source_filenames, const gchar *target_filenames, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_link_into (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_link_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **source_filenames, const gchar *target_filename, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_unlink_files (ThunarDBusService *dbus_service, + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_unlink_files (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, const gchar *working_directory, gchar **filenames, const gchar *display, const gchar *startup_id, - GError **error); -static gboolean thunar_dbus_service_terminate (ThunarDBusService *dbus_service, - GError **error); - - - -/* include generate dbus infos */ -#include <thunar/thunar-dbus-service-infos.h> + ThunarDBusService *dbus_service); +static gboolean thunar_dbus_service_terminate (ThunarDBusThunar *object, + GDBusMethodInvocation *invocation, + ThunarDBusService *dbus_service); @@ -213,7 +231,10 @@ struct _ThunarDBusService { GObject __parent__; - DBusGConnection *connection; + ThunarDBusFileManager *file_manager; + ThunarDBusTrash *trash; + ThunarDBusThunar *thunar; + ThunarFile *trash_bin; }; @@ -230,75 +251,70 @@ thunar_dbus_service_class_init (ThunarDBusServiceClass *klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = thunar_dbus_service_finalize; - - /* install the D-BUS info for our class */ - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), - &dbus_glib_thunar_dbus_service_object_info); - - /** - * ThunarDBusService::trash-changed: - * @dbus_service : a #ThunarDBusService. - * @full : %TRUE if the trash bin now contains at least - * one item, %FALSE otherwise. - * - * This signal is emitted whenever the state of the trash bin - * changes. Note that this signal is only emitted after the - * trash has previously been queried by a D-BUS client. - **/ - g_signal_new (I_("trash-changed"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN); } -static void -thunar_dbus_service_init (ThunarDBusService *dbus_service) +static void connect_signals_multiple (gpointer object, + gpointer data, + ...) { - GError *error = NULL; - DBusConnection *dbus_connection; - gint result; + va_list ap; - /* try to connect to the session bus */ - dbus_service->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - if (G_LIKELY (dbus_service->connection != NULL)) - { - /* register the /org/xfce/FileManager object for Thunar */ - dbus_g_connection_register_g_object (dbus_service->connection, "/org/xfce/FileManager", G_OBJECT (dbus_service)); + const char *signal; + gpointer *handler; - /* request the org.xfce.Thunar name for Thunar */ - dbus_connection = dbus_g_connection_get_connection (dbus_service->connection); - result = dbus_bus_request_name (dbus_connection, "org.xfce.Thunar", - DBUS_NAME_FLAG_ALLOW_REPLACEMENT | DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL); + va_start (ap, data); - /* check if we successfully acquired the name */ - if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) - { - g_printerr ("Thunar: D-BUS name org.xfce.Thunar already registered.\n"); + while ((signal = va_arg (ap, const char *))) + { + handler = va_arg (ap, gpointer); - /* unset connection */ - dbus_g_connection_unref (dbus_service->connection); - dbus_service->connection = NULL; + g_signal_connect (object, signal, G_CALLBACK (handler), data); + } - return; - } + va_end (ap); +} - /* request the org.xfce.FileManager name for Thunar */ - dbus_bus_request_name (dbus_connection, "org.xfce.FileManager", DBUS_NAME_FLAG_REPLACE_EXISTING, NULL); - /* once we registered, unset dbus variables (bug #8800) */ - g_unsetenv ("DBUS_STARTER_ADDRESS"); - g_unsetenv ("DBUS_STARTER_BUS_TYPE"); - } - else - { - /* notify the user that D-BUS service won't be available */ - g_printerr ("Thunar: Failed to connect to the D-BUS session bus: %s\n", error->message); - g_error_free (error); - } + +static void +thunar_dbus_service_init (ThunarDBusService *dbus_service) +{ + dbus_service->file_manager = thunar_dbus_file_manager_skeleton_new (); + dbus_service->trash = thunar_dbus_trash_skeleton_new (); + dbus_service->thunar = thunar_dbus_thunar_skeleton_new (); + + connect_signals_multiple (dbus_service->file_manager, dbus_service, + "handle-display-chooser-dialog", thunar_dbus_service_display_chooser_dialog, + "handle-display-folder", thunar_dbus_service_display_folder, + "handle-display-folder-and-select", thunar_dbus_service_display_folder_and_select, + "handle-launch", thunar_dbus_service_launch, + "handle-execute", thunar_dbus_service_execute, + "handle-display-preferences-dialog", thunar_dbus_service_display_preferences_dialog, + "handle-copy-to", thunar_dbus_service_copy_to, + "handle-copy-into", thunar_dbus_service_copy_into, + "handle-move-into", thunar_dbus_service_move_into, + "handle-link-into", thunar_dbus_service_link_into, + "handle-unlink-files", thunar_dbus_service_unlink_files, + "handle-launch-files", thunar_dbus_service_launch_files, + "handle-rename-file", thunar_dbus_service_rename_file, + "handle-create-file", thunar_dbus_service_create_file, + "handle-create-file-from-template", thunar_dbus_service_create_file_from_template, + NULL); + + connect_signals_multiple (dbus_service->trash, dbus_service, + "handle-display-trash", thunar_dbus_service_display_trash, + "handle-empty-trash", thunar_dbus_service_empty_trash, + "handle-move-to-trash", thunar_dbus_service_move_to_trash, + "handle-query-trash", thunar_dbus_service_query_trash, + NULL); + + connect_signals_multiple (dbus_service->thunar, dbus_service, + "handle-bulk-rename", thunar_dbus_service_bulk_rename, + "handle-terminate", + thunar_dbus_service_terminate, + NULL); } @@ -307,29 +323,13 @@ static void thunar_dbus_service_finalize (GObject *object) { ThunarDBusService *dbus_service = THUNAR_DBUS_SERVICE (object); - DBusConnection *dbus_connection; - /* release the D-BUS connection object */ - if (G_LIKELY (dbus_service->connection != NULL)) - { - /* release the names */ - dbus_connection = dbus_g_connection_get_connection (dbus_service->connection); - dbus_bus_release_name (dbus_connection, "org.xfce.Thunar", NULL); - dbus_bus_release_name (dbus_connection, "org.xfce.FileManager", NULL); + g_object_unref (dbus_service->file_manager); + g_object_unref (dbus_service->trash); + g_object_unref (dbus_service->thunar); - dbus_g_connection_unref (dbus_service->connection); - } - - /* check if we are connected to the trash bin */ - if (G_LIKELY (dbus_service->trash_bin != NULL)) - { - /* unwatch the trash bin */ - thunar_file_unwatch (dbus_service->trash_bin); - - /* release the trash bin */ - g_signal_handlers_disconnect_by_func (G_OBJECT (dbus_service->trash_bin), thunar_dbus_service_trash_bin_changed, dbus_service); - g_object_unref (G_OBJECT (dbus_service->trash_bin)); - } + if (dbus_service->trash_bin) + g_object_unref (dbus_service->trash_bin); (*G_OBJECT_CLASS (thunar_dbus_service_parent_class)->finalize) (object); } @@ -402,26 +402,27 @@ thunar_dbus_service_trash_bin_changed (ThunarDBusService *dbus_service, _thunar_return_if_fail (THUNAR_IS_FILE (trash_bin)); /* emit the "trash-changed" signal with the new state */ - g_signal_emit_by_name (G_OBJECT (dbus_service), "trash-changed", - thunar_file_get_item_count (trash_bin) > 0); + thunar_dbus_trash_emit_trash_changed (dbus_service->trash); } static gboolean -thunar_dbus_service_display_chooser_dialog (ThunarDBusService *dbus_service, - const gchar *uri, - gboolean open, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_chooser_dialog (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + gboolean open, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarFile *file; GdkScreen *screen; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) + goto out; /* popup the chooser dialog */ /* TODO use the startup id! */ @@ -431,24 +432,32 @@ thunar_dbus_service_display_chooser_dialog (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_display_chooser_dialog (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_display_folder (ThunarDBusService *dbus_service, - const gchar *uri, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_folder (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; GdkScreen *screen; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) return FALSE; /* popup a new window for the folder */ @@ -460,18 +469,25 @@ thunar_dbus_service_display_folder (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_display_folder (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_display_folder_and_select (ThunarDBusService *dbus_service, - const gchar *uri, - const gchar *filename, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_folder_and_select (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + const gchar *filename, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; @@ -479,17 +495,18 @@ thunar_dbus_service_display_folder_and_select (ThunarDBusService *dbus_service, GdkScreen *screen; GtkWidget *window; GFile *path; + GError *error = NULL; /* verify that filename is valid */ if (G_UNLIKELY (filename == NULL || *filename == '\0' || strchr (filename, '/') != NULL)) { - g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Invalid filename \"%s\""), filename); - return FALSE; + g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("Invalid filename \"%s\""), filename); + goto out; } /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &folder, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &folder, &screen, &error)) + goto out; /* popup a new window for the folder */ application = thunar_application_get (); @@ -519,26 +536,34 @@ thunar_dbus_service_display_folder_and_select (ThunarDBusService *dbus_service, g_object_unref (screen); g_object_unref (folder); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_display_folder_and_select (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_display_file_properties (ThunarDBusService *dbus_service, - const gchar *uri, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_file_properties (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; GdkScreen *screen; GtkWidget *dialog; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) + goto out; /* popup the file properties dialog */ dialog = thunar_properties_dialog_new (NULL); @@ -556,50 +581,63 @@ thunar_dbus_service_display_file_properties (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_display_file_properties (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_launch (ThunarDBusService *dbus_service, - const gchar *uri, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_launch (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarFile *file; GdkScreen *screen; - gboolean result = FALSE; + GError *error = NULL; /* parse uri and display parameters */ - if (thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) + if (thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) { /* try to launch the file on the given screen */ - result = thunar_file_launch (file, screen, startup_id, error); + thunar_file_launch (file, screen, startup_id, &error); /* cleanup */ g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); } - return result; + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_launch (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_execute (ThunarDBusService *dbus_service, - const gchar *working_directory, - const gchar *uri, - const gchar **files, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_execute (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + const gchar *uri, + const gchar **files, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarFile *file; GdkScreen *screen; - gboolean result = FALSE; + GError *error = NULL; GFile *working_dir; GList *file_list = NULL; gchar *tmp_working_dir = NULL; @@ -607,7 +645,7 @@ thunar_dbus_service_execute (ThunarDBusService *dbus_service, guint n; /* parse uri and display parameters */ - if (thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) + if (thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) { if (working_directory != NULL && *working_directory != '\0') old_working_dir = thunar_util_change_working_directory (working_directory); @@ -626,7 +664,7 @@ thunar_dbus_service_execute (ThunarDBusService *dbus_service, /* try to launch the file on the given screen */ working_dir = g_file_new_for_commandline_arg (working_directory); - result = thunar_file_execute (file, working_dir, screen, file_list, startup_id, error); + thunar_file_execute (file, working_dir, screen, file_list, startup_id, &error); g_object_unref (working_dir); /* cleanup */ @@ -635,25 +673,32 @@ thunar_dbus_service_execute (ThunarDBusService *dbus_service, g_object_unref (file); } - return result; + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_launch (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_display_preferences_dialog (ThunarDBusService *dbus_service, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_preferences_dialog (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GdkScreen *screen; GtkWidget *dialog; + GError *error = NULL; /* try to open the screen for the display name */ - screen = thunar_gdk_screen_open (display, error); + screen = thunar_gdk_screen_open (display, &error); if (G_UNLIKELY (screen == NULL)) - return FALSE; + goto out; /* popup the preferences dialog... */ dialog = thunar_preferences_dialog_new (NULL); @@ -669,26 +714,34 @@ thunar_dbus_service_display_preferences_dialog (ThunarDBusService *dbus_service, /* cleanup */ g_object_unref (G_OBJECT (screen)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_display_preferences_dialog (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_display_trash (ThunarDBusService *dbus_service, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_display_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GdkScreen *screen; + GError *error = NULL; /* connect to the trash bin on-demand */ - if (!thunar_dbus_service_connect_trash_bin (dbus_service, error)) - return FALSE; + if (!thunar_dbus_service_connect_trash_bin (dbus_service, &error)) + goto out; /* try to open the screen for the display name */ - screen = thunar_gdk_screen_open (display, error); + screen = thunar_gdk_screen_open (display, &error); if (G_LIKELY (screen != NULL)) { /* tell the application to display the trash bin */ @@ -698,25 +751,32 @@ thunar_dbus_service_display_trash (ThunarDBusService *dbus_service, /* release the screen */ g_object_unref (G_OBJECT (screen)); - return TRUE; } - return FALSE; +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_trash_complete_display_trash (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_empty_trash (ThunarDBusService *dbus_service, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_empty_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GdkScreen *screen; + GError *error = NULL; /* try to open the screen for the display name */ - screen = thunar_gdk_screen_open (display, error); + screen = thunar_gdk_screen_open (display, &error); if (G_LIKELY (screen != NULL)) { /* tell the application to empty the trash bin */ @@ -726,20 +786,26 @@ thunar_dbus_service_empty_trash (ThunarDBusService *dbus_service, /* release the screen */ g_object_unref (G_OBJECT (screen)); - return TRUE; } - return FALSE; +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_trash_complete_empty_trash (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_move_to_trash (ThunarDBusService *dbus_service, - gchar **filenames, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_move_to_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + gchar **filenames, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GFile *file; @@ -786,12 +852,11 @@ thunar_dbus_service_move_to_trash (ThunarDBusService *dbus_service, } /* check if we failed */ - if (G_UNLIKELY (err != NULL)) - { - /* propagate the error */ - g_propagate_error (error, err); - return FALSE; - } +out: + if (err) + g_dbus_method_invocation_take_error (invocation, err); + else + thunar_dbus_trash_complete_move_to_trash (object, invocation); return TRUE; } @@ -799,36 +864,45 @@ thunar_dbus_service_move_to_trash (ThunarDBusService *dbus_service, static gboolean -thunar_dbus_service_query_trash (ThunarDBusService *dbus_service, - gboolean *full, - GError **error) +thunar_dbus_service_query_trash (ThunarDBusTrash *object, + GDBusMethodInvocation *invocation, + ThunarDBusService *dbus_service) { + GError *error = NULL; + gboolean full = FALSE; + /* connect to the trash bin on-demand */ - if (thunar_dbus_service_connect_trash_bin (dbus_service, error)) + if (thunar_dbus_service_connect_trash_bin (dbus_service, &error)) { /* check whether the trash bin is not empty */ - *full = (thunar_file_get_item_count (dbus_service->trash_bin) > 0); - return TRUE; + full = (thunar_file_get_item_count (dbus_service->trash_bin) > 0); } - return FALSE; +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_trash_complete_query_trash (object, invocation, full); + + return TRUE; } static gboolean -thunar_dbus_service_bulk_rename (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **filenames, - gboolean standalone, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_bulk_rename (ThunarDBusThunar *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **filenames, + gboolean standalone, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GdkScreen *screen; - gboolean result = FALSE; gchar *cwd; + GError *error = NULL; /* determine a proper working directory */ cwd = (working_directory != NULL && *working_directory != '\0') @@ -836,12 +910,12 @@ thunar_dbus_service_bulk_rename (ThunarDBusService *dbus_service, : g_get_current_dir (); /* try to open the screen for the display name */ - screen = thunar_gdk_screen_open (display, error); + screen = thunar_gdk_screen_open (display, &error); if (G_LIKELY (screen != NULL)) { /* tell the application to display the bulk rename dialog */ application = thunar_application_get (); - result = thunar_application_bulk_rename (application, cwd, filenames, standalone, screen, startup_id, error); + thunar_application_bulk_rename (application, cwd, filenames, standalone, screen, startup_id, &error); g_object_unref (G_OBJECT (application)); /* release the screen */ @@ -851,71 +925,86 @@ thunar_dbus_service_bulk_rename (ThunarDBusService *dbus_service, /* release the cwd */ g_free (cwd); - return result; +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_thunar_complete_bulk_rename (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_launch_files (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **filenames, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_launch_files (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **filenames, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; GdkScreen *screen; - gboolean result = FALSE; + GError *error = NULL; /* verify that a valid working directory is given */ if (G_UNLIKELY (!g_path_is_absolute (working_directory))) { /* LaunchFiles() invoked without a valid working directory */ - g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("The working directory must be an absolute path")); - return FALSE; + g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("The working directory must be an absolute path")); + goto out; } /* verify that at least one filename is given */ if (G_UNLIKELY (filenames == NULL || *filenames == NULL)) { /* LaunchFiles() invoked with an empty filename list */ - g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("At least one filename must be specified")); - return FALSE; + g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("At least one filename must be specified")); + goto out; } /* try to open the screen for the display name */ - screen = thunar_gdk_screen_open (display, error); + screen = thunar_gdk_screen_open (display, &error); if (G_LIKELY (screen != NULL)) { /* let the application process the filenames */ application = thunar_application_get (); - result = thunar_application_process_filenames (application, working_directory, filenames, screen, startup_id, error); + thunar_application_process_filenames (application, working_directory, filenames, screen, startup_id, &error); g_object_unref (G_OBJECT (application)); /* release the screen */ g_object_unref (G_OBJECT (screen)); } - return result; +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_launch_files (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_rename_file (ThunarDBusService *dbus_service, - const gchar *uri, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_rename_file (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *uri, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; GdkScreen *screen; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, uri, display, &file, &screen, &error)) + goto out; /* popup a new window for the folder */ application = thunar_application_get (); @@ -926,26 +1015,34 @@ thunar_dbus_service_rename_file (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_rename_file (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_create_file (ThunarDBusService *dbus_service, - const gchar *parent_directory, - const gchar *content_type, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_create_file (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *parent_directory, + const gchar *content_type, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; GdkScreen *screen; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, parent_directory, display, &file, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, parent_directory, display, &file, &screen, &error)) + goto out; /* fall back to plain text file if no content type is provided */ if (content_type == NULL || *content_type == '\0') @@ -960,32 +1057,40 @@ thunar_dbus_service_create_file (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_create_file (object, invocation); + return TRUE; } static gboolean -thunar_dbus_service_create_file_from_template (ThunarDBusService *dbus_service, - const gchar *parent_directory, - const gchar *template_uri, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_create_file_from_template (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *parent_directory, + const gchar *template_uri, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *file; ThunarFile *template_file; GdkScreen *screen; + GError *error = NULL; /* parse uri and display parameters */ - if (!thunar_dbus_service_parse_uri_and_display (dbus_service, parent_directory, display, &file, &screen, error)) - return FALSE; + if (!thunar_dbus_service_parse_uri_and_display (dbus_service, parent_directory, display, &file, &screen, &error)) + goto out; /* try to determine the file for the template URI */ - template_file = thunar_file_get_for_uri (template_uri, error); + template_file = thunar_file_get_for_uri (template_uri, &error); if(template_file == NULL) - return FALSE; + goto out; /* popup a new window for the folder */ application = thunar_application_get (); @@ -996,6 +1101,12 @@ thunar_dbus_service_create_file_from_template (ThunarDBusService *dbus_service, g_object_unref (G_OBJECT (screen)); g_object_unref (G_OBJECT (file)); +out: + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_create_file_from_template (object, invocation); + return TRUE; } @@ -1141,97 +1252,135 @@ thunar_dbus_service_transfer_files (ThunarDBusTransferMode transfer_mode, static gboolean -thunar_dbus_service_copy_to (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **source_filenames, - gchar **target_filenames, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_copy_to (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **source_filenames, + gchar **target_filenames, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { - return thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_COPY_TO, - working_directory, - (const gchar * const *)source_filenames, - (const gchar * const *)target_filenames, - display, - startup_id, - error); + GError *error = NULL; + + thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_COPY_TO, + working_directory, + (const gchar * const *)source_filenames, + (const gchar * const *)target_filenames, + display, + startup_id, + &error); + + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_copy_to (object, invocation); + + return TRUE; } static gboolean -thunar_dbus_service_copy_into (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **source_filenames, - const gchar *target_filename, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_copy_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **source_filenames, + const gchar *target_filename, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { const gchar *target_filenames[2] = { target_filename, NULL }; + GError *error = NULL; + + thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_COPY_INTO, + working_directory, + (const gchar * const *)source_filenames, + target_filenames, + display, + startup_id, + &error); + + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_copy_into (object, invocation); - return thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_COPY_INTO, - working_directory, - (const gchar * const *)source_filenames, - target_filenames, - display, - startup_id, - error); + return TRUE; } static gboolean -thunar_dbus_service_move_into (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **source_filenames, - const gchar *target_filename, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_move_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **source_filenames, + const gchar *target_filename, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { const gchar *target_filenames[2] = { target_filename, NULL }; + GError *error = NULL; + + thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_MOVE_INTO, + working_directory, + (const gchar * const *)source_filenames, + target_filenames, + display, + startup_id, + &error); + + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_move_into (object, invocation); - return thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_MOVE_INTO, - working_directory, - (const gchar * const *)source_filenames, - target_filenames, - display, - startup_id, - error); + return TRUE; } static gboolean -thunar_dbus_service_link_into (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **source_filenames, - const gchar *target_filename, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_link_into (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **source_filenames, + const gchar *target_filename, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { const gchar *target_filenames[2] = { target_filename, NULL }; + GError *error = NULL; + + thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_LINK_INTO, + working_directory, + (const gchar * const *)source_filenames, + target_filenames, + display, + startup_id, + &error); + + if (error) + g_dbus_method_invocation_take_error (invocation, error); + else + thunar_dbus_file_manager_complete_link_into (object, invocation); - return thunar_dbus_service_transfer_files (THUNAR_DBUS_TRANSFER_MODE_LINK_INTO, - working_directory, - (const gchar * const *)source_filenames, - target_filenames, - display, - startup_id, - error); + return TRUE; } static gboolean -thunar_dbus_service_unlink_files (ThunarDBusService *dbus_service, - const gchar *working_directory, - gchar **filenames, - const gchar *display, - const gchar *startup_id, - GError **error) +thunar_dbus_service_unlink_files (ThunarDBusFileManager *object, + GDBusMethodInvocation *invocation, + const gchar *working_directory, + gchar **filenames, + const gchar *display, + const gchar *startup_id, + ThunarDBusService *dbus_service) { ThunarApplication *application; ThunarFile *thunar_file; @@ -1247,8 +1396,8 @@ thunar_dbus_service_unlink_files (ThunarDBusService *dbus_service, /* verify that atleast one filename is given */ if (filenames == NULL || *filenames == NULL) { - g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("At least one filename must be specified")); - return FALSE; + g_set_error (&err, G_FILE_ERROR, G_FILE_ERROR_INVAL, _("At least one filename must be specified")); + goto out; } /* try to open the screen for the display name */ @@ -1302,11 +1451,11 @@ thunar_dbus_service_unlink_files (ThunarDBusService *dbus_service, g_object_unref (screen); } - if (err != NULL) - { - g_propagate_error (error, err); - return FALSE; - } +out: + if (err) + g_dbus_method_invocation_take_error (invocation, err); + else + thunar_dbus_file_manager_complete_unlink_files (object, invocation); return TRUE; } @@ -1314,21 +1463,51 @@ thunar_dbus_service_unlink_files (ThunarDBusService *dbus_service, static gboolean -thunar_dbus_service_terminate (ThunarDBusService *dbus_service, - GError **error) +thunar_dbus_service_terminate (ThunarDBusThunar *object, + GDBusMethodInvocation *invocation, + ThunarDBusService *dbus_service) { /* leave the Gtk main loop as soon as possible */ - gtk_main_quit (); + ThunarApplication *app = thunar_application_get (); + g_application_quit (G_APPLICATION (app)); + g_object_unref (app); /* we cannot fail */ + thunar_dbus_thunar_complete_terminate (object, invocation); + return TRUE; } -gboolean -thunar_dbus_service_has_connection (ThunarDBusService *dbus_service) +gboolean thunar_dbus_service_export_on_connection (ThunarDBusService *service, + GDBusConnection *connection, + GError **error) { - _thunar_return_val_if_fail (THUNAR_IS_DBUS_SERVICE (dbus_service), FALSE); - return dbus_service->connection != NULL; + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (service->file_manager), + connection, + "/org/xfce/FileManager", + error)) + goto fail; + + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (service->trash), + connection, + "/org/xfce/FileManager", + error)) + goto fail; + + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (service->thunar), + connection, + "/org/xfce/FileManager", + error)) + goto fail; + + return TRUE; + +fail: + /* export either all or nothing */ + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (service->file_manager), connection); + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (service->trash), connection); + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (service->thunar), connection); + return FALSE; } diff --git a/thunar/thunar-dbus-service.h b/thunar/thunar-dbus-service.h index 7044000b9a59b805574a0b1f6fff6fb0a646fe43..e2900bd93d7b2395d77113e94a5dac2345b86e00 100644 --- a/thunar/thunar-dbus-service.h +++ b/thunar/thunar-dbus-service.h @@ -36,7 +36,9 @@ typedef struct _ThunarDBusService ThunarDBusService; GType thunar_dbus_service_get_type (void) G_GNUC_CONST; -gboolean thunar_dbus_service_has_connection (ThunarDBusService *dbus_service); +gboolean thunar_dbus_service_export_on_connection (ThunarDBusService *service, + GDBusConnection *connection, + GError **error); G_END_DECLS; diff --git a/thunar/thunar-thumbnail-cache-dbus.xml b/thunar/thunar-thumbnail-cache-dbus.xml index 92ffa422949cc21390ef32bbb4795e7356ccaf91..db06d32a78071b2204316865c076f12140182b0d 100644 --- a/thunar/thunar-thumbnail-cache-dbus.xml +++ b/thunar/thunar-thumbnail-cache-dbus.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <node name="/org/freedesktop/thumbnails/Cache1"> <interface name="org.freedesktop.thumbnails.Cache1"> + <annotation name="org.gtk.GDBus.C.Name" value="ThumbnailCacheDBus" /> <method name="Move"> <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> <arg type="as" name="from_uris" direction="in" /> diff --git a/thunar/thunar-thumbnail-cache-proxy.c b/thunar/thunar-thumbnail-cache-proxy.c new file mode 100644 index 0000000000000000000000000000000000000000..dee22acaab6917439f50acf46effb4c4b6cd8152 --- /dev/null +++ b/thunar/thunar-thumbnail-cache-proxy.c @@ -0,0 +1,1663 @@ +/* + * Generated by gdbus-codegen 2.44.1. DO NOT EDIT. + * + * The license of this code is the same as for the source it was derived from. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "thunar-thumbnail-cache-proxy.h" + +#include <string.h> +#ifdef G_OS_UNIX +# include <gio/gunixfdlist.h> +#endif + +typedef struct +{ + GDBusArgInfo parent_struct; + gboolean use_gvariant; +} _ExtendedGDBusArgInfo; + +typedef struct +{ + GDBusMethodInfo parent_struct; + const gchar *signal_name; + gboolean pass_fdlist; +} _ExtendedGDBusMethodInfo; + +typedef struct +{ + GDBusSignalInfo parent_struct; + const gchar *signal_name; +} _ExtendedGDBusSignalInfo; + +typedef struct +{ + GDBusPropertyInfo parent_struct; + const gchar *hyphen_name; + gboolean use_gvariant; +} _ExtendedGDBusPropertyInfo; + +typedef struct +{ + GDBusInterfaceInfo parent_struct; + const gchar *hyphen_name; +} _ExtendedGDBusInterfaceInfo; + +typedef struct +{ + const _ExtendedGDBusPropertyInfo *info; + guint prop_id; + GValue orig_value; /* the value before the change */ +} ChangedProperty; + +static void +_changed_property_free (ChangedProperty *data) +{ + g_value_unset (&data->orig_value); + g_free (data); +} + +static gboolean +_g_strv_equal0 (gchar **a, gchar **b) +{ + gboolean ret = FALSE; + guint n; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + if (g_strv_length (a) != g_strv_length (b)) + goto out; + for (n = 0; a[n] != NULL; n++) + if (g_strcmp0 (a[n], b[n]) != 0) + goto out; + ret = TRUE; +out: + return ret; +} + +static gboolean +_g_variant_equal0 (GVariant *a, GVariant *b) +{ + gboolean ret = FALSE; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + ret = g_variant_equal (a, b); +out: + return ret; +} + +G_GNUC_UNUSED static gboolean +_g_value_equal (const GValue *a, const GValue *b) +{ + gboolean ret = FALSE; + g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); + switch (G_VALUE_TYPE (a)) + { + case G_TYPE_BOOLEAN: + ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); + break; + case G_TYPE_UCHAR: + ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); + break; + case G_TYPE_INT: + ret = (g_value_get_int (a) == g_value_get_int (b)); + break; + case G_TYPE_UINT: + ret = (g_value_get_uint (a) == g_value_get_uint (b)); + break; + case G_TYPE_INT64: + ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); + break; + case G_TYPE_UINT64: + ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); + break; + case G_TYPE_DOUBLE: + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } + break; + case G_TYPE_STRING: + ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); + break; + case G_TYPE_VARIANT: + ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); + break; + default: + if (G_VALUE_TYPE (a) == G_TYPE_STRV) + ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); + else + g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); + break; + } + return ret; +} + +/* ------------------------------------------------------------------------ + * Code for interface org.freedesktop.thumbnails.Cache1 + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:ThunarThumbnailCacheDBus + * @title: ThunarThumbnailCacheDBus + * @short_description: Generated C code for the org.freedesktop.thumbnails.Cache1 D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.freedesktop.thumbnails.Cache1 ---- */ + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_from_uris = +{ + { + -1, + (gchar *) "from_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_to_uris = +{ + { + -1, + (gchar *) "to_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_from_uris, + &_thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_to_uris, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnail_cache_dbus_method_move_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnail_cache_dbus_method_move_annotation_info_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_move_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnail_cache_dbus_method_info_move = +{ + { + -1, + (gchar *) "Move", + (GDBusArgInfo **) &_thunar_thumbnail_cache_dbus_method_info_move_IN_ARG_pointers, + NULL, + (GDBusAnnotationInfo **) &_thunar_thumbnail_cache_dbus_method_move_annotation_info_pointers + }, + "handle-move", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_from_uris = +{ + { + -1, + (gchar *) "from_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_to_uris = +{ + { + -1, + (gchar *) "to_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_from_uris, + &_thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_to_uris, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnail_cache_dbus_method_copy_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnail_cache_dbus_method_copy_annotation_info_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_copy_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnail_cache_dbus_method_info_copy = +{ + { + -1, + (gchar *) "Copy", + (GDBusArgInfo **) &_thunar_thumbnail_cache_dbus_method_info_copy_IN_ARG_pointers, + NULL, + (GDBusAnnotationInfo **) &_thunar_thumbnail_cache_dbus_method_copy_annotation_info_pointers + }, + "handle-copy", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_delete_IN_ARG_uris = +{ + { + -1, + (gchar *) "uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnail_cache_dbus_method_info_delete_IN_ARG_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_info_delete_IN_ARG_uris, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnail_cache_dbus_method_delete_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnail_cache_dbus_method_delete_annotation_info_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_delete_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnail_cache_dbus_method_info_delete = +{ + { + -1, + (gchar *) "Delete", + (GDBusArgInfo **) &_thunar_thumbnail_cache_dbus_method_info_delete_IN_ARG_pointers, + NULL, + (GDBusAnnotationInfo **) &_thunar_thumbnail_cache_dbus_method_delete_annotation_info_pointers + }, + "handle-delete", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_base_uris = +{ + { + -1, + (gchar *) "base_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_since = +{ + { + -1, + (gchar *) "since", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_base_uris, + &_thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_since, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnail_cache_dbus_method_cleanup_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnail_cache_dbus_method_cleanup_annotation_info_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_cleanup_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnail_cache_dbus_method_info_cleanup = +{ + { + -1, + (gchar *) "Cleanup", + (GDBusArgInfo **) &_thunar_thumbnail_cache_dbus_method_info_cleanup_IN_ARG_pointers, + NULL, + (GDBusAnnotationInfo **) &_thunar_thumbnail_cache_dbus_method_cleanup_annotation_info_pointers + }, + "handle-cleanup", + FALSE +}; + +static const _ExtendedGDBusMethodInfo * const _thunar_thumbnail_cache_dbus_method_info_pointers[] = +{ + &_thunar_thumbnail_cache_dbus_method_info_move, + &_thunar_thumbnail_cache_dbus_method_info_copy, + &_thunar_thumbnail_cache_dbus_method_info_delete, + &_thunar_thumbnail_cache_dbus_method_info_cleanup, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _thunar_thumbnail_cache_dbus_interface_info = +{ + { + -1, + (gchar *) "org.freedesktop.thumbnails.Cache1", + (GDBusMethodInfo **) &_thunar_thumbnail_cache_dbus_method_info_pointers, + NULL, + NULL, + NULL + }, + "thumbnail-cache-dbus", +}; + + +/** + * thunar_thumbnail_cache_dbus_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +thunar_thumbnail_cache_dbus_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct; +} + +/** + * thunar_thumbnail_cache_dbus_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #ThunarThumbnailCacheDBus interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +thunar_thumbnail_cache_dbus_override_properties (GObjectClass *klass, guint property_id_begin) +{ + return property_id_begin - 1; +} + + + +/** + * ThunarThumbnailCacheDBus: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link>. + */ + +/** + * ThunarThumbnailCacheDBusIface: + * @parent_iface: The parent interface. + * @handle_cleanup: Handler for the #ThunarThumbnailCacheDBus::handle-cleanup signal. + * @handle_copy: Handler for the #ThunarThumbnailCacheDBus::handle-copy signal. + * @handle_delete: Handler for the #ThunarThumbnailCacheDBus::handle-delete signal. + * @handle_move: Handler for the #ThunarThumbnailCacheDBus::handle-move signal. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link>. + */ + +typedef ThunarThumbnailCacheDBusIface ThunarThumbnailCacheDBusInterface; +G_DEFINE_INTERFACE (ThunarThumbnailCacheDBus, thunar_thumbnail_cache_dbus, G_TYPE_OBJECT); + +static void +thunar_thumbnail_cache_dbus_default_init (ThunarThumbnailCacheDBusIface *iface) +{ + /* GObject signals for incoming D-Bus method calls: */ + /** + * ThunarThumbnailCacheDBus::handle-move: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_from_uris: Argument passed by remote caller. + * @arg_to_uris: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Move">Move()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnail_cache_dbus_complete_move() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-move", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailCacheDBusIface, handle_move), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV, G_TYPE_STRV); + + /** + * ThunarThumbnailCacheDBus::handle-copy: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_from_uris: Argument passed by remote caller. + * @arg_to_uris: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Copy">Copy()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnail_cache_dbus_complete_copy() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-copy", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailCacheDBusIface, handle_copy), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV, G_TYPE_STRV); + + /** + * ThunarThumbnailCacheDBus::handle-delete: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_uris: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Delete">Delete()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnail_cache_dbus_complete_delete() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-delete", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailCacheDBusIface, handle_delete), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 2, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV); + + /** + * ThunarThumbnailCacheDBus::handle-cleanup: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_base_uris: Argument passed by remote caller. + * @arg_since: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Cleanup">Cleanup()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnail_cache_dbus_complete_cleanup() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-cleanup", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailCacheDBusIface, handle_cleanup), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 3, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV, G_TYPE_UINT); + +} + +/** + * thunar_thumbnail_cache_dbus_call_move: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_from_uris: Argument to pass with the method invocation. + * @arg_to_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Move">Move()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_call_move_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_call_move_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnail_cache_dbus_call_move ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_from_uris, + const gchar *const *arg_to_uris, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Move", + g_variant_new ("(^as^as)", + arg_from_uris, + arg_to_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnail_cache_dbus_call_move_finish: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_call_move(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_call_move(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_move_finish ( + ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_move_sync: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_from_uris: Argument to pass with the method invocation. + * @arg_to_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Move">Move()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_call_move() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_move_sync ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_from_uris, + const gchar *const *arg_to_uris, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Move", + g_variant_new ("(^as^as)", + arg_from_uris, + arg_to_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_copy: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_from_uris: Argument to pass with the method invocation. + * @arg_to_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Copy">Copy()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_call_copy_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_call_copy_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnail_cache_dbus_call_copy ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_from_uris, + const gchar *const *arg_to_uris, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Copy", + g_variant_new ("(^as^as)", + arg_from_uris, + arg_to_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnail_cache_dbus_call_copy_finish: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_call_copy(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_call_copy(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_copy_finish ( + ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_copy_sync: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_from_uris: Argument to pass with the method invocation. + * @arg_to_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Copy">Copy()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_call_copy() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_copy_sync ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_from_uris, + const gchar *const *arg_to_uris, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Copy", + g_variant_new ("(^as^as)", + arg_from_uris, + arg_to_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_delete: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Delete">Delete()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_call_delete_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_call_delete_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnail_cache_dbus_call_delete ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_uris, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Delete", + g_variant_new ("(^as)", + arg_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnail_cache_dbus_call_delete_finish: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_call_delete(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_call_delete(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_delete_finish ( + ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_delete_sync: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_uris: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Delete">Delete()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_call_delete() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_delete_sync ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_uris, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Delete", + g_variant_new ("(^as)", + arg_uris), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_cleanup: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_base_uris: Argument to pass with the method invocation. + * @arg_since: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Cleanup">Cleanup()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_call_cleanup_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_call_cleanup_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnail_cache_dbus_call_cleanup ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_base_uris, + guint arg_since, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Cleanup", + g_variant_new ("(^asu)", + arg_base_uris, + arg_since), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnail_cache_dbus_call_cleanup_finish: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_call_cleanup(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_call_cleanup(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_cleanup_finish ( + ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_call_cleanup_sync: + * @proxy: A #ThunarThumbnailCacheDBusProxy. + * @arg_base_uris: Argument to pass with the method invocation. + * @arg_since: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Cleanup">Cleanup()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_call_cleanup() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnail_cache_dbus_call_cleanup_sync ( + ThunarThumbnailCacheDBus *proxy, + const gchar *const *arg_base_uris, + guint arg_since, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Cleanup", + g_variant_new ("(^asu)", + arg_base_uris, + arg_since), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnail_cache_dbus_complete_move: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Move">Move()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnail_cache_dbus_complete_move ( + ThunarThumbnailCacheDBus *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_thumbnail_cache_dbus_complete_copy: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Copy">Copy()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnail_cache_dbus_complete_copy ( + ThunarThumbnailCacheDBus *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_thumbnail_cache_dbus_complete_delete: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Delete">Delete()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnail_cache_dbus_complete_delete ( + ThunarThumbnailCacheDBus *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_thumbnail_cache_dbus_complete_cleanup: + * @object: A #ThunarThumbnailCacheDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Cache1.Cleanup">Cleanup()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnail_cache_dbus_complete_cleanup ( + ThunarThumbnailCacheDBus *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarThumbnailCacheDBusProxy: + * + * The #ThunarThumbnailCacheDBusProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarThumbnailCacheDBusProxyClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarThumbnailCacheDBusProxy. + */ + +struct _ThunarThumbnailCacheDBusProxyPrivate +{ + GData *qdata; +}; + +static void thunar_thumbnail_cache_dbus_proxy_iface_init (ThunarThumbnailCacheDBusIface *iface); + +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailCacheDBusProxy, thunar_thumbnail_cache_dbus_proxy, G_TYPE_DBUS_PROXY, + G_ADD_PRIVATE (ThunarThumbnailCacheDBusProxy) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS, thunar_thumbnail_cache_dbus_proxy_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailCacheDBusProxy, thunar_thumbnail_cache_dbus_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS, thunar_thumbnail_cache_dbus_proxy_iface_init)); + +#endif +static void +thunar_thumbnail_cache_dbus_proxy_finalize (GObject *object) +{ + ThunarThumbnailCacheDBusProxy *proxy = THUNAR_THUMBNAIL_CACHE_DBUS_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (thunar_thumbnail_cache_dbus_proxy_parent_class)->finalize (object); +} + +static void +thunar_thumbnail_cache_dbus_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_thumbnail_cache_dbus_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_thumbnail_cache_dbus_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], THUNAR_TYPE_THUMBNAIL_CACHE_DBUS); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_THUMBNAIL_CACHE_DBUS); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +thunar_thumbnail_cache_dbus_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + ThunarThumbnailCacheDBusProxy *proxy = THUNAR_THUMBNAIL_CACHE_DBUS_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static void +thunar_thumbnail_cache_dbus_proxy_init (ThunarThumbnailCacheDBusProxy *proxy) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + proxy->priv = thunar_thumbnail_cache_dbus_proxy_get_instance_private (proxy); +#else + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_PROXY, ThunarThumbnailCacheDBusProxyPrivate); +#endif + + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), thunar_thumbnail_cache_dbus_interface_info ()); +} + +static void +thunar_thumbnail_cache_dbus_proxy_class_init (ThunarThumbnailCacheDBusProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_thumbnail_cache_dbus_proxy_finalize; + gobject_class->get_property = thunar_thumbnail_cache_dbus_proxy_get_property; + gobject_class->set_property = thunar_thumbnail_cache_dbus_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = thunar_thumbnail_cache_dbus_proxy_g_signal; + proxy_class->g_properties_changed = thunar_thumbnail_cache_dbus_proxy_g_properties_changed; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarThumbnailCacheDBusProxyPrivate)); +#endif +} + +static void +thunar_thumbnail_cache_dbus_proxy_iface_init (ThunarThumbnailCacheDBusIface *iface) +{ +} + +/** + * thunar_thumbnail_cache_dbus_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_proxy_new_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_thumbnail_cache_dbus_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Cache1", NULL); +} + +/** + * thunar_thumbnail_cache_dbus_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_proxy_new(). + * + * Returns: (transfer full) (type ThunarThumbnailCacheDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailCacheDBus * +thunar_thumbnail_cache_dbus_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_THUMBNAIL_CACHE_DBUS (ret); + else + return NULL; +} + +/** + * thunar_thumbnail_cache_dbus_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarThumbnailCacheDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailCacheDBus * +thunar_thumbnail_cache_dbus_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Cache1", NULL); + if (ret != NULL) + return THUNAR_THUMBNAIL_CACHE_DBUS (ret); + else + return NULL; +} + + +/** + * thunar_thumbnail_cache_dbus_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like thunar_thumbnail_cache_dbus_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnail_cache_dbus_proxy_new_for_bus_finish() to get the result of the operation. + * + * See thunar_thumbnail_cache_dbus_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_thumbnail_cache_dbus_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Cache1", NULL); +} + +/** + * thunar_thumbnail_cache_dbus_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnail_cache_dbus_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_thumbnail_cache_dbus_proxy_new_for_bus(). + * + * Returns: (transfer full) (type ThunarThumbnailCacheDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailCacheDBus * +thunar_thumbnail_cache_dbus_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_THUMBNAIL_CACHE_DBUS (ret); + else + return NULL; +} + +/** + * thunar_thumbnail_cache_dbus_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like thunar_thumbnail_cache_dbus_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_thumbnail_cache_dbus_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarThumbnailCacheDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailCacheDBus * +thunar_thumbnail_cache_dbus_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Cache1", NULL); + if (ret != NULL) + return THUNAR_THUMBNAIL_CACHE_DBUS (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarThumbnailCacheDBusSkeleton: + * + * The #ThunarThumbnailCacheDBusSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarThumbnailCacheDBusSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarThumbnailCacheDBusSkeleton. + */ + +struct _ThunarThumbnailCacheDBusSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_thunar_thumbnail_cache_dbus_skeleton_handle_method_call ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ThunarThumbnailCacheDBusSkeleton *skeleton = THUNAR_THUMBNAIL_CACHE_DBUS_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], THUNAR_TYPE_THUMBNAIL_CACHE_DBUS); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_THUMBNAIL_CACHE_DBUS); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_thunar_thumbnail_cache_dbus_skeleton_handle_get_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ThunarThumbnailCacheDBusSkeleton *skeleton = THUNAR_THUMBNAIL_CACHE_DBUS_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_thunar_thumbnail_cache_dbus_skeleton_handle_set_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + ThunarThumbnailCacheDBusSkeleton *skeleton = THUNAR_THUMBNAIL_CACHE_DBUS_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnail_cache_dbus_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _thunar_thumbnail_cache_dbus_skeleton_vtable = +{ + _thunar_thumbnail_cache_dbus_skeleton_handle_method_call, + _thunar_thumbnail_cache_dbus_skeleton_handle_get_property, + _thunar_thumbnail_cache_dbus_skeleton_handle_set_property, + {NULL} +}; + +static GDBusInterfaceInfo * +thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return thunar_thumbnail_cache_dbus_interface_info (); +} + +static GDBusInterfaceVTable * +thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return (GDBusInterfaceVTable *) &_thunar_thumbnail_cache_dbus_skeleton_vtable; +} + +static GVariant * +thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + ThunarThumbnailCacheDBusSkeleton *skeleton = THUNAR_THUMBNAIL_CACHE_DBUS_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_thunar_thumbnail_cache_dbus_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _thunar_thumbnail_cache_dbus_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _thunar_thumbnail_cache_dbus_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _thunar_thumbnail_cache_dbus_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Cache1", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static void +thunar_thumbnail_cache_dbus_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ +} + +static void thunar_thumbnail_cache_dbus_skeleton_iface_init (ThunarThumbnailCacheDBusIface *iface); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailCacheDBusSkeleton, thunar_thumbnail_cache_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_ADD_PRIVATE (ThunarThumbnailCacheDBusSkeleton) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS, thunar_thumbnail_cache_dbus_skeleton_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailCacheDBusSkeleton, thunar_thumbnail_cache_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS, thunar_thumbnail_cache_dbus_skeleton_iface_init)); + +#endif +static void +thunar_thumbnail_cache_dbus_skeleton_finalize (GObject *object) +{ + ThunarThumbnailCacheDBusSkeleton *skeleton = THUNAR_THUMBNAIL_CACHE_DBUS_SKELETON (object); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (thunar_thumbnail_cache_dbus_skeleton_parent_class)->finalize (object); +} + +static void +thunar_thumbnail_cache_dbus_skeleton_init (ThunarThumbnailCacheDBusSkeleton *skeleton) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + skeleton->priv = thunar_thumbnail_cache_dbus_skeleton_get_instance_private (skeleton); +#else + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_SKELETON, ThunarThumbnailCacheDBusSkeletonPrivate); +#endif + + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); +} + +static void +thunar_thumbnail_cache_dbus_skeleton_class_init (ThunarThumbnailCacheDBusSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_thumbnail_cache_dbus_skeleton_finalize; + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_properties; + skeleton_class->flush = thunar_thumbnail_cache_dbus_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = thunar_thumbnail_cache_dbus_skeleton_dbus_interface_get_vtable; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarThumbnailCacheDBusSkeletonPrivate)); +#endif +} + +static void +thunar_thumbnail_cache_dbus_skeleton_iface_init (ThunarThumbnailCacheDBusIface *iface) +{ +} + +/** + * thunar_thumbnail_cache_dbus_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Cache1.top_of_page">org.freedesktop.thumbnails.Cache1</link>. + * + * Returns: (transfer full) (type ThunarThumbnailCacheDBusSkeleton): The skeleton object. + */ +ThunarThumbnailCacheDBus * +thunar_thumbnail_cache_dbus_skeleton_new (void) +{ + return THUNAR_THUMBNAIL_CACHE_DBUS (g_object_new (THUNAR_TYPE_THUMBNAIL_CACHE_DBUS_SKELETON, NULL)); +} + diff --git a/thunar/thunar-thumbnail-cache.c b/thunar/thunar-thumbnail-cache.c index 348ec53ee31d2c743d1daa2f09111746a629308c..b5f1526d3a8a937346235c3af3b865409b20add7 100644 --- a/thunar/thunar-thumbnail-cache.c +++ b/thunar/thunar-thumbnail-cache.c @@ -22,12 +22,7 @@ #include <config.h> #endif -#ifdef HAVE_DBUS -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> - #include <thunar/thunar-thumbnail-cache-proxy.h> -#endif #include <glib.h> #include <glib-object.h> @@ -51,6 +46,13 @@ static void thunar_thumbnail_cache_finalize (GObject *object); +enum +{ + THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE, + THUNAR_THUMBNAIL_CACHE_PROXY_WAITING, + THUNAR_THUMBNAIL_CACHE_PROXY_FAILED +}; + struct _ThunarThumbnailCacheClass { GObjectClass __parent__; @@ -60,8 +62,8 @@ struct _ThunarThumbnailCache { GObject __parent__; -#ifdef HAVE_DBUS - DBusGProxy *cache_proxy; + ThunarThumbnailCacheDBus *cache_proxy; + int proxy_state; GList *move_source_queue; GList *move_target_queue; @@ -82,7 +84,6 @@ struct _ThunarThumbnailCache #else GMutex *lock; #endif -#endif }; @@ -105,42 +106,9 @@ thunar_thumbnail_cache_class_init (ThunarThumbnailCacheClass *klass) -static void -thunar_thumbnail_cache_init (ThunarThumbnailCache *cache) -{ -#ifdef HAVE_DBUS - DBusGConnection *connection; - - /* try to connect to D-Bus */ - connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); - if (connection != NULL) - { - /* create a proxy for the thumbnail cache service */ - cache->cache_proxy = - dbus_g_proxy_new_for_name (connection, - "org.freedesktop.thumbnails.Cache1", - "/org/freedesktop/thumbnails/Cache1", - "org.freedesktop.thumbnails.Cache1"); - - /* release the D-Bus connection */ - dbus_g_connection_unref (connection); - } - -/* create a new mutex for accessing the cache from different threads */ -#if GLIB_CHECK_VERSION (2, 32, 0) - g_mutex_init (&cache->lock); -#else - cache->lock = g_mutex_new (); -#endif -#endif -} - - - static void thunar_thumbnail_cache_finalize (GObject *object) { -#ifdef HAVE_DBUS ThunarThumbnailCache *cache = THUNAR_THUMBNAIL_CACHE (object); /* acquire a cache lock */ @@ -180,7 +148,6 @@ thunar_thumbnail_cache_finalize (GObject *object) g_mutex_clear (&cache->lock); #else g_mutex_free (cache->lock); -#endif #endif (*G_OBJECT_CLASS (thunar_thumbnail_cache_parent_class)->finalize) (object); @@ -188,21 +155,26 @@ thunar_thumbnail_cache_finalize (GObject *object) -#ifdef HAVE_DBUS static void -thunar_thumbnail_cache_move_copy_async_reply (DBusGProxy *proxy, - GError *error, - gpointer user_data) +thunar_thumbnail_cache_copy_async_reply (ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + gpointer user_data) { GList *li; ThunarFile *file; + GError *error; - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + _thunar_return_if_fail (THUNAR_IS_THUMBNAIL_CACHE_DBUS (proxy)); + + if (!thunar_thumbnail_cache_dbus_call_copy_finish (proxy, res, &error)) + { + g_printerr ("ThunarThumbnailCache: failed to call Copy(): %s\n", error->message); + } + g_clear_error (&error); for (li = user_data; li != NULL; li = li->next) { file = thunar_file_cache_lookup (G_FILE (li->data)); - g_object_unref (G_OBJECT (li->data)); if (G_LIKELY (file != NULL)) { @@ -212,7 +184,41 @@ thunar_thumbnail_cache_move_copy_async_reply (DBusGProxy *proxy, } } - g_list_free (user_data); + g_list_free_full (user_data, g_object_unref); +} + + + +static void +thunar_thumbnail_cache_move_async_reply (ThunarThumbnailCacheDBus *proxy, + GAsyncResult *res, + gpointer user_data) +{ + GList *li; + ThunarFile *file; + GError *error; + + _thunar_return_if_fail (THUNAR_IS_THUMBNAIL_CACHE_DBUS (proxy)); + + if (!thunar_thumbnail_cache_dbus_call_move_finish (proxy, res, &error)) + { + g_printerr ("ThunarThumbnailCache: failed to call Move(): %s\n", error->message); + } + g_clear_error (&error); + + for (li = user_data; li != NULL; li = li->next) + { + file = thunar_file_cache_lookup (G_FILE (li->data)); + + if (G_LIKELY (file != NULL)) + { + /* if visible, let the view know there might be a thumb */ + thunar_file_changed (file); + g_object_unref (file); + } + } + + g_list_free_full (user_data, g_object_unref); } @@ -228,10 +234,11 @@ thunar_thumbnail_cache_move_async (ThunarThumbnailCache *cache, _thunar_return_if_fail (target_uris != NULL); /* request a thumbnail cache update asynchronously */ - thunar_thumbnail_cache_proxy_move_async (cache->cache_proxy, - source_uris, target_uris, - thunar_thumbnail_cache_move_copy_async_reply, - user_data); + thunar_thumbnail_cache_dbus_call_move (cache->cache_proxy, + source_uris, target_uris, + NULL, + (GAsyncReadyCallback)thunar_thumbnail_cache_move_async_reply, + user_data); } @@ -247,20 +254,11 @@ thunar_thumbnail_cache_copy_async (ThunarThumbnailCache *cache, _thunar_return_if_fail (target_uris != NULL); /* request a thumbnail cache update asynchronously */ - thunar_thumbnail_cache_proxy_copy_async (cache->cache_proxy, - source_uris, target_uris, - thunar_thumbnail_cache_move_copy_async_reply, - user_data); -} - - - -static void -thunar_thumbnail_cache_delete_async_reply (DBusGProxy *proxy, - GError *error, - gpointer user_data) -{ - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + thunar_thumbnail_cache_dbus_call_copy (cache->cache_proxy, + source_uris, target_uris, + NULL, + (GAsyncReadyCallback)thunar_thumbnail_cache_copy_async_reply, + user_data); } @@ -273,19 +271,8 @@ thunar_thumbnail_cache_delete_async (ThunarThumbnailCache *cache, _thunar_return_if_fail (uris != NULL); /* request a thumbnail cache update asynchronously */ - thunar_thumbnail_cache_proxy_delete_async (cache->cache_proxy, uris, - thunar_thumbnail_cache_delete_async_reply, - NULL); -} - - - -static void -thunar_thumbnail_cache_cleanup_async_reply (DBusGProxy *proxy, - GError *error, - gpointer user_data) -{ - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + thunar_thumbnail_cache_dbus_call_delete (cache->cache_proxy, uris, + NULL, NULL, NULL); } @@ -298,10 +285,9 @@ thunar_thumbnail_cache_cleanup_async (ThunarThumbnailCache *cache, _thunar_return_if_fail (base_uris != NULL); /* request a thumbnail cache update asynchronously */ - thunar_thumbnail_cache_proxy_cleanup_async (cache->cache_proxy, - (const gchar **)base_uris, 0, - thunar_thumbnail_cache_cleanup_async_reply, - NULL); + thunar_thumbnail_cache_dbus_call_cleanup (cache->cache_proxy, + (const gchar **)base_uris, 0, + NULL, NULL, NULL); } @@ -538,7 +524,6 @@ thunar_thumbnail_cache_process_cleanup_queue (ThunarThumbnailCache *cache) return FALSE; } -#endif /* HAVE_DBUS */ @@ -559,12 +544,20 @@ thunar_thumbnail_cache_move_file (ThunarThumbnailCache *cache, _thunar_return_if_fail (G_IS_FILE (source_file)); _thunar_return_if_fail (G_IS_FILE (target_file)); -#ifdef HAVE_DBUS /* acquire a cache lock */ _thumbnail_cache_lock (cache); /* check if we have a valid proxy for the cache service */ - if (cache->cache_proxy != NULL) + if (cache->proxy_state != THUNAR_THUMBNAIL_CACHE_PROXY_FAILED) + { + /* add the files to the move queue */ + cache->move_source_queue = g_list_prepend (cache->move_source_queue, + g_object_ref (source_file)); + cache->move_target_queue = g_list_prepend (cache->move_target_queue, + g_object_ref (target_file)); + } + + if (cache->proxy_state == THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE) { /* cancel any pending timeout to process the move queue */ if (cache->move_queue_idle_id > 0) @@ -573,12 +566,6 @@ thunar_thumbnail_cache_move_file (ThunarThumbnailCache *cache, cache->move_queue_idle_id = 0; } - /* add the files to the move queue */ - cache->move_source_queue = g_list_prepend (cache->move_source_queue, - g_object_ref (source_file)); - cache->move_target_queue = g_list_prepend (cache->move_target_queue, - g_object_ref (target_file)); - /* process the move queue in a 250ms timeout */ cache->move_queue_idle_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 250, thunar_thumbnail_cache_process_move_queue, @@ -587,7 +574,6 @@ thunar_thumbnail_cache_move_file (ThunarThumbnailCache *cache, /* release the cache lock */ _thumbnail_cache_unlock (cache); -#endif } @@ -601,12 +587,20 @@ thunar_thumbnail_cache_copy_file (ThunarThumbnailCache *cache, _thunar_return_if_fail (G_IS_FILE (source_file)); _thunar_return_if_fail (G_IS_FILE (target_file)); -#ifdef HAVE_DBUS /* acquire a cache lock */ _thumbnail_cache_lock (cache); /* check if we have a valid proxy for the cache service */ - if (cache->cache_proxy != NULL) + if (cache->proxy_state != THUNAR_THUMBNAIL_CACHE_PROXY_FAILED) + { + /* add the files to the copy queues */ + cache->copy_source_queue = g_list_prepend (cache->copy_source_queue, + g_object_ref (source_file)); + cache->copy_target_queue = g_list_prepend (cache->copy_target_queue, + g_object_ref (target_file)); + } + + if (cache->proxy_state == THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE) { /* cancel any pending timeout to process the copy queue */ if (cache->copy_queue_idle_id > 0) @@ -615,12 +609,6 @@ thunar_thumbnail_cache_copy_file (ThunarThumbnailCache *cache, cache->copy_queue_idle_id = 0; } - /* add the files to the copy queues */ - cache->copy_source_queue = g_list_prepend (cache->copy_source_queue, - g_object_ref (source_file)); - cache->copy_target_queue = g_list_prepend (cache->copy_target_queue, - g_object_ref (target_file)); - /* process the copy queue in a 250ms timeout */ cache->copy_queue_idle_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 500, thunar_thumbnail_cache_process_copy_queue, @@ -629,7 +617,6 @@ thunar_thumbnail_cache_copy_file (ThunarThumbnailCache *cache, /* release the cache lock */ _thumbnail_cache_unlock (cache); -#endif } @@ -641,12 +628,17 @@ thunar_thumbnail_cache_delete_file (ThunarThumbnailCache *cache, _thunar_return_if_fail (THUNAR_IS_THUMBNAIL_CACHE (cache)); _thunar_return_if_fail (G_IS_FILE (file)); -#ifdef HAVE_DBUS /* acquire a cache lock */ _thumbnail_cache_lock (cache); /* check if we have a valid proxy for the cache service */ - if (cache->cache_proxy) + if (cache->proxy_state != THUNAR_THUMBNAIL_CACHE_PROXY_FAILED) + { + /* add the file to the delete queue */ + cache->delete_queue = g_list_prepend (cache->delete_queue, g_object_ref (file)); + } + + if (cache->proxy_state == THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE) { /* cancel any pending timeout to process the delete queue */ if (cache->delete_queue_idle_id > 0) @@ -655,9 +647,6 @@ thunar_thumbnail_cache_delete_file (ThunarThumbnailCache *cache, cache->delete_queue_idle_id = 0; } - /* add the file to the delete queue */ - cache->delete_queue = g_list_prepend (cache->delete_queue, g_object_ref (file)); - /* process the delete queue in a 250ms timeout */ cache->delete_queue_idle_id = g_timeout_add (500, (GSourceFunc) thunar_thumbnail_cache_process_delete_queue, @@ -666,7 +655,6 @@ thunar_thumbnail_cache_delete_file (ThunarThumbnailCache *cache, /* release the cache lock */ _thumbnail_cache_unlock (cache); -#endif } @@ -678,12 +666,17 @@ thunar_thumbnail_cache_cleanup_file (ThunarThumbnailCache *cache, _thunar_return_if_fail (THUNAR_IS_THUMBNAIL_CACHE (cache)); _thunar_return_if_fail (G_IS_FILE (file)); -#ifdef HAVE_DBUS /* acquire a cache lock */ _thumbnail_cache_lock (cache); /* check if we have a valid proxy for the cache service */ - if (cache->cache_proxy) + if (cache->proxy_state != THUNAR_THUMBNAIL_CACHE_PROXY_FAILED) + { + /* add the file to the cleanup queue */ + cache->cleanup_queue = g_list_prepend (cache->cleanup_queue, g_object_ref (file)); + } + + if (cache->proxy_state == THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE) { /* cancel any pending timeout to process the cleanup queue */ if (cache->cleanup_queue_idle_id > 0) @@ -692,9 +685,6 @@ thunar_thumbnail_cache_cleanup_file (ThunarThumbnailCache *cache, cache->cleanup_queue_idle_id = 0; } - /* add the file to the cleanup queue */ - cache->cleanup_queue = g_list_prepend (cache->cleanup_queue, g_object_ref (file)); - /* process the cleanup queue in a 250ms timeout */ cache->cleanup_queue_idle_id = g_timeout_add (1000, (GSourceFunc) thunar_thumbnail_cache_process_cleanup_queue, @@ -703,5 +693,89 @@ thunar_thumbnail_cache_cleanup_file (ThunarThumbnailCache *cache, /* release the cache lock */ _thumbnail_cache_unlock (cache); +} + + + +static void +thunar_thumbnail_cache_proxy_created (GObject *source, + GAsyncResult *res, + gpointer userdata) +{ + ThunarThumbnailCache *cache = THUNAR_THUMBNAIL_CACHE (userdata); + ThunarThumbnailCacheDBus *proxy; + GError *error = NULL; + + _thumbnail_cache_lock (cache); + + if ((proxy = thunar_thumbnail_cache_dbus_proxy_new_for_bus_finish (res, &error))) + { + cache->cache_proxy = proxy; + cache->proxy_state = THUNAR_THUMBNAIL_CACHE_PROXY_AVAILABLE; + } + else + { + cache->proxy_state = THUNAR_THUMBNAIL_CACHE_PROXY_FAILED; + + g_printerr ("ThunarThumbnailCache: Couldn't connect to bus service: %s\n", error->message); + } + + g_clear_error (&error); + + /* process the move queue in a 250ms timeout */ + if (cache->move_source_queue) + cache->move_queue_idle_id = + g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 250, thunar_thumbnail_cache_process_move_queue, + cache, thunar_thumbnail_cache_process_move_queue_destroy); + + /* process the copy queue in a 250ms timeout */ + if (cache->copy_source_queue) + cache->copy_queue_idle_id = + g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 500, thunar_thumbnail_cache_process_copy_queue, + cache, thunar_thumbnail_cache_process_copy_queue_destroy); + + /* process the delete queue in a 250ms timeout */ + if (cache->delete_queue) + cache->delete_queue_idle_id = + g_timeout_add (500, (GSourceFunc) thunar_thumbnail_cache_process_delete_queue, + cache); + + /* process the cleanup queue in a 250ms timeout */ + if (cache->cleanup_queue) + cache->cleanup_queue_idle_id = + g_timeout_add (1000, (GSourceFunc) thunar_thumbnail_cache_process_cleanup_queue, + cache); + + _thumbnail_cache_unlock (cache); + + /* drop additional reference */ + g_object_unref (cache); +} + + + +static void +thunar_thumbnail_cache_init (ThunarThumbnailCache *cache) +{ + /* create a new mutex for accessing the cache from different threads */ +#if GLIB_CHECK_VERSION (2, 32, 0) + g_mutex_init (&cache->lock); +#else + cache->lock = g_mutex_new (); #endif + + /* add an additional reference to keep us alive while tre proxy initializes */ + g_object_ref (cache); + + /* try to connect to D-Bus */ + cache->proxy_state = THUNAR_THUMBNAIL_CACHE_PROXY_WAITING; + thunar_thumbnail_cache_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + 0, + "org.freedesktop.thumbnails.Cache1", + "/org/freedesktop/thumbnails/Cache1", + NULL, + thunar_thumbnail_cache_proxy_created, + cache); } + + diff --git a/thunar/thunar-thumbnailer-dbus.xml b/thunar/thunar-thumbnailer-dbus.xml index d0d2ada0010ba6b2102dab8a1f61c773a61b94f8..1187a3286924547e822fb67334ef2ffde63c1886 100644 --- a/thunar/thunar-thumbnailer-dbus.xml +++ b/thunar/thunar-thumbnailer-dbus.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <node name="/org/freedesktop/thumbnails/Thumbnailer1"> <interface name="org.freedesktop.thumbnails.Thumbnailer1"> + <annotation name="org.gtk.GDBus.C.Name" value="ThumbnailerDBus" /> <method name="Queue"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> <arg type="as" name="uris" direction="in" /> <arg type="as" name="mime_hints" direction="in" /> <arg type="s" name="flavor" direction="in" /> diff --git a/thunar/thunar-thumbnailer-proxy.c b/thunar/thunar-thumbnailer-proxy.c new file mode 100644 index 0000000000000000000000000000000000000000..0b7b6905bcf8e89f41cbc74b1b274fc627c5ec9d --- /dev/null +++ b/thunar/thunar-thumbnailer-proxy.c @@ -0,0 +1,2149 @@ +/* + * Generated by gdbus-codegen 2.44.1. DO NOT EDIT. + * + * The license of this code is the same as for the source it was derived from. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "thunar-thumbnailer-proxy.h" + +#include <string.h> +#ifdef G_OS_UNIX +# include <gio/gunixfdlist.h> +#endif + +typedef struct +{ + GDBusArgInfo parent_struct; + gboolean use_gvariant; +} _ExtendedGDBusArgInfo; + +typedef struct +{ + GDBusMethodInfo parent_struct; + const gchar *signal_name; + gboolean pass_fdlist; +} _ExtendedGDBusMethodInfo; + +typedef struct +{ + GDBusSignalInfo parent_struct; + const gchar *signal_name; +} _ExtendedGDBusSignalInfo; + +typedef struct +{ + GDBusPropertyInfo parent_struct; + const gchar *hyphen_name; + gboolean use_gvariant; +} _ExtendedGDBusPropertyInfo; + +typedef struct +{ + GDBusInterfaceInfo parent_struct; + const gchar *hyphen_name; +} _ExtendedGDBusInterfaceInfo; + +typedef struct +{ + const _ExtendedGDBusPropertyInfo *info; + guint prop_id; + GValue orig_value; /* the value before the change */ +} ChangedProperty; + +static void +_changed_property_free (ChangedProperty *data) +{ + g_value_unset (&data->orig_value); + g_free (data); +} + +static gboolean +_g_strv_equal0 (gchar **a, gchar **b) +{ + gboolean ret = FALSE; + guint n; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + if (g_strv_length (a) != g_strv_length (b)) + goto out; + for (n = 0; a[n] != NULL; n++) + if (g_strcmp0 (a[n], b[n]) != 0) + goto out; + ret = TRUE; +out: + return ret; +} + +static gboolean +_g_variant_equal0 (GVariant *a, GVariant *b) +{ + gboolean ret = FALSE; + if (a == NULL && b == NULL) + { + ret = TRUE; + goto out; + } + if (a == NULL || b == NULL) + goto out; + ret = g_variant_equal (a, b); +out: + return ret; +} + +G_GNUC_UNUSED static gboolean +_g_value_equal (const GValue *a, const GValue *b) +{ + gboolean ret = FALSE; + g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); + switch (G_VALUE_TYPE (a)) + { + case G_TYPE_BOOLEAN: + ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); + break; + case G_TYPE_UCHAR: + ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); + break; + case G_TYPE_INT: + ret = (g_value_get_int (a) == g_value_get_int (b)); + break; + case G_TYPE_UINT: + ret = (g_value_get_uint (a) == g_value_get_uint (b)); + break; + case G_TYPE_INT64: + ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); + break; + case G_TYPE_UINT64: + ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); + break; + case G_TYPE_DOUBLE: + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } + break; + case G_TYPE_STRING: + ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); + break; + case G_TYPE_VARIANT: + ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); + break; + default: + if (G_VALUE_TYPE (a) == G_TYPE_STRV) + ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); + else + g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a))); + break; + } + return ret; +} + +/* ------------------------------------------------------------------------ + * Code for interface org.freedesktop.thumbnails.Thumbnailer1 + * ------------------------------------------------------------------------ + */ + +/** + * SECTION:ThunarThumbnailerDBus + * @title: ThunarThumbnailerDBus + * @short_description: Generated C code for the org.freedesktop.thumbnails.Thumbnailer1 D-Bus interface + * + * This section contains code for working with the <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link> D-Bus interface in C. + */ + +/* ---- Introspection data for org.freedesktop.thumbnails.Thumbnailer1 ---- */ + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_uris = +{ + { + -1, + (gchar *) "uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_mime_hints = +{ + { + -1, + (gchar *) "mime_hints", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_flavor = +{ + { + -1, + (gchar *) "flavor", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_scheduler = +{ + { + -1, + (gchar *) "scheduler", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_handle_to_unqueue = +{ + { + -1, + (gchar *) "handle_to_unqueue", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_method_info_queue_IN_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_uris, + &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_mime_hints, + &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_flavor, + &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_scheduler, + &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_handle_to_unqueue, + NULL +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_queue_OUT_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_method_info_queue_OUT_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_queue_OUT_ARG_handle, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnailer_dbus_method_info_queue = +{ + { + -1, + (gchar *) "Queue", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_method_info_queue_IN_ARG_pointers, + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_method_info_queue_OUT_ARG_pointers, + NULL + }, + "handle-queue", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_dequeue_IN_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_method_info_dequeue_IN_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_dequeue_IN_ARG_handle, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnailer_dbus_method_dequeue_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnailer_dbus_method_dequeue_annotation_info_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_dequeue_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnailer_dbus_method_info_dequeue = +{ + { + -1, + (gchar *) "Dequeue", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_method_info_dequeue_IN_ARG_pointers, + NULL, + (GDBusAnnotationInfo **) &_thunar_thumbnailer_dbus_method_dequeue_annotation_info_pointers + }, + "handle-dequeue", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_uri_schemes = +{ + { + -1, + (gchar *) "uri_schemes", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_mime_types = +{ + { + -1, + (gchar *) "mime_types", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_uri_schemes, + &_thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_mime_types, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnailer_dbus_method_get_supported_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnailer_dbus_method_get_supported_annotation_info_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_get_supported_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnailer_dbus_method_info_get_supported = +{ + { + -1, + (gchar *) "GetSupported", + NULL, + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_method_info_get_supported_OUT_ARG_pointers, + (GDBusAnnotationInfo **) &_thunar_thumbnailer_dbus_method_get_supported_annotation_info_pointers + }, + "handle-get-supported", + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_method_info_get_schedulers_OUT_ARG_schedulers = +{ + { + -1, + (gchar *) "schedulers", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_method_info_get_schedulers_OUT_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_get_schedulers_OUT_ARG_schedulers, + NULL +}; + +static const GDBusAnnotationInfo _thunar_thumbnailer_dbus_method_get_schedulers_annotation_info_0 = +{ + -1, + (gchar *) "org.freedesktop.DBus.GLib.Async", + (gchar *) "true", + NULL +}; + +static const GDBusAnnotationInfo * const _thunar_thumbnailer_dbus_method_get_schedulers_annotation_info_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_get_schedulers_annotation_info_0, + NULL +}; + +static const _ExtendedGDBusMethodInfo _thunar_thumbnailer_dbus_method_info_get_schedulers = +{ + { + -1, + (gchar *) "GetSchedulers", + NULL, + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_method_info_get_schedulers_OUT_ARG_pointers, + (GDBusAnnotationInfo **) &_thunar_thumbnailer_dbus_method_get_schedulers_annotation_info_pointers + }, + "handle-get-schedulers", + FALSE +}; + +static const _ExtendedGDBusMethodInfo * const _thunar_thumbnailer_dbus_method_info_pointers[] = +{ + &_thunar_thumbnailer_dbus_method_info_queue, + &_thunar_thumbnailer_dbus_method_info_dequeue, + &_thunar_thumbnailer_dbus_method_info_get_supported, + &_thunar_thumbnailer_dbus_method_info_get_schedulers, + NULL +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_started_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_signal_info_started_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_signal_info_started_ARG_handle, + NULL +}; + +static const _ExtendedGDBusSignalInfo _thunar_thumbnailer_dbus_signal_info_started = +{ + { + -1, + (gchar *) "Started", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_signal_info_started_ARG_pointers, + NULL + }, + "started" +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_finished_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_signal_info_finished_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_signal_info_finished_ARG_handle, + NULL +}; + +static const _ExtendedGDBusSignalInfo _thunar_thumbnailer_dbus_signal_info_finished = +{ + { + -1, + (gchar *) "Finished", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_signal_info_finished_ARG_pointers, + NULL + }, + "finished" +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_ready_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_ready_ARG_uris = +{ + { + -1, + (gchar *) "uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_signal_info_ready_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_signal_info_ready_ARG_handle, + &_thunar_thumbnailer_dbus_signal_info_ready_ARG_uris, + NULL +}; + +static const _ExtendedGDBusSignalInfo _thunar_thumbnailer_dbus_signal_info_ready = +{ + { + -1, + (gchar *) "Ready", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_signal_info_ready_ARG_pointers, + NULL + }, + "ready" +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_error_ARG_handle = +{ + { + -1, + (gchar *) "handle", + (gchar *) "u", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_error_ARG_failed_uris = +{ + { + -1, + (gchar *) "failed_uris", + (gchar *) "as", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_error_ARG_error_code = +{ + { + -1, + (gchar *) "error_code", + (gchar *) "i", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _thunar_thumbnailer_dbus_signal_info_error_ARG_message = +{ + { + -1, + (gchar *) "message", + (gchar *) "s", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo * const _thunar_thumbnailer_dbus_signal_info_error_ARG_pointers[] = +{ + &_thunar_thumbnailer_dbus_signal_info_error_ARG_handle, + &_thunar_thumbnailer_dbus_signal_info_error_ARG_failed_uris, + &_thunar_thumbnailer_dbus_signal_info_error_ARG_error_code, + &_thunar_thumbnailer_dbus_signal_info_error_ARG_message, + NULL +}; + +static const _ExtendedGDBusSignalInfo _thunar_thumbnailer_dbus_signal_info_error = +{ + { + -1, + (gchar *) "Error", + (GDBusArgInfo **) &_thunar_thumbnailer_dbus_signal_info_error_ARG_pointers, + NULL + }, + "error" +}; + +static const _ExtendedGDBusSignalInfo * const _thunar_thumbnailer_dbus_signal_info_pointers[] = +{ + &_thunar_thumbnailer_dbus_signal_info_started, + &_thunar_thumbnailer_dbus_signal_info_finished, + &_thunar_thumbnailer_dbus_signal_info_ready, + &_thunar_thumbnailer_dbus_signal_info_error, + NULL +}; + +static const _ExtendedGDBusInterfaceInfo _thunar_thumbnailer_dbus_interface_info = +{ + { + -1, + (gchar *) "org.freedesktop.thumbnails.Thumbnailer1", + (GDBusMethodInfo **) &_thunar_thumbnailer_dbus_method_info_pointers, + (GDBusSignalInfo **) &_thunar_thumbnailer_dbus_signal_info_pointers, + NULL, + NULL + }, + "thumbnailer-dbus", +}; + + +/** + * thunar_thumbnailer_dbus_interface_info: + * + * Gets a machine-readable description of the <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link> D-Bus interface. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + */ +GDBusInterfaceInfo * +thunar_thumbnailer_dbus_interface_info (void) +{ + return (GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct; +} + +/** + * thunar_thumbnailer_dbus_override_properties: + * @klass: The class structure for a #GObject<!-- -->-derived class. + * @property_id_begin: The property id to assign to the first overridden property. + * + * Overrides all #GObject properties in the #ThunarThumbnailerDBus interface for a concrete class. + * The properties are overridden in the order they are defined. + * + * Returns: The last property id. + */ +guint +thunar_thumbnailer_dbus_override_properties (GObjectClass *klass, guint property_id_begin) +{ + return property_id_begin - 1; +} + + + +/** + * ThunarThumbnailerDBus: + * + * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link>. + */ + +/** + * ThunarThumbnailerDBusIface: + * @parent_iface: The parent interface. + * @handle_dequeue: Handler for the #ThunarThumbnailerDBus::handle-dequeue signal. + * @handle_get_schedulers: Handler for the #ThunarThumbnailerDBus::handle-get-schedulers signal. + * @handle_get_supported: Handler for the #ThunarThumbnailerDBus::handle-get-supported signal. + * @handle_queue: Handler for the #ThunarThumbnailerDBus::handle-queue signal. + * @error: Handler for the #ThunarThumbnailerDBus::error signal. + * @finished: Handler for the #ThunarThumbnailerDBus::finished signal. + * @ready: Handler for the #ThunarThumbnailerDBus::ready signal. + * @started: Handler for the #ThunarThumbnailerDBus::started signal. + * + * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link>. + */ + +typedef ThunarThumbnailerDBusIface ThunarThumbnailerDBusInterface; +G_DEFINE_INTERFACE (ThunarThumbnailerDBus, thunar_thumbnailer_dbus, G_TYPE_OBJECT); + +static void +thunar_thumbnailer_dbus_default_init (ThunarThumbnailerDBusIface *iface) +{ + /* GObject signals for incoming D-Bus method calls: */ + /** + * ThunarThumbnailerDBus::handle-queue: + * @object: A #ThunarThumbnailerDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_uris: Argument passed by remote caller. + * @arg_mime_hints: Argument passed by remote caller. + * @arg_flavor: Argument passed by remote caller. + * @arg_scheduler: Argument passed by remote caller. + * @arg_handle_to_unqueue: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Queue">Queue()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnailer_dbus_complete_queue() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-queue", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, handle_queue), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 6, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRV, G_TYPE_STRV, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT); + + /** + * ThunarThumbnailerDBus::handle-dequeue: + * @object: A #ThunarThumbnailerDBus. + * @invocation: A #GDBusMethodInvocation. + * @arg_handle: Argument passed by remote caller. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Dequeue">Dequeue()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnailer_dbus_complete_dequeue() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-dequeue", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, handle_dequeue), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 2, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_UINT); + + /** + * ThunarThumbnailerDBus::handle-get-supported: + * @object: A #ThunarThumbnailerDBus. + * @invocation: A #GDBusMethodInvocation. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSupported">GetSupported()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnailer_dbus_complete_get_supported() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-get-supported", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, handle_get_supported), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_METHOD_INVOCATION); + + /** + * ThunarThumbnailerDBus::handle-get-schedulers: + * @object: A #ThunarThumbnailerDBus. + * @invocation: A #GDBusMethodInvocation. + * + * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSchedulers">GetSchedulers()</link> D-Bus method. + * + * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call thunar_thumbnailer_dbus_complete_get_schedulers() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned. + * + * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run. + */ + g_signal_new ("handle-get-schedulers", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, handle_get_schedulers), + g_signal_accumulator_true_handled, + NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_METHOD_INVOCATION); + + /* GObject signals for received D-Bus signals: */ + /** + * ThunarThumbnailerDBus::started: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument. + * + * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Started">"Started"</link> is received. + * + * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. + */ + g_signal_new ("started", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, started), + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 1, G_TYPE_UINT); + + /** + * ThunarThumbnailerDBus::finished: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument. + * + * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Finished">"Finished"</link> is received. + * + * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. + */ + g_signal_new ("finished", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, finished), + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 1, G_TYPE_UINT); + + /** + * ThunarThumbnailerDBus::ready: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument. + * @arg_uris: Argument. + * + * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Ready">"Ready"</link> is received. + * + * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. + */ + g_signal_new ("ready", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, ready), + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 2, G_TYPE_UINT, G_TYPE_STRV); + + /** + * ThunarThumbnailerDBus::error: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument. + * @arg_failed_uris: Argument. + * @arg_error_code: Argument. + * @arg_message: Argument. + * + * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Error">"Error"</link> is received. + * + * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal. + */ + g_signal_new ("error", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ThunarThumbnailerDBusIface, error), + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 4, G_TYPE_UINT, G_TYPE_STRV, G_TYPE_INT, G_TYPE_STRING); + +} + +/** + * thunar_thumbnailer_dbus_emit_started: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument to pass with the signal. + * + * Emits the <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Started">"Started"</link> D-Bus signal. + */ +void +thunar_thumbnailer_dbus_emit_started ( + ThunarThumbnailerDBus *object, + guint arg_handle) +{ + g_signal_emit_by_name (object, "started", arg_handle); +} + +/** + * thunar_thumbnailer_dbus_emit_finished: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument to pass with the signal. + * + * Emits the <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Finished">"Finished"</link> D-Bus signal. + */ +void +thunar_thumbnailer_dbus_emit_finished ( + ThunarThumbnailerDBus *object, + guint arg_handle) +{ + g_signal_emit_by_name (object, "finished", arg_handle); +} + +/** + * thunar_thumbnailer_dbus_emit_ready: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument to pass with the signal. + * @arg_uris: Argument to pass with the signal. + * + * Emits the <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Ready">"Ready"</link> D-Bus signal. + */ +void +thunar_thumbnailer_dbus_emit_ready ( + ThunarThumbnailerDBus *object, + guint arg_handle, + const gchar *const *arg_uris) +{ + g_signal_emit_by_name (object, "ready", arg_handle, arg_uris); +} + +/** + * thunar_thumbnailer_dbus_emit_error: + * @object: A #ThunarThumbnailerDBus. + * @arg_handle: Argument to pass with the signal. + * @arg_failed_uris: Argument to pass with the signal. + * @arg_error_code: Argument to pass with the signal. + * @arg_message: Argument to pass with the signal. + * + * Emits the <link linkend="gdbus-signal-org-freedesktop-thumbnails-Thumbnailer1.Error">"Error"</link> D-Bus signal. + */ +void +thunar_thumbnailer_dbus_emit_error ( + ThunarThumbnailerDBus *object, + guint arg_handle, + const gchar *const *arg_failed_uris, + gint arg_error_code, + const gchar *arg_message) +{ + g_signal_emit_by_name (object, "error", arg_handle, arg_failed_uris, arg_error_code, arg_message); +} + +/** + * thunar_thumbnailer_dbus_call_queue: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @arg_uris: Argument to pass with the method invocation. + * @arg_mime_hints: Argument to pass with the method invocation. + * @arg_flavor: Argument to pass with the method invocation. + * @arg_scheduler: Argument to pass with the method invocation. + * @arg_handle_to_unqueue: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Queue">Queue()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_call_queue_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_call_queue_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnailer_dbus_call_queue ( + ThunarThumbnailerDBus *proxy, + const gchar *const *arg_uris, + const gchar *const *arg_mime_hints, + const gchar *arg_flavor, + const gchar *arg_scheduler, + guint arg_handle_to_unqueue, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Queue", + g_variant_new ("(^as^asssu)", + arg_uris, + arg_mime_hints, + arg_flavor, + arg_scheduler, + arg_handle_to_unqueue), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnailer_dbus_call_queue_finish: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @out_handle: (out): Return location for return parameter or %NULL to ignore. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_call_queue(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnailer_dbus_call_queue(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_queue_finish ( + ThunarThumbnailerDBus *proxy, + guint *out_handle, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(u)", + out_handle); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_queue_sync: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @arg_uris: Argument to pass with the method invocation. + * @arg_mime_hints: Argument to pass with the method invocation. + * @arg_flavor: Argument to pass with the method invocation. + * @arg_scheduler: Argument to pass with the method invocation. + * @arg_handle_to_unqueue: Argument to pass with the method invocation. + * @out_handle: (out): Return location for return parameter or %NULL to ignore. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Queue">Queue()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_call_queue() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_queue_sync ( + ThunarThumbnailerDBus *proxy, + const gchar *const *arg_uris, + const gchar *const *arg_mime_hints, + const gchar *arg_flavor, + const gchar *arg_scheduler, + guint arg_handle_to_unqueue, + guint *out_handle, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Queue", + g_variant_new ("(^as^asssu)", + arg_uris, + arg_mime_hints, + arg_flavor, + arg_scheduler, + arg_handle_to_unqueue), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(u)", + out_handle); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_dequeue: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @arg_handle: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Dequeue">Dequeue()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_call_dequeue_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_call_dequeue_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnailer_dbus_call_dequeue ( + ThunarThumbnailerDBus *proxy, + guint arg_handle, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "Dequeue", + g_variant_new ("(u)", + arg_handle), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnailer_dbus_call_dequeue_finish: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_call_dequeue(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnailer_dbus_call_dequeue(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_dequeue_finish ( + ThunarThumbnailerDBus *proxy, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_dequeue_sync: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @arg_handle: Argument to pass with the method invocation. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Dequeue">Dequeue()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_call_dequeue() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_dequeue_sync ( + ThunarThumbnailerDBus *proxy, + guint arg_handle, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "Dequeue", + g_variant_new ("(u)", + arg_handle), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "()"); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_get_supported: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSupported">GetSupported()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_call_get_supported_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_call_get_supported_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnailer_dbus_call_get_supported ( + ThunarThumbnailerDBus *proxy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "GetSupported", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnailer_dbus_call_get_supported_finish: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @out_uri_schemes: (out): Return location for return parameter or %NULL to ignore. + * @out_mime_types: (out): Return location for return parameter or %NULL to ignore. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_call_get_supported(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnailer_dbus_call_get_supported(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_get_supported_finish ( + ThunarThumbnailerDBus *proxy, + gchar ***out_uri_schemes, + gchar ***out_mime_types, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(^as^as)", + out_uri_schemes, + out_mime_types); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_get_supported_sync: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @out_uri_schemes: (out): Return location for return parameter or %NULL to ignore. + * @out_mime_types: (out): Return location for return parameter or %NULL to ignore. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSupported">GetSupported()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_call_get_supported() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_get_supported_sync ( + ThunarThumbnailerDBus *proxy, + gchar ***out_uri_schemes, + gchar ***out_mime_types, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "GetSupported", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(^as^as)", + out_uri_schemes, + out_mime_types); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_get_schedulers: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSchedulers">GetSchedulers()</link> D-Bus method on @proxy. + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_call_get_schedulers_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_call_get_schedulers_sync() for the synchronous, blocking version of this method. + */ +void +thunar_thumbnailer_dbus_call_get_schedulers ( + ThunarThumbnailerDBus *proxy, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call (G_DBUS_PROXY (proxy), + "GetSchedulers", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + +/** + * thunar_thumbnailer_dbus_call_get_schedulers_finish: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @out_schedulers: (out): Return location for return parameter or %NULL to ignore. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_call_get_schedulers(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with thunar_thumbnailer_dbus_call_get_schedulers(). + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_get_schedulers_finish ( + ThunarThumbnailerDBus *proxy, + gchar ***out_schedulers, + GAsyncResult *res, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(^as)", + out_schedulers); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_call_get_schedulers_sync: + * @proxy: A #ThunarThumbnailerDBusProxy. + * @out_schedulers: (out): Return location for return parameter or %NULL to ignore. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSchedulers">GetSchedulers()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_call_get_schedulers() for the asynchronous version of this method. + * + * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set. + */ +gboolean +thunar_thumbnailer_dbus_call_get_schedulers_sync ( + ThunarThumbnailerDBus *proxy, + gchar ***out_schedulers, + GCancellable *cancellable, + GError **error) +{ + GVariant *_ret; + _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), + "GetSchedulers", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (_ret == NULL) + goto _out; + g_variant_get (_ret, + "(^as)", + out_schedulers); + g_variant_unref (_ret); +_out: + return _ret != NULL; +} + +/** + * thunar_thumbnailer_dbus_complete_queue: + * @object: A #ThunarThumbnailerDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @handle: Parameter to return. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Queue">Queue()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnailer_dbus_complete_queue ( + ThunarThumbnailerDBus *object, + GDBusMethodInvocation *invocation, + guint handle) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(u)", + handle)); +} + +/** + * thunar_thumbnailer_dbus_complete_dequeue: + * @object: A #ThunarThumbnailerDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.Dequeue">Dequeue()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnailer_dbus_complete_dequeue ( + ThunarThumbnailerDBus *object, + GDBusMethodInvocation *invocation) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("()")); +} + +/** + * thunar_thumbnailer_dbus_complete_get_supported: + * @object: A #ThunarThumbnailerDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @uri_schemes: Parameter to return. + * @mime_types: Parameter to return. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSupported">GetSupported()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnailer_dbus_complete_get_supported ( + ThunarThumbnailerDBus *object, + GDBusMethodInvocation *invocation, + const gchar *const *uri_schemes, + const gchar *const *mime_types) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(^as^as)", + uri_schemes, + mime_types)); +} + +/** + * thunar_thumbnailer_dbus_complete_get_schedulers: + * @object: A #ThunarThumbnailerDBus. + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @schedulers: Parameter to return. + * + * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-freedesktop-thumbnails-Thumbnailer1.GetSchedulers">GetSchedulers()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar. + * + * This method will free @invocation, you cannot use it afterwards. + */ +void +thunar_thumbnailer_dbus_complete_get_schedulers ( + ThunarThumbnailerDBus *object, + GDBusMethodInvocation *invocation, + const gchar *const *schedulers) +{ + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(^as)", + schedulers)); +} + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarThumbnailerDBusProxy: + * + * The #ThunarThumbnailerDBusProxy structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarThumbnailerDBusProxyClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarThumbnailerDBusProxy. + */ + +struct _ThunarThumbnailerDBusProxyPrivate +{ + GData *qdata; +}; + +static void thunar_thumbnailer_dbus_proxy_iface_init (ThunarThumbnailerDBusIface *iface); + +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailerDBusProxy, thunar_thumbnailer_dbus_proxy, G_TYPE_DBUS_PROXY, + G_ADD_PRIVATE (ThunarThumbnailerDBusProxy) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAILER_DBUS, thunar_thumbnailer_dbus_proxy_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailerDBusProxy, thunar_thumbnailer_dbus_proxy, G_TYPE_DBUS_PROXY, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAILER_DBUS, thunar_thumbnailer_dbus_proxy_iface_init)); + +#endif +static void +thunar_thumbnailer_dbus_proxy_finalize (GObject *object) +{ + ThunarThumbnailerDBusProxy *proxy = THUNAR_THUMBNAILER_DBUS_PROXY (object); + g_datalist_clear (&proxy->priv->qdata); + G_OBJECT_CLASS (thunar_thumbnailer_dbus_proxy_parent_class)->finalize (object); +} + +static void +thunar_thumbnailer_dbus_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_thumbnailer_dbus_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec G_GNUC_UNUSED) +{ +} + +static void +thunar_thumbnailer_dbus_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *signal_name, + GVariant *parameters) +{ + _ExtendedGDBusSignalInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint n; + guint signal_id; + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct, signal_name); + if (info == NULL) + return; + num_params = g_variant_n_children (parameters); + paramv = g_new0 (GValue, num_params + 1); + g_value_init (¶mv[0], THUNAR_TYPE_THUMBNAILER_DBUS); + g_value_set_object (¶mv[0], proxy); + g_variant_iter_init (&iter, parameters); + n = 1; + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_THUMBNAILER_DBUS); + g_signal_emitv (paramv, signal_id, 0, NULL); + for (n = 0; n < num_params + 1; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static void +thunar_thumbnailer_dbus_proxy_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties) +{ + ThunarThumbnailerDBusProxy *proxy = THUNAR_THUMBNAILER_DBUS_PROXY (_proxy); + guint n; + const gchar *key; + GVariantIter *iter; + _ExtendedGDBusPropertyInfo *info; + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct, key); + g_datalist_remove_data (&proxy->priv->qdata, key); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } + g_variant_iter_free (iter); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct, invalidated_properties[n]); + g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); + if (info != NULL) + g_object_notify (G_OBJECT (proxy), info->hyphen_name); + } +} + +static void +thunar_thumbnailer_dbus_proxy_init (ThunarThumbnailerDBusProxy *proxy) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + proxy->priv = thunar_thumbnailer_dbus_proxy_get_instance_private (proxy); +#else + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, THUNAR_TYPE_THUMBNAILER_DBUS_PROXY, ThunarThumbnailerDBusProxyPrivate); +#endif + + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), thunar_thumbnailer_dbus_interface_info ()); +} + +static void +thunar_thumbnailer_dbus_proxy_class_init (ThunarThumbnailerDBusProxyClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_thumbnailer_dbus_proxy_finalize; + gobject_class->get_property = thunar_thumbnailer_dbus_proxy_get_property; + gobject_class->set_property = thunar_thumbnailer_dbus_proxy_set_property; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = thunar_thumbnailer_dbus_proxy_g_signal; + proxy_class->g_properties_changed = thunar_thumbnailer_dbus_proxy_g_properties_changed; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarThumbnailerDBusProxyPrivate)); +#endif +} + +static void +thunar_thumbnailer_dbus_proxy_iface_init (ThunarThumbnailerDBusIface *iface) +{ +} + +/** + * thunar_thumbnailer_dbus_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link>. See g_dbus_proxy_new() for more details. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_proxy_new_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_proxy_new_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_thumbnailer_dbus_proxy_new ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_THUMBNAILER_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Thumbnailer1", NULL); +} + +/** + * thunar_thumbnailer_dbus_proxy_new_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_proxy_new(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_thumbnailer_dbus_proxy_new(). + * + * Returns: (transfer full) (type ThunarThumbnailerDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailerDBus * +thunar_thumbnailer_dbus_proxy_new_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_THUMBNAILER_DBUS (ret); + else + return NULL; +} + +/** + * thunar_thumbnailer_dbus_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link>. See g_dbus_proxy_new_sync() for more details. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_proxy_new() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarThumbnailerDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailerDBus * +thunar_thumbnailer_dbus_proxy_new_sync ( + GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_THUMBNAILER_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Thumbnailer1", NULL); + if (ret != NULL) + return THUNAR_THUMBNAILER_DBUS (ret); + else + return NULL; +} + + +/** + * thunar_thumbnailer_dbus_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: User data to pass to @callback. + * + * Like thunar_thumbnailer_dbus_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from. + * You can then call thunar_thumbnailer_dbus_proxy_new_for_bus_finish() to get the result of the operation. + * + * See thunar_thumbnailer_dbus_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor. + */ +void +thunar_thumbnailer_dbus_proxy_new_for_bus ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_async_initable_new_async (THUNAR_TYPE_THUMBNAILER_DBUS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Thumbnailer1", NULL); +} + +/** + * thunar_thumbnailer_dbus_proxy_new_for_bus_finish: + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to thunar_thumbnailer_dbus_proxy_new_for_bus(). + * @error: Return location for error or %NULL + * + * Finishes an operation started with thunar_thumbnailer_dbus_proxy_new_for_bus(). + * + * Returns: (transfer full) (type ThunarThumbnailerDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailerDBus * +thunar_thumbnailer_dbus_proxy_new_for_bus_finish ( + GAsyncResult *res, + GError **error) +{ + GObject *ret; + GObject *source_object; + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + if (ret != NULL) + return THUNAR_THUMBNAILER_DBUS (ret); + else + return NULL; +} + +/** + * thunar_thumbnailer_dbus_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags from the #GDBusProxyFlags enumeration. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL + * + * Like thunar_thumbnailer_dbus_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * The calling thread is blocked until a reply is received. + * + * See thunar_thumbnailer_dbus_proxy_new_for_bus() for the asynchronous version of this constructor. + * + * Returns: (transfer full) (type ThunarThumbnailerDBusProxy): The constructed proxy object or %NULL if @error is set. + */ +ThunarThumbnailerDBus * +thunar_thumbnailer_dbus_proxy_new_for_bus_sync ( + GBusType bus_type, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error) +{ + GInitable *ret; + ret = g_initable_new (THUNAR_TYPE_THUMBNAILER_DBUS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.thumbnails.Thumbnailer1", NULL); + if (ret != NULL) + return THUNAR_THUMBNAILER_DBUS (ret); + else + return NULL; +} + + +/* ------------------------------------------------------------------------ */ + +/** + * ThunarThumbnailerDBusSkeleton: + * + * The #ThunarThumbnailerDBusSkeleton structure contains only private data and should only be accessed using the provided API. + */ + +/** + * ThunarThumbnailerDBusSkeletonClass: + * @parent_class: The parent class. + * + * Class structure for #ThunarThumbnailerDBusSkeleton. + */ + +struct _ThunarThumbnailerDBusSkeletonPrivate +{ + GValue *properties; + GList *changed_properties; + GSource *changed_properties_idle_source; + GMainContext *context; + GMutex lock; +}; + +static void +_thunar_thumbnailer_dbus_skeleton_handle_method_call ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (user_data); + _ExtendedGDBusMethodInfo *info; + GVariantIter iter; + GVariant *child; + GValue *paramv; + guint num_params; + guint num_extra; + guint n; + guint signal_id; + GValue return_value = G_VALUE_INIT; + info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); + g_assert (info != NULL); + num_params = g_variant_n_children (parameters); + num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra); + n = 0; + g_value_init (¶mv[n], THUNAR_TYPE_THUMBNAILER_DBUS); + g_value_set_object (¶mv[n++], skeleton); + g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION); + g_value_set_object (¶mv[n++], invocation); + if (info->pass_fdlist) + { +#ifdef G_OS_UNIX + g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST); + g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation))); +#else + g_assert_not_reached (); +#endif + } + g_variant_iter_init (&iter, parameters); + while ((child = g_variant_iter_next_value (&iter)) != NULL) + { + _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra]; + if (arg_info->use_gvariant) + { + g_value_init (¶mv[n], G_TYPE_VARIANT); + g_value_set_variant (¶mv[n], child); + n++; + } + else + g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); + g_variant_unref (child); + } + signal_id = g_signal_lookup (info->signal_name, THUNAR_TYPE_THUMBNAILER_DBUS); + g_value_init (&return_value, G_TYPE_BOOLEAN); + g_signal_emitv (paramv, signal_id, 0, &return_value); + if (!g_value_get_boolean (&return_value)) + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name); + g_value_unset (&return_value); + for (n = 0; n < num_params + num_extra; n++) + g_value_unset (¶mv[n]); + g_free (paramv); +} + +static GVariant * +_thunar_thumbnailer_dbus_skeleton_handle_get_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + GVariant *ret; + ret = NULL; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value); + ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); + g_value_unset (&value); + } + return ret; +} + +static gboolean +_thunar_thumbnailer_dbus_skeleton_handle_set_property ( + GDBusConnection *connection G_GNUC_UNUSED, + const gchar *sender G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *property_name, + GVariant *variant, + GError **error, + gpointer user_data) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (user_data); + GValue value = G_VALUE_INIT; + GParamSpec *pspec; + _ExtendedGDBusPropertyInfo *info; + gboolean ret; + ret = FALSE; + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_thunar_thumbnailer_dbus_interface_info.parent_struct, property_name); + g_assert (info != NULL); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); + if (pspec == NULL) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name); + } + else + { + if (info->use_gvariant) + g_value_set_variant (&value, variant); + else + g_dbus_gvariant_to_gvalue (variant, &value); + g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value); + g_value_unset (&value); + ret = TRUE; + } + return ret; +} + +static const GDBusInterfaceVTable _thunar_thumbnailer_dbus_skeleton_vtable = +{ + _thunar_thumbnailer_dbus_skeleton_handle_method_call, + _thunar_thumbnailer_dbus_skeleton_handle_get_property, + _thunar_thumbnailer_dbus_skeleton_handle_set_property, + {NULL} +}; + +static GDBusInterfaceInfo * +thunar_thumbnailer_dbus_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return thunar_thumbnailer_dbus_interface_info (); +} + +static GDBusInterfaceVTable * +thunar_thumbnailer_dbus_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED) +{ + return (GDBusInterfaceVTable *) &_thunar_thumbnailer_dbus_skeleton_vtable; +} + +static GVariant * +thunar_thumbnailer_dbus_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (_skeleton); + + GVariantBuilder builder; + guint n; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (_thunar_thumbnailer_dbus_interface_info.parent_struct.properties == NULL) + goto out; + for (n = 0; _thunar_thumbnailer_dbus_interface_info.parent_struct.properties[n] != NULL; n++) + { + GDBusPropertyInfo *info = _thunar_thumbnailer_dbus_interface_info.parent_struct.properties[n]; + if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + value = _thunar_thumbnailer_dbus_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Thumbnailer1", info->name, NULL, skeleton); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->name, value); + g_variant_unref (value); + } + } + } +out: + return g_variant_builder_end (&builder); +} + +static void +thunar_thumbnailer_dbus_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton) +{ +} + +static void +_thunar_thumbnailer_dbus_on_signal_started ( + ThunarThumbnailerDBus *object, + guint arg_handle) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (object); + + GList *connections, *l; + GVariant *signal_variant; + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + + signal_variant = g_variant_ref_sink (g_variant_new ("(u)", + arg_handle)); + for (l = connections; l != NULL; l = l->next) + { + GDBusConnection *connection = l->data; + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Thumbnailer1", "Started", + signal_variant, NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); +} + +static void +_thunar_thumbnailer_dbus_on_signal_finished ( + ThunarThumbnailerDBus *object, + guint arg_handle) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (object); + + GList *connections, *l; + GVariant *signal_variant; + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + + signal_variant = g_variant_ref_sink (g_variant_new ("(u)", + arg_handle)); + for (l = connections; l != NULL; l = l->next) + { + GDBusConnection *connection = l->data; + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Thumbnailer1", "Finished", + signal_variant, NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); +} + +static void +_thunar_thumbnailer_dbus_on_signal_ready ( + ThunarThumbnailerDBus *object, + guint arg_handle, + const gchar *const *arg_uris) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (object); + + GList *connections, *l; + GVariant *signal_variant; + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + + signal_variant = g_variant_ref_sink (g_variant_new ("(u^as)", + arg_handle, + arg_uris)); + for (l = connections; l != NULL; l = l->next) + { + GDBusConnection *connection = l->data; + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Thumbnailer1", "Ready", + signal_variant, NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); +} + +static void +_thunar_thumbnailer_dbus_on_signal_error ( + ThunarThumbnailerDBus *object, + guint arg_handle, + const gchar *const *arg_failed_uris, + gint arg_error_code, + const gchar *arg_message) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (object); + + GList *connections, *l; + GVariant *signal_variant; + connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton)); + + signal_variant = g_variant_ref_sink (g_variant_new ("(u^asis)", + arg_handle, + arg_failed_uris, + arg_error_code, + arg_message)); + for (l = connections; l != NULL; l = l->next) + { + GDBusConnection *connection = l->data; + g_dbus_connection_emit_signal (connection, + NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.thumbnails.Thumbnailer1", "Error", + signal_variant, NULL); + } + g_variant_unref (signal_variant); + g_list_free_full (connections, g_object_unref); +} + +static void thunar_thumbnailer_dbus_skeleton_iface_init (ThunarThumbnailerDBusIface *iface); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailerDBusSkeleton, thunar_thumbnailer_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_ADD_PRIVATE (ThunarThumbnailerDBusSkeleton) + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAILER_DBUS, thunar_thumbnailer_dbus_skeleton_iface_init)); + +#else +G_DEFINE_TYPE_WITH_CODE (ThunarThumbnailerDBusSkeleton, thunar_thumbnailer_dbus_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_THUMBNAILER_DBUS, thunar_thumbnailer_dbus_skeleton_iface_init)); + +#endif +static void +thunar_thumbnailer_dbus_skeleton_finalize (GObject *object) +{ + ThunarThumbnailerDBusSkeleton *skeleton = THUNAR_THUMBNAILER_DBUS_SKELETON (object); + g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); + if (skeleton->priv->changed_properties_idle_source != NULL) + g_source_destroy (skeleton->priv->changed_properties_idle_source); + g_main_context_unref (skeleton->priv->context); + g_mutex_clear (&skeleton->priv->lock); + G_OBJECT_CLASS (thunar_thumbnailer_dbus_skeleton_parent_class)->finalize (object); +} + +static void +thunar_thumbnailer_dbus_skeleton_init (ThunarThumbnailerDBusSkeleton *skeleton) +{ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + skeleton->priv = thunar_thumbnailer_dbus_skeleton_get_instance_private (skeleton); +#else + skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, THUNAR_TYPE_THUMBNAILER_DBUS_SKELETON, ThunarThumbnailerDBusSkeletonPrivate); +#endif + + g_mutex_init (&skeleton->priv->lock); + skeleton->priv->context = g_main_context_ref_thread_default (); +} + +static void +thunar_thumbnailer_dbus_skeleton_class_init (ThunarThumbnailerDBusSkeletonClass *klass) +{ + GObjectClass *gobject_class; + GDBusInterfaceSkeletonClass *skeleton_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = thunar_thumbnailer_dbus_skeleton_finalize; + + skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = thunar_thumbnailer_dbus_skeleton_dbus_interface_get_info; + skeleton_class->get_properties = thunar_thumbnailer_dbus_skeleton_dbus_interface_get_properties; + skeleton_class->flush = thunar_thumbnailer_dbus_skeleton_dbus_interface_flush; + skeleton_class->get_vtable = thunar_thumbnailer_dbus_skeleton_dbus_interface_get_vtable; + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38 + g_type_class_add_private (klass, sizeof (ThunarThumbnailerDBusSkeletonPrivate)); +#endif +} + +static void +thunar_thumbnailer_dbus_skeleton_iface_init (ThunarThumbnailerDBusIface *iface) +{ + iface->started = _thunar_thumbnailer_dbus_on_signal_started; + iface->finished = _thunar_thumbnailer_dbus_on_signal_finished; + iface->ready = _thunar_thumbnailer_dbus_on_signal_ready; + iface->error = _thunar_thumbnailer_dbus_on_signal_error; +} + +/** + * thunar_thumbnailer_dbus_skeleton_new: + * + * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-freedesktop-thumbnails-Thumbnailer1.top_of_page">org.freedesktop.thumbnails.Thumbnailer1</link>. + * + * Returns: (transfer full) (type ThunarThumbnailerDBusSkeleton): The skeleton object. + */ +ThunarThumbnailerDBus * +thunar_thumbnailer_dbus_skeleton_new (void) +{ + return THUNAR_THUMBNAILER_DBUS (g_object_new (THUNAR_TYPE_THUMBNAILER_DBUS_SKELETON, NULL)); +} + diff --git a/thunar/thunar-thumbnailer.c b/thunar/thunar-thumbnailer.c index 52daad9650989cbcf6daed808802204456401016..a55db099780758733f1069c2fca69164c60ab684 100644 --- a/thunar/thunar-thumbnailer.c +++ b/thunar/thunar-thumbnailer.c @@ -23,13 +23,7 @@ #include <config.h> #endif -#ifdef HAVE_DBUS -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> - #include <thunar/thunar-thumbnailer-proxy.h> -#endif - #include <thunar/thunar-marshal.h> #include <thunar/thunar-private.h> #include <thunar/thunar-thumbnailer.h> @@ -47,15 +41,19 @@ * * Please note that all D-Bus calls are performed asynchronously. * + * The proxy and the supported file types are intialized asynchronously, but + * this is nearly completely transparent to the calling code because all requests + * that arrive beforehand will be cached and sent out as soon as the initialization + * is completed. * - * When a request call is sent out, an internal request ID is created and - * associated with the corresponding DBusGProxyCall. + * When a request call is sent out, an internal request ID is created and tied + * to the dbus call. While the call is running, an additional reference is held + * to the thumbnailer so it cannot be finalized. * * The D-Bus reply handler then checks if there was an delivery error or * not. If the request method was sent successfully, the handle returned by the * D-Bus thumbnailer is associated bidirectionally with the internal request ID via - * the request and handle values in the job structure. In both cases, the - * association of the internal request ID with the DBusGProxyCall is set to NULL. + * the request and handle values in the job structure. * * * Ready / Error @@ -76,7 +74,6 @@ -#ifdef HAVE_DBUS typedef enum { THUNAR_THUMBNAILER_IDLE_ERROR, @@ -85,9 +82,17 @@ typedef enum +typedef enum +{ + THUNAR_THUMBNAILER_PROXY_WAITING = 0, + THUNAR_THUMBNAILER_PROXY_AVAILABLE, + THUNAR_THUMBNAILER_PROXY_FAILED +} ThunarThumbnailerProxyState; + + + typedef struct _ThunarThumbnailerJob ThunarThumbnailerJob; typedef struct _ThunarThumbnailerIdle ThunarThumbnailerIdle; -#endif /* Signal identifiers */ enum @@ -99,21 +104,19 @@ enum static void thunar_thumbnailer_finalize (GObject *object); -#ifdef HAVE_DBUS -static void thunar_thumbnailer_init_thumbnailer_proxy (ThunarThumbnailer *thumbnailer, - DBusGConnection *connection); +static void thunar_thumbnailer_init_thumbnailer_proxy (ThunarThumbnailer *thumbnailer); static gboolean thunar_thumbnailer_file_is_supported (ThunarThumbnailer *thumbnailer, ThunarFile *file); -static void thunar_thumbnailer_thumbnailer_finished (DBusGProxy *proxy, +static void thunar_thumbnailer_thumbnailer_finished (GDBusProxy *proxy, guint handle, ThunarThumbnailer *thumbnailer); -static void thunar_thumbnailer_thumbnailer_error (DBusGProxy *proxy, +static void thunar_thumbnailer_thumbnailer_error (GDBusProxy *proxy, guint handle, const gchar **uris, gint code, const gchar *message, ThunarThumbnailer *thumbnailer); -static void thunar_thumbnailer_thumbnailer_ready (DBusGProxy *proxy, +static void thunar_thumbnailer_thumbnailer_ready (GDBusProxy *proxy, guint32 handle, const gchar **uris, ThunarThumbnailer *thumbnailer); @@ -126,7 +129,6 @@ static void thunar_thumbnailer_idle (ThunarT const gchar **uris); static gboolean thunar_thumbnailer_idle_func (gpointer user_data); static void thunar_thumbnailer_idle_free (gpointer data); -#endif #if GLIB_CHECK_VERSION (2, 32, 0) #define _thumbnailer_lock(thumbnailer) g_mutex_lock (&((thumbnailer)->lock)) @@ -149,9 +151,9 @@ struct _ThunarThumbnailer { GObject __parent__; -#ifdef HAVE_DBUS /* proxies to communicate with D-Bus services */ - DBusGProxy *thumbnailer_proxy; + ThunarThumbnailerDBus *thumbnailer_proxy; + ThunarThumbnailerProxyState proxy_state; /* running jobs */ GSList *jobs; @@ -170,10 +172,8 @@ struct _ThunarThumbnailer /* IDs of idle functions */ GSList *idles; -#endif }; -#ifdef HAVE_DBUS struct _ThunarThumbnailerJob { ThunarThumbnailer *thumbnailer; @@ -181,14 +181,17 @@ struct _ThunarThumbnailerJob /* if this job is cancelled */ guint cancelled : 1; + guint lazy_checks : 1; + + /* data is saved here in case the queueing is delayed */ + /* If this is NULL, the request has been sent off. */ + GList *files; /* element type: ThunarFile */ + /* request number returned by ThunarThumbnailer */ guint request; /* handle returned by the tumbler dbus service */ guint handle; - - /* dbus call to get the handle */ - DBusGProxyCall *handle_call; }; struct _ThunarThumbnailerIdle @@ -198,8 +201,6 @@ struct _ThunarThumbnailerIdle guint id; gchar **uris; }; -#endif - static guint thumbnailer_signals[LAST_SIGNAL]; @@ -238,27 +239,213 @@ thunar_thumbnailer_class_init (ThunarThumbnailerClass *klass) static void -thunar_thumbnailer_init (ThunarThumbnailer *thumbnailer) +thunar_thumbnailer_free_job (ThunarThumbnailerJob *job) { -#ifdef HAVE_DBUS - DBusGConnection *connection; + if (job->files) + g_list_free_full (job->files, g_object_unref); -#if GLIB_CHECK_VERSION (2, 32, 0) + if (job->thumbnailer && job->thumbnailer->thumbnailer_proxy && job->handle) + thunar_thumbnailer_dbus_call_dequeue (job->thumbnailer->thumbnailer_proxy, job->handle, NULL, NULL, NULL); + + g_slice_free (ThunarThumbnailerJob, job); +} + + + +static void +thunar_thumbnailer_queue_async_reply (GObject *proxy, + GAsyncResult *res, + gpointer user_data) +{ + ThunarThumbnailerJob *job = user_data; + ThunarThumbnailer *thumbnailer = THUNAR_THUMBNAILER (job->thumbnailer); + GError *error = NULL; + int handle; + + _thunar_return_if_fail (THUNAR_IS_THUMBNAILER_DBUS (proxy)); + _thunar_return_if_fail (job != NULL); + _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); + + _thumbnailer_lock (thumbnailer); + + thunar_thumbnailer_dbus_call_queue_finish (THUNAR_THUMBNAILER_DBUS (proxy), &handle, res, &error); + + if (job->cancelled) + { + /* job is cancelled while there was no handle jet, so dequeue it now */ + thunar_thumbnailer_dbus_call_dequeue (THUNAR_THUMBNAILER_DBUS (proxy), handle, NULL, NULL, NULL); + + /* cleanup */ + thumbnailer->jobs = g_slist_remove (thumbnailer->jobs, job); + thunar_thumbnailer_free_job (job); + } + else if (error == NULL) + { + /* store the handle returned by tumbler */ + job->handle = handle; + } + else + { + g_printerr ("ThunarThumbnailer: Queue failed: %s\n", error->message); + } + + _thumbnailer_unlock (thumbnailer); + g_clear_error (&error); + + /* remove the additional reference we held during the call */ + g_object_unref (thumbnailer); +} + + + +/* NOTE: assumes that the lock is held by the caller */ +gboolean +thunar_thumbnailer_begin_job (ThunarThumbnailer *thumbnailer, + ThunarThumbnailerJob *job) +{ + gboolean success = FALSE; + const gchar **mime_hints; + gchar **uris; + GList *lp; + GList *supported_files = NULL; + guint n; + guint n_items = 0; + ThunarFileThumbState thumb_state; + const gchar *thumbnail_path; + gint request_no; + + if (thumbnailer->proxy_state == THUNAR_THUMBNAILER_PROXY_WAITING) + { + /* all pending jobs will be queued automatically once the proxy is available */ + return TRUE; + } + else if (thumbnailer->proxy_state == THUNAR_THUMBNAILER_PROXY_FAILED) + { + /* the job has no chance to be completed - ever */ + return FALSE; + } + + /* collect all supported files from the list that are neither in the + * about to be queued (wait queue), nor already queued, nor already + * processed (and awaiting to be refreshed) */ + for (lp = job->files; lp != NULL; lp = lp->next) + { + /* the icon factory only loads icons for regular files */ + if (!thunar_file_is_regular (lp->data)) + { + thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_NONE); + continue; + } + + /* get the current thumb state */ + thumb_state = thunar_file_get_thumb_state (lp->data); + + if (job->lazy_checks) + { + /* in lazy mode, don't both for files that have already + * been loaded or are not supported */ + if (thumb_state == THUNAR_FILE_THUMB_STATE_NONE + || thumb_state == THUNAR_FILE_THUMB_STATE_READY) + continue; + } + + /* check if the file is supported, assume it is when the state was ready previously */ + if (thumb_state == THUNAR_FILE_THUMB_STATE_READY + || thunar_thumbnailer_file_is_supported (thumbnailer, lp->data)) + { + supported_files = g_list_prepend (supported_files, lp->data); + n_items++; + } + else + { + /* still a regular file, but the type is now known to tumbler but + * maybe the application created a thumbnail */ + thumbnail_path = thunar_file_get_thumbnail_path (lp->data); + + /* test if a thumbnail can be found */ + if (thumbnail_path != NULL && g_file_test (thumbnail_path, G_FILE_TEST_EXISTS)) + thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_READY); + else + thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_NONE); + } + } + + /* check if we have any supported files */ + if (n_items > 0) + { + /* allocate arrays for URIs and mime hints */ + uris = g_new0 (gchar *, n_items + 1); + mime_hints = g_new0 (const gchar *, n_items + 1); + + /* fill URI and MIME hint arrays with items from the wait queue */ + for (lp = supported_files, n = 0; lp != NULL; lp = lp->next, ++n) + { + /* set the thumbnail state to loading */ + thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_LOADING); + + /* save URI and MIME hint in the arrays */ + uris[n] = thunar_file_dup_uri (lp->data); + mime_hints[n] = thunar_file_get_content_type (lp->data); + } + + /* NULL-terminate both arrays */ + uris[n] = NULL; + mime_hints[n] = NULL; + + /* queue a thumbnail request for the URIs from the wait queue */ + /* compute the next request ID, making sure it's never 0 */ + request_no = thumbnailer->last_request + 1; + request_no = MAX (request_no, 1); + + /* remember the ID for the next request */ + thumbnailer->last_request = request_no; + + /* save the request number */ + job->request = request_no; + + /* increase the reference count while the dbus call is running */ + g_object_ref (thumbnailer); + + /* queue the request - asynchronously, of course */ + thunar_thumbnailer_dbus_call_queue (thumbnailer->thumbnailer_proxy, + (const gchar *const *)uris, + (const gchar *const *)mime_hints, + "normal", "foreground", 0, + NULL, + thunar_thumbnailer_queue_async_reply, + job); + + /* free mime hints array */ + g_free (mime_hints); + g_strfreev (uris); + + /* free the list of supported files */ + g_list_free (supported_files); + + /* free the list of files passed in */ + g_list_free_full (job->files, g_object_unref); + job->files = NULL; + + /* we assume success if we've come so far */ + success = TRUE; + } + + return success; +} + + + +static void +thunar_thumbnailer_init (ThunarThumbnailer *thumbnailer) +{ + #if GLIB_CHECK_VERSION (2, 32, 0) g_mutex_init (&thumbnailer->lock); #else thumbnailer->lock = g_mutex_new (); #endif - /* try to connect to D-Bus */ - connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); - /* initialize the proxies */ - thunar_thumbnailer_init_thumbnailer_proxy (thumbnailer, connection); - - /* release the D-Bus connection if we have one */ - if (connection != NULL) - dbus_g_connection_unref (connection); -#endif + thunar_thumbnailer_init_thumbnailer_proxy (thumbnailer); } @@ -266,7 +453,6 @@ thunar_thumbnailer_init (ThunarThumbnailer *thumbnailer) static void thunar_thumbnailer_finalize (GObject *object) { -#ifdef HAVE_DBUS ThunarThumbnailer *thumbnailer = THUNAR_THUMBNAILER (object); ThunarThumbnailerIdle *idle; ThunarThumbnailerJob *job; @@ -292,22 +478,7 @@ thunar_thumbnailer_finalize (GObject *object) g_slist_free (thumbnailer->idles); /* remove all jobs */ - for (lp = thumbnailer->jobs; lp != NULL; lp = lp->next) - { - job = lp->data; - - if (thumbnailer->thumbnailer_proxy != NULL) - { - if (job->handle_call != NULL) - dbus_g_proxy_cancel_call (thumbnailer->thumbnailer_proxy, job->handle_call); - - if (job->handle != 0) - thunar_thumbnailer_proxy_dequeue (thumbnailer->thumbnailer_proxy, job->handle, NULL); - } - - g_slice_free (ThunarThumbnailerJob, job); - } - g_slist_free (thumbnailer->jobs); + g_slist_free_full (thumbnailer->jobs, (GDestroyNotify)thunar_thumbnailer_free_job); /* release the thumbnailer proxy */ if (thumbnailer->thumbnailer_proxy != NULL) @@ -325,7 +496,6 @@ thunar_thumbnailer_finalize (GObject *object) g_mutex_clear (&thumbnailer->lock); #else g_mutex_free (thumbnailer->lock); -#endif #endif (*G_OBJECT_CLASS (thunar_thumbnailer_parent_class)->finalize) (object); @@ -333,63 +503,6 @@ thunar_thumbnailer_finalize (GObject *object) -#ifdef HAVE_DBUS -static void -thunar_thumbnailer_init_thumbnailer_proxy (ThunarThumbnailer *thumbnailer, - DBusGConnection *connection) -{ - /* we can't have a proxy without a D-Bus connection */ - if (connection == NULL) - { - thumbnailer->thumbnailer_proxy = NULL; - return; - } - - /* create the thumbnailer proxy */ - thumbnailer->thumbnailer_proxy = - dbus_g_proxy_new_for_name (connection, - "org.freedesktop.thumbnails.Thumbnailer1", - "/org/freedesktop/thumbnails/Thumbnailer1", - "org.freedesktop.thumbnails.Thumbnailer1"); - - /* TODO this should actually be VOID:UINT,BOXED,INT,STRING */ - dbus_g_object_register_marshaller (_thunar_marshal_VOID__UINT_BOXED_UINT_STRING, - G_TYPE_NONE, - G_TYPE_UINT, - G_TYPE_STRV, - G_TYPE_UINT, - G_TYPE_STRING, - G_TYPE_INVALID); - - dbus_g_object_register_marshaller ((GClosureMarshal) _thunar_marshal_VOID__UINT_BOXED, - G_TYPE_NONE, - G_TYPE_UINT, - G_TYPE_STRV, - G_TYPE_INVALID); - - dbus_g_proxy_add_signal (thumbnailer->thumbnailer_proxy, "Error", - G_TYPE_UINT, G_TYPE_STRV, G_TYPE_UINT, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (thumbnailer->thumbnailer_proxy, "Finished", - G_TYPE_UINT, G_TYPE_INVALID); - dbus_g_proxy_add_signal (thumbnailer->thumbnailer_proxy, "Ready", - G_TYPE_UINT, G_TYPE_STRV, G_TYPE_INVALID); - dbus_g_proxy_add_signal (thumbnailer->thumbnailer_proxy, "Started", - G_TYPE_UINT, G_TYPE_INVALID); - - dbus_g_proxy_connect_signal (thumbnailer->thumbnailer_proxy, "Error", - G_CALLBACK (thunar_thumbnailer_thumbnailer_error), - thumbnailer, NULL); - dbus_g_proxy_connect_signal (thumbnailer->thumbnailer_proxy, "Finished", - G_CALLBACK (thunar_thumbnailer_thumbnailer_finished), - thumbnailer, NULL); - dbus_g_proxy_connect_signal (thumbnailer->thumbnailer_proxy, "Ready", - G_CALLBACK (thunar_thumbnailer_thumbnailer_ready), - thumbnailer, NULL); -} - - - static gint thunar_thumbnailer_file_schemes_compare (gconstpointer a, gconstpointer b) @@ -426,31 +539,39 @@ thunar_thumbnailer_file_sort_schemes (gpointer mime_type, static void -thunar_thumbnailer_get_supported_types (ThunarThumbnailer *thumbnailer) +thunar_thumbnailer_received_supported_types (ThunarThumbnailerDBus *proxy, + GAsyncResult *result, + ThunarThumbnailer *thumbnailer) { guint n; gchar **schemes = NULL; gchar **types = NULL; GPtrArray *schemes_array; + GSList *lp = NULL; + GError *error = NULL; _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); - _thunar_return_if_fail (DBUS_IS_G_PROXY (thumbnailer->thumbnailer_proxy)); - _thunar_return_if_fail (!_thumbnailer_trylock (thumbnailer)); + _thunar_return_if_fail (THUNAR_IS_THUMBNAILER_DBUS (proxy)); - /* leave if there already is a hash table */ - if (thumbnailer->supported != NULL) - return; + _thumbnailer_lock (thumbnailer); - /* prepare table */ - thumbnailer->supported = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - (GDestroyNotify) g_ptr_array_unref); - /* request the supported types from the thumbnailer D-Bus service. We only do - * this once, so using a non-async call should be ok */ - thunar_thumbnailer_proxy_get_supported (thumbnailer->thumbnailer_proxy, - &schemes, &types, - NULL); + if (!thunar_thumbnailer_dbus_call_get_supported_finish (proxy, &schemes, &types, result, &error)) + { + g_slist_free_full (thumbnailer->jobs, (GDestroyNotify)thunar_thumbnailer_free_job); + thumbnailer->jobs = NULL; + + g_printerr ("ThunarThumbnailer: Failed to retrieve supported types: %s\n", error->message); + g_clear_error (&error); + + thumbnailer->proxy_state = THUNAR_THUMBNAILER_PROXY_FAILED; + g_object_unref (proxy); + + _thumbnailer_unlock (thumbnailer); + + g_object_unref (thumbnailer); + return; + } if (G_LIKELY (schemes != NULL && types != NULL)) { @@ -482,10 +603,112 @@ thunar_thumbnailer_get_supported_types (ThunarThumbnailer *thumbnailer) /* sort array to optimize for local files */ g_hash_table_foreach (thumbnailer->supported, thunar_thumbnailer_file_sort_schemes, NULL); } + + thumbnailer->proxy_state = THUNAR_THUMBNAILER_PROXY_AVAILABLE; + thumbnailer->thumbnailer_proxy = proxy; + + /* now start delayed jobs */ + for (lp = thumbnailer->jobs; lp; lp = lp->next) + { + if (!thunar_thumbnailer_begin_job (thumbnailer, lp->data)) + { + thunar_thumbnailer_free_job (lp->data); + lp->data = NULL; + } + } + thumbnailer->jobs = g_slist_remove_all (thumbnailer->jobs, NULL); + + g_clear_error (&error); + + _thumbnailer_unlock (thumbnailer); + + g_object_unref (thumbnailer); +} + + + +static void +thunar_thumbnailer_proxy_created (GObject *object, + GAsyncResult *result, + gpointer userdata) +{ + ThunarThumbnailer *thumbnailer = THUNAR_THUMBNAILER (userdata); + GError *error = NULL; + ThunarThumbnailerDBus *proxy; + + proxy = thunar_thumbnailer_dbus_proxy_new_finish (result, &error); + + if (!proxy) + { + _thumbnailer_lock (thumbnailer); + + thumbnailer->proxy_state = THUNAR_THUMBNAILER_PROXY_FAILED; + g_printerr ("ThunarThumbnailer: failed to create proxy: %s", error->message); + g_clear_error (&error); + + g_slist_free_full (thumbnailer->jobs, (GDestroyNotify)thunar_thumbnailer_free_job); + thumbnailer->jobs = NULL; + + _thumbnailer_unlock (thumbnailer); + + g_object_unref (thumbnailer); + + return; + } + + /* setup signals */ + g_signal_connect (proxy, "error", + G_CALLBACK (thunar_thumbnailer_thumbnailer_error), thumbnailer); + g_signal_connect (proxy, "finished", + G_CALLBACK (thunar_thumbnailer_thumbnailer_finished), thumbnailer); + g_signal_connect (proxy, "ready", + G_CALLBACK (thunar_thumbnailer_thumbnailer_ready), thumbnailer); + + /* begin retrieving supported file types */ + + _thumbnailer_lock (thumbnailer); + + /* prepare table */ + g_clear_pointer (&thumbnailer->supported, g_hash_table_unref); + thumbnailer->supported = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, + (GDestroyNotify) g_ptr_array_unref); + + /* request the supported types from the thumbnailer D-Bus service. */ + thunar_thumbnailer_dbus_call_get_supported (proxy, NULL, + (GAsyncReadyCallback)thunar_thumbnailer_received_supported_types, + thumbnailer); + + _thumbnailer_unlock (thumbnailer); +} + + + +static void +thunar_thumbnailer_init_thumbnailer_proxy (ThunarThumbnailer *thumbnailer) +{ + GError *error = NULL; + + _thumbnailer_lock (thumbnailer); + + thumbnailer->thumbnailer_proxy = NULL; + thumbnailer->proxy_state = THUNAR_THUMBNAILER_PROXY_WAITING; + + /* create the thumbnailer proxy */ + thunar_thumbnailer_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, + "org.freedesktop.thumbnails.Thumbnailer1", + "/org/freedesktop/thumbnails/Thumbnailer1", + NULL, + (GAsyncReadyCallback)thunar_thumbnailer_proxy_created, + thumbnailer); + + _thumbnailer_unlock (thumbnailer); } +/* NOTE: assumes the lock is being held by the caller*/ static gboolean thunar_thumbnailer_file_is_supported (ThunarThumbnailer *thumbnailer, ThunarFile *file) @@ -498,9 +721,8 @@ thunar_thumbnailer_file_is_supported (ThunarThumbnailer *thumbnailer, _thunar_return_val_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer), FALSE); _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); - _thunar_return_val_if_fail (DBUS_IS_G_PROXY (thumbnailer->thumbnailer_proxy), FALSE); + _thunar_return_val_if_fail (THUNAR_IS_THUMBNAILER_DBUS (thumbnailer->thumbnailer_proxy), FALSE); _thunar_return_val_if_fail (thumbnailer->supported != NULL, FALSE); - _thunar_return_val_if_fail (!_thumbnailer_trylock (thumbnailer), FALSE); /* determine the content type of the passed file */ content_type = thunar_file_get_content_type (file); @@ -529,14 +751,14 @@ thunar_thumbnailer_file_is_supported (ThunarThumbnailer *thumbnailer, static void -thunar_thumbnailer_thumbnailer_error (DBusGProxy *proxy, +thunar_thumbnailer_thumbnailer_error (GDBusProxy *proxy, guint handle, const gchar **uris, gint code, const gchar *message, ThunarThumbnailer *thumbnailer) { - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + _thunar_return_if_fail (G_IS_DBUS_PROXY (proxy)); _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); /* check if we have any ready URIs */ @@ -549,12 +771,12 @@ thunar_thumbnailer_thumbnailer_error (DBusGProxy *proxy, static void -thunar_thumbnailer_thumbnailer_ready (DBusGProxy *proxy, +thunar_thumbnailer_thumbnailer_ready (GDBusProxy *proxy, guint32 handle, const gchar **uris, ThunarThumbnailer *thumbnailer) { - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + _thunar_return_if_fail (G_IS_DBUS_PROXY (proxy)); _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); thunar_thumbnailer_idle (thumbnailer, @@ -566,16 +788,18 @@ thunar_thumbnailer_thumbnailer_ready (DBusGProxy *proxy, static void -thunar_thumbnailer_thumbnailer_finished (DBusGProxy *proxy, +thunar_thumbnailer_thumbnailer_finished (GDBusProxy *proxy, guint handle, ThunarThumbnailer *thumbnailer) { ThunarThumbnailerJob *job; GSList *lp; - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); + _thunar_return_if_fail (G_IS_DBUS_PROXY (proxy)); _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); + _thumbnailer_lock (thumbnailer); + for (lp = thumbnailer->jobs; lp != NULL; lp = lp->next) { job = lp->data; @@ -589,98 +813,18 @@ thunar_thumbnailer_thumbnailer_finished (DBusGProxy *proxy, g_signal_emit (G_OBJECT (thumbnailer), thumbnailer_signals[REQUEST_FINISHED], 0, job->request); /* remove job from the list */ - _thumbnailer_lock (thumbnailer); thumbnailer->jobs = g_slist_delete_link (thumbnailer->jobs, lp); - _thumbnailer_unlock (thumbnailer); - g_slice_free (ThunarThumbnailerJob, job); + thunar_thumbnailer_free_job (job); break; } } -} - - - -static void -thunar_thumbnailer_queue_async_reply (DBusGProxy *proxy, - guint handle, - GError *error, - gpointer user_data) -{ - ThunarThumbnailerJob *job = user_data; - ThunarThumbnailer *thumbnailer = THUNAR_THUMBNAILER (job->thumbnailer); - - _thunar_return_if_fail (DBUS_IS_G_PROXY (proxy)); - _thunar_return_if_fail (job != NULL); - _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); - - _thumbnailer_lock (thumbnailer); - - /* the queue call is finished, we can forget about its proxy call */ - job->handle_call = NULL; - - if (job->cancelled) - { - /* job is cancelled while there was no handle jet, so dequeue it now */ - thunar_thumbnailer_proxy_dequeue (proxy, handle, NULL); - - /* cleanup */ - thumbnailer->jobs = g_slist_remove (thumbnailer->jobs, job); - g_slice_free (ThunarThumbnailerJob, job); - } - else if (error == NULL) - { - /* store the handle returned by tumbler */ - job->handle = handle; - } _thumbnailer_unlock (thumbnailer); } -static guint -thunar_thumbnailer_queue_async (ThunarThumbnailer *thumbnailer, - gchar **uris, - const gchar **mime_hints) -{ - ThunarThumbnailerJob *job; - guint request_no; - - _thunar_return_val_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer), 0); - _thunar_return_val_if_fail (uris != NULL, 0); - _thunar_return_val_if_fail (mime_hints != NULL, 0); - _thunar_return_val_if_fail (DBUS_IS_G_PROXY (thumbnailer->thumbnailer_proxy), 0); - _thunar_return_val_if_fail (!_thumbnailer_trylock (thumbnailer), 0); - - /* compute the next request ID, making sure it's never 0 */ - request_no = thumbnailer->last_request + 1; - request_no = MAX (request_no, 1); - - /* remember the ID for the next request */ - thumbnailer->last_request = request_no; - - /* allocate a new struct to follow this job until finished */ - job = g_slice_new0 (ThunarThumbnailerJob); - job->thumbnailer = thumbnailer; - job->request = request_no; - - /* store the job */ - thumbnailer->jobs = g_slist_prepend (thumbnailer->jobs, job); - - /* queue thumbnails for the given URIs asynchronously */ - job->handle_call = thunar_thumbnailer_proxy_queue_async (thumbnailer->thumbnailer_proxy, - (const gchar **)uris, mime_hints, - "normal", "foreground", 0, - thunar_thumbnailer_queue_async_reply, - job); - - /* return the request ID used for this request */ - return request_no; -} - - - static void thunar_thumbnailer_idle (ThunarThumbnailer *thumbnailer, guint handle, @@ -695,6 +839,8 @@ thunar_thumbnailer_idle (ThunarThumbnailer *thumbnailer, if (G_UNLIKELY (uris == NULL)) return; + _thumbnailer_lock (thumbnailer); + /* look for the job so we don't emit unknown handles, the reason * we do this is when you have multiple windows opened, you don't * want each window (because they all have a connection to the @@ -715,9 +861,7 @@ thunar_thumbnailer_idle (ThunarThumbnailer *thumbnailer, idle->uris = g_strdupv ((gchar **)uris); /* remember the idle struct because we might have to remove it in finalize() */ - _thumbnailer_lock (thumbnailer); thumbnailer->idles = g_slist_prepend (thumbnailer->idles, idle); - _thumbnailer_unlock (thumbnailer); /* call the idle function when we have the time */ idle->id = g_idle_add_full (G_PRIORITY_LOW, @@ -727,6 +871,8 @@ thunar_thumbnailer_idle (ThunarThumbnailer *thumbnailer, break; } } + + _thumbnailer_unlock (thumbnailer); } @@ -802,7 +948,6 @@ thunar_thumbnailer_idle_free (gpointer data) /* free the struct */ g_slice_free (ThunarThumbnailerIdle, idle); } -#endif /* HAVE_DBUS */ @@ -827,12 +972,8 @@ thunar_thumbnailer_get (void) thumbnailer = g_object_new (THUNAR_TYPE_THUMBNAILER, NULL); g_object_add_weak_pointer (G_OBJECT (thumbnailer), (gpointer) &thumbnailer); } - else - { - g_object_ref (G_OBJECT (thumbnailer)); - } - return thumbnailer; + return g_object_ref_sink (thumbnailer); } @@ -865,126 +1006,35 @@ thunar_thumbnailer_queue_files (ThunarThumbnailer *thumbnailer, guint *request) { gboolean success = FALSE; -#ifdef HAVE_DBUS - const gchar **mime_hints; - gchar **uris; - GList *lp; - GList *supported_files = NULL; - guint n; - guint n_items = 0; - ThunarFileThumbState thumb_state; - const gchar *thumbnail_path; -#endif + ThunarThumbnailerJob *job = NULL; _thunar_return_val_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer), FALSE); _thunar_return_val_if_fail (files != NULL, FALSE); -#ifdef HAVE_DBUS /* acquire the thumbnailer lock */ _thumbnailer_lock (thumbnailer); - if (thumbnailer->thumbnailer_proxy == NULL) + /* allocate a job */ + job = g_slice_new0 (ThunarThumbnailerJob); + job->thumbnailer = thumbnailer; + job->files = g_list_copy_deep (files, (GCopyFunc)g_object_ref, NULL); + job->lazy_checks = lazy_checks ? 1 : 0; + + success = thunar_thumbnailer_begin_job (thumbnailer, job); + if (success) { - /* release the lock and abort */ - _thumbnailer_unlock (thumbnailer); - return FALSE; + thumbnailer->jobs = g_slist_prepend (thumbnailer->jobs, job); + if (*request) + *request = job->request; } - - /* make sure there is a hash table with supported files */ - thunar_thumbnailer_get_supported_types (thumbnailer); - - /* collect all supported files from the list that are neither in the - * about to be queued (wait queue), nor already queued, nor already - * processed (and awaiting to be refreshed) */ - for (lp = files; lp != NULL; lp = lp->next) + else { - /* the icon factory only loads icons for regular files */ - if (!thunar_file_is_regular (lp->data)) - { - thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_NONE); - continue; - } - - /* get the current thumb state */ - thumb_state = thunar_file_get_thumb_state (lp->data); - - if (lazy_checks) - { - /* in lazy mode, don't both for files that have already - * been loaded or are not supported */ - if (thumb_state == THUNAR_FILE_THUMB_STATE_NONE - || thumb_state == THUNAR_FILE_THUMB_STATE_READY) - continue; - } - - /* check if the file is supported, assume it is when the state was ready previously */ - if (thumb_state == THUNAR_FILE_THUMB_STATE_READY - || thunar_thumbnailer_file_is_supported (thumbnailer, lp->data)) - { - supported_files = g_list_prepend (supported_files, lp->data); - n_items++; - } - else - { - /* still a regular file, but the type is now known to tumbler but - * maybe the application created a thumbnail */ - thumbnail_path = thunar_file_get_thumbnail_path (lp->data); - - /* test if a thumbnail can be found */ - if (thumbnail_path != NULL && g_file_test (thumbnail_path, G_FILE_TEST_EXISTS)) - thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_READY); - else - thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_NONE); - } + thunar_thumbnailer_free_job (job); } - /* release the thumbnailer lock */ + /* release the lock */ _thumbnailer_unlock (thumbnailer); - /* check if we have any supported files */ - if (n_items > 0) - { - /* allocate arrays for URIs and mime hints */ - uris = g_new0 (gchar *, n_items + 1); - mime_hints = g_new0 (const gchar *, n_items + 1); - - /* fill URI and MIME hint arrays with items from the wait queue */ - for (lp = supported_files, n = 0; lp != NULL; lp = lp->next, ++n) - { - /* set the thumbnail state to loading */ - thunar_file_set_thumb_state (lp->data, THUNAR_FILE_THUMB_STATE_LOADING); - - /* save URI and MIME hint in the arrays */ - uris[n] = thunar_file_dup_uri (lp->data); - mime_hints[n] = thunar_file_get_content_type (lp->data); - } - - /* NULL-terminate both arrays */ - uris[n] = NULL; - mime_hints[n] = NULL; - - _thumbnailer_lock (thumbnailer); - - /* queue a thumbnail request for the URIs from the wait queue */ - if (request != NULL) - *request = thunar_thumbnailer_queue_async (thumbnailer, uris, mime_hints); - else - thunar_thumbnailer_queue_async (thumbnailer, uris, mime_hints); - - _thumbnailer_unlock (thumbnailer); - - /* free mime hints array */ - g_free (mime_hints); - g_strfreev (uris); - - /* free the list of supported files */ - g_list_free (supported_files); - - /* we assume success if we've come so far */ - success = TRUE; - } -#endif /* HAVE_DBUS */ - return success; } @@ -994,14 +1044,11 @@ void thunar_thumbnailer_dequeue (ThunarThumbnailer *thumbnailer, guint request) { -#ifdef HAVE_DBUS ThunarThumbnailerJob *job; GSList *lp; -#endif _thunar_return_if_fail (THUNAR_IS_THUMBNAILER (thumbnailer)); -#ifdef HAVE_DBUS /* acquire the thumbnailer lock */ _thumbnailer_lock (thumbnailer); @@ -1017,13 +1064,10 @@ thunar_thumbnailer_dequeue (ThunarThumbnailer *thumbnailer, if (job->handle != 0) { - /* dequeue the tumbler request */ - if (thumbnailer->thumbnailer_proxy != NULL) - thunar_thumbnailer_proxy_dequeue (thumbnailer->thumbnailer_proxy, job->handle, NULL); - /* remove job */ thumbnailer->jobs = g_slist_delete_link (thumbnailer->jobs, lp); - g_slice_free (ThunarThumbnailerJob, job); + + thunar_thumbnailer_free_job (job); } break; @@ -1032,5 +1076,4 @@ thunar_thumbnailer_dequeue (ThunarThumbnailer *thumbnailer, /* release the thumbnailer lock */ _thumbnailer_unlock (thumbnailer); -#endif }