diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-07-09 21:12:13 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-07-13 15:32:36 -0400 |
commit | 69bdea2a55b976322c9583eafcd51468ef953a30 (patch) | |
tree | a9943ee543731851d51aa8a369829fb42f177b33 /common | |
parent | 89d6253b08ae993dd23004c8c8f7f9ac4b7d1a2e (diff) | |
download | gvfs-69bdea2a55b976322c9583eafcd51468ef953a30.tar.gz |
common: add support show-unmount-progress signal to GMountOperationDBus
https://bugzilla.gnome.org/show_bug.cgi?id=676111
Diffstat (limited to 'common')
-rw-r--r-- | common/gmountoperationdbus.c | 49 | ||||
-rw-r--r-- | common/gmountsource.c | 61 | ||||
-rw-r--r-- | common/gmountsource.h | 5 | ||||
-rw-r--r-- | common/gvfsdaemonprotocol.h | 1 |
4 files changed, 116 insertions, 0 deletions
diff --git a/common/gmountoperationdbus.c b/common/gmountoperationdbus.c index b192b7e0..c5e251e2 100644 --- a/common/gmountoperationdbus.c +++ b/common/gmountoperationdbus.c @@ -53,6 +53,8 @@ static void mount_op_ask_question (GMountOperationDBus *op_d DBusMessage *message); static void mount_op_show_processes (GMountOperationDBus *op_dbus, DBusMessage *message); +static void mount_op_show_unmount_progress (GMountOperationDBus *op_dbus, + DBusMessage *message); static void mount_op_aborted (GMountOperationDBus *op_dbus, DBusMessage *message); @@ -140,6 +142,10 @@ mount_op_message_function (DBusConnection *connection, G_VFS_DBUS_MOUNT_OPERATION_OP_SHOW_PROCESSES)) mount_op_show_processes (op_dbus, message); else if (dbus_message_is_method_call (message, + G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, + G_VFS_DBUS_MOUNT_OPERATION_OP_SHOW_UNMOUNT_PROGRESS)) + mount_op_show_unmount_progress (op_dbus, message); + else if (dbus_message_is_method_call (message, G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, G_VFS_DBUS_MOUNT_OPERATION_OP_ABORTED)) mount_op_aborted (op_dbus, message); @@ -407,6 +413,49 @@ mount_op_show_processes (GMountOperationDBus *op_dbus, } static void +mount_op_show_unmount_progress (GMountOperationDBus *op_dbus, + DBusMessage *message) +{ + const gchar *message_string; + guint64 time_left, bytes_left; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + reply = NULL; + + dbus_message_iter_init (message, &iter); + dbus_error_init (&error); + if (!_g_dbus_message_iter_get_args (&iter, + &error, + DBUS_TYPE_STRING, &message_string, + DBUS_TYPE_UINT64, &time_left, + DBUS_TYPE_UINT64, &bytes_left, + 0)) + { + reply = dbus_message_new_error (message, error.name, error.message); + if (reply == NULL) + _g_dbus_oom (); + if (!dbus_connection_send (op_dbus->connection, reply, NULL)) + _g_dbus_oom (); + dbus_message_unref (reply); + dbus_error_free (&error); + return; + } + + reply = dbus_message_new_method_return (message); + if (reply == NULL) + _g_dbus_oom (); + + g_signal_emit_by_name (op_dbus->op, "show-unmount-progress", + message_string, + time_left, + bytes_left); + + mount_op_send_reply (op_dbus, reply); +} + +static void mount_op_aborted (GMountOperationDBus *op_dbus, DBusMessage *message) { diff --git a/common/gmountsource.c b/common/gmountsource.c index cf567fcb..da1b1c7f 100644 --- a/common/gmountsource.c +++ b/common/gmountsource.c @@ -931,6 +931,66 @@ op_show_processes (GMountOperation *op, return TRUE; } +/* the callback from dbus -> main thread */ +static void +show_unmount_progress_reply (DBusMessage *reply, + GError *error, + gpointer _data) +{ + if (error != NULL) + g_warning ("ShowUnmountProgress request failed: %s", error->message); +} + +void +g_mount_source_show_unmount_progress (GMountSource *source, + const char *message_string, + guint64 time_left, + guint64 bytes_left) +{ + DBusMessage *message; + + /* If no dbus id specified, warn and return */ + if (source->dbus_id[0] == 0) + { + g_warning ("No dbus id specified in the mount source, " + "ignoring show-unmount-progress request"); + return; + } + + if (message_string == NULL) + message_string = ""; + + message = dbus_message_new_method_call (source->dbus_id, + source->obj_path, + G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, + G_VFS_DBUS_MOUNT_OPERATION_OP_SHOW_UNMOUNT_PROGRESS); + + _g_dbus_message_append_args (message, + DBUS_TYPE_STRING, &message_string, + DBUS_TYPE_UINT64, &time_left, + DBUS_TYPE_UINT64, &bytes_left, + 0); + + /* 30 minute timeout */ + _g_dbus_connection_call_async (NULL, message, 1000 * 60 * 30, + show_unmount_progress_reply, NULL); + dbus_message_unref (message); +} + +static void +op_show_unmount_progress (GMountOperation *op, + const char *message, + guint64 time_left, + guint64 bytes_left, + GMountSource *mount_source) +{ + g_mount_source_show_unmount_progress (mount_source, + message, + time_left, + bytes_left); + g_signal_stop_emission_by_name (op, "show_unmount_progress"); +} + gboolean g_mount_source_abort (GMountSource *source) { @@ -993,6 +1053,7 @@ g_mount_source_get_operation (GMountSource *mount_source) g_signal_connect (op, "ask_password", (GCallback)op_ask_password, mount_source); g_signal_connect (op, "ask_question", (GCallback)op_ask_question, mount_source); g_signal_connect (op, "show_processes", (GCallback)op_show_processes, mount_source); + g_signal_connect (op, "show_unmount_progress", (GCallback)op_show_unmount_progress, mount_source); g_signal_connect (op, "aborted", (GCallback)op_aborted, mount_source); return op; diff --git a/common/gmountsource.h b/common/gmountsource.h index 1f973a10..6a1d2e02 100644 --- a/common/gmountsource.h +++ b/common/gmountsource.h @@ -125,6 +125,11 @@ gboolean g_mount_source_show_processes_finish (GMountSource gboolean *aborted, gint *choice_out); +void g_mount_source_show_unmount_progress (GMountSource *mount_source, + const char *message, + guint64 time_left, + guint64 bytes_left); + gboolean g_mount_source_abort (GMountSource *source); gboolean g_mount_source_is_dummy (GMountSource *source); diff --git a/common/gvfsdaemonprotocol.h b/common/gvfsdaemonprotocol.h index 98779f72..b5d47205 100644 --- a/common/gvfsdaemonprotocol.h +++ b/common/gvfsdaemonprotocol.h @@ -77,6 +77,7 @@ G_BEGIN_DECLS #define G_VFS_DBUS_MOUNT_OPERATION_OP_ASK_PASSWORD "askPassword" #define G_VFS_DBUS_MOUNT_OPERATION_OP_ASK_QUESTION "askQuestion" #define G_VFS_DBUS_MOUNT_OPERATION_OP_SHOW_PROCESSES "showProcesses" +#define G_VFS_DBUS_MOUNT_OPERATION_OP_SHOW_UNMOUNT_PROGRESS "showUnmountProgress" #define G_VFS_DBUS_MOUNT_OPERATION_OP_ABORTED "aborted" /* Implemented by the spawner of a process, the spawned process sends the |