[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