[evolution-ews] Do not save unchanged Out-Of-Office settings



commit ea6d3ce87d445386a51cd3e32905a67660255877
Author: Milan Crha <mcrha redhat com>
Date:   Fri Aug 3 16:09:13 2012 +0200

    Do not save unchanged Out-Of-Office settings

 src/configuration/e-mail-config-ews-ooo-page.c |   43 ++++++++++++++++++++----
 src/server/e-ews-oof-settings.c                |   26 ++++++++++++++
 2 files changed, 62 insertions(+), 7 deletions(-)
---
diff --git a/src/configuration/e-mail-config-ews-ooo-page.c b/src/configuration/e-mail-config-ews-ooo-page.c
index 62ea848..382f6b7 100644
--- a/src/configuration/e-mail-config-ews-ooo-page.c
+++ b/src/configuration/e-mail-config-ews-ooo-page.c
@@ -53,6 +53,9 @@ struct _EMailConfigEwsOooPagePrivate {
 	EEwsOofSettings *oof_settings;
 	GMutex *oof_settings_lock;
 
+	/* to not save unchanged state */
+	gboolean changed;
+
 	GtkWidget *enabled_radio_button;	/* not referenced */
 	GtkWidget *disabled_radio_button;	/* not referenced */
 	GtkWidget *scheduled_radio_button;	/* not referenced */
@@ -673,6 +676,14 @@ mail_config_ews_ooo_page_submit_cb (GObject *source_object,
 }
 
 static void
+ews_oof_settings_changed (gboolean *pchanged)
+{
+	g_return_if_fail (pchanged != NULL);
+
+	*pchanged = TRUE;
+}
+
+static void
 mail_config_ews_ooo_page_submit (EMailConfigPage *page,
                                  GCancellable *cancellable,
                                  GAsyncReadyCallback callback,
@@ -686,6 +697,7 @@ mail_config_ews_ooo_page_submit (EMailConfigPage *page,
 	GDateTime *date_time;
 	gchar *text;
 	time_t tm;
+	gulong signal_id;
 
 	priv = E_MAIL_CONFIG_EWS_OOO_PAGE_GET_PRIVATE (page);
 
@@ -696,20 +708,30 @@ mail_config_ews_ooo_page_submit (EMailConfigPage *page,
 	 * are obviously no changes to submit. */
 	if (priv->oof_settings == NULL) {
 		g_mutex_unlock (priv->oof_settings_lock);
+
+		simple = g_simple_async_result_new (
+			G_OBJECT (page), callback, user_data,
+			mail_config_ews_ooo_page_submit);
+		g_simple_async_result_complete (simple);
+		g_object_unref (simple);
+
 		return;
 	}
 
+	signal_id = g_signal_connect_swapped (priv->oof_settings, "notify",
+		G_CALLBACK (ews_oof_settings_changed), &priv->changed);
+
 	toggle_button = GTK_TOGGLE_BUTTON (priv->enabled_radio_button);
 	if (gtk_toggle_button_get_active (toggle_button))
 		e_ews_oof_settings_set_state (
 			priv->oof_settings,
-			E_EWS_OOF_STATE_DISABLED);
+			E_EWS_OOF_STATE_ENABLED);
 
 	toggle_button = GTK_TOGGLE_BUTTON (priv->disabled_radio_button);
 	if (gtk_toggle_button_get_active (toggle_button))
 		e_ews_oof_settings_set_state (
 			priv->oof_settings,
-			E_EWS_OOF_STATE_ENABLED);
+			E_EWS_OOF_STATE_DISABLED);
 
 	toggle_button = GTK_TOGGLE_BUTTON (priv->scheduled_radio_button);
 	if (gtk_toggle_button_get_active (toggle_button))
@@ -743,12 +765,18 @@ mail_config_ews_ooo_page_submit (EMailConfigPage *page,
 		G_OBJECT (page), callback, user_data,
 		mail_config_ews_ooo_page_submit);
 
-	g_simple_async_result_set_check_cancellable (simple, cancellable);
+	g_signal_handler_disconnect (priv->oof_settings, signal_id);
+
+	if (priv->changed) {
+		g_simple_async_result_set_check_cancellable (simple, cancellable);
 
-	e_ews_oof_settings_submit (
-		priv->oof_settings, cancellable,
-		mail_config_ews_ooo_page_submit_cb,
-		g_object_ref (simple));
+		e_ews_oof_settings_submit (
+			priv->oof_settings, cancellable,
+			mail_config_ews_ooo_page_submit_cb,
+			g_object_ref (simple));
+	} else {
+		g_simple_async_result_complete (simple);
+	}
 
 	g_object_unref (simple);
 
@@ -815,6 +843,7 @@ mail_config_ews_ooo_page_try_password_sync (ESourceAuthenticator *auth,
 		if (page->priv->oof_settings != NULL)
 			g_object_unref (oof_settings);
 		page->priv->oof_settings = oof_settings;
+		page->priv->changed = FALSE;
 		g_mutex_unlock (page->priv->oof_settings_lock);
 
 	} else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_UNAUTHORIZED)) {
diff --git a/src/server/e-ews-oof-settings.c b/src/server/e-ews-oof-settings.c
index e2135e8..3138271 100644
--- a/src/server/e-ews-oof-settings.c
+++ b/src/server/e-ews-oof-settings.c
@@ -697,6 +697,9 @@ e_ews_oof_settings_set_state (EEwsOofSettings *settings,
 {
 	g_return_if_fail (E_IS_EWS_OOF_SETTINGS (settings));
 
+	if (settings->priv->state == state)
+		return;
+
 	settings->priv->state = state;
 
 	g_object_notify (G_OBJECT (settings), "state");
@@ -718,6 +721,9 @@ e_ews_oof_settings_set_external_audience (EEwsOofSettings *settings,
 {
 	g_return_if_fail (E_IS_EWS_OOF_SETTINGS (settings));
 
+	if (settings->priv->external_audience == external_audience)
+		return;
+
 	settings->priv->external_audience = external_audience;
 
 	g_object_notify (G_OBJECT (settings), "external-audience");
@@ -740,6 +746,11 @@ e_ews_oof_settings_set_start_time (EEwsOofSettings *settings,
 
 	g_mutex_lock (settings->priv->property_lock);
 
+	if (g_date_time_compare (settings->priv->start_time, start_time) == 0) {
+		g_mutex_unlock (settings->priv->property_lock);
+		return;
+	}
+
 	if (start_time != settings->priv->start_time) {
 		g_date_time_unref (settings->priv->start_time);
 		settings->priv->start_time = g_date_time_ref (start_time);
@@ -767,6 +778,11 @@ e_ews_oof_settings_set_end_time (EEwsOofSettings *settings,
 
 	g_mutex_lock (settings->priv->property_lock);
 
+	if (g_date_time_compare (settings->priv->end_time, end_time) == 0) {
+		g_mutex_unlock (settings->priv->property_lock);
+		return;
+	}
+
 	if (end_time != settings->priv->end_time) {
 		g_date_time_unref (settings->priv->end_time);
 		settings->priv->end_time = g_date_time_ref (end_time);
@@ -811,6 +827,11 @@ e_ews_oof_settings_set_internal_reply (EEwsOofSettings *settings,
 
 	g_mutex_lock (settings->priv->property_lock);
 
+	if (g_strcmp0 (internal_reply, settings->priv->internal_reply) == 0) {
+		g_mutex_unlock (settings->priv->property_lock);
+		return;
+	}
+
 	g_free (settings->priv->internal_reply);
 	settings->priv->internal_reply = g_strdup (internal_reply);
 
@@ -853,6 +874,11 @@ e_ews_oof_settings_set_external_reply (EEwsOofSettings *settings,
 
 	g_mutex_lock (settings->priv->property_lock);
 
+	if (g_strcmp0 (external_reply, settings->priv->external_reply) == 0) {
+		g_mutex_unlock (settings->priv->property_lock);
+		return;
+	}
+
 	g_free (settings->priv->external_reply);
 	settings->priv->external_reply = g_strdup (external_reply);
 



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