diff options
Diffstat (limited to 'gnome-2-24/common/gmountsource.c')
-rw-r--r-- | gnome-2-24/common/gmountsource.c | 716 |
1 files changed, 0 insertions, 716 deletions
diff --git a/gnome-2-24/common/gmountsource.c b/gnome-2-24/common/gmountsource.c deleted file mode 100644 index e801d647..00000000 --- a/gnome-2-24/common/gmountsource.c +++ /dev/null @@ -1,716 +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 <gmountsource.h> -#include <gdbusutils.h> -#include <gio/gio.h> -#include <gvfsdaemonprotocol.h> - -struct _GMountSource -{ - GObject parent_instance; - - char *dbus_id; - char *obj_path; -}; - -G_DEFINE_TYPE (GMountSource, g_mount_source, G_TYPE_OBJECT) - -static void -g_mount_source_finalize (GObject *object) -{ - GMountSource *source; - - source = G_MOUNT_SOURCE (object); - - g_free (source->dbus_id); - g_free (source->obj_path); - - if (G_OBJECT_CLASS (g_mount_source_parent_class)->finalize) - (*G_OBJECT_CLASS (g_mount_source_parent_class)->finalize) (object); -} - -static void -g_mount_source_class_init (GMountSourceClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->finalize = g_mount_source_finalize; -} - -static void -g_mount_source_init (GMountSource *mount_source) -{ -} - -GMountSource * -g_mount_source_new (const char *dbus_id, - const char *obj_path) -{ - GMountSource *source; - - source = g_object_new (G_TYPE_MOUNT_SOURCE, NULL); - - source->dbus_id = g_strdup (dbus_id); - source->obj_path = g_strdup (obj_path); - - return source; -} - -GMountSource * -g_mount_source_new_dummy (void) -{ - GMountSource *source; - - source = g_object_new (G_TYPE_MOUNT_SOURCE, NULL); - - source->dbus_id = g_strdup (""); - source->obj_path = g_strdup ("/"); - - return source; -} - - -void -g_mount_source_to_dbus (GMountSource *source, - DBusMessage *message) -{ - g_assert (source->dbus_id != NULL); - g_assert (source->obj_path != NULL); - - if (!dbus_message_append_args (message, - DBUS_TYPE_STRING, &source->dbus_id, - DBUS_TYPE_OBJECT_PATH, &source->obj_path, - 0)) - _g_dbus_oom (); - -} - -const char * -g_mount_source_get_dbus_id (GMountSource *mount_source) -{ - return mount_source->dbus_id; -} - -const char * -g_mount_source_get_obj_path (GMountSource *mount_source) -{ - return mount_source->obj_path; -} - -typedef struct AskPasswordData AskPasswordData; - -struct AskPasswordData { - - /* results: */ - gboolean aborted; - char *password; - char *username; - char *domain; - GPasswordSave password_save; - gboolean anonymous; -}; - -typedef struct AskSyncData AskSyncData; - -struct AskSyncData { - - /* For sync calls */ - GMutex *mutex; - GCond *cond; - - /* results: */ - GAsyncResult *result; -}; - -static void -ask_password_data_free (gpointer _data) -{ - AskPasswordData *data = (AskPasswordData *) _data; - g_free (data->password); - g_free (data->username); - g_free (data->domain); - g_free (data); -} - -/* the callback from dbus -> main thread */ -static void -ask_password_reply (DBusMessage *reply, - GError *error, - gpointer _data) -{ - GSimpleAsyncResult *result; - AskPasswordData *data; - dbus_bool_t handled, aborted, anonymous; - guint32 password_save; - const char *password, *username, *domain; - DBusMessageIter iter; - - result = G_SIMPLE_ASYNC_RESULT (_data); - handled = TRUE; - - data = g_new0 (AskPasswordData, 1); - g_simple_async_result_set_op_res_gpointer (result, data, ask_password_data_free); - - if (reply == NULL) - { - data->aborted = TRUE; - } - else - { - dbus_message_iter_init (reply, &iter); - if (!_g_dbus_message_iter_get_args (&iter, NULL, - DBUS_TYPE_BOOLEAN, &handled, - DBUS_TYPE_BOOLEAN, &aborted, - DBUS_TYPE_STRING, &password, - DBUS_TYPE_STRING, &username, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_BOOLEAN, &anonymous, - DBUS_TYPE_UINT32, &password_save, - 0)) - data->aborted = TRUE; - else - { - data->aborted = aborted; - - if (!anonymous) - { - data->password = g_strdup (password); - data->username = *username == 0 ? NULL : g_strdup (username); - data->domain = *domain == 0 ? NULL : g_strdup (domain); - } - data->password_save = (GPasswordSave)password_save; - data->anonymous = anonymous; - - /* TODO: handle more args */ - } - } - - if (handled == FALSE) - { - g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED, "Internal Error"); - } - - g_simple_async_result_complete (result); -} - -void -g_mount_source_ask_password_async (GMountSource *source, - const char *message_string, - const char *default_user, - const char *default_domain, - GAskPasswordFlags flags, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *result; - DBusMessage *message; - guint32 flags_as_int; - - - /* If no dbus id specified, reply that we weren't handled */ - if (source->dbus_id[0] == 0) - { - g_simple_async_report_error_in_idle (G_OBJECT (source), - callback, - user_data, - G_IO_ERROR, G_IO_ERROR_FAILED, - "Internal Error"); - return; - } - - if (message_string == NULL) - message_string = ""; - if (default_user == NULL) - default_user = ""; - if (default_domain == NULL) - default_domain = ""; - - flags_as_int = flags; - - message = dbus_message_new_method_call (source->dbus_id, - source->obj_path, - G_VFS_DBUS_MOUNT_OPERATION_INTERFACE, - G_VFS_DBUS_MOUNT_OPERATION_OP_ASK_PASSWORD); - - _g_dbus_message_append_args (message, - DBUS_TYPE_STRING, &message_string, - DBUS_TYPE_STRING, &default_user, - DBUS_TYPE_STRING, &default_domain, - DBUS_TYPE_UINT32, &flags_as_int, - 0); - - result = g_simple_async_result_new (G_OBJECT (source), callback, user_data, - g_mount_source_ask_password_async); - /* 30 minute timeout */ - _g_dbus_connection_call_async (NULL, message, 1000 * 60 * 30, - ask_password_reply, result); - dbus_message_unref (message); - -} - -/** - * g_mount_source_ask_password_finish: - * @source: the source to query - * @result: the async result - * @aborted: set to %TRUE if the password dialog was aborted by the user - * @password_out: the to the password set by the user or to %NULL if none - * @user_out: set to the username set by the user or to %NULL if none - * @domain_out: set to the domain set by the user or to %NULL if none - * @anonymous_out: set to %TRUE if the user selected anonymous login. This - * should only happen if G_ASK_PASSWORD_ANONYMOUS_SUPPORTED - * was supplied whe querying the password. - * @password_save_out: set to the save flags to use when saving the password - * in the keyring. - * - * Requests the reply parameters from a g_mount_source_ask_password_async() - * request. All out parameters can be set to %NULL to ignore them. - * <note><para>Please be aware that out parameters other than the password - * are set to %NULL if the user don't specify them so make sure to - * check them.</para></note> - * - * Returns: %FALSE if the async reply contained an error. - **/ -gboolean -g_mount_source_ask_password_finish (GMountSource *source, - GAsyncResult *result, - gboolean *aborted, - char **password_out, - char **user_out, - char **domain_out, - gboolean *anonymous_out, - GPasswordSave *password_save_out) -{ - AskPasswordData *data, def = { TRUE, }; - GSimpleAsyncResult *simple; - - simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, NULL)) - data = &def; - else - data = (AskPasswordData *) g_simple_async_result_get_op_res_gpointer (simple); - - if (aborted) - *aborted = data->aborted; - - if (password_out) - { - *password_out = data->password; - data->password = NULL; - } - - if (user_out) - { - *user_out = data->username; - data->username = NULL; - } - - if (domain_out) - { - *domain_out = data->domain; - data->domain = NULL; - } - - if (anonymous_out) - *anonymous_out = data->anonymous; - - if (password_save_out) - *password_save_out = data->password_save; - - return data != &def; -} - - -static void -ask_reply_sync (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - AskSyncData *data; - - data = (AskSyncData *) user_data; - - data->result = g_object_ref (res); - - /* Wake up sync call thread */ - g_mutex_lock (data->mutex); - g_cond_signal (data->cond); - g_mutex_unlock (data->mutex); -} - -gboolean -g_mount_source_ask_password (GMountSource *source, - const char *message_string, - const char *default_user, - const char *default_domain, - GAskPasswordFlags flags, - gboolean *aborted_out, - char **password_out, - char **user_out, - char **domain_out, - gboolean *anonymous_out, - GPasswordSave *password_save_out) -{ - gboolean handled; - AskSyncData data = {NULL}; - - data.mutex = g_mutex_new (); - data.cond = g_cond_new (); - - g_mutex_lock (data.mutex); - - - g_mount_source_ask_password_async (source, - message_string, - default_user, - default_domain, - flags, - ask_reply_sync, - &data); - - g_cond_wait(data.cond, data.mutex); - g_mutex_unlock (data.mutex); - - g_cond_free (data.cond); - g_mutex_free (data.mutex); - - - handled = g_mount_source_ask_password_finish (source, - data.result, - aborted_out, - password_out, - user_out, - domain_out, - anonymous_out, - password_save_out); - g_object_unref (data.result); - - return handled; -} - -static void -op_ask_password_reply (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GMountOperationResult result; - GMountOperation *op; - GMountSource *source; - gboolean handled, aborted; - char *username; - char *password; - char *domain; - GPasswordSave password_save; - - source = G_MOUNT_SOURCE (source_object); - op = G_MOUNT_OPERATION (user_data); - username = NULL; - password = NULL; - domain = NULL; - - handled = g_mount_source_ask_password_finish (source, - res, - &aborted, - &username, - &password, - &domain, - NULL, - &password_save); - - if (!handled) - result = G_MOUNT_OPERATION_UNHANDLED; - else if (aborted) - result = G_MOUNT_OPERATION_ABORTED; - else - { - result = G_MOUNT_OPERATION_HANDLED; - - if (password) - g_mount_operation_set_password (op, password); - if (username) - g_mount_operation_set_username (op, username); - if (domain) - g_mount_operation_set_domain (op, domain); - g_mount_operation_set_password_save (op, password_save); - } - - g_mount_operation_reply (op, result); - g_object_unref (op); -} - -static gboolean -op_ask_password (GMountOperation *op, - const char *message, - const char *default_user, - const char *default_domain, - GAskPasswordFlags flags, - GMountSource *mount_source) -{ - g_mount_source_ask_password_async (mount_source, - message, - default_user, - default_domain, - flags, - op_ask_password_reply, - g_object_ref (op)); - return TRUE; -} - -typedef struct AskQuestionData AskQuestionData; - -struct AskQuestionData { - - /* results: */ - gboolean aborted; - guint32 choice; -}; - -/* the callback from dbus -> main thread */ -static void -ask_question_reply (DBusMessage *reply, - GError *error, - gpointer _data) -{ - GSimpleAsyncResult *result; - AskQuestionData *data; - dbus_bool_t handled, aborted; - guint32 choice; - DBusMessageIter iter; - - result = G_SIMPLE_ASYNC_RESULT (_data); - handled = TRUE; - - data = g_new0 (AskQuestionData, 1); - g_simple_async_result_set_op_res_gpointer (result, data, g_free); - - if (reply == NULL) - { - data->aborted = TRUE; - } - else - { - dbus_message_iter_init (reply, &iter); - if (!_g_dbus_message_iter_get_args (&iter, NULL, - DBUS_TYPE_BOOLEAN, &handled, - DBUS_TYPE_BOOLEAN, &aborted, - DBUS_TYPE_UINT32, &choice, - 0)) - data->aborted = TRUE; - else - { - data->aborted = aborted; - data->choice = choice; - } - } - - if (handled == FALSE) - { - g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED, "Internal Error"); - } - - g_simple_async_result_complete (result); -} - -gboolean -g_mount_source_ask_question (GMountSource *source, - const char *message, - const char **choices, - gint n_choices, - gboolean *aborted_out, - gint *choice_out) -{ - gint choice; - gboolean handled, aborted; - AskSyncData data = {NULL}; - - data.mutex = g_mutex_new (); - data.cond = g_cond_new (); - - g_mutex_lock (data.mutex); - - g_mount_source_ask_question_async (source, - message, - choices, - n_choices, - ask_reply_sync, - &data); - - g_cond_wait(data.cond, data.mutex); - g_mutex_unlock (data.mutex); - - g_cond_free (data.cond); - g_mutex_free (data.mutex); - - handled = g_mount_source_ask_question_finish (source, - data.result, - &aborted, - &choice); - - g_object_unref (data.result); - - if (aborted_out) - *aborted_out = aborted; - - if (choice_out) - *choice_out = choice; - - return handled; -} - -void -g_mount_source_ask_question_async (GMountSource *source, - const char *message_string, - const char **choices, - gint n_choices, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *result; - DBusMessage *message; - - /* If no dbus id specified, reply that we weren't handled */ - if (source->dbus_id[0] == 0) - { - g_simple_async_report_error_in_idle (G_OBJECT (source), - callback, - user_data, - G_IO_ERROR, G_IO_ERROR_FAILED, - "Internal Error"); - 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_ASK_QUESTION); - - _g_dbus_message_append_args (message, - DBUS_TYPE_STRING, &message_string, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, - choices, n_choices, - 0); - - result = g_simple_async_result_new (G_OBJECT (source), callback, user_data, - g_mount_source_ask_question_async); - /* 30 minute timeout */ - _g_dbus_connection_call_async (NULL, message, 1000 * 60 * 30, - ask_question_reply, result); - dbus_message_unref (message); - -} - -gboolean -g_mount_source_ask_question_finish (GMountSource *source, - GAsyncResult *result, - gboolean *aborted, - gint *choice_out) -{ - AskQuestionData *data, def= { FALSE, }; - GSimpleAsyncResult *simple; - - simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, NULL)) - data = &def; - else - data = (AskQuestionData *) g_simple_async_result_get_op_res_gpointer (simple); - - if (aborted) - *aborted = data->aborted; - - if (choice_out) - *choice_out = data->choice; - - return data != &def; -} - -static void -op_ask_question_reply (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GMountOperationResult result; - GMountOperation *op; - GMountSource *source; - gboolean handled, aborted; - gint choice; - - source = G_MOUNT_SOURCE (source_object); - op = G_MOUNT_OPERATION (user_data); - - handled = g_mount_source_ask_question_finish (source, - res, - &aborted, - &choice); - - if (!handled) - result = G_MOUNT_OPERATION_UNHANDLED; - else if (aborted) - result = G_MOUNT_OPERATION_ABORTED; - else - { - result = G_MOUNT_OPERATION_HANDLED; - g_mount_operation_set_choice (op, choice); - } - - g_mount_operation_reply (op, result); - g_object_unref (op); -} - -static gboolean -op_ask_question (GMountOperation *op, - const char *message, - const char **choices, - gint n_choices, - GMountSource *mount_source) -{ - g_mount_source_ask_question_async (mount_source, - message, - choices, - n_choices, - op_ask_question_reply, - g_object_ref (op)); - return TRUE; -} - -GMountOperation * -g_mount_source_get_operation (GMountSource *mount_source) -{ - GMountOperation *op; - - op = g_mount_operation_new (); - g_object_set_data_full (G_OBJECT (op), "source", - g_object_ref (mount_source), - g_object_unref); - - - g_signal_connect (op, "ask_password", (GCallback)op_ask_password, mount_source); - g_signal_connect (op, "ask_question", (GCallback)op_ask_question, mount_source); - - return op; -} |