diff options
Diffstat (limited to 'common/gmountoperationdbus.c')
-rw-r--r-- | common/gmountoperationdbus.c | 324 |
1 files changed, 0 insertions, 324 deletions
diff --git a/common/gmountoperationdbus.c b/common/gmountoperationdbus.c deleted file mode 100644 index 1027b3a9..00000000 --- a/common/gmountoperationdbus.c +++ /dev/null @@ -1,324 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2006-2007 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, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Alexander Larsson <alexl@redhat.com> - */ - -#include <config.h> - -#include <string.h> - -#include <dbus/dbus.h> - -#define I_(string) g_intern_static_string (string) - -#include <gio/gio.h> -#include "gmountoperationdbus.h" -#include "gvfsdaemonprotocol.h" -#include "gdbusutils.h" -#include <glib/gi18n-lib.h> - -typedef struct -{ - GMountOperation *op; - char *obj_path; - char *dbus_id; - DBusConnection *connection; -} GMountOperationDBus; - -static DBusHandlerResult mount_op_message_function (DBusConnection *connection, - DBusMessage *message, - void *user_data); -static void mount_op_unregister_function (DBusConnection *connection, - void *user_data); -static void mount_op_ask_password (GMountOperationDBus *op_dbus, - DBusMessage *message); -static void mount_op_ask_question (GMountOperationDBus *op_dbus, - DBusMessage *message); - -static void -g_mount_operation_dbus_free (GMountOperationDBus *op_dbus) -{ - if (op_dbus->connection) - { - dbus_connection_unregister_object_path (op_dbus->connection, - op_dbus->obj_path); - dbus_connection_unref (op_dbus->connection); - } - g_free (op_dbus->dbus_id); - g_free (op_dbus->obj_path); - g_free (op_dbus); -} - -GMountSource * -g_mount_operation_dbus_wrap (GMountOperation *op, - DBusConnection *connection) -{ - GMountOperationDBus *op_dbus; - static int mount_id = 0; - DBusObjectPathVTable mount_vtable = { - mount_op_unregister_function, - mount_op_message_function - }; - - if (op == NULL) - return g_mount_source_new_dummy (); - - op_dbus = g_new0 (GMountOperationDBus, 1); - - op_dbus->op = op; - op_dbus->connection = dbus_connection_ref (connection); - op_dbus->obj_path = g_strdup_printf ("/org/gtk/gvfs/mountop/%d", mount_id++); - if (op_dbus->connection) - { - op_dbus->dbus_id = g_strdup (dbus_bus_get_unique_name (op_dbus->connection)); - if (!dbus_connection_register_object_path (op_dbus->connection, - op_dbus->obj_path, - &mount_vtable, - op_dbus)) - _g_dbus_oom (); - } - - g_object_set_data_full (G_OBJECT (op), "dbus-op", - op_dbus, (GDestroyNotify)g_mount_operation_dbus_free); - - return g_mount_source_new (op_dbus->dbus_id, op_dbus->obj_path); -} - -/** - * Called when a #DBusObjectPathVTable is unregistered (or its connection is freed). - * Found in #DBusObjectPathVTable. - */ -static void -mount_op_unregister_function (DBusConnection *connection, - void *user_data) -{ -} - -/** - * Called when a message is sent to a registered object path. Found in - * #DBusObjectPathVTable which is registered with dbus_connection_register_object_path() - * or dbus_connection_register_fallback(). - */ -static DBusHandlerResult -mount_op_message_function (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - GMountOperationDBus *op_dbus = user_data; - - if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, - G_VFS_DBUS_MOUNT_OPERATION_OP_ASK_PASSWORD)) - mount_op_ask_password (op_dbus, message); - else if (dbus_message_is_method_call (message, - G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, - G_VFS_DBUS_MOUNT_OPERATION_OP_ASK_QUESTION)) - mount_op_ask_question (op_dbus, message); - else - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static void -mount_op_send_reply (GMountOperationDBus *op_dbus, - DBusMessage *reply) -{ - if (!dbus_connection_send (op_dbus->connection, reply, NULL)) - _g_dbus_oom (); - - g_signal_handlers_disconnect_matched (op_dbus->op, - G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA, - g_signal_lookup ("reply", G_TYPE_MOUNT_OPERATION), - 0, - NULL, - NULL, - reply); - dbus_message_unref (reply); -} - -static void -ask_password_reply (GMountOperation *op, - GMountOperationResult result, - gpointer data) -{ - DBusMessage *reply = data; - const char *username, *password, *domain; - dbus_bool_t anonymous; - guint32 password_save; - 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); - - password = g_mount_operation_get_password (op); - if (password == NULL) - password = ""; - username = g_mount_operation_get_username (op); - if (username == NULL) - username = ""; - domain = g_mount_operation_get_domain (op); - if (domain == NULL) - domain = ""; - anonymous = g_mount_operation_get_anonymous (op); - password_save = g_mount_operation_get_password_save (op); - - _g_dbus_message_append_args (reply, - DBUS_TYPE_BOOLEAN, &handled, - DBUS_TYPE_BOOLEAN, &abort_dbus, - DBUS_TYPE_STRING, &password, - DBUS_TYPE_STRING, &username, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_BOOLEAN, &anonymous, - DBUS_TYPE_UINT32, &password_save, - 0); - - mount_op_send_reply (op_dbus, reply); -} - -static void -mount_op_ask_password (GMountOperationDBus *op_dbus, - DBusMessage *message) -{ - const char *message_string, *default_user, *default_domain; - guint32 flags; - DBusMessageIter iter; - DBusMessage *reply; - 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_STRING, &default_user, - DBUS_TYPE_STRING, &default_domain, - DBUS_TYPE_UINT32, &flags, - 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_connect (op_dbus->op, "reply", (GCallback)ask_password_reply, reply); - - g_signal_emit_by_name (op_dbus->op, "ask_password", - message_string, - default_user, - default_domain, - flags); -} - -static void -ask_question_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_ask_question (GMountOperationDBus *op_dbus, - DBusMessage *message) -{ - const char *message_string; - char **choices; - int num_choices; - dbus_bool_t handled = FALSE; - DBusMessage *reply; - DBusError error; - gboolean res; - DBusMessageIter iter; - - 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, - 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_connect (op_dbus->op, "reply", (GCallback)ask_question_reply, reply); - - g_signal_emit_by_name (op_dbus->op, "ask_question", - message_string, - choices, - &res); - if (!res) - { - _g_dbus_message_append_args (reply, - DBUS_TYPE_BOOLEAN, &handled, - 0); - mount_op_send_reply (op_dbus, reply); - } - - dbus_free_string_array (choices); -} |