[Goodies-commits] r7603 - in gigolo/trunk: . src
Enrico Troeger
enrico at xfce.org
Wed Jun 17 23:34:07 CEST 2009
Author: enrico
Date: 2009-06-17 21:34:07 +0000 (Wed, 17 Jun 2009)
New Revision: 7603
Modified:
gigolo/trunk/ChangeLog
gigolo/trunk/src/backendgvfs.c
gigolo/trunk/src/backendgvfs.h
gigolo/trunk/src/bookmarkeditdialog.c
Log:
When querying Samba shares in the Connect/Bookmark Edit dialog, mount smb://hostname as necessary.
Modified: gigolo/trunk/ChangeLog
===================================================================
--- gigolo/trunk/ChangeLog 2009-06-17 20:42:52 UTC (rev 7602)
+++ gigolo/trunk/ChangeLog 2009-06-17 21:34:07 UTC (rev 7603)
@@ -1,11 +1,18 @@
-2009-06-06 Enrico Tröger <enrico(at)xfce(dot)org>
+2009-06-17 Enrico Tröger <enrico(at)xfce(dot)org>
+ * src/backendgvfs.c, src/backendgvfs.h, src/bookmarkeditdialog.c:
+ When querying Samba shares in the Connect/Bookmark Edit dialog,
+ mount smb://hostname as necessary.
+
+
+2009-06-13 Enrico Tröger <enrico(at)xfce(dot)org>
+
* src/main.c, src/common:
Move definition of a variable to fix non-debug build of the
test suite.
-2009-06-13 Enrico Tröger <enrico(at)xfce(dot)org>
+2009-06-06 Enrico Tröger <enrico(at)xfce(dot)org>
* src/preferences.c:
Adjust tooltip for the 'Show side panel' option.
Modified: gigolo/trunk/src/backendgvfs.c
===================================================================
--- gigolo/trunk/src/backendgvfs.c 2009-06-17 20:42:52 UTC (rev 7602)
+++ gigolo/trunk/src/backendgvfs.c 2009-06-17 21:34:07 UTC (rev 7603)
@@ -43,6 +43,7 @@
MOUNTS_CHANGED,
OPERATION_FAILED,
BROWSE_NETWORK_FINISHED,
+ BROWSE_HOST_FINISHED,
LAST_SIGNAL
};
@@ -63,7 +64,7 @@
gboolean show_errors;
} MountInfo;
-typedef struct
+typedef struct BrowseData
{
GigoloBackendGVFS *self;
@@ -72,6 +73,8 @@
GtkWindow *parent;
GtkTreeStore *store;
GtkTreePath *parent_path;
+
+ void (*browse_func) (struct BrowseData *bd);
} BrowseData;
@@ -86,6 +89,7 @@
static void gigolo_backend_gvfs_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec);
static void browse_network_real (BrowseData *bd);
+static void browse_host_real (BrowseData *bd);
G_DEFINE_TYPE(GigoloBackendGVFS, gigolo_backend_gvfs, G_TYPE_OBJECT);
@@ -173,6 +177,15 @@
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ signals[BROWSE_HOST_FINISHED] = g_signal_new("browse-host-finished",
+ G_TYPE_FROM_CLASS(klass),
+ (GSignalFlags) 0,
+ 0,
+ 0,
+ NULL,
+ /* FIXME use a proper closure, arg1 is a GList* */
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1, G_TYPE_POINTER);
}
@@ -528,75 +541,6 @@
}
-gchar **gigolo_backend_gvfs_get_smb_shares(const gchar *hostname, const gchar *user, const gchar *domain)
-{
- gchar *uri;
- gchar **shares = NULL;
- GList *l, *shares_list = NULL;
- GFile *file;
- GFileInfo *info;
- GError *error = NULL;
- GFileEnumerator *e;
-
- g_return_val_if_fail(hostname != NULL, NULL);
-
- uri = g_strdup_printf("smb://%s%s%s%s%s/",
- (NZV(domain)) ? domain : "",
- (NZV(domain)) ? ";" : "",
- (NZV(user)) ? user : "",
- (NZV(user) || NZV(domain)) ? "@" : "",
- hostname);
-
- /** TODO mount if necessary, merge with browse_network_real */
-
- verbose("Querying \"%s\" for available shares", uri);
-
- file = g_file_new_for_uri(uri);
-
- e = g_file_enumerate_children(file,
- G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT "," G_FILE_ATTRIBUTE_STANDARD_NAME,
- G_FILE_QUERY_INFO_NONE, NULL, &error);
-
- if (error != NULL)
- {
- verbose("%s: %s", G_STRFUNC, error->message);
- g_error_free(error);
- }
- else
- {
- guint i, len;
-
- while ((info = g_file_enumerator_next_file(e, NULL, NULL)) != NULL)
- {
- shares_list = g_list_append(shares_list, g_strdup(g_file_info_get_name(info)));
-
- g_object_unref(info);
- }
- g_object_unref(e);
-
- len = g_list_length(shares_list);
- if (len > 0)
- {
- i = 0;
- shares = g_new(gchar*, len + 1);
-
- for (l = shares_list; l != NULL; l = g_list_next(l))
- {
- shares[i] = l->data;
- i++;
- }
- shares[i] = NULL;
- }
- g_list_free(shares_list);
- }
-
- g_object_unref(file);
- g_free(uri);
-
- return shares;
-}
-
-
static gboolean browse_network_ready_cb(gpointer backend)
{
GigoloBackendGVFSPrivate *priv;
@@ -632,10 +576,15 @@
{
verbose("%s (%s)", G_STRFUNC, error->message);
g_error_free(error);
+
+ /* If we are looking only for shares, we need to emit the finished signal otherwise the
+ * caller will never know we are done. */
+ if (bd->browse_func == browse_host_real)
+ g_signal_emit(bd->self, signals[BROWSE_HOST_FINISHED], 0, NULL);
}
else
{
- browse_network_real(bd);
+ bd->browse_func(bd);
}
}
@@ -697,7 +646,7 @@
GtkTreeIter *parent_iter;
gint child_mode;
- verbose("Querying \"%s\" for available groups/hosts", bd->uri);
+ verbose("Querying \"%s\" for available groups/hosts/shares", bd->uri);
while ((info = g_file_enumerator_next_file(e, NULL, NULL)) != NULL)
{
@@ -744,6 +693,7 @@
bd_child->self = backend;
bd_child->parent = parent;
bd_child->parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+ bd_child->browse_func = browse_network_real;
/* recurse into the next level */
browse_network_real(bd_child);
@@ -775,6 +725,7 @@
bd->store = store;
bd->uri = g_strdup("smb://");
bd->self = backend;
+ bd->browse_func = browse_network_real;
priv = GIGOLO_BACKEND_GVFS_GET_PRIVATE(backend);
priv->browse_counter = 0;
@@ -787,6 +738,83 @@
}
+static void browse_host_real(BrowseData *bd)
+{
+ GFile *file;
+ GFileInfo *info;
+ GError *error = NULL;
+ GFileEnumerator *e;
+ GSList *list = NULL;
+
+ g_return_if_fail(bd != NULL);
+ g_return_if_fail(bd->self != NULL);
+
+ file = g_file_new_for_uri(bd->uri);
+
+ e = g_file_enumerate_children(file,
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ G_FILE_QUERY_INFO_NONE, NULL, &error);
+
+ if (error != NULL)
+ {
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED))
+ {
+ GMountOperation *op = gigolo_mount_operation_new(bd->parent);
+ /* if the URI wasn't mounted yet, mount it and try again from the mount ready callback */
+ g_file_mount_enclosing_volume(file, G_MOUNT_MOUNT_NONE, op, NULL,
+ (GAsyncReadyCallback) browse_network_mount_ready_cb, bd);
+
+ g_error_free(error);
+ g_object_unref(file);
+ g_object_unref(op);
+ return;
+ }
+ else
+ {
+ verbose("%s: %s", G_STRFUNC, error->message);
+ g_error_free(error);
+ }
+ }
+ else
+ {
+ verbose("Querying \"%s\" for available shares", bd->uri);
+
+ while ((info = g_file_enumerator_next_file(e, NULL, NULL)) != NULL)
+ {
+ list = g_slist_append(list, g_strdup(g_file_info_get_name(info)));
+ g_object_unref(info);
+ }
+ g_object_unref(e);
+ }
+
+ /* propagate our results */
+ g_signal_emit(bd->self, signals[BROWSE_HOST_FINISHED], 0, list);
+
+ g_slist_foreach(list, (GFunc) g_free, NULL);
+ g_slist_free(list);
+
+ g_object_unref(file);
+ g_free(bd->uri);
+ g_free(bd);
+}
+
+
+void gigolo_backend_gvfs_browse_host(GigoloBackendGVFS *backend, GtkWindow *parent, const gchar *hostname)
+{
+ BrowseData *bd = g_new0(BrowseData, 1);
+
+ g_return_if_fail(backend != NULL);
+ g_return_if_fail(NZV(hostname));
+
+ bd->uri = g_strdup_printf("smb://%s", hostname);
+ bd->self = backend;
+ bd->parent = parent;
+ bd->browse_func = browse_host_real;
+
+ browse_host_real(bd);
+}
+
+
const gchar *const *gigolo_backend_gvfs_get_supported_uri_schemes(void)
{
return g_vfs_get_supported_uri_schemes(g_vfs_get_default());
Modified: gigolo/trunk/src/backendgvfs.h
===================================================================
--- gigolo/trunk/src/backendgvfs.h 2009-06-17 20:42:52 UTC (rev 7602)
+++ gigolo/trunk/src/backendgvfs.h 2009-06-17 21:34:07 UTC (rev 7603)
@@ -102,14 +102,14 @@
gchar* gigolo_backend_gvfs_get_volume_identifier (gpointer volume);
-gchar** gigolo_backend_gvfs_get_smb_shares (const gchar *hostname,
- const gchar *user,
- const gchar *domain);
-
void gigolo_backend_gvfs_browse_network (GigoloBackendGVFS *backend,
GtkWindow *parent,
GtkTreeStore *store);
+void gigolo_backend_gvfs_browse_host (GigoloBackendGVFS *backend,
+ GtkWindow *parent,
+ const gchar *hostname);
+
const gchar *const* gigolo_backend_gvfs_get_supported_uri_schemes (void);
gboolean gigolo_backend_gvfs_is_scheme_supported (const gchar *scheme);
Modified: gigolo/trunk/src/bookmarkeditdialog.c
===================================================================
--- gigolo/trunk/src/bookmarkeditdialog.c 2009-06-17 20:42:52 UTC (rev 7602)
+++ gigolo/trunk/src/bookmarkeditdialog.c 2009-06-17 21:34:07 UTC (rev 7603)
@@ -77,13 +77,19 @@
GigoloBookmark *bookmark_init;
GigoloBookmark *bookmark_update;
+
+ gulong browse_host_signal_id;
};
static void gigolo_bookmark_edit_dialog_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec);
+static void browse_host_finished_cb (G_GNUC_UNUSED GigoloBackendGVFS *bnd,
+ GSList *shares,
+ GigoloBookmarkEditDialog *dialog);
-struct MethodInfo {
+struct MethodInfo
+{
const gchar *scheme;
guint port;
guint flags;
@@ -143,7 +149,15 @@
static void gigolo_bookmark_edit_dialog_destroy(GtkObject *object)
{
GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(object);
+ GigoloBackendGVFS *backend;
+ backend = gigolo_window_get_backend(priv->parent);
+ if (backend != NULL && IS_GIGOLO_BACKEND_GVFS(backend) && priv->browse_host_signal_id > 0)
+ {
+ g_signal_handler_disconnect(gigolo_window_get_backend(priv->parent), priv->browse_host_signal_id);
+ priv->browse_host_signal_id = 0;
+ }
+
gtk_widget_destroy(priv->uri_entry);
gtk_widget_destroy(priv->uri_label);
gtk_widget_destroy(priv->host_entry);
@@ -786,11 +800,27 @@
}
+static void browse_host_finished_cb(G_GNUC_UNUSED GigoloBackendGVFS *bnd, GSList *shares,
+ GigoloBookmarkEditDialog *dialog)
+{
+ GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
+
+ if (shares != NULL)
+ {
+ GSList *node;
+ for (node = shares; node != NULL; node = node->next)
+ {
+ gtk_combo_box_append_text(GTK_COMBO_BOX(priv->share_combo), node->data);
+ }
+ }
+ gtk_widget_set_sensitive(priv->share_button, TRUE);
+}
+
+
static void share_button_clicked_cb(GtkWidget *btn, GigoloBookmarkEditDialog *dialog)
{
GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
const gchar *hostname;
- gchar **shares;
gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(priv->share_combo))));
@@ -800,20 +830,8 @@
gtk_widget_set_sensitive(btn, FALSE);
- /* FIXME for now we ignore username and domain when browsing for shares as this is not yet
- * supported by GVfs (1.0.x). */
- shares = gigolo_backend_gvfs_get_smb_shares(hostname, NULL, NULL);
-
- if (shares != NULL)
- {
- guint i, len = g_strv_length(shares);
- for (i = 0; i < len; i++)
- {
- gtk_combo_box_append_text(GTK_COMBO_BOX(priv->share_combo), shares[i]);
- }
- g_strfreev(shares);
- }
- gtk_widget_set_sensitive(btn, TRUE);
+ gigolo_backend_gvfs_browse_host(gigolo_window_get_backend(priv->parent),
+ GTK_WINDOW(priv->parent), hostname);
}
@@ -837,6 +855,8 @@
GtkCellRenderer *renderer;
GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
+ priv->browse_host_signal_id = 0;
+
gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
gtk_box_set_spacing(GTK_BOX(gigolo_dialog_get_content_area(GTK_DIALOG(dialog))), 2);
@@ -948,13 +968,20 @@
GtkWidget *gigolo_bookmark_edit_dialog_new(GigoloWindow *parent, GigoloBookmarkEditDialogMode mode)
{
- GigoloBookmarkEditDialog *dialog = g_object_new(GIGOLO_BOOKMARK_EDIT_DIALOG_TYPE,
+ GigoloBookmarkEditDialog *dialog;
+ GigoloBookmarkEditDialogPrivate *priv;
+
+ dialog = g_object_new(GIGOLO_BOOKMARK_EDIT_DIALOG_TYPE,
"transient-for", parent,
"mode", mode,
NULL);
- GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
+
+ priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
priv->parent = parent;
+ priv->browse_host_signal_id = g_signal_connect(gigolo_window_get_backend(parent),
+ "browse-host-finished", G_CALLBACK(browse_host_finished_cb), dialog);
+
return GTK_WIDGET(dialog);
}
@@ -962,15 +989,12 @@
GtkWidget *gigolo_bookmark_edit_dialog_new_with_bookmark(GigoloWindow *parent,
GigoloBookmarkEditDialogMode mode, GigoloBookmark *bookmark)
{
- GigoloBookmarkEditDialog *dialog = g_object_new(GIGOLO_BOOKMARK_EDIT_DIALOG_TYPE,
- "transient-for", parent,
- "bookmark-init", bookmark,
- "mode", mode,
- NULL);
- GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
- priv->parent = parent;
+ GtkWidget *dialog;
- return GTK_WIDGET(dialog);
+ dialog = gigolo_bookmark_edit_dialog_new(parent, mode);
+ g_object_set(dialog, "bookmark-init", bookmark, NULL);
+
+ return dialog;
}
More information about the Goodies-commits
mailing list