[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