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

Enrico Troeger enrico at xfce.org
Sun Mar 1 15:35:58 CET 2009


Author: enrico
Date: 2009-03-01 14:35:58 +0000 (Sun, 01 Mar 2009)
New Revision: 6816

Modified:
   gigolo/trunk/ChangeLog
   gigolo/trunk/src/backendgvfs.c
   gigolo/trunk/src/backendgvfs.h
   gigolo/trunk/src/bookmarkeditdialog.c
Log:
Implement browsing for smb shares in the Connect/Bookmark Edit dialogs to easily select them.

Modified: gigolo/trunk/ChangeLog
===================================================================
--- gigolo/trunk/ChangeLog	2009-03-01 10:55:12 UTC (rev 6815)
+++ gigolo/trunk/ChangeLog	2009-03-01 14:35:58 UTC (rev 6816)
@@ -7,6 +7,9 @@
    authentication information are needed.
    This implicitly allows choosing the method to store passwords
    (never, session, forever).
+ * src/backendgvfs.c, src/backendgvfs.h, src/bookmarkeditdialog.c:
+   Implement browsing for smb shares in the Connect/Bookmark Edit
+   dialogs to easily select them.
 
 
 2009-02-28  Enrico Tröger  <enrico(at)xfce(dot)org>

Modified: gigolo/trunk/src/backendgvfs.c
===================================================================
--- gigolo/trunk/src/backendgvfs.c	2009-03-01 10:55:12 UTC (rev 6815)
+++ gigolo/trunk/src/backendgvfs.c	2009-03-01 14:35:58 UTC (rev 6816)
@@ -492,3 +492,67 @@
 }
 
 
+gchar **gigolo_backend_gvfs_get_smb_shares(const gchar *hostname, const gchar *user, const gchar *domain)
+{
+	gchar **shares = NULL;
+	gchar *uri;
+	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);
+
+	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);
+
+		i = 0;
+		len = g_list_length(shares_list);
+		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;
+}
+
+

Modified: gigolo/trunk/src/backendgvfs.h
===================================================================
--- gigolo/trunk/src/backendgvfs.h	2009-03-01 10:55:12 UTC (rev 6815)
+++ gigolo/trunk/src/backendgvfs.h	2009-03-01 14:35:58 UTC (rev 6816)
@@ -63,6 +63,10 @@
 
 gchar*				gigolo_backend_gvfs_get_volume_identifier		(GVolume *volume);
 
+gchar**				gigolo_backend_gvfs_get_smb_shares				(const gchar *hostname,
+																	 const gchar *user,
+																	 const gchar *domain);
+
 G_END_DECLS
 
 #endif /* __BACKENDGVFS_H__ */

Modified: gigolo/trunk/src/bookmarkeditdialog.c
===================================================================
--- gigolo/trunk/src/bookmarkeditdialog.c	2009-03-01 10:55:12 UTC (rev 6815)
+++ gigolo/trunk/src/bookmarkeditdialog.c	2009-03-01 14:35:58 UTC (rev 6816)
@@ -30,6 +30,7 @@
 #include "compat.h"
 #include "settings.h"
 #include "bookmark.h"
+#include "backendgvfs.h"
 #include "bookmarkeditdialog.h"
 
 
@@ -69,6 +70,8 @@
 	GtkWidget *domain_entry;
 
 	GtkWidget *share_label;
+	GtkWidget *share_combo;
+	GtkWidget *share_button;
 	GtkWidget *share_entry;
 
 	GigoloBookmark *bookmark_init;
@@ -147,7 +150,8 @@
 	gtk_widget_destroy(priv->user_label);
 	gtk_widget_destroy(priv->domain_entry);
 	gtk_widget_destroy(priv->domain_label);
-	gtk_widget_destroy(priv->share_entry);
+	gtk_widget_destroy(priv->share_combo);
+	gtk_widget_destroy(priv->share_button);
 	gtk_widget_destroy(priv->share_label);
 	gtk_widget_destroy(priv->information_label);
 
@@ -214,7 +218,7 @@
 					gtk_widget_grab_focus(priv->server_entry);
 				}
 			}
-			if (! error && gtk_widget_get_parent(priv->share_entry) != NULL)
+			if (! error && gtk_widget_get_parent(priv->share_combo) != NULL)
 			{
 				tmp = gtk_entry_get_text(GTK_ENTRY(priv->share_entry));
 				if (! *tmp)
@@ -222,7 +226,7 @@
 					error = TRUE;
 					gigolo_message_dialog((gpointer)dialog, GTK_MESSAGE_ERROR, _("Error"),
 						_("You must enter a share name."), NULL);
-					gtk_widget_grab_focus(priv->share_entry);
+					gtk_widget_grab_focus(priv->share_combo);
 				}
 			}
 			if (! error && gtk_widget_get_parent(priv->uri_entry) != NULL)
@@ -424,10 +428,11 @@
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->domain_label);
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->domain_entry);
 	}
-	if (gtk_widget_get_parent(priv->share_entry) != NULL)
+	if (gtk_widget_get_parent(priv->share_combo) != NULL)
 	{
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->share_label);
-		gtk_container_remove(GTK_CONTAINER(priv->table), priv->share_entry);
+		gtk_container_remove(GTK_CONTAINER(priv->table), priv->share_combo);
+		gtk_container_remove(GTK_CONTAINER(priv->table), priv->share_button);
 	}
 	if (gtk_widget_get_parent(priv->information_label) != NULL)
 	{
@@ -472,11 +477,15 @@
 			gtk_table_attach(GTK_TABLE(table), priv->share_label,
 					  0, 1, i, i+1, GTK_FILL, GTK_FILL, 0, 0);
 
-			gtk_label_set_mnemonic_widget(GTK_LABEL(priv->share_label), priv->share_entry);
-			gtk_widget_show(priv->share_entry);
-			gtk_table_attach(GTK_TABLE(table), priv->share_entry,
+			gtk_label_set_mnemonic_widget(GTK_LABEL(priv->share_label), priv->share_combo);
+			gtk_widget_show(priv->share_combo);
+			gtk_table_attach(GTK_TABLE(table), priv->share_combo,
 					  1, 2, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
 
+			gtk_widget_show(priv->share_button);
+			gtk_table_attach(GTK_TABLE(table), priv->share_button,
+					  2, 3, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
 			i++;
 		}
 
@@ -725,6 +734,45 @@
 }
 
 
+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))));
+
+	hostname = gtk_entry_get_text(GTK_ENTRY(priv->server_entry));
+	if (! NZV(hostname))
+		return;
+
+	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);
+}
+
+
+static void server_entry_changed_cb(GtkEditable *editable, GtkWidget *btn)
+{
+	const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable));
+
+	gtk_widget_set_sensitive(btn, NZV(text));
+}
+
+
 static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 {
 	GtkWidget *label;
@@ -753,7 +801,7 @@
 	hbox = gtk_hbox_new(FALSE, 6);
 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
 
-	priv->table = table = gtk_table_new(9, 2, FALSE);
+	priv->table = table = gtk_table_new(9, 3, FALSE);
 	gtk_table_set_row_spacings(GTK_TABLE(table), 6);
 	gtk_table_set_col_spacings(GTK_TABLE(table), 12);
 	gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0);
@@ -800,7 +848,8 @@
 	gtk_widget_set_tooltip_text(priv->port_spin, _("Set the port to 0 to use the default port"));
 	priv->user_entry = gtk_entry_new();
 	priv->domain_entry = gtk_entry_new();
-	priv->share_entry = gtk_entry_new();
+	priv->share_combo = gtk_combo_box_entry_new_text();
+	priv->share_entry = gtk_bin_get_child(GTK_BIN(priv->share_combo));
 
 	priv->uri_label = gtk_label_new_with_mnemonic(_("_Location (URI):"));
 	priv->server_label = gtk_label_new_with_mnemonic(_("_Server:"));
@@ -816,6 +865,15 @@
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->port_spin), TRUE);
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->user_entry), TRUE);
 
+	priv->share_button = gtk_button_new();
+	gtk_button_set_image(GTK_BUTTON(priv->share_button),
+		gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU));
+	gtk_widget_set_sensitive(priv->share_button, FALSE);
+	g_signal_connect(priv->share_button, "clicked", G_CALLBACK(share_button_clicked_cb), dialog);
+
+	g_signal_connect(priv->server_entry, "changed",
+		G_CALLBACK(server_entry_changed_cb), priv->share_button);
+
 	/* We need an extra ref so we can remove them from the table */
 	g_object_ref(priv->uri_entry);
 	g_object_ref(priv->uri_label);
@@ -827,7 +885,8 @@
 	g_object_ref(priv->user_label);
 	g_object_ref(priv->domain_entry);
 	g_object_ref(priv->domain_label);
-	g_object_ref(priv->share_entry);
+	g_object_ref(priv->share_combo);
+	g_object_ref(priv->share_button);
 	g_object_ref(priv->share_label);
 	g_object_ref(priv->information_label);
 




More information about the Goodies-commits mailing list