summaryrefslogtreecommitdiff
path: root/common/gmountoperationdbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/gmountoperationdbus.c')
-rw-r--r--common/gmountoperationdbus.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/common/gmountoperationdbus.c b/common/gmountoperationdbus.c
index b8ac4f7d..9122042e 100644
--- a/common/gmountoperationdbus.c
+++ b/common/gmountoperationdbus.c
@@ -51,6 +51,8 @@ static void mount_op_ask_password (GMountOperationDBus *op_d
DBusMessage *message);
static void mount_op_ask_question (GMountOperationDBus *op_dbus,
DBusMessage *message);
+static void mount_op_show_processes (GMountOperationDBus *op_dbus,
+ DBusMessage *message);
static void mount_op_aborted (GMountOperationDBus *op_dbus,
DBusMessage *message);
@@ -135,6 +137,10 @@ mount_op_message_function (DBusConnection *connection,
mount_op_ask_question (op_dbus, message);
else if (dbus_message_is_method_call (message,
G_VFS_DBUS_MOUNT_OPERATION_INTERFACE,
+ 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_ABORTED))
mount_op_aborted (op_dbus, message);
else
@@ -320,8 +326,91 @@ mount_op_ask_question (GMountOperationDBus *op_dbus,
}
static void
+show_processes_reply (GMountOperation *op,
+ GMountOperationResult result,
+ gpointer data)
+{
+ DBusMessage *reply = data;
+ guint32 choice;
+ dbus_bool_t handled, abort_dbus;
+ GMountOperationDBus *op_dbus;
+
+ op_dbus = g_object_get_data (G_OBJECT (op), "dbus-op");
+
+ handled = (result != G_MOUNT_OPERATION_UNHANDLED);
+ abort_dbus = (result == G_MOUNT_OPERATION_ABORTED);
+
+ choice = g_mount_operation_get_choice (op);
+
+ _g_dbus_message_append_args (reply,
+ DBUS_TYPE_BOOLEAN, &handled,
+ DBUS_TYPE_BOOLEAN, &abort_dbus,
+ DBUS_TYPE_UINT32, &choice,
+ 0);
+
+ mount_op_send_reply (op_dbus, reply);
+}
+
+static void
+mount_op_show_processes (GMountOperationDBus *op_dbus,
+ DBusMessage *message)
+{
+ const char *message_string;
+ char **choices;
+ int num_choices;
+ gint32 **process_pids;
+ int num_process_pids;
+ DBusMessage *reply;
+ DBusError error;
+ DBusMessageIter iter;
+ GArray *processes;
+
+ 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_ARRAY, DBUS_TYPE_STRING,
+ &choices, &num_choices,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
+ &process_pids, &num_process_pids,
+ 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;
+ }
+
+ processes = g_array_sized_new (FALSE, FALSE, sizeof (GPid), num_process_pids);
+ g_array_append_vals (processes, process_pids, num_process_pids);
+
+ reply = dbus_message_new_method_return (message);
+ if (reply == NULL)
+ _g_dbus_oom ();
+
+ g_signal_connect (op_dbus->op, "reply", (GCallback)show_processes_reply, reply);
+
+ g_signal_emit_by_name (op_dbus->op, "show_processes",
+ message_string,
+ processes,
+ choices);
+
+ dbus_free_string_array (choices);
+ g_array_unref (processes);
+}
+
+static void
mount_op_aborted (GMountOperationDBus *op_dbus,
DBusMessage *message)
{
+ /* also emit reply to make the all DBus ops return */
+ g_mount_operation_reply (op_dbus->op, G_MOUNT_OPERATION_UNHANDLED);
g_signal_emit_by_name (op_dbus->op, "aborted");
}