[evolution-mapi] Be able to search GAL users from "Subscribe other user's folder" dialog



commit 57e756f19ade35da92b374e7f3475c72c837a8e1
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 24 14:23:06 2012 +0100

    Be able to search GAL users from "Subscribe other user's folder" dialog

 .../e-mapi-subscribe-foreign-folder.c              |   76 ++++++++++++++++++--
 1 files changed, 69 insertions(+), 7 deletions(-)
---
diff --git a/src/account-setup-eplugin/e-mapi-subscribe-foreign-folder.c b/src/account-setup-eplugin/e-mapi-subscribe-foreign-folder.c
index 65dec46..fab0072 100644
--- a/src/account-setup-eplugin/e-mapi-subscribe-foreign-folder.c
+++ b/src/account-setup-eplugin/e-mapi-subscribe-foreign-folder.c
@@ -34,6 +34,7 @@
 #include "camel/camel-mapi-store-summary.h"
 
 #include "e-mapi-account-setup.h"
+#include "e-mapi-search-gal-user.h"
 #include "e-mapi-subscribe-foreign-folder.h"
 #include "e-mapi-utils.h"
 
@@ -45,6 +46,7 @@
 #define STR_FOLDER_NAME_COMBO		"e-mapi-folder-name-combo"
 #define STR_MAPI_CAMEL_SESSION		"e-mapi-camel-session"
 #define STR_MAPI_CAMEL_STORE		"e-mapi-camel-store"
+#define STR_MAPI_DIRECT_USER_NAME	"e-mapi-direct-user-name"
 
 static gboolean
 add_foreign_folder_to_camel (CamelMapiStore *mapi_store,
@@ -162,6 +164,8 @@ name_entry_changed_cb (GObject *dialog)
 	entry = g_object_get_data (dialog, STR_USER_NAME_SELECTOR_ENTRY);
 	g_return_if_fail (entry != NULL);
 
+	g_object_set_data (G_OBJECT (entry), STR_MAPI_DIRECT_USER_NAME, NULL);
+
 	text = gtk_entry_get_text (entry);
 
 	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, text && *text && *text != ' ' && *text != ',');
@@ -171,6 +175,7 @@ struct EMapiCheckForeignFolderData
 {
 	GtkWidget *dialog;
 	gchar *username;
+	gchar *direct_username;
 	gchar *user_displayname;
 	gchar *orig_foldername;
 	gchar *use_foldername;
@@ -189,6 +194,7 @@ e_mapi_check_foreign_folder_data_free (gpointer ptr)
 		return;
 
 	g_free (cffd->username);
+	g_free (cffd->direct_username);
 	g_free (cffd->user_displayname);
 	g_free (cffd->orig_foldername);
 	g_free (cffd->use_foldername);
@@ -291,12 +297,19 @@ check_foreign_folder_thread (GObject *with_object,
 		return;
 	}
 
-	if (!e_mapi_connection_resolve_username (conn, cffd->username,
-		NULL, NULL,
-		check_foreign_username_resolved_cb, cffd,
-		cancellable, perror)) {
-		make_mapi_error (perror, "e_mapi_connection_resolve_username", MAPI_E_CALL_FAILED);
-		return;
+	if (cffd->direct_username && *cffd->direct_username) {
+		g_return_if_fail (cffd->user_displayname == NULL);
+
+		cffd->user_displayname = cffd->username;
+		cffd->username = g_strdup (cffd->direct_username);
+	} else {
+		if (!e_mapi_connection_resolve_username (conn, cffd->username,
+			NULL, NULL,
+			check_foreign_username_resolved_cb, cffd,
+			cancellable, perror)) {
+			make_mapi_error (perror, "e_mapi_connection_resolve_username", MAPI_E_CALL_FAILED);
+			return;
+		}
 	}
 
 	if (g_cancellable_set_error_if_cancelled (cancellable, perror)) {
@@ -487,6 +500,7 @@ subscribe_foreign_response_cb (GObject *dialog,
 	cffd = g_new0 (struct EMapiCheckForeignFolderData, 1);
 	cffd->dialog = GTK_WIDGET (dialog);
 	cffd->username = g_strdup (username ? username : "");
+	cffd->direct_username = g_strdup (g_object_get_data (G_OBJECT (entry), STR_MAPI_DIRECT_USER_NAME));
 	cffd->orig_foldername = orig_foldername;
 	cffd->use_foldername = use_foldername;
 	cffd->folder_id = 0;
@@ -506,6 +520,45 @@ subscribe_foreign_response_cb (GObject *dialog,
 	g_free (description);
 }
 
+static void
+pick_gal_user_clicked_cb (GtkButton *button,
+			  GObject *dialog)
+{
+	GtkEntry *entry;
+	CamelMapiStore *mapi_store;
+	gchar *text, *display_name = NULL, *dn = NULL;
+	EMapiGalUserType searched_type = E_MAPI_GAL_USER_NONE;
+
+	g_return_if_fail (dialog != NULL);
+
+	entry = g_object_get_data (dialog, STR_USER_NAME_SELECTOR_ENTRY);
+	mapi_store = g_object_get_data (dialog, STR_MAPI_CAMEL_STORE);
+
+	g_return_if_fail (entry != NULL);
+	g_return_if_fail (mapi_store != NULL);
+
+	text = g_strstrip (g_strdup (gtk_entry_get_text (entry)));
+
+	if (e_mapi_search_gal_user_modal (GTK_WINDOW (dialog),
+					  camel_mapi_store_get_connection (mapi_store),
+					  text,
+					  &searched_type,
+					  &display_name,
+					  NULL,
+					  &dn,
+					  NULL)) {
+		if (searched_type == E_MAPI_GAL_USER_REGULAR &&
+		    display_name && dn && *dn && strchr (dn, '=')) {
+			gtk_entry_set_text (entry, display_name);
+			g_object_set_data_full (G_OBJECT (entry), STR_MAPI_DIRECT_USER_NAME, g_strdup (strrchr (dn, '=') + 1), g_free);
+		}
+	}
+
+	g_free (text);
+	g_free (display_name);
+	g_free (dn);
+}
+
 /* Opens dialog to subscribe to folders of other
    users in the given store */
 void
@@ -572,7 +625,7 @@ e_mapi_subscribe_foreign_folder (GtkWindow *parent,
 	pango_attr_list_unref (attrs);
 
 	gtk_grid_attach (grid, label, 0, row, 1, 1);
-	gtk_grid_attach (grid, widget, 1, row, 3, 1);
+	gtk_grid_attach (grid, widget, 1, row, 2, 1);
 
 	row++;
 
@@ -598,9 +651,18 @@ e_mapi_subscribe_foreign_folder (GtkWindow *parent,
 		"vexpand", FALSE,
 		NULL);
 
+	widget = gtk_button_new_with_mnemonic (_("C_hoose..."));
+	g_object_set (G_OBJECT (entry),
+		"hexpand", TRUE,
+		"vexpand", FALSE,
+		NULL);
+
 	gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
+	g_signal_connect (widget, "clicked", G_CALLBACK (pick_gal_user_clicked_cb), dialog);
+
 	gtk_grid_attach (grid, label, 0, row, 1, 1);
 	gtk_grid_attach (grid, entry, 1, row, 1, 1);
+	gtk_grid_attach (grid, widget, 2, row, 1, 1);
 
 	row++;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]