[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