[evolution/account-mgmt: 18/50] Adapt AlarmNotify to the new ESource API.



commit 82d1ac9f6ea5713d49da7a982003e74be2d88792
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Dec 8 14:48:06 2010 -0500

    Adapt AlarmNotify to the new ESource API.

 calendar/gui/alarm-notify/alarm-notify.c |  350 +++++++++---------------------
 calendar/gui/alarm-notify/alarm-notify.h |    9 +-
 calendar/gui/alarm-notify/alarm-queue.c  |    2 +-
 calendar/gui/alarm-notify/config-data.c  |  164 ++++----------
 calendar/gui/alarm-notify/config-data.h  |    1 -
 5 files changed, 153 insertions(+), 373 deletions(-)
---
diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c
index e612b0c..da0225e 100644
--- a/calendar/gui/alarm-notify/alarm-notify.c
+++ b/calendar/gui/alarm-notify/alarm-notify.c
@@ -27,8 +27,13 @@
 #include <string.h>
 #include <camel/camel.h>
 #include <libecal/e-cal-client.h>
+#include <libecal/e-source-calendar.h>
 #include <libedataserver/e-url.h>
 #include <libedataserver/e-data-server-util.h>
+#include <libedataserver/e-source-alarms.h>
+#include <libedataserver/e-source-authentication.h>
+#include <libedataserver/e-source-password.h>
+#include <libedataserver/e-source-registry.h>
 #include <libedataserverui/e-passwords.h>
 #include <libedataserverui/e-client-utils.h>
 
@@ -44,21 +49,11 @@
 #define APPLICATION_ID "org.gnome.EvolutionAlarmNotify"
 
 struct _AlarmNotifyPrivate {
-	/* Mapping from EUri's to LoadedClient structures */
-	/* FIXME do we need per source type uri hashes? or perhaps we
-	 * just need to hash based on source */
-	GHashTable *uri_client_hash[E_CAL_CLIENT_SOURCE_TYPE_LAST];
-        ESourceList *source_lists[E_CAL_CLIENT_SOURCE_TYPE_LAST];
-	ESourceList *selected_calendars;
-        GMutex *mutex;
+	ESourceRegistry *registry;
+	GHashTable *clients;
+	GMutex *mutex;
 };
 
-typedef struct {
-	AlarmNotify *an;
-	ESourceList *source_list;
-	GList *removals;
-} ProcessRemovalsData;
-
 /* Forward Declarations */
 static void	alarm_notify_initable_init	(GInitableIface *interface);
 
@@ -68,168 +63,51 @@ G_DEFINE_TYPE_WITH_CODE (
 		G_TYPE_INITABLE, alarm_notify_initable_init))
 
 static void
-process_removal_in_hash (const gchar *uri,
-                         gpointer value,
-                         ProcessRemovalsData *prd)
+alarm_notify_load_calendars (AlarmNotify *an)
 {
-	GSList *groups, *sources, *p, *q;
-	gboolean found = FALSE;
-
-	/* search the list of selected calendars */
-	groups = e_source_list_peek_groups (prd->source_list);
-	for (p = groups; p != NULL; p = p->next) {
-		ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
-		sources = e_source_group_peek_sources (group);
-		for (q = sources; q != NULL; q = q->next) {
-			ESource *source = E_SOURCE (q->data);
-			gchar *source_uri;
-			const gchar *completion = e_source_get_property (source, "alarm");
-
-			source_uri = e_source_get_uri (source);
-			if (strcmp (source_uri, uri) == 0)
-				if (!completion || !g_ascii_strcasecmp (completion, "true"))
-					found = TRUE;
-
-			g_free (source_uri);
-
-			if (found)
-				return;
-		}
-	}
+	GList *list, *iter;
 
-	/* not found, so list it for removal */
-	prd->removals = g_list_prepend (prd->removals, (gpointer) uri);
-}
-
-static void
-alarm_notify_list_changed_cb (ESourceList *source_list,
-                              AlarmNotify *an)
-{
-	GSList *groups, *sources, *p, *q;
-	ECalClientSourceType source_type = E_CAL_CLIENT_SOURCE_TYPE_LAST;
-	ProcessRemovalsData prd;
-	GList *l;
-	gint i;
-
-	g_signal_handlers_block_by_func (
-		source_list, alarm_notify_list_changed_cb, an);
-
-	/* Figure out the source type */
-	for (i = 0; i < E_CAL_CLIENT_SOURCE_TYPE_LAST; i++) {
-		if (source_list == an->priv->source_lists[i]) {
-			source_type = i;
-			break;
-		}
-	}
-	if (source_type == E_CAL_CLIENT_SOURCE_TYPE_LAST)
-		return;
+	/* Add all available ESources.  alarm_notify_add_calendar() will
+	 * discard the ones we're not interested in (mail accounts, etc.). */
 
-	/* process the additions */
-	groups = e_source_list_peek_groups (source_list);
-	for (p = groups; p != NULL; p = p->next) {
-		ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
-		sources = e_source_group_peek_sources (group);
-		for (q = sources; q != NULL; q = q->next) {
-			ESource *source = E_SOURCE (q->data);
-			gchar *uri;
-			const gchar *alarm = e_source_get_property (source, "alarm");
-
-			if (alarm && (!g_ascii_strcasecmp (alarm, "false") ||
-			    !g_ascii_strcasecmp (alarm, "never")))
-				continue;
-
-			uri = e_source_get_uri (source);
-			if (!g_hash_table_lookup (an->priv->uri_client_hash[source_type], uri)) {
-				debug (("Adding Calendar %s", uri));
-				alarm_notify_add_calendar (an, source_type, source, FALSE);
-			}
-			g_free (uri);
-		}
-	}
+	list = e_source_registry_list_sources (an->priv->registry, NULL);
 
-	/* process the removals */
-	prd.an = an;
-	prd.source_list = an->priv->source_lists[source_type];
-	prd.removals = NULL;
-	g_hash_table_foreach (
-		an->priv->uri_client_hash[source_type],
-		(GHFunc) process_removal_in_hash, &prd);
-
-	for (l = prd.removals; l; l = l->next) {
-		debug (("Removing Calendar %s", (gchar *)l->data));
-		alarm_notify_remove_calendar (an, source_type, l->data);
-	}
-	g_list_free (prd.removals);
-	g_signal_handlers_unblock_by_func (
-		source_list, alarm_notify_list_changed_cb, an);
+	for (iter = list; iter != NULL; iter = g_list_next (iter))
+		alarm_notify_add_calendar (an, E_SOURCE (iter->data));
 
+	g_list_free (list);
 }
 
 static void
-alarm_notify_load_calendars (AlarmNotify *an,
-                             ECalClientSourceType source_type)
+alarm_notify_dispose (GObject *object)
 {
-	ESourceList *source_list;
-	GSList *groups, *sources, *p, *q;
-
-	if (!e_cal_client_get_sources (&source_list, source_type, NULL)) {
-		debug (("Cannont get sources"));
-		an->priv->source_lists[source_type] = NULL;
-
-		return;
-	}
-
-	groups = e_source_list_peek_groups (source_list);
-	for (p = groups; p != NULL; p = p->next) {
-		ESourceGroup *group = E_SOURCE_GROUP (p->data);
-
-		sources = e_source_group_peek_sources (group);
-		for (q = sources; q != NULL; q = q->next) {
-			ESource *source = E_SOURCE (q->data);
-			gchar *uri;
-			const gchar *alarm = e_source_get_property (source, "alarm");
-
-			if (alarm && (!g_ascii_strcasecmp (alarm, "false") || !g_ascii_strcasecmp (alarm, "never")))
-				continue;
+	AlarmNotifyPrivate *priv;
+	GHashTableIter iter;
+	gpointer client;
 
-			uri = e_source_get_uri (source);
-			debug (("Loading Calendar %s", uri));
-			alarm_notify_add_calendar (an, source_type, source, FALSE);
-			g_free (uri);
+	priv = ALARM_NOTIFY_GET_PRIVATE (object);
 
-		}
+	if (priv->registry != NULL) {
+		g_object_unref (priv->registry);
+		priv->registry = NULL;
 	}
 
-	e_source_list_sync (source_list, NULL);
-	g_signal_connect_object (
-		source_list, "changed",
-		G_CALLBACK (alarm_notify_list_changed_cb), an, 0);
-	an->priv->source_lists[source_type] = source_list;
-}
+	g_hash_table_iter_init (&iter, priv->clients);
+	while (g_hash_table_iter_next (&iter, NULL, &client))
+		alarm_queue_remove_client (client, TRUE);
 
-static void
-alarm_notify_dequeue_client (gpointer key,
-                             ECalClient *client)
-{
-	alarm_queue_remove_client (client, TRUE);
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (alarm_notify_parent_class)->dispose (object);
 }
 
 static void
 alarm_notify_finalize (GObject *object)
 {
 	AlarmNotifyPrivate *priv;
-	gint ii;
 
 	priv = ALARM_NOTIFY_GET_PRIVATE (object);
 
-	for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++) {
-		g_hash_table_foreach (
-			priv->uri_client_hash[ii],
-			(GHFunc) alarm_notify_dequeue_client, NULL);
-		g_hash_table_destroy (priv->uri_client_hash[ii]);
-	}
+	g_hash_table_destroy (priv->clients);
 
 	alarm_queue_done ();
 	alarm_done ();
@@ -279,8 +157,23 @@ alarm_notify_initable (GInitable *initable,
                        GCancellable *cancellable,
                        GError **error)
 {
-	/* XXX Just return TRUE for now.  We'll have use for this soon. */
-	return TRUE;
+	AlarmNotify *an = ALARM_NOTIFY (initable);
+
+	an->priv->registry = e_source_registry_new_sync (cancellable, error);
+
+	if (an->priv->registry != NULL) {
+		alarm_notify_load_calendars (an);
+
+		g_signal_connect_swapped (
+			an->priv->registry, "source-added",
+			G_CALLBACK (alarm_notify_add_calendar), an);
+
+		g_signal_connect_swapped (
+			an->priv->registry, "source-removed",
+			G_CALLBACK (alarm_notify_remove_calendar), an);
+	}
+
+	return (an->priv->registry != NULL);
 }
 
 static void
@@ -292,6 +185,7 @@ alarm_notify_class_init (AlarmNotifyClass *class)
 	g_type_class_add_private (class, sizeof (AlarmNotifyPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = alarm_notify_dispose;
 	object_class->finalize = alarm_notify_finalize;
 
 	application_class = G_APPLICATION_CLASS (class);
@@ -309,29 +203,16 @@ alarm_notify_initable_init (GInitableIface *interface)
 static void
 alarm_notify_init (AlarmNotify *an)
 {
-	gint ii;
-
 	an->priv = ALARM_NOTIFY_GET_PRIVATE (an);
 	an->priv->mutex = g_mutex_new ();
-	an->priv->selected_calendars = config_data_get_calendars (
-		"/apps/evolution/calendar/sources");
 
-	for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++)
-		an->priv->uri_client_hash[ii] = g_hash_table_new_full (
-			g_str_hash, g_str_equal,
-			(GDestroyNotify) g_free,
-			(GDestroyNotify) g_object_unref);
+	an->priv->clients = g_hash_table_new_full (
+		(GHashFunc) e_source_hash,
+		(GEqualFunc) e_source_equal,
+		(GDestroyNotify) g_object_unref,
+		(GDestroyNotify) g_object_unref);
 
 	alarm_queue_init (an);
-
-	for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++)
-		alarm_notify_load_calendars (an, ii);
-}
-
-ESourceList *
-alarm_notify_get_selected_calendars (AlarmNotify *an)
-{
-	return an->priv->selected_calendars;
 }
 
 /**
@@ -359,21 +240,17 @@ client_opened_cb (GObject *source_object,
 	AlarmNotify *an = ALARM_NOTIFY (user_data);
 	EClient *client = NULL;
 	ECalClient *cal_client;
-	ECalClientSourceType source_type;
-	const gchar *uri;
 
 	e_client_utils_open_new_finish (source, result, &client, NULL);
 
 	if (client == NULL)
 		return;
 
-	cal_client = E_CAL_CLIENT (client);
-	source_type = e_cal_client_get_source_type (cal_client);
-	uri = e_client_get_uri (client);
-
 	g_hash_table_insert (
-		an->priv->uri_client_hash[source_type],
-		g_strdup (uri), cal_client);
+		an->priv->clients,
+		g_object_ref (source), client);
+
+	cal_client = E_CAL_CLIENT (client);
 
 	/* to resolve floating DATE-TIME properly */
 	e_cal_client_set_default_timezone (
@@ -384,107 +261,84 @@ client_opened_cb (GObject *source_object,
 
 /**
  * alarm_notify_add_calendar:
- * @an: An alarm notification service.
- * @uri: URI of the calendar to load.
- * @load_afterwards: Whether this calendar should be loaded in the future
- * when the alarm daemon starts up.
+ * @an: an #AlarmNotify
+ * @source: the #ESource to create an #ECal from
  *
- * Tells the alarm notification service to load a calendar and start monitoring
- * its alarms.  It can optionally be made to save the URI of this calendar so
- * that it can be loaded in the future when the alarm daemon starts up.
+ * Tells the alarm notification service to load a calendar and start
+ * monitoring its alarms.
  **/
 void
 alarm_notify_add_calendar (AlarmNotify *an,
-                           ECalClientSourceType source_type,
-                           ESource *source,
-                           gboolean load_afterwards)
+                           ESource *source)
 {
-	AlarmNotifyPrivate *priv;
 	EClientSourceType client_source_type;
-	EUri *e_uri;
-	gchar *str_uri;
-	gchar *pass_key;
-	g_return_if_fail (an != NULL);
-	g_return_if_fail (IS_ALARM_NOTIFY (an));
+	const gchar *extension_name;
+	gboolean auth_required = FALSE;
 
-	/* Make sure the key used in for getting password is
-	 * properly generated for all types of backends. */
-	priv = an->priv;
-	str_uri = e_source_get_uri (source);
-	e_uri = e_uri_new (str_uri);
-	if (e_source_get_property (source, "auth-type"))
-		pass_key = e_uri_to_string (e_uri, FALSE);
-	else
-		pass_key = g_strdup (str_uri);
-	e_uri_free (e_uri);
+	g_return_if_fail (IS_ALARM_NOTIFY (an));
 
 	g_mutex_lock (an->priv->mutex);
-	/* See if we already know about this uri */
-	if (g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri)) {
+
+	/* Check if we already know about this ESource. */
+	if (g_hash_table_lookup (an->priv->clients, source) != NULL) {
 		g_mutex_unlock (an->priv->mutex);
-		g_free (str_uri);
-		g_free (pass_key);
 		return;
 	}
 
-	/* If loading of this requires password and password is not
-	 * currently availble in e-password session, skip this source
-	 * loading.  We do not really want to prompt for auth from
-	 * the alarm dameon. */
+	/* Check if this is an ESource we're interested in. */
+	if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
+		client_source_type = E_CLIENT_SOURCE_TYPE_EVENTS;
+	else if (e_source_has_extension (source, E_SOURCE_EXTENSION_MEMO_LIST))
+		client_source_type = E_CLIENT_SOURCE_TYPE_MEMOS;
+	else if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST))
+		client_source_type = E_CLIENT_SOURCE_TYPE_TASKS;
+	else
+		return;
+
+	/* Check if alarms are even wanted on this ESource. */
+	extension_name = E_SOURCE_EXTENSION_ALARMS;
+	if (e_source_has_extension (source, extension_name)) {
+		ESourceAlarms *extension;
+		extension = e_source_get_extension (source, extension_name);
+		if (!e_source_alarms_get_include_me (extension))
+			return;
+	}
+
+	/* If the ESource requires authentication and the password is
+	 * not currently available in the keyring, skip the ESource to
+	 * avoid prompting for a password. */
 
-	if (e_source_get_property (source, "auth")) {
+	extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+	if (e_source_has_extension (source, extension_name)) {
+		ESourceAuthentication *extension;
+		extension = e_source_get_extension (source, extension_name);
+		auth_required = e_source_authentication_required (extension);
+	}
 
-		if (!e_passwords_get_password (NULL, pass_key)) {
+	if (auth_required) {
+		if (!e_source_password_lookup_sync (source, NULL, NULL, NULL)) {
 			g_mutex_unlock (an->priv->mutex);
-			g_free (str_uri);
-			g_free (pass_key);
-
 			return;
 		}
 	}
 
-	debug (("%s - Calendar Open Async... %p", str_uri, source));
-
-	switch (source_type) {
-		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
-			client_source_type = E_CLIENT_SOURCE_TYPE_EVENTS;
-			break;
-		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
-			client_source_type = E_CLIENT_SOURCE_TYPE_TASKS;
-			break;
-		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
-			client_source_type = E_CLIENT_SOURCE_TYPE_MEMOS;
-			break;
-		default:
-			g_warn_if_reached ();
-			client_source_type = E_CLIENT_SOURCE_TYPE_LAST;
-	}
-
 	e_client_utils_open_new (
 		source, client_source_type, TRUE, NULL,
 		e_client_utils_authenticate_handler, NULL,
 		client_opened_cb, an);
 
-	g_free (str_uri);
-	g_free (pass_key);
 	g_mutex_unlock (an->priv->mutex);
 }
 
 void
 alarm_notify_remove_calendar (AlarmNotify *an,
-                              ECalClientSourceType source_type,
-                              const gchar *str_uri)
+                              ESource *source)
 {
-	AlarmNotifyPrivate *priv;
 	ECalClient *cal_client;
 
-	priv = an->priv;
-
-	cal_client = g_hash_table_lookup (
-		priv->uri_client_hash[source_type], str_uri);
-	if (cal_client) {
-		debug (("Removing Client %p", cal_client));
+	cal_client = g_hash_table_lookup (an->priv->clients, source);
+	if (cal_client != NULL) {
 		alarm_queue_remove_client (cal_client, FALSE);
-		g_hash_table_remove (priv->uri_client_hash[source_type], str_uri);
+		g_hash_table_remove (an->priv->clients, source);
 	}
 }
diff --git a/calendar/gui/alarm-notify/alarm-notify.h b/calendar/gui/alarm-notify/alarm-notify.h
index f95a4d6..1dc46ee 100644
--- a/calendar/gui/alarm-notify/alarm-notify.h
+++ b/calendar/gui/alarm-notify/alarm-notify.h
@@ -68,14 +68,9 @@ GType		alarm_notify_get_type		(void);
 AlarmNotify *	alarm_notify_new		(GCancellable *cancellable,
 						 GError **error);
 void		alarm_notify_add_calendar	(AlarmNotify *an,
-						 ECalClientSourceType source_type,
-						 ESource *source,
-						 gboolean load_afterwards);
+						 ESource *source);
 void		alarm_notify_remove_calendar	(AlarmNotify *an,
-						 ECalClientSourceType source_type,
-						 const gchar *str_uri);
-ESourceList *	alarm_notify_get_selected_calendars
-						(AlarmNotify *an);
+						 ESource *source);
 
 G_END_DECLS
 
diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c
index d7a1346..5ab85db 100644
--- a/calendar/gui/alarm-notify/alarm-queue.c
+++ b/calendar/gui/alarm-notify/alarm-queue.c
@@ -1021,7 +1021,7 @@ edit_component (ECalClient *cal_client,
 	 *     How are other apps expected to know this stuff? */
 
 	source = e_client_get_source (E_CLIENT (cal_client));
-	source_uid = e_source_peek_uid (source);
+	source_uid = e_source_get_uid (source);
 
 	e_cal_component_get_uid (comp, &comp_uid);
 
diff --git a/calendar/gui/alarm-notify/config-data.c b/calendar/gui/alarm-notify/config-data.c
index b682686..6ad7a95 100644
--- a/calendar/gui/alarm-notify/config-data.c
+++ b/calendar/gui/alarm-notify/config-data.c
@@ -27,7 +27,7 @@
 #endif
 
 #include <string.h>
-#include <libedataserver/e-source-list.h>
+#include <libedataserver/e-source-alarms.h>
 #include "config-data.h"
 
 #define KEY_LAST_NOTIFICATION_TIME \
@@ -38,9 +38,6 @@
  * the data from the configuration engine. */
 static gboolean inited = FALSE;
 static GConfClient *conf_client = NULL;
-static ESourceList *calendar_source_list = NULL, *tasks_source_list = NULL;
-
-
 
 /* Copied from ../calendar-config.c; returns whether the locale has 'am' and
  * 'pm' strings defined.
@@ -58,16 +55,6 @@ locale_supports_12_hour_format (void)
 static void
 do_cleanup (void)
 {
-	if (calendar_source_list) {
-		g_object_unref (calendar_source_list);
-		calendar_source_list = NULL;
-	}
-
-	if (tasks_source_list) {
-		g_object_unref (tasks_source_list);
-		tasks_source_list = NULL;
-	}
-
 	g_object_unref (conf_client);
 	conf_client = NULL;
 
@@ -90,70 +77,6 @@ ensure_inited (void)
 	}
 
 	g_atexit ((GVoidFunc) do_cleanup);
-
-	/* load the sources for calendars and tasks */
-	calendar_source_list = e_source_list_new_for_gconf (conf_client,
-							    "/apps/evolution/calendar/sources");
-	tasks_source_list = e_source_list_new_for_gconf (conf_client,
-							 "/apps/evolution/tasks/sources");
-
-}
-
-ESourceList *
-config_data_get_calendars (const gchar *key)
-{
-	ESourceList *cal_sources;
-	gboolean state;
-	GSList *gconf_list;
-
-	if (!inited)
-		conf_client = gconf_client_get_default ();
-
-	gconf_list = gconf_client_get_list (conf_client,
-					    key,
-					    GCONF_VALUE_STRING,
-					    NULL);
-	cal_sources = e_source_list_new_for_gconf (conf_client, key);
-
-	if (cal_sources && g_slist_length (gconf_list)) {
-		g_slist_foreach (gconf_list, (GFunc) g_free, NULL);
-		g_slist_free (gconf_list);
-		return cal_sources;
-	}
-
-	state = gconf_client_get_bool (conf_client,
-				      "/apps/evolution/calendar/notify/notify_with_tray",
-				      NULL);
-	if (!state) /* Should be old client */ {
-		GSList *source;
-		gconf_client_set_bool (conf_client,
-				      "/apps/evolution/calendar/notify/notify_with_tray",
-				      TRUE,
-				      NULL);
-		source = gconf_client_get_list (conf_client,
-						"/apps/evolution/calendar/sources",
-						GCONF_VALUE_STRING,
-						NULL);
-		gconf_client_set_list (conf_client,
-				       key,
-				       GCONF_VALUE_STRING,
-				       source,
-				       NULL);
-		cal_sources = e_source_list_new_for_gconf (conf_client, key);
-
-		if (source) {
-			g_slist_foreach (source, (GFunc) g_free, NULL);
-			g_slist_free (source);
-		}
-	}
-
-	if (gconf_list) {
-		g_slist_foreach (gconf_list, (GFunc) g_free, NULL);
-		g_slist_free (gconf_list);
-	}
-
-	return cal_sources;
-
 }
 
 void
@@ -267,29 +190,26 @@ config_data_set_last_notification_time (ECalClient *cal,
 
 	g_return_if_fail (t != -1);
 
-	if (cal) {
-		ESource *source = e_client_get_source (E_CLIENT (cal));
-		if (source) {
-			const gchar *prop_str;
-			GTimeVal curr_tv = {0};
-
-			prop_str = e_source_get_property (source, "last-notified");
-			if (!prop_str || !g_time_val_from_iso8601 (prop_str, &curr_tv))
-				curr_tv.tv_sec = 0;
-
-			if (t > (time_t) curr_tv.tv_sec || (time_t) curr_tv.tv_sec > now) {
-				GTimeVal tmval = {0};
-				gchar *as_text;
-
-				tmval.tv_sec = (glong) t;
-				as_text = g_time_val_to_iso8601 (&tmval);
-
-				if (as_text) {
-					e_source_set_property (source, "last-notified", as_text);
-					g_free (as_text);
-					/* pass through, thus the global last notification time is also changed */
-				}
-			}
+	if (cal != NULL) {
+		ESource *source;
+		ESourceAlarms *extension;
+		GTimeVal tv = {0};
+		const gchar *extension_name;
+		gchar *iso8601;
+
+		source = e_client_get_source (E_CLIENT (cal));
+		extension_name = E_SOURCE_EXTENSION_ALARMS;
+		extension = e_source_get_extension (source, extension_name);
+
+		iso8601 = (gchar *) e_source_alarms_get_last_notified (extension, iso8601);
+		if (iso8601 != NULL)
+			g_time_val_from_iso8601 (iso8601, &tv);
+
+		if (t > (time_t) tv.tv_sec || (time_t) tv.tv_sec > now) {
+			tv.tv_sec = (glong) t;
+			iso8601 = g_time_val_to_iso8601 (&tv);
+			e_source_alarms_set_last_notified (extension, iso8601);
+			g_free (iso8601);
 		}
 	}
 
@@ -316,27 +236,39 @@ config_data_get_last_notification_time (ECalClient *cal)
 	GConfValue *value;
 	GConfClient *client;
 
-	if (cal) {
-		ESource *source = e_client_get_source (E_CLIENT (cal));
-		if (source) {
-			const gchar *last_notified;
+	if (cal != NULL) {
+		ESource *source;
+		ESourceAlarms *extension;
+		GTimeVal tmval = {0};
+		const gchar *extension_name;
+		const gchar *last_notified;
+		time_t now, val;
 
-			GTimeVal tmval = {0};
+		source = e_client_get_source (E_CLIENT (cal));
+		extension_name = E_SOURCE_EXTENSION_ALARMS;
 
-			last_notified = e_source_get_property (
-				source, "last-notified");
+		if (!e_source_has_extension (source, extension_name))
+			goto skip;
 
-			if (last_notified && *last_notified &&
-				g_time_val_from_iso8601 (last_notified, &tmval)) {
-				time_t now = time (NULL), val = (time_t) tmval.tv_sec;
+		extension = e_source_get_extension (source, extension_name);
+		last_notified = e_source_alarms_get_last_notified (extension);
 
-				if (val > now)
-					val = now;
-				return val;
-			}
-		}
+		if (last_notified == NULL || *last_notified == '\0')
+			goto skip;
+
+		if (!g_time_val_from_iso8601 (last_notified, &tmval))
+			goto skip;
+
+		now = time (NULL);
+		val = (time_t) tmval.tv_sec;
+
+		if (val > now)
+			val = now;
+
+		return val;
 	}
 
+skip:
 	if (!(client = config_data_get_conf_client ()))
 		return -1;
 
diff --git a/calendar/gui/alarm-notify/config-data.h b/calendar/gui/alarm-notify/config-data.h
index 1023609..705e69e 100644
--- a/calendar/gui/alarm-notify/config-data.h
+++ b/calendar/gui/alarm-notify/config-data.h
@@ -44,7 +44,6 @@ time_t		config_data_get_last_notification_time
 void		config_data_save_blessed_program
 						(const gchar *program);
 gboolean	config_data_is_blessed_program	(const gchar *program);
-ESourceList *	config_data_get_calendars	(const gchar *);
 void		config_data_replace_string_list	(const gchar *,
 						 const gchar *,
 						 const gchar *);



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