| Thanks -- Sarfraaz Ahmed <asarfraaz novell com> | 
Index: camel/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.2103
diff -u -r1.2103 ChangeLog
--- camel/ChangeLog	16 Apr 2004 18:34:55 -0000	1.2103
+++ camel/ChangeLog	19 Apr 2004 13:00:18 -0000
@@ -1,3 +1,8 @@
+2004-04-19  Sarfraaz Ahmed <asarfraaz novell com>
+
+	* camel-provider.h: Added flags for allowing camel providers to 
+	display license file.
+
 2004-04-16  Jeffrey Stedfast  <fejj ximian com>
 
 	* camel-vee-store.c (change_folder): (flags & 0) will never be
Index: camel/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.2103
diff -u -r1.2103 ChangeLog
--- camel/ChangeLog	16 Apr 2004 18:34:55 -0000	1.2103
+++ camel/ChangeLog	19 Apr 2004 13:01:01 -0000
@@ -1,3 +1,8 @@
+2004-04-19  Sarfraaz Ahmed <asarfraaz novell com>
+
+	* camel-provider.h: Added flags for allowing camel providers to 
+	display license file.
+
 2004-04-16  Jeffrey Stedfast  <fejj ximian com>
 
 	* camel-vee-store.c (change_folder): (flags & 0) will never be
Index: mail/mail-account-gui.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v
retrieving revision 1.158
diff -u -r1.158 mail-account-gui.c
--- mail/mail-account-gui.c	8 Apr 2004 22:02:36 -0000	1.158
+++ mail/mail-account-gui.c	19 Apr 2004 13:02:02 -0000
@@ -27,6 +27,8 @@
 #include <config.h>
 #endif
 
+#include <glib.h>
+
 #include <string.h>
 #include <stdarg.h>
 
@@ -56,6 +58,9 @@
 
 #define d(x)
 
+#define FILENAME EVOLUTION_GLADEDIR "/mail-license.glade"
+#define ROOTNODE "lic_dialog"
+
 static void save_service (MailAccountGuiService *gsvc, GHashTable *extra_conf, EAccountService *service);
 static void service_changed (GtkEntry *entry, gpointer user_data);
 
@@ -155,6 +160,109 @@
 	g_free (value);
 }
 
+static void 
+set_license_rejected (GtkWidget *widget, gpointer data)
+{
+	gtk_dialog_response (GTK_DIALOG (data), GTK_RESPONSE_DELETE_EVENT);
+	return;
+}
+
+static void
+set_license_accepted (GtkWidget *widget, gpointer data)
+{
+	gtk_dialog_response (GTK_DIALOG (data), GTK_RESPONSE_ACCEPT);
+	return;
+
+}
+
+static void
+check_button_state (GtkToggleButton *button, gpointer data)
+{
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)))
+		gtk_widget_set_sensitive (GTK_WIDGET (data), TRUE);
+	else
+		gtk_widget_set_sensitive (GTK_WIDGET (data), FALSE);
+}
+
+#define BUFSIZE 1024
+
+static gboolean
+populate_text_entry (GtkTextView *view, const char *filename)
+{
+	FILE *fd;
+	char filebuf[BUFSIZE];
+	GtkTextIter iter;
+	GtkTextBuffer *buffer;
+	char fname[BUFSIZE];
+	int count;
+
+	g_sprintf (fname, "%s/../%s", EVOLUTION_GLADEDIR, filename);
+
+	fd = fopen (fname, "r");
+	
+	if (!fd) {
+		/* FIXME: Should never come here */
+		return FALSE;
+	}
+
+	buffer =  gtk_text_buffer_new (NULL);
+	gtk_text_buffer_get_start_iter (buffer, &iter);
+
+	while (!feof (fd)) {
+		count = fread (filebuf, 1, (BUFSIZE - 1), fd);
+		filebuf [count] = '\0';
+		gtk_text_buffer_insert (buffer, &iter, filebuf, -1);
+	}
+	gtk_text_view_set_buffer (GTK_TEXT_VIEW (view), 
+					GTK_TEXT_BUFFER (buffer));
+	fclose (fd);
+	return TRUE;
+}
+
+static gboolean
+display_license(const char *filename)
+{
+	GladeXML *xml;
+	GtkWidget *top_widget;
+	GtkTextView *text_entry;
+	GtkButton *button_yes, *button_no;
+	GtkCheckButton *check_button;
+	GtkResponseType *response;
+	gboolean status;
+	
+	xml = glade_xml_new (FILENAME, ROOTNODE, NULL);
+	
+	top_widget = glade_xml_get_widget (xml, ROOTNODE);
+	text_entry = GTK_TEXT_VIEW (glade_xml_get_widget (xml, "textview1"));
+	status = populate_text_entry (GTK_TEXT_VIEW (text_entry), filename);
+	if (!status)
+		goto failed;
+
+	gtk_text_view_set_editable (GTK_TEXT_VIEW (text_entry), FALSE);
+
+	button_yes = GTK_BUTTON (glade_xml_get_widget (xml, "lic_yes_button"));
+	gtk_widget_set_sensitive (GTK_WIDGET (button_yes), FALSE);
+
+	button_no = GTK_BUTTON (glade_xml_get_widget (xml, "lic_no_button"));
+
+	check_button = GTK_CHECK_BUTTON (glade_xml_get_widget (xml, "lic_checkbutton"));
+
+	g_signal_connect (check_button, "toggled", G_CALLBACK (check_button_state), button_yes);
+	g_signal_connect (button_yes, "clicked", G_CALLBACK (set_license_accepted), GTK_WIDGET (top_widget));
+	g_signal_connect (button_no, "clicked", G_CALLBACK (set_license_rejected), GTK_WIDGET (top_widget));
+
+	response = gtk_dialog_run (GTK_DIALOG (top_widget));
+	if (response == GTK_RESPONSE_ACCEPT) {
+		gtk_widget_destroy (top_widget);
+		g_object_unref (xml);
+		return TRUE;
+	}
+failed:
+	gtk_widget_destroy (top_widget);
+	g_object_unref (xml);
+	return FALSE;
+}
+
 static gboolean
 service_complete (MailAccountGuiService *service, GHashTable *extra_config, GtkWidget **incomplete)
 {
@@ -216,6 +324,34 @@
 }
 
 gboolean
+mail_account_gui_check_for_license (CamelProvider *prov)
+{
+	GConfClient *gconf;
+	gboolean accepted, status;
+
+	if (prov->flags & CAMEL_PROVIDER_CHECK_LICENSE) {
+		gconf = mail_config_get_gconf_client ();
+		accepted = gconf_client_get_bool (gconf, prov->gconf_license_bool_key, NULL);
+
+		if (accepted)
+			return TRUE;
+
+		/* Since the license is not yet accepted, pop-up a dialog 
+		 * to display the license agreement and check if the user
+		 * accepts it
+		 */
+
+		status = display_license (prov->license_file);
+		if (!status)
+			return FALSE;
+		
+		status = gconf_client_set_bool (gconf, prov->gconf_license_bool_key, TRUE, NULL);
+
+	}
+	return TRUE;
+}
+
+gboolean
 mail_account_gui_source_complete (MailAccountGui *gui, GtkWidget **incomplete)
 {
 	return service_complete (&gui->source, gui->extra_config, incomplete);
@@ -492,6 +628,7 @@
 	GtkWidget *file_entry, *label, *frame, *dwidget = NULL;
 	CamelProvider *provider;
 	gboolean writeable;
+	gboolean license_accepted = TRUE;
 	
 	provider = g_object_get_data ((GObject *) widget, "provider");
 	
@@ -521,8 +658,13 @@
 	else
 		gtk_label_set_text (gui->source.description, "");
 	
+	printf("provider found \n");
+
+	if (gui->source.provider)	
+		license_accepted = mail_account_gui_check_for_license (gui->source.provider);
+
 	frame = glade_xml_get_widget (gui->xml, "source_frame");
-	if (provider) {
+	if (provider && license_accepted) {
 		gtk_widget_show (frame);
 		
 		/* hostname */
Index: camel/camel-provider.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-provider.h,v
retrieving revision 1.40
diff -u -r1.40 camel-provider.h
--- camel/camel-provider.h	19 Feb 2004 07:27:35 -0000	1.40
+++ camel/camel-provider.h	19 Apr 2004 13:02:24 -0000
@@ -59,6 +59,8 @@
  * _IS_STORAGE  mail is stored there. it will appear in the folder tree.
  * _IS_EXTERNAL it appears in the folder tree but is not created by
  *                the mail component.
+ * _CHECK_LICENSE  the provider configuration first needs the license to
+ *		   be accepted.
  */
 #define CAMEL_PROVIDER_IS_REMOTE	(1 << 0)
 #define CAMEL_PROVIDER_IS_LOCAL		(1 << 1)
@@ -66,6 +68,7 @@
 #define CAMEL_PROVIDER_IS_SOURCE	(1 << 3)
 #define CAMEL_PROVIDER_IS_STORAGE	(1 << 4)
 #define CAMEL_PROVIDER_SUPPORTS_SSL	(1 << 5)
+#define CAMEL_PROVIDER_CHECK_LICENSE    (1 << 6)
 
 
 /* Flags for url_flags. "ALLOW" means the config dialog will let
@@ -182,6 +185,17 @@
 	 * evolution source tree).
 	 */
 	char *translation_domain;
+
+	/* This holds the gconf key string which needs to be checked/set
+	 * for accepting the license 
+	 */
+	const char *gconf_license_bool_key;
+
+	/* This holds the license file name [ ascii text format ] containing
+	 * the license agreement. This is read only when the CHECK_LICENSE
+	 * flag is set
+	 */
+	const char *license_file;
 } CamelProvider;
 
 typedef struct _CamelProviderModule CamelProviderModule;
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> <glade-interface> <widget class="GtkDialog" id="lic_dialog"> <property name="visible">True</property> <property name="title" translatable="yes">Exchange Connector License Agreement for Evolution</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <property name="has_separator">True</property> <child internal-child="vbox"> <widget class="GtkVBox" id="dialog_vbox"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child internal-child="action_area"> <widget class="GtkHButtonBox" id="dialog-action_area1"> <property name="visible">True</property> <property name="layout_style">GTK_BUTTONBOX_END</property> <child> <widget class="GtkButton" id="lic_no_button"> <property name="visible">True</property> <property name="can_default">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes">NO</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="response_id">0</property> </widget> </child> <child> <widget class="GtkButton" id="lic_yes_button"> <property name="visible">True</property> <property name="can_default">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes">YES</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="response_id">0</property> </widget> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">True</property> <property name="pack_type">GTK_PACK_END</property> </packing> </child> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child> <widget class="GtkLabel" id="lic_top_label"> <property name="visible">True</property> <property name="label" translatable="yes"> Please read carefully the license agreement for Evolution Exchange Connector displayed below and tick the check box for accepting it </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> </packing> </child> <child> <widget class="GtkScrolledWindow" id="lic_scrolledwindow"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> <property name="shadow_type">GTK_SHADOW_NONE</property> <property name="window_placement">GTK_CORNER_TOP_LEFT</property> <child> <widget class="GtkTextView" id="textview1"> <property name="width_request">500</property> <property name="height_request">400</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">True</property> <property name="justification">GTK_JUSTIFY_LEFT</property> <property name="wrap_mode">GTK_WRAP_NONE</property> <property name="cursor_visible">True</property> <property name="pixels_above_lines">0</property> <property name="pixels_below_lines">0</property> <property name="pixels_inside_wrap">0</property> <property name="left_margin">0</property> <property name="right_margin">0</property> <property name="indent">0</property> <property name="text" translatable="yes"></property> </widget> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> </packing> </child> <child> <widget class="GtkCheckButton" id="lic_checkbutton"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes">Tick this to accept the license agreement</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="active">False</property> <property name="inconsistent">False</property> <property name="draw_indicator">True</property> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> </packing> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> </packing> </child> </widget> </child> </widget> </glade-interface>