[nautilus/wip/muktupavels/delete: 3/4] dbus-manager: add and implement FileOperations2 interface
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/muktupavels/delete: 3/4] dbus-manager: add and implement FileOperations2 interface
- Date: Wed, 18 Dec 2019 22:28:24 +0000 (UTC)
commit 23644d17ca3ce88334191b4cd309b7aa91373433
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Thu Dec 19 00:10:18 2019 +0200
dbus-manager: add and implement FileOperations2 interface
https://gitlab.gnome.org/GNOME/nautilus/merge_requests/504
data/dbus-interfaces2.xml | 60 +++++++
src/meson.build | 8 +
src/nautilus-dbus-manager.c | 377 ++++++++++++++++++++++++++++++++++++++++----
3 files changed, 412 insertions(+), 33 deletions(-)
---
diff --git a/data/dbus-interfaces2.xml b/data/dbus-interfaces2.xml
new file mode 100644
index 000000000..2b09c4ece
--- /dev/null
+++ b/data/dbus-interfaces2.xml
@@ -0,0 +1,60 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ Copyright (C) 2011 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+ Author: Alexander Larsson <alexl redhat com>
+-->
+
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name='org.gnome.Nautilus.FileOperations2'>
+ <method name='CopyURIs'>
+ <arg type='as' name='SourceFilesURIList' direction='in'/>
+ <arg type='s' name='DestinationDirectoryURI' direction='in'/>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='MoveURIs'>
+ <arg type='as' name='SourceFilesURIList' direction='in'/>
+ <arg type='s' name='DestinationDirectoryURI' direction='in'/>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='EmptyTrash'>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='TrashFiles'>
+ <arg type='as' name='URIs' direction='in'/>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='CreateFolder'>
+ <arg type='s' name='URI' direction='in'/>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='RenameFile'>
+ <arg type='s' name='URI' direction='in'/>
+ <arg type='s' name='NewName' direction='in'/>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='Undo'>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <method name='Redo'>
+ <arg type='a{sv}' name='Parameters' direction='in'/>
+ </method>
+ <property name="UndoStatus" type="i" access="read"/>
+ </interface>
+</node>
diff --git a/src/meson.build b/src/meson.build
index 86d062161..1fb7d2dde 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -37,6 +37,14 @@ libnautilus_sources = [
interface_prefix: 'org.gnome.Nautilus',
namespace: 'NautilusDBus'
),
+ gnome.gdbus_codegen(
+ 'nautilus-generated2',
+ join_paths(
+ meson.source_root(), 'data', 'dbus-interfaces2.xml'
+ ),
+ interface_prefix: 'org.gnome.Nautilus',
+ namespace: 'NautilusDBus'
+ ),
gnome.gdbus_codegen(
'nautilus-shell-search-provider-generated',
join_paths(
diff --git a/src/nautilus-dbus-manager.c b/src/nautilus-dbus-manager.c
index e0075d94b..eb43c1b8a 100644
--- a/src/nautilus-dbus-manager.c
+++ b/src/nautilus-dbus-manager.c
@@ -24,6 +24,7 @@
#include "nautilus-dbus-manager.h"
#include "nautilus-generated.h"
+#include "nautilus-generated2.h"
#include "nautilus-file-operations.h"
#include "nautilus-file-undo-manager.h"
@@ -37,6 +38,7 @@ struct _NautilusDBusManager
GObject parent;
NautilusDBusFileOperations *file_operations;
+ NautilusDBusFileOperations2 *file_operations2;
};
G_DEFINE_TYPE (NautilusDBusManager, nautilus_dbus_manager, G_TYPE_OBJECT);
@@ -52,6 +54,12 @@ nautilus_dbus_manager_dispose (GObject *object)
self->file_operations = NULL;
}
+ if (self->file_operations2)
+ {
+ g_object_unref (self->file_operations2);
+ self->file_operations2 = NULL;
+ }
+
G_OBJECT_CLASS (nautilus_dbus_manager_parent_class)->dispose (object);
}
@@ -67,9 +75,9 @@ undo_redo_on_finished (gpointer user_data)
g_free (handler_id);
}
-static gboolean
-handle_redo (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation)
+static void
+redo (const char *parent_handle,
+ guint32 timestamp)
{
NautilusFileUndoManager *undo_manager = NULL;
gint *handler_id = g_new0(int, 1);
@@ -80,15 +88,45 @@ handle_redo (NautilusDBusFileOperations *object,
*handler_id = g_signal_connect_swapped (undo_manager, "undo-changed",
G_CALLBACK (undo_redo_on_finished),
handler_id);
- nautilus_file_undo_manager_redo (NULL, NULL, 0);
+ nautilus_file_undo_manager_redo (NULL, parent_handle, timestamp);
+}
+
+static gboolean
+handle_redo (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation)
+{
+ redo (NULL, 0);
nautilus_dbus_file_operations_complete_redo (object, invocation);
return TRUE; /* invocation was handled */
}
static gboolean
-handle_undo (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation)
+handle_redo2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ redo (parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_redo (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
+static void
+undo (const char *parent_handle,
+ guint32 timestamp)
{
NautilusFileUndoManager *undo_manager = NULL;
gint *handler_id = g_new0(int, 1);
@@ -99,12 +137,42 @@ handle_undo (NautilusDBusFileOperations *object,
*handler_id = g_signal_connect_swapped (undo_manager, "undo-changed",
G_CALLBACK (undo_redo_on_finished),
handler_id);
- nautilus_file_undo_manager_undo (NULL, NULL, 0);
+ nautilus_file_undo_manager_undo (NULL, parent_handle, timestamp);
+}
+
+static gboolean
+handle_undo (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation)
+{
+ undo (NULL, 0);
nautilus_dbus_file_operations_complete_undo (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_undo2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ undo (parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_undo (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
static void
create_folder_on_finished (GFile *new_file,
gboolean success,
@@ -113,10 +181,10 @@ create_folder_on_finished (GFile *new_file,
g_application_release (g_application_get_default ());
}
-static gboolean
-handle_create_folder (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation,
- const gchar *uri)
+static void
+create_folder (const char *uri,
+ const char *parent_handle,
+ guint32 timestamp)
{
g_autoptr (GFile) file = NULL;
g_autoptr (GFile) parent_file = NULL;
@@ -129,14 +197,46 @@ handle_create_folder (NautilusDBusFileOperations *object,
parent_file_uri = g_file_get_uri (parent_file);
g_application_hold (g_application_get_default ());
- nautilus_file_operations_new_folder (NULL, NULL, 0,
+ nautilus_file_operations_new_folder (NULL, parent_handle, timestamp,
parent_file_uri, basename,
create_folder_on_finished, NULL);
+}
+
+static gboolean
+handle_create_folder (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *uri)
+{
+ create_folder (uri, NULL, 0);
nautilus_dbus_file_operations_complete_create_folder (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_create_folder2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *uri,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ create_folder (uri, parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_create_folder (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
static void
copy_move_on_finished (GHashTable *debutting_uris,
gboolean success,
@@ -145,11 +245,11 @@ copy_move_on_finished (GHashTable *debutting_uris,
g_application_release (g_application_get_default ());
}
-static gboolean
-handle_copy_uris (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation,
- const gchar **sources,
- const gchar *destination)
+static void
+copy_uris (const char **sources,
+ const char *destination,
+ const char *parent_handle,
+ guint32 timestamp)
{
GList *source_files = NULL;
gint idx;
@@ -165,15 +265,50 @@ handle_copy_uris (NautilusDBusFileOperations *object,
copy_move_on_finished, NULL);
g_list_free_full (source_files, g_free);
- nautilus_dbus_file_operations_complete_copy_uris (object, invocation);
- return TRUE; /* invocation was handled */
}
static gboolean
-handle_move_uris (NautilusDBusFileOperations *object,
+handle_copy_uris (NautilusDBusFileOperations *object,
GDBusMethodInvocation *invocation,
const gchar **sources,
const gchar *destination)
+{
+ copy_uris (sources, destination, NULL, 0);
+
+ nautilus_dbus_file_operations_complete_copy_uris (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
+static gboolean
+handle_copy_uris2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources,
+ const gchar *destination,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ copy_uris (sources, destination, parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_copy_uris (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
+static void
+move_uris (const char **sources,
+ const char *destination,
+ const char *parent_handle,
+ guint32 timestamp)
{
GList *source_files = NULL;
gint idx;
@@ -189,21 +324,86 @@ handle_move_uris (NautilusDBusFileOperations *object,
copy_move_on_finished, NULL);
g_list_free_full (source_files, g_free);
+}
+
+static gboolean
+handle_move_uris (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources,
+ const gchar *destination)
+{
+ move_uris (sources, destination, NULL, 0);
+
nautilus_dbus_file_operations_complete_copy_uris (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_move_uris2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources,
+ const gchar *destination,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ move_uris (sources, destination, parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_copy_uris (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
/* FIXME: Needs a callback for maintaining alive the application */
+static void
+empty_trash (const char *parent_handle,
+ guint32 timestamp)
+{
+ nautilus_file_operations_empty_trash (NULL, NULL, 0);
+}
+
static gboolean
handle_empty_trash (NautilusDBusFileOperations *object,
GDBusMethodInvocation *invocation)
{
- nautilus_file_operations_empty_trash (NULL, NULL, 0);
+ empty_trash (NULL, 0);
nautilus_dbus_file_operations_complete_empty_trash (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_empty_trash2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ empty_trash (parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_empty_trash (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
static void
trash_on_finished (GHashTable *debutting_uris,
gboolean user_cancel,
@@ -212,10 +412,10 @@ trash_on_finished (GHashTable *debutting_uris,
g_application_release (g_application_get_default ());
}
-static gboolean
-handle_trash_files (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation,
- const gchar **sources)
+static void
+trash_files (const char **sources,
+ const char *parent_handle,
+ guint32 timestamp)
{
g_autolist (GFile) source_files = NULL;
gint idx;
@@ -227,13 +427,46 @@ handle_trash_files (NautilusDBusFileOperations *object,
}
g_application_hold (g_application_get_default ());
- nautilus_file_operations_trash_or_delete_async (source_files, NULL, NULL, 0,
+ nautilus_file_operations_trash_or_delete_async (source_files, NULL,
+ parent_handle, timestamp,
trash_on_finished, NULL);
+}
+
+static gboolean
+handle_trash_files (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources)
+{
+ trash_files (sources, NULL, 0);
nautilus_dbus_file_operations_complete_trash_files (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_trash_files2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ const gchar **sources,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ trash_files (sources, parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_trash_files (object, invocation);
+ return TRUE; /* invocation was handled */
+}
+
static void
rename_file_on_finished (NautilusFile *file,
GFile *result_location,
@@ -243,11 +476,11 @@ rename_file_on_finished (NautilusFile *file,
g_application_release (g_application_get_default ());
}
-static gboolean
-handle_rename_file (NautilusDBusFileOperations *object,
- GDBusMethodInvocation *invocation,
- const gchar *uri,
- const gchar *new_name)
+static void
+rename_file (const gchar *uri,
+ const gchar *new_name,
+ const char *parent_handle,
+ guint32 timestamp)
{
NautilusFile *file = NULL;
@@ -256,12 +489,46 @@ handle_rename_file (NautilusDBusFileOperations *object,
g_application_hold (g_application_get_default ());
nautilus_file_rename (file, new_name,
rename_file_on_finished, NULL);
+}
+
+static gboolean
+handle_rename_file (NautilusDBusFileOperations *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *uri,
+ const gchar *new_name)
+{
+ rename_file (uri, new_name, NULL, 0);
nautilus_dbus_file_operations_complete_rename_file (object, invocation);
return TRUE; /* invocation was handled */
}
+static gboolean
+handle_rename_file2 (NautilusDBusFileOperations2 *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *uri,
+ const gchar *new_name,
+ GVariant *parameters)
+{
+ GVariantDict dict;
+ const char *parent_handle;
+ guint32 timestamp;
+
+ g_variant_dict_init (&dict, parameters);
+
+ if (!g_variant_dict_lookup (&dict, "parent-handle", "&s", &parent_handle))
+ parent_handle = NULL;
+
+ if (!g_variant_dict_lookup (&dict, "timestamp", "u", ×tamp))
+ timestamp = 0;
+
+ rename_file (uri, new_name, parent_handle, timestamp);
+
+ nautilus_dbus_file_operations2_complete_rename_file (object, invocation);
+
+ return TRUE; /* invocation was handled */
+}
static void
undo_manager_changed (NautilusDBusManager *self)
@@ -271,45 +538,80 @@ undo_manager_changed (NautilusDBusManager *self)
undo_state = nautilus_file_undo_manager_get_state ();
nautilus_dbus_file_operations_set_undo_status (self->file_operations,
undo_state);
+ nautilus_dbus_file_operations2_set_undo_status (self->file_operations2,
+ undo_state);
}
static void
nautilus_dbus_manager_init (NautilusDBusManager *self)
{
self->file_operations = nautilus_dbus_file_operations_skeleton_new ();
+ self->file_operations2 = nautilus_dbus_file_operations2_skeleton_new ();
g_signal_connect (self->file_operations,
"handle-copy-uris",
G_CALLBACK (handle_copy_uris),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-copy-uris",
+ G_CALLBACK (handle_copy_uris2),
+ self);
g_signal_connect (self->file_operations,
"handle-move-uris",
G_CALLBACK (handle_move_uris),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-move-uris",
+ G_CALLBACK (handle_move_uris2),
+ self);
g_signal_connect (self->file_operations,
"handle-empty-trash",
G_CALLBACK (handle_empty_trash),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-empty-trash",
+ G_CALLBACK (handle_empty_trash2),
+ self);
g_signal_connect (self->file_operations,
"handle-trash-files",
G_CALLBACK (handle_trash_files),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-trash-files",
+ G_CALLBACK (handle_trash_files2),
+ self);
g_signal_connect (self->file_operations,
"handle-create-folder",
G_CALLBACK (handle_create_folder),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-create-folder",
+ G_CALLBACK (handle_create_folder2),
+ self);
g_signal_connect (self->file_operations,
"handle-rename-file",
G_CALLBACK (handle_rename_file),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-rename-file",
+ G_CALLBACK (handle_rename_file2),
+ self);
g_signal_connect (self->file_operations,
"handle-undo",
G_CALLBACK (handle_undo),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-undo",
+ G_CALLBACK (handle_undo2),
+ self);
g_signal_connect (self->file_operations,
"handle-redo",
G_CALLBACK (handle_redo),
self);
+ g_signal_connect (self->file_operations2,
+ "handle-redo",
+ G_CALLBACK (handle_redo2),
+ self);
}
static void
@@ -331,10 +633,18 @@ nautilus_dbus_manager_register (NautilusDBusManager *self,
GDBusConnection *connection,
GError **error)
{
+ gboolean succes1;
+ gboolean succes2;
gboolean succes;
- succes = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations),
- connection, "/org/gnome/Nautilus" PROFILE, error);
+ succes1 = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations),
+ connection, "/org/gnome/Nautilus" PROFILE, error);
+
+ succes2 = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations2),
+ connection, "/org/gnome/Nautilus" PROFILE, error);
+
+ succes = succes1 && succes2;
+
if (succes)
{
g_signal_connect_object (nautilus_file_undo_manager_get (),
@@ -353,6 +663,7 @@ void
nautilus_dbus_manager_unregister (NautilusDBusManager *self)
{
g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->file_operations));
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->file_operations2));
g_signal_handlers_disconnect_by_data (nautilus_file_undo_manager_get (), self);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]