Separating GUI from VFS

Pavel Roskin proski at gnu.org
Sun Jul 15 07:08:01 UTC 2001


Hello!

I'm applying a patch that moves the dialog for requesting SMB credentials
from vfs/smbfs.c to src/boxes.c and gnome/gdialogs.c.

The interface that has to be exposed goes to vfs/vfs.h.  The
function and the structure it uses are renamed so that they have
less generic names.

The new code in src/boxes.c is an exact copy of the old code from
vfs/smbfs.c.  The new code in gnome/gdialogs.c is a new implementation
using a native GNOME dialog instead of MC dialog.  This was the last user
of the glue code using deprecated GtkTed!

ChangeLog:
	* gnome/gdialogs.c [WITH_SMBFS] (vfs_smb_get_authinfo): New
	function implementing SMB password dialog.
        * src/boxes.c [WITH_SMBFS] (vfs_smb_get_authinfo): Copied from
        vfs/smbfs.c, function authinfo_get_authinfo_from_user().
	* vfs/smbfs.c: Rename authinfo to smb_authinfo and
	authinfo_get_authinfo_from_user() to vfs_smb_get_authinfo()
	and remove their definitions.
	* vfs/vfs.h: Declare smb_authinfo and vfs_smb_get_authinfo().

-- 
Regards,
Pavel Roskin


----------------------------------------------------
--- gnome/gdialogs.c
+++ gnome/gdialogs.c
@@ -2,7 +2,7 @@
 /* New dialogs... */
 #include <config.h>
 #include "panel.h"
-#include <gnome.h>
+#include "x.h"
 #include "dialog.h"
 #include "global.h"
 #include "file.h"
@@ -1100,3 +1100,101 @@ symlink_dialog (char *existing, char *ne
         if (ret != -1)
                 gtk_widget_destroy (dialog);
 }
+
+#ifdef WITH_SMBFS
+struct smb_authinfo *
+vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
+		      const char *user)
+{
+	struct smb_authinfo *return_value;
+	GtkWidget *smbauth_dialog;
+	GtkWidget *domain_entry, *user_entry, *passwd_entry;
+	GtkWidget *domain_label, *user_label, *passwd_label;
+
+	char *title;
+	static char* labs[] = {N_("Domain:"), N_("Username:"), N_("Password: ")};
+
+	if (!domain)
+	    domain = "";
+	if (!user)
+	    user = "";
+
+	title = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
+
+	/* Create dialog */
+	smbauth_dialog =
+	    gnome_dialog_new(title, GNOME_STOCK_BUTTON_OK,
+			     GNOME_STOCK_BUTTON_CANCEL, NULL);
+	g_free (title);
+	gmc_window_setup_from_panel(GNOME_DIALOG(smbauth_dialog), cpanel);
+
+	domain_label = gtk_label_new(_(labs[0]));
+	gtk_misc_set_alignment(GTK_MISC(domain_label), 0.0, 0.5);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), domain_label, FALSE,
+			   FALSE, 0);
+
+	domain_entry = gnome_entry_new("domain");
+	gnome_entry_load_history(GNOME_ENTRY(domain_entry));
+	gtk_entry_set_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(domain_entry))),
+			   domain);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), domain_entry, FALSE,
+			   FALSE, 0);
+
+	user_label = gtk_label_new(_(labs[1]));
+	gtk_misc_set_alignment(GTK_MISC(user_label), 0.0, 0.5);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), user_label, FALSE,
+			   FALSE, 0);
+
+	user_entry = gnome_entry_new("user");
+	gnome_entry_load_history(GNOME_ENTRY(user_entry));
+	gtk_entry_set_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(user_entry))),
+			   user);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), user_entry, FALSE,
+			   FALSE, 0);
+
+	passwd_label = gtk_label_new(_(labs[2]));
+	gtk_misc_set_alignment(GTK_MISC(passwd_label), 0.0, 0.5);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), passwd_label, FALSE,
+			   FALSE, 0);
+
+	passwd_entry = gtk_entry_new();
+	gtk_entry_set_text(GTK_ENTRY(passwd_entry), "");
+	gtk_entry_set_visibility(GTK_ENTRY(passwd_entry), FALSE);
+	gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(smbauth_dialog)->vbox), passwd_entry, FALSE,
+			   FALSE, 0);
+
+	gtk_widget_grab_focus(passwd_entry);
+	gnome_dialog_set_default(GNOME_DIALOG(smbauth_dialog), 0);
+
+	gtk_widget_show_all(GNOME_DIALOG(smbauth_dialog)->vbox);
+
+	switch (gnome_dialog_run(GNOME_DIALOG(smbauth_dialog))) {
+	case 0:
+		return_value = g_new (struct smb_authinfo, 1);
+		if (!return_value)
+			break;
+
+		return_value->host = g_strdup (host);
+		return_value->share = g_strdup (share);
+		return_value->domain =
+			g_strdup(gtk_entry_get_text
+				 (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(domain_entry)))));
+		return_value->user =
+			g_strdup(gtk_entry_get_text
+				 (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(user_entry)))));
+		return_value->password = g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_entry)));
+		break;
+
+	case 1:
+		return_value = 0;
+		break;
+
+	default:
+		return 0;
+	}
+
+	gtk_widget_destroy(smbauth_dialog);
+
+	return return_value;
+}
+#endif /* WITH_SMBFS */
--- src/boxes.c
+++ src/boxes.c
@@ -54,6 +54,10 @@
 #include "selcodepage.h"
 #endif

+#ifdef WITH_SMBFS
+#include "../vfs/vfs.h"		/* smb_authinfo */
+#endif /* WITH_SMBFS */
+
 static int DISPLAY_X = 45, DISPLAY_Y = 14;

 static Dlg_head *dd;
@@ -1038,4 +1042,113 @@ jobs_cmd (void)

     destroy_dlg (jobs_dlg);
 }
-#endif
+#endif /* WITH_BACKGROUND */
+
+#ifdef WITH_SMBFS
+struct smb_authinfo *
+vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
+		      const char *user)
+{
+    static int dialog_x = 44;
+    int dialog_y = 12;
+    struct smb_authinfo *return_value;
+    static char* labs[] = {N_("Domain:"), N_("Username:"), N_("Password: ")};
+    static char* buts[] = {N_("&Ok"), N_("&Cancel")};
+    static int ilen = 30, istart = 14;
+    static int b0 = 3, b2 = 30;
+    char *title;
+    WInput *in_password;
+    WInput *in_user;
+    WInput *in_domain;
+    Dlg_head *auth_dlg;
+
+#ifdef ENABLE_NLS
+    static int i18n_flag = 0;
+
+    if (!i18n_flag)
+    {
+        register int i = sizeof(labs)/sizeof(labs[0]);
+        int l1, maxlen = 0;
+
+        while (i--)
+        {
+            l1 = strlen (labs [i] = _(labs [i]));
+            if (l1 > maxlen)
+                maxlen = l1;
+        }
+        i = maxlen + ilen + 7;
+        if (i > dialog_x)
+            dialog_x = i;
+
+        for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; )
+        {
+            l1 += strlen (buts [i] = _(buts [i]));
+        }
+        l1 += 15;
+        if (l1 > dialog_x)
+            dialog_x = l1;
+
+        ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */
+        istart = dialog_x - 3 - ilen;
+
+        b2 = dialog_x - (strlen(buts[1]) + 6);
+
+        i18n_flag = 1;
+    }
+
+#endif /* ENABLE_NLS */
+
+    if (!domain)
+    domain = "";
+    if (!user)
+    user = "";
+
+    auth_dlg = create_dlg (0, 0, dialog_y, dialog_x, dialog_colors,
+                       common_dialog_callback, "[Smb Authinfo]", "smbauthinfo",
+                       DLG_CENTER | DLG_GRID);
+
+    title = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
+    x_set_dialog_title (auth_dlg, title);
+    g_free (title);
+
+    in_user  = input_new (5, istart, INPUT_COLOR, ilen, user, "auth_name");
+    add_widget (auth_dlg, in_user);
+
+    in_domain = input_new (3, istart, INPUT_COLOR, ilen, domain, "auth_domain");
+    add_widget (auth_dlg, in_domain);
+    add_widget (auth_dlg, button_new (9, b2, B_CANCEL, NORMAL_BUTTON,
+                 buts[1], 0 ,0, "cancel"));
+    add_widget (auth_dlg, button_new (9, b0, B_ENTER, DEFPUSH_BUTTON,
+                 buts[0], 0, 0, "ok"));
+
+    in_password  = input_new (7, istart, INPUT_COLOR, ilen, "", "auth_password");
+    in_password->completion_flags = 0;
+    in_password->is_password = 1;
+    add_widget (auth_dlg, in_password);
+
+    add_widget (auth_dlg, label_new (7, 3, labs[2], "label-passwd"));
+    add_widget (auth_dlg, label_new (5, 3, labs[1], "label-user"));
+    add_widget (auth_dlg, label_new (3, 3, labs[0], "label-domain"));
+
+    run_dlg (auth_dlg);
+
+    switch (auth_dlg->ret_value) {
+    case B_CANCEL:
+        return_value = 0;
+        break;
+    default:
+        return_value = g_new (struct smb_authinfo, 1);
+        if (return_value) {
+            return_value->host = g_strdup (host);
+            return_value->share = g_strdup (share);
+            return_value->domain = g_strdup (in_domain->buffer);
+            return_value->user = g_strdup (in_user->buffer);
+            return_value->password = g_strdup (in_password->buffer);
+        }
+    }
+
+    destroy_dlg (auth_dlg);
+
+    return return_value;
+}
+#endif /* WITH_SMBFS */
--- vfs/smbfs.c
+++ vfs/smbfs.c
@@ -40,9 +40,6 @@
 #include "smbfs.h"
 #include "tcputil.h"
 #include "../src/dialog.h"
-#include "../src/widget.h"
-#include "../src/color.h"
-#include "../src/wtools.h"

 #define SMBFS_MAX_CONNECTIONS 16
 static const char * const IPC = "IPC$";
@@ -89,128 +86,10 @@ typedef struct {
 	uint16 attr;
 } smbfs_handle;

-struct authinfo {
-    char *host;
-    char *share;
-    char *domain;
-    char *user;
-    char *password;
-/*	struct timeval timestamp;*/
-};
-
 static GSList *auth_list;

-static struct authinfo *
-authinfo_get_authinfo_from_user (const char *host,
-                                 const char *share,
-                                 const char *domain,
-                                 const char *user)
-{
-    static int dialog_x = 44;
-    int dialog_y = 12;
-    struct authinfo *return_value;
-    static char* labs[] = {N_("Domain:"), N_("Username:"), N_("Password: ")};
-    static char* buts[] = {N_("&Ok"), N_("&Cancel")};
-    static int ilen = 30, istart = 14;
-    static int b0 = 3, b2 = 30;
-    char *title;
-    WInput *in_password;
-    WInput *in_user;
-    WInput *in_domain;
-    Dlg_head *auth_dlg;
-
-#ifdef ENABLE_NLS
-    static int i18n_flag = 0;
-
-    if (!i18n_flag)
-    {
-        register int i = sizeof(labs)/sizeof(labs[0]);
-        int l1, maxlen = 0;
-
-        while (i--)
-        {
-            l1 = strlen (labs [i] = _(labs [i]));
-            if (l1 > maxlen)
-                maxlen = l1;
-        }
-        i = maxlen + ilen + 7;
-        if (i > dialog_x)
-            dialog_x = i;
-
-        for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; )
-        {
-            l1 += strlen (buts [i] = _(buts [i]));
-        }
-        l1 += 15;
-        if (l1 > dialog_x)
-            dialog_x = l1;
-
-        ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */
-        istart = dialog_x - 3 - ilen;
-
-        b2 = dialog_x - (strlen(buts[1]) + 6);
-
-        i18n_flag = 1;
-    }
-
-#endif /* ENABLE_NLS */
-
-    if (!domain)
-    domain = "";
-    if (!user)
-    user = "";
-
-    auth_dlg = create_dlg (0, 0, dialog_y, dialog_x, dialog_colors,
-                       common_dialog_callback, "[Smb Authinfo]", "smbauthinfo",
-                       DLG_CENTER | DLG_GRID);
-
-    title = g_strdup_printf (_("Password for \\\\%s\\%s"), host, share);
-    x_set_dialog_title (auth_dlg, title);
-    g_free (title);
-
-    in_user  = input_new (5, istart, INPUT_COLOR, ilen, user, "auth_name");
-    add_widget (auth_dlg, in_user);
-
-    in_domain = input_new (3, istart, INPUT_COLOR, ilen, domain, "auth_domain");
-    add_widget (auth_dlg, in_domain);
-    add_widget (auth_dlg, button_new (9, b2, B_CANCEL, NORMAL_BUTTON,
-                 buts[1], 0 ,0, "cancel"));
-    add_widget (auth_dlg, button_new (9, b0, B_ENTER, DEFPUSH_BUTTON,
-                 buts[0], 0, 0, "ok"));
-
-    in_password  = input_new (7, istart, INPUT_COLOR, ilen, "", "auth_password");
-    in_password->completion_flags = 0;
-    in_password->is_password = 1;
-    add_widget (auth_dlg, in_password);
-
-    add_widget (auth_dlg, label_new (7, 3, labs[2], "label-passwd"));
-    add_widget (auth_dlg, label_new (5, 3, labs[1], "label-user"));
-    add_widget (auth_dlg, label_new (3, 3, labs[0], "label-domain"));
-
-    run_dlg (auth_dlg);
-
-    switch (auth_dlg->ret_value) {
-    case B_CANCEL:
-        return_value = 0;
-        break;
-    default:
-        return_value = g_new (struct authinfo, 1);
-        if (return_value) {
-            return_value->host = g_strdup (host);
-            return_value->share = g_strdup (share);
-            return_value->domain = g_strdup (in_domain->buffer);
-            return_value->user = g_strdup (in_user->buffer);
-            return_value->password = g_strdup (in_password->buffer);
-        }
-    }
-
-    destroy_dlg (auth_dlg);
-
-    return return_value;
-}
-
 static void
-authinfo_free (struct authinfo const *a)
+authinfo_free (struct smb_authinfo const *a)
 {
     g_free (a->host);
     g_free (a->share);
@@ -232,8 +111,8 @@ authinfo_free_all ()
 static gint
 authinfo_compare_host_and_share (gconstpointer _a, gconstpointer _b)
 {
-    struct authinfo const *a = (struct authinfo const *)_a;
-    struct authinfo const *b = (struct authinfo const *)_b;
+    struct smb_authinfo const *a = (struct smb_authinfo const *)_a;
+    struct smb_authinfo const *b = (struct smb_authinfo const *)_b;

     if (!a->host || !a->share || !b->host || !b->share)
         return 1;
@@ -247,8 +126,8 @@ authinfo_compare_host_and_share (gconstp
 static gint
 authinfo_compare_host (gconstpointer _a, gconstpointer _b)
 {
-    struct authinfo const *a = (struct authinfo const *)_a;
-    struct authinfo const *b = (struct authinfo const *)_b;
+    struct smb_authinfo const *a = (struct smb_authinfo const *)_a;
+    struct smb_authinfo const *b = (struct smb_authinfo const *)_b;

     if (!a->host || !b->host)
         return 1;
@@ -263,7 +142,7 @@ static void
 authinfo_add (const char *host, const char *share, const char *domain,
               const char *user, const char *password)
 {
-    struct authinfo *auth = g_new (struct authinfo, 1);
+    struct smb_authinfo *auth = g_new (struct smb_authinfo, 1);

     if (!auth)
         return;
@@ -280,8 +159,8 @@ authinfo_add (const char *host, const ch
 static void
 authinfo_remove (const char *host, const char *share)
 {
-    struct authinfo data;
-    struct authinfo *auth;
+    struct smb_authinfo data;
+    struct smb_authinfo *auth;
     GSList *list;

     data.host = g_strdup (host);
@@ -306,8 +185,8 @@ bucket_set_authinfo (smbfs_connection *b
         const char *domain, const char *user, const char *pass,
         int fallback_to_host)
 {
-    struct authinfo data;
-    struct authinfo *auth;
+    struct smb_authinfo data;
+    struct smb_authinfo *auth;
     GSList *list;

     if (domain && user && pass) {
@@ -343,10 +222,10 @@ bucket_set_authinfo (smbfs_connection *b
         return 1;
     }

-    auth = authinfo_get_authinfo_from_user (bucket->host,
-                                bucket->service,
-                                (domain ? domain : lp_workgroup ()),
-                                user);
+    auth = vfs_smb_get_authinfo (bucket->host,
+				 bucket->service,
+				 (domain ? domain : lp_workgroup ()),
+				 user);
     if (auth) {
         g_free (bucket->domain);
         g_free (bucket->user);
--- vfs/vfs.h
+++ vfs/vfs.h
@@ -349,6 +349,22 @@
 extern char *vfs_get_password (char *msg);
 extern char *vfs_split_url (char *path, char **host, char **user, int *port, char **pass,
 					int default_port, int flags);
+
+#ifdef WITH_SMBFS
+/* Interface for requesting SMB credentials.  */
+struct smb_authinfo {
+    char *host;
+    char *share;
+    char *domain;
+    char *user;
+    char *password;
+};
+
+struct smb_authinfo *
+vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
+		      const char *user);
+#endif /* WITH_SMBFS */
+
 #define URL_DEFAULTANON 1
 #define URL_NOSLASH 2
 extern void vfs_print_stats (char *fs_name, char *action, char *file_name, int have, int need);





More information about the mc-devel mailing list