From 30bab8c491c75223386c71a7e1c265791d6b7c9c Mon Sep 17 00:00:00 2001
From: Vivek Jain <jvivek@novell.com>
Date: Thu, 13 Jan 2005 11:32:17 +0000
Subject: changed the function find_node to return user node corresponding to
 the

2005-01-13 Vivek Jain <jvivek@novell.com>
	* share-folder.c :changed the function find_node to return user node
	corresponding to the mail address given.
	(add_clicked): added a condition so that user can't share folder to himself.
	(user_selected): modified to display proper rights when owner is selected.
	* share-folder-common.c : calling share_folder with a cnc in it.

svn path=/trunk/; revision=28390
---
 plugins/shared-folder/ChangeLog             |  35 ++++---
 plugins/shared-folder/install-shared.c      |   2 +
 plugins/shared-folder/share-folder-common.c |  17 +++-
 plugins/shared-folder/share-folder.c        | 139 ++++++++++++++--------------
 plugins/shared-folder/share-folder.h        |   1 -
 5 files changed, 108 insertions(+), 86 deletions(-)

(limited to 'plugins/shared-folder')

diff --git a/plugins/shared-folder/ChangeLog b/plugins/shared-folder/ChangeLog
index 5d411b0214..2782a217d0 100644
--- a/plugins/shared-folder/ChangeLog
+++ b/plugins/shared-folder/ChangeLog
@@ -1,3 +1,10 @@
+2005-01-13 Vivek Jain <jvivek@novell.com> 
+	* share-folder.c :changed the function find_node to return user node
+	corresponding to the mail address given.
+	(add_clicked): added a condition so that user can't share folder to itself.
+	(user_selected): modified to display proper rights when owner is selected.
+	* share-folder-common.c : calling share_folder with a cnc in it.
+
 2005-01-11 Vivek Jain <jvivek@novell.com> 
 killed compile time warnings by including suitable definitions
 and type casting widgets
@@ -14,7 +21,7 @@ a shared folder is created so that different icons are displayed
 * share-folder.c : minor changes to fix the crash
 * Makefile.am : including install-shared.c in sources
 * org-gnome-shared-folder.eplug.in : added a plugin to the e-plugin list for
- the message-read event
+the message-read event
 
 2004-12-15 Vivek Jain <jvivek@novell.com>
 
@@ -25,19 +32,19 @@ Added (Create a shared folder) functionality in the plugin
 2004-12-15  Vivek Jain <jvivek@novell.com>
 
 * shared-folder-common.c : (org_gnome_shared_folder_factory)
-* shared-folder.c : some whitespace changes, typecasting widgets,
-in (on_add_clicked) removed assigning the rights portion
-
-2004-12-08  Vivek Jain <jvivek@novell.com>
-
-The following files are added as an initial check in for the plugin that
-implements shared-folder functionality in the groupwise folders
-* share-folder.c
-* share-folder.h
-* share-folder-common.c
-* properties.glade
-* Makefile.am
-* org-gnome-shared-folder.eplug.in
+	* shared-folder.c : some whitespace changes, typecasting widgets,
+	in (on_add_clicked) removed assigning the rights portion
+
+	2004-12-08  Vivek Jain <jvivek@novell.com>
+
+	The following files are added as an initial check in for the plugin that
+	implements shared-folder functionality in the groupwise folders
+	* share-folder.c
+	* share-folder.h
+	* share-folder-common.c
+	* properties.glade
+	* Makefile.am
+	* org-gnome-shared-folder.eplug.in
 
 
 
diff --git a/plugins/shared-folder/install-shared.c b/plugins/shared-folder/install-shared.c
index 7eb1191e95..6b7e7b8f78 100644
--- a/plugins/shared-folder/install-shared.c
+++ b/plugins/shared-folder/install-shared.c
@@ -192,6 +192,7 @@ org_gnome_popup_wizard (EPlugin *ep, EMEventTargetMessage *target)
 		camel_data_wrapper_write_to_stream(dw, (CamelStream *)content);
 		buffer = g_malloc0 (content->buffer->len+1) ;
 		buffer = memcpy (buffer, content->buffer->data, content->buffer->len) ;
+/*		buffer = camel_mime_message_build_mbox_from ( (CamelMimeMessage *)target->message) ;*/
 		from_addr = camel_mime_message_get_from ((CamelMimeMessage *)target->message);
 		if (camel_internet_address_get (from_addr,0, &name, &email))
 		subject = camel_mime_message_get_subject (target->message) ;
@@ -203,6 +204,7 @@ org_gnome_popup_wizard (EPlugin *ep, EMEventTargetMessage *target)
 		finish_page = GNOME_DRUID_PAGE_EDGE (gnome_druid_page_edge_new_with_vals(GNOME_EDGE_FINISH, TRUE, "finished Install the shared folder", "said", NULL,NULL, NULL));
 		wizard = GNOME_DRUID (gnome_druid_new_with_window ("Shared Folder Installation", NULL, TRUE, (GtkWidget**)(&window)));
 		gnome_druid_append_page(wizard, GNOME_DRUID_PAGE(title_page));
+		gtk_window_set_position (GTK_WINDOW (window) , GTK_WIN_POS_CENTER_ALWAYS);
 		gtk_widget_show_all (GTK_WIDGET (title_page));
 		gnome_druid_append_page(wizard, GNOME_DRUID_PAGE(middle_page));	
 		gtk_widget_show_all (GTK_WIDGET (middle_page));
diff --git a/plugins/shared-folder/share-folder-common.c b/plugins/shared-folder/share-folder-common.c
index fa1f36eab7..dd79b6f43c 100644
--- a/plugins/shared-folder/share-folder-common.c
+++ b/plugins/shared-folder/share-folder-common.c
@@ -292,6 +292,10 @@ new_folder_response (EMFolderSelector *emfs, int response, EMFolderTreeModel *mo
 	GtkWidget *users_dialog;
 	GtkWidget *w;
 	struct ShareInfo *ssi;
+	const char *uri, *path;
+	EGwConnection *cnc;
+	CamelException ex;
+	CamelStore *store;
 
 	ssi = g_new0(struct ShareInfo, 1);
 	if (response != GTK_RESPONSE_OK) {
@@ -299,12 +303,21 @@ new_folder_response (EMFolderSelector *emfs, int response, EMFolderTreeModel *mo
 		return;
 	}
 	
+	/* i want store at this point to get cnc not sure proper or not*/
+	uri = em_folder_selector_get_selected_uri (emfs);
+	camel_exception_init (&ex);
+	if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) {
+		camel_exception_clear (&ex);
+		return;
+	}
+
+	cnc = get_cnc (store);
 	users_dialog = gtk_dialog_new_with_buttons (
 			_("Users"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
 	w = gtk_label_new_with_mnemonic (_("Enter the users and set permissions"));
 	gtk_widget_show(w);
 	gtk_box_pack_start(GTK_BOX (GTK_DIALOG (users_dialog)->vbox), (GtkWidget *) w, TRUE, TRUE, 6);
-	ssi->sf = share_folder_new (NULL, NULL);
+	ssi->sf = share_folder_new (cnc, NULL);
 	((ssi->sf)->table)->parent = NULL;
 	gtk_widget_set_sensitive (GTK_WIDGET ((ssi->sf)->table), TRUE);	
 	ssi->model = model;
@@ -315,7 +328,9 @@ new_folder_response (EMFolderSelector *emfs, int response, EMFolderTreeModel *mo
 	gtk_widget_show(users_dialog);
 	g_signal_connect (users_dialog, "response", G_CALLBACK (users_dialog_response), ssi);
 	
+	camel_object_unref (store);
 	return ;
+
 }
 
 void 
diff --git a/plugins/shared-folder/share-folder.c b/plugins/shared-folder/share-folder.c
index 2ed4b41cec..6d8f140d9a 100644
--- a/plugins/shared-folder/share-folder.c
+++ b/plugins/shared-folder/share-folder.c
@@ -52,7 +52,7 @@ static void share_folder_finalise   (GObject *obj);
 static void free_node(EShUsers *user);
 static void free_all(ShareFolder *sf);
 static void update_list_update (ShareFolder *sf);
-static int find_node(GList *list, gchar *email);
+static EShUsers * find_node(GList *list, gchar *email);
 static void free_all(ShareFolder *sf);
 static void get_container_list (ShareFolder *sf);
 static void user_selected(GtkTreeSelection *selection, ShareFolder *sf);
@@ -125,7 +125,6 @@ share_folder_init (ShareFolder *sf)
 {
 	sf->gcontainer = NULL;
 	sf->users = 0;
-	sf->duplicate = -1;
 	sf->flag_for_ok = 0;
 	sf->shared = FALSE;
 	sf->container_list = NULL;
@@ -146,28 +145,25 @@ free_node(EShUsers *user)
 	return ;
 }
 
-static int
+static EShUsers * 
 find_node(GList *list, gchar *email)
 {
-
 	EShUsers *user = NULL;
 	GList *tmp;
 	gint i ;
-	gint duplicate = -1;
+	
 	if(list){
-		tmp = g_list_first(list);
+		tmp = g_list_first(list); 
 		for(i=0; tmp  ; i++)
 		{
-			user= g_list_nth_data(tmp, 0);
+			user= tmp->data;
 			if(!g_ascii_strcasecmp(user->email, email)){
-				duplicate = i;
-				break;
+				return user; /*if found, it returns that user*/
 			}
 			tmp= g_list_next(tmp);
 		}
-
 	}
-	return duplicate;
+	return NULL;
 }
 
 static void 
@@ -208,6 +204,7 @@ update_list_update (ShareFolder *sf)
 	gboolean delete = FALSE;
 	GList *tmp = NULL;
 	EShUsers *user = NULL;
+	EShUsers *usr = NULL;
 	int rights = 0;
 	add = gtk_toggle_button_get_active(sf->add);
 	edit = gtk_toggle_button_get_active(sf->edit);
@@ -224,24 +221,22 @@ update_list_update (ShareFolder *sf)
 
 	if(sf->update_list){
 		tmp = g_list_last(sf->update_list);
-		user = g_list_nth_data(tmp, 0);
+		user = tmp->data;
 		/* if the user is still in the new list then remove from update list*/
 		if (sf->new_list && user->email){
-			sf->duplicate = find_node (sf->new_list, user->email);
-			if (sf->duplicate != -1) {
+			usr = find_node (sf->new_list, user->email);
+			if (usr) {
 				sf->update_list = g_list_remove(sf->update_list, user);
 				free_node (user);
 				if (g_list_length (sf->update_list) == 0)
 					sf->update_list = NULL;
-				user = g_list_nth_data (sf->new_list, sf->duplicate);	
-				sf->duplicate = -1;
-				if(user->rights != rights)
-					user->rights= rights;
-
+				/* and update the rights in the new list*/
+				if(usr->rights != rights)
+					usr->rights= rights;
 				return ;
 			}
 		}
-
+		/* if not in the new list then update the rights, if no change then remove it from the update list*/
 		if (user) {
 			if(user->rights != rights){
 				user->rights= rights;
@@ -271,7 +266,6 @@ display_container (EGwContainer *container , ShareFolder *sf)
 	EShUsers *user = NULL;
 
 	id_shared = g_strdup(e_gw_container_get_id(container));
-	g_print ("folder id: %s ours is %s\n",id_shared, sf->container_id);
 	/* this has to be done since id changes after the folder is shared*/
 	if( g_str_has_suffix (id_shared, "35")){
 		tail = g_strsplit(id_shared, "@", 2);
@@ -291,12 +285,11 @@ display_container (EGwContainer *container , ShareFolder *sf)
 				gtk_toggle_button_set_active((GtkToggleButton *) sf->shared, TRUE);
 				shared_clicked(sf->shared , sf);
 				if (tome) {
-					gtk_widget_set_sensitive (GTK_WIDGET (sf->table), FALSE);
-					gtk_widget_set_sensitive (GTK_WIDGET (sf->shared), FALSE);
 					gtk_widget_set_sensitive (GTK_WIDGET (sf->not_shared), FALSE);
-					gtk_widget_set_sensitive (GTK_WIDGET (sf->scrolled_window), TRUE);
-					gtk_widget_set_sensitive (GTK_WIDGET (sf->user_list), TRUE);
-
+					gtk_widget_set_sensitive (GTK_WIDGET (sf->add_button), FALSE);
+					gtk_widget_set_sensitive (GTK_WIDGET (sf->remove), FALSE);
+					gtk_widget_set_sensitive (GTK_WIDGET (sf->add_book), FALSE);
+					gtk_widget_set_sensitive (GTK_WIDGET (sf->notification), FALSE);
 					email = g_strdup (e_gw_container_get_owner (sf->gcontainer));
 					msg = g_strconcat (email, "  (Owner)", NULL);
 					gtk_list_store_append (GTK_LIST_STORE (sf->model), &(sf->iter));
@@ -351,10 +344,11 @@ static void
 user_selected(GtkTreeSelection *selection, ShareFolder *sf)
 {
 	EShUsers *user = NULL;
-	gint index = -1;
+	EShUsers *usr = NULL;
+	GList *list = NULL;
+	gint index = -1;	
 	int rights = 0;
 	gchar *email = NULL;
-	int length=0;
 
 	/* This function should be called in the beginning of any probable subsequent event*/
 	update_list_update (sf);
@@ -363,7 +357,9 @@ user_selected(GtkTreeSelection *selection, ShareFolder *sf)
 	if (gtk_tree_selection_get_selected (selection, &(sf->model), &(sf->iter))){
 		gtk_widget_set_sensitive (GTK_WIDGET (sf->frame), TRUE);
 		gtk_widget_set_sensitive (GTK_WIDGET (sf->remove), TRUE);
-
+		if(sf->gcontainer)
+			if (e_gw_container_get_is_shared_to_me (sf->gcontainer))
+				gtk_widget_set_sensitive (GTK_WIDGET (sf->remove), FALSE);
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->add), FALSE);	
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->del), FALSE);	
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->edit), FALSE);
@@ -372,42 +368,44 @@ user_selected(GtkTreeSelection *selection, ShareFolder *sf)
 
 		gtk_label_set_text (GTK_LABEL (sf->user_rights), email); 
 
-		sf->duplicate = find_node(sf->update_list, email);
-		if( sf->duplicate == -1) {
-			if (sf->shared && index < sf->users) {
-				rights = e_gw_container_get_rights (sf->gcontainer, email);
-			} else {
-				user = g_list_nth_data (sf->new_list, index - sf->users);
-				rights = user->rights;
+		usr = find_node(sf->update_list, email);
+		if(! usr) { /* not in the update list..check whether an existing user*/
+			if (sf->gcontainer) 
+				e_gw_container_get_user_list (sf->gcontainer, &list); 
+			if (list && email){
+				usr = find_node (list, email);
+				if (usr) 	
+					rights = usr->rights;	
+			}  
+			if (sf->new_list && email){
+				usr = find_node (sf->new_list, email);
+				if (usr) 
+					rights = usr->rights;
 			}
-		} else { 
-			user = g_list_nth_data (sf->update_list, sf->duplicate);
-			rights = user->rights;
-			sf->duplicate = -1;
+
+		} else  {
+			rights = usr->rights;
+			sf->update_list = g_list_remove (sf->update_list, usr); /*i want to keep it on the top*/
+			free_node (usr);
 		}
+		/* till here fight was to get the rights of the selected user now display them*/	
 		if (rights & 0x1)
 			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->add), TRUE);		
 		if (rights & 0x2)
 			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->edit), TRUE);		
 		if (rights & 0x4)
 			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->del), TRUE);
-
+		if(g_strrstr (email, "Owner")) {
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->add), TRUE);		
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->edit), TRUE);		
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->del), TRUE);		
+		}
 
 		user = g_new0(EShUsers, 1);	
 		user->email = g_strdup (email);
 		user->rights = rights;
 
-		if (sf->duplicate != -1) {
-			EShUsers *usr = NULL;
-			usr = g_list_nth_data (sf->update_list, sf->duplicate);
-			if (usr) {
-				sf->update_list = g_list_remove (sf->update_list, usr);
-				free_node (usr);
-			}
-			sf->duplicate = -1;
-		}
 		sf->update_list = g_list_append (sf->update_list, user);
-		length = g_list_length (sf->update_list);
 	}
 	else {
 		gtk_widget_set_sensitive (GTK_WIDGET (sf->frame), FALSE);
@@ -439,7 +437,9 @@ static void
 add_clicked(GtkButton *button, ShareFolder *sf)
 {
 	const char *email = NULL;
+	const char *self_email = NULL;
 	EShUsers *user = NULL;
+	EShUsers *usr = NULL;
 	GList *list = NULL;
 	gint rights = 0;
 	gint length;
@@ -453,9 +453,11 @@ add_clicked(GtkButton *button, ShareFolder *sf)
 				name_selector_entry));
 	destinations = e_destination_store_list_destinations (destination_store);
 	tmp = destinations;
+	self_email = g_strdup (e_gw_connection_get_user_email (sf->cnc));
 	for (; tmp != NULL; tmp = g_list_next (tmp)) {
 		email = e_destination_get_email (tmp->data);
-		if (g_strrstr (email, "@") == NULL) 
+		/* You can't share a folder with yourself*/
+		if (g_strrstr (email, "@") == NULL || (!g_ascii_strcasecmp (email , self_email))) 
 			e_error_run ((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *) sf->table), "mail:shared-folder-invalid-user-error", email, NULL); 
 		else {	
 			if (g_ascii_strcasecmp (email, "" )) {
@@ -471,20 +473,17 @@ add_clicked(GtkButton *button, ShareFolder *sf)
 				e_gw_container_get_user_list (sf->gcontainer, &list); 
 
 			if (list && user->email){
-
-				sf->duplicate = find_node (list, user->email);
-				if (sf->duplicate != -1) {	
-					sf->duplicate = -1;
+				usr = find_node (list, user->email);
+				if (usr) 	
 					return ;
-				}
+
 			}
 			if (sf->new_list && user->email){
 
-				sf->duplicate = find_node (sf->new_list, user->email);
-				if (sf->duplicate != -1) {	
-					sf->duplicate = -1;
+				usr = find_node (sf->new_list, user->email);
+				if (usr) 
 					return ;
-				}
+
 			}
 
 			user->rights = rights;
@@ -508,22 +507,21 @@ remove_clicked(GtkButton *button, ShareFolder *sf)
 
 	GList *list = NULL;
 	EShUsers *usr = NULL;
+	EShUsers *user = NULL;
 	gchar *email;
 
 	/*check whether this is required*/
 	gtk_tree_model_get ((GtkTreeModel *) sf->model, &(sf->iter), 0, &email, -1);
 	list = g_list_last (sf->update_list);
-	usr = g_list_nth_data (list, 0);
-	sf->duplicate = find_node (sf->new_list, usr->email);
-	sf->update_list = g_list_remove (sf->update_list, usr);
-	if (sf->duplicate != -1) {	
-		free_node (usr);
-		usr = g_list_nth_data (sf->new_list, sf->duplicate);
+	user = list->data;
+	sf->update_list = g_list_remove (sf->update_list, user);
+	/* if in the newlist remove from there*/
+	usr = find_node (sf->new_list, user->email);
+	if (usr) {	
 		sf->new_list = g_list_remove (sf->new_list, usr);
 		free_node(usr);		
-		sf->duplicate = -1;
 	} else {
-		sf->remove_list = g_list_append (sf->remove_list, usr);
+		sf->remove_list = g_list_append (sf->remove_list, user);
 	}
 	g_free (email);
 	gtk_list_store_remove (GTK_LIST_STORE (sf->model), &(sf->iter));
@@ -570,7 +568,6 @@ share_folder (ShareFolder *sf)
 			if (sf->update_list) {
 				sf->sub = "Shared Folder rights updated";
 
-			printf ("\n\nthe message is :%s\n\n", sf->mesg);
 				if (e_gw_connection_share_folder (sf->cnc, sf->container_id, sf->update_list, sf->sub, sf->mesg, 2) == E_GW_CONNECTION_STATUS_OK);
 			}
 		}  
@@ -634,6 +631,7 @@ notification_clicked(GtkButton *button, ShareFolder *sf)
 	g_signal_connect ((gpointer) not_ok, "clicked", G_CALLBACK (not_ok_clicked), sf);
 	not_cancel = GTK_BUTTON (glade_xml_get_widget (xmln, "nCancel"));
 	g_signal_connect ((gpointer) not_cancel, "clicked", G_CALLBACK (not_cancel_clicked), sf->window);
+	gtk_window_set_title (GTK_WINDOW (sf->window), "Custom Notification");
 	gtk_window_set_position (GTK_WINDOW (sf->window) , GTK_WIN_POS_CENTER_ALWAYS);
 	gtk_widget_show_all (sf->window);
 }
@@ -751,6 +749,7 @@ share_folder_new (EGwConnection *ccnc, gchar *id)
 	share_folder_construct (new);
 	new->cnc = ccnc;
 	new->container_id = id;
+	if (ccnc && id)
 	get_container_list(new);
 
 	return (ShareFolder *) new;
diff --git a/plugins/shared-folder/share-folder.h b/plugins/shared-folder/share-folder.h
index da692bc985..9d4aeff51e 100644
--- a/plugins/shared-folder/share-folder.h
+++ b/plugins/shared-folder/share-folder.h
@@ -98,7 +98,6 @@ struct _ShareFolder {
 	gint users;
 	gboolean byme;
 	gboolean tome;
-	gint duplicate;
 	gint flag_for_ok;
 	gchar *email;
 	gboolean is_shared;
-- 
cgit