[Goodies-commits] r6955 - in gigolo/trunk: . src

Enrico Troeger enrico at xfce.org
Fri Mar 20 16:24:14 CET 2009


Author: enrico
Date: 2009-03-20 15:24:14 +0000 (Fri, 20 Mar 2009)
New Revision: 6955

Modified:
   gigolo/trunk/ChangeLog
   gigolo/trunk/src/backendgvfs.c
   gigolo/trunk/src/backendgvfs.h
   gigolo/trunk/src/browsenetworkdialog.c
Log:
When browsing the network for Samba shares, first query "smb://" for workgroups, then query each workgroup for hosts and then the found hosts for shares.

Modified: gigolo/trunk/ChangeLog
===================================================================
--- gigolo/trunk/ChangeLog	2009-03-19 22:43:50 UTC (rev 6954)
+++ gigolo/trunk/ChangeLog	2009-03-20 15:24:14 UTC (rev 6955)
@@ -1,3 +1,11 @@
+2009-03-19  Enrico Tröger  <enrico(at)xfce(dot)org>
+
+ * src/browsenetworkdialog.c, src/backendgvfs.c, src/backendgvfs.h:
+   When browsing the network for Samba shares, first query "smb://"
+   for workgroups, then query each workgroup for hosts and then
+   the found hosts for shares.
+
+
 2009-03-17  Enrico Tröger  <enrico(at)xfce(dot)org>
 
  * gigolo.1.in, src/Makefile.am, src/main.c, src/singleinstance.c,

Modified: gigolo/trunk/src/backendgvfs.c
===================================================================
--- gigolo/trunk/src/backendgvfs.c	2009-03-19 22:43:50 UTC (rev 6954)
+++ gigolo/trunk/src/backendgvfs.c	2009-03-20 15:24:14 UTC (rev 6955)
@@ -528,8 +528,10 @@
 		}
 		g_object_unref(e);
 
-		i = 0;
 		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))
@@ -538,6 +540,7 @@
 			i++;
 		}
 		shares[i] = NULL;
+		}
 		g_list_free(shares_list);
 	}
 
@@ -568,7 +571,7 @@
 }
 
 
-GigoloHostUri **gigolo_backend_gvfs_browse_network(void)
+GigoloHostUri **gigolo_backend_gvfs_browse_network(const gchar *uri)
 {
 	GigoloHostUri *h, **hosts = NULL;
 	GList *l, *hosts_list = NULL;
@@ -577,8 +580,15 @@
 	GError *error = NULL;
 	GFileEnumerator *e;
 
-	file = g_file_new_for_uri("network://");
+	/* If a uri is passed, we assume this is an URI pointing to a workgroup like
+	 * "smb://WORKGROUP/", if passed NULL, we use "smb://" to search for workgroups */
+	if (uri == NULL)
+		uri = "smb://";
 
+	verbose("Querying \"%s\" for available groups/hosts", uri);
+
+	file = g_file_new_for_uri(uri);
+
 	e = g_file_enumerate_children(file,
 		G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT ","
 		G_FILE_ATTRIBUTE_STANDARD_TARGET_URI ","
@@ -594,16 +604,16 @@
 	else
 	{
 		guint i, len;
-		const gchar *uri;
+		const gchar *h_uri;
 
 		while ((info = g_file_enumerator_next_file(e, NULL, NULL)) != NULL)
 		{
-			uri = g_file_info_get_attribute_string(info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
-			if (uri != NULL && g_str_has_prefix(uri, "smb://"))
+			h_uri = g_file_info_get_attribute_string(info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
+			if (h_uri != NULL && g_str_has_prefix(h_uri, "smb://"))
 			{
 				h = g_new(GigoloHostUri, 1);
 				h->name = g_strdup(g_file_info_get_display_name(info));
-				h->uri = g_strdup(uri);
+				h->uri = g_strdup(h_uri);
 				h->icon = g_object_ref(g_file_info_get_icon(info));
 				hosts_list = g_list_append(hosts_list, h);
 			}
@@ -611,8 +621,10 @@
 		}
 		g_object_unref(e);
 
-		i = 0;
 		len = g_list_length(hosts_list);
+		if (len > 0)
+		{
+			i = 0;
 		hosts = g_new(GigoloHostUri*, len + 1);
 
 		for (l = hosts_list; l != NULL; l = g_list_next(l))
@@ -621,9 +633,9 @@
 			i++;
 		}
 		hosts[i] = NULL;
+		}
 		g_list_free(hosts_list);
 	}
-
 	g_object_unref(file);
 
 	return hosts;
@@ -632,7 +644,10 @@
 
 gpointer gigolo_backend_gvfs_get_share_icon(void)
 {
+	if (gtk_check_version(2, 14, 0) == NULL)
 	return g_themed_icon_new("folder-remote");
+	else
+		return NULL;
 }
 
 

Modified: gigolo/trunk/src/backendgvfs.h
===================================================================
--- gigolo/trunk/src/backendgvfs.h	2009-03-19 22:43:50 UTC (rev 6954)
+++ gigolo/trunk/src/backendgvfs.h	2009-03-20 15:24:14 UTC (rev 6955)
@@ -77,7 +77,7 @@
 																	 const gchar *user,
 																	 const gchar *domain);
 
-GigoloHostUri**		gigolo_backend_gvfs_browse_network				(void);
+GigoloHostUri**		gigolo_backend_gvfs_browse_network				(const gchar *uri);
 
 const gchar *const* gigolo_backend_gvfs_get_supported_uri_schemes	(void);
 

Modified: gigolo/trunk/src/browsenetworkdialog.c
===================================================================
--- gigolo/trunk/src/browsenetworkdialog.c	2009-03-19 22:43:50 UTC (rev 6954)
+++ gigolo/trunk/src/browsenetworkdialog.c	2009-03-20 15:24:14 UTC (rev 6955)
@@ -173,26 +173,40 @@
 static void gigolo_browse_network_dialog_refresh(GigoloBrowseNetworkDialog *dialog)
 {
 	GigoloBrowseNetworkDialogPrivate *priv = GIGOLO_BROWSE_NETWORK_DIALOG_GET_PRIVATE(dialog);
+	GigoloHostUri **groups;
 	GigoloHostUri **hosts;
+	guint g, i, j;
+	GtkTreeIter iter_group, iter_host, iter_share;
+	gchar **shares;
+	gpointer icon_share = NULL;
 
 	gtk_widget_set_sensitive(priv->button_refresh, FALSE);
 	gtk_tree_store_clear(priv->store);
 
 	/* TODO make this async? */
-	hosts = gigolo_backend_gvfs_browse_network();
-	if (hosts != NULL)
+
+	/* Iterate over workgroups */
+	groups = gigolo_backend_gvfs_browse_network(NULL);
+	if (groups != NULL)
 	{
-		guint i;
-		GtkTreeIter iter_host, iter_share;
-		GtkTreeIter *iter_root = NULL;
-		gpointer icon_share = NULL;
-
-		if (gtk_check_version(2, 14, 0) == NULL)
 			icon_share = gigolo_backend_gvfs_get_share_icon();
+		for (g = 0; groups[g] != NULL; g++)
+		{
+			gtk_tree_store_append(priv->store, &iter_group, NULL);
+			gtk_tree_store_set(priv->store, &iter_group,
+				COLUMN_URI, groups[g]->uri,
+				COLUMN_NAME, groups[g]->name,
+				COLUMN_ICON, groups[g]->icon,
+				COLUMN_CAN_MOUNT, FALSE,
+				-1);
 
+			/* Iterate over hosts */
+			hosts = gigolo_backend_gvfs_browse_network(groups[g]->uri);
+			if (hosts != NULL)
+			{
 		for (i = 0; hosts[i] != NULL; i++)
 		{
-			gtk_tree_store_append(priv->store, &iter_host, iter_root);
+					gtk_tree_store_append(priv->store, &iter_host, &iter_group);
 			gtk_tree_store_set(priv->store, &iter_host,
 				COLUMN_URI, hosts[i]->uri,
 				COLUMN_NAME, hosts[i]->name,
@@ -200,17 +214,10 @@
 				COLUMN_CAN_MOUNT, FALSE,
 				-1);
 
-			if (gigolo_str_equal(hosts[i]->uri, "smb:///"))
-			{	/* Cache the root element("Windows Network") and use it as parent for found hosts. */
-				if (iter_root == NULL)
-					iter_root = gtk_tree_iter_copy(&iter_host);
-			}
-			else
-			{	/* Now we have a host, look for shares. */
-				gchar **shares = gigolo_backend_gvfs_get_smb_shares_from_uri(hosts[i]->uri);
+					/* Iterate over shares */
+					shares = gigolo_backend_gvfs_get_smb_shares_from_uri(hosts[i]->uri);
 				if (shares != NULL)
 				{
-					guint j;
 					for (j = 0; shares[j] != NULL; j++)
 					{
 						gtk_tree_store_append(priv->store, &iter_share, &iter_host);
@@ -222,18 +229,32 @@
 							-1);
 					}
 					g_strfreev(shares);
-				}
-			}
+
 			g_object_unref(hosts[i]->icon);
 			g_free(hosts[i]->uri);
 			g_free(hosts[i]->name);
 			g_free(hosts[i]);
 		}
-		gtk_tree_iter_free(iter_root);
+					else
+						verbose("No shares found for %s", hosts[i]);
+				}
+				g_free(hosts);
+
+				g_object_unref(groups[i]->icon);
+				g_free(groups[i]->uri);
+				g_free(groups[i]->name);
+				g_free(groups[i]);
+			}
+			else
+				verbose("No hosts found for %s", groups[g]);
+		}
+		g_free(groups);
 		if (icon_share !=  NULL)
 			g_object_unref(icon_share);
-		g_free(hosts);
 	}
+	else
+		verbose("No workgroups found");
+
 	gtk_tree_view_expand_all(GTK_TREE_VIEW(priv->tree));
 
 	gdk_window_set_cursor(gigolo_widget_get_window(GTK_WIDGET(dialog)), NULL);




More information about the Goodies-commits mailing list