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



commit b17ba63012282ff415dd7a444bd40e367c98cc0f
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 |  373 +++++++++---------------------
 calendar/gui/alarm-notify/alarm-notify.h |    9 +-
 calendar/gui/alarm-notify/alarm-queue.c  |    2 +-
 calendar/gui/alarm-notify/config-data.c  |  132 ++++-------
 calendar/gui/alarm-notify/config-data.h  |    2 +-
 5 files changed, 162 insertions(+), 356 deletions(-)
---
diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c
index 2a75d79..1775b20 100644
--- a/calendar/gui/alarm-notify/alarm-notify.c
+++ b/calendar/gui/alarm-notify/alarm-notify.c
@@ -27,198 +27,74 @@
 #include <string.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 <libecal/e-cal.h>
+#include <libecal/e-source-calendar.h>
 #include "alarm-notify.h"
 #include "alarm-queue.h"
 #include "config-data.h"
 #include "common/authentication.h"
 
 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_SOURCE_TYPE_LAST];
-        ESourceList *source_lists[E_CAL_SOURCE_TYPE_LAST];
-	ESourceList *selected_calendars;
-        GMutex *mutex;
+	GHashTable *clients;
+	GMutex *mutex;
 };
 
-typedef struct {
-	AlarmNotify *an;
-	ESourceList *source_list;
-	GList *removals;
-} ProcessRemovalsData;
-
-static gpointer parent_class;
+G_DEFINE_TYPE (AlarmNotify, alarm_notify, G_TYPE_OBJECT)
 
 static void
-process_removal_in_hash (const gchar *uri,
-                         gpointer value,
-                         ProcessRemovalsData *prd)
+alarm_notify_load_calendars (AlarmNotify *an,
+                             ESourceRegistry *registry)
 {
-	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");
+	GList *list, *iter;
 
-			source_uri = e_source_get_uri (source);
-			if (strcmp (source_uri, uri) == 0)
-				if (!completion || !g_ascii_strcasecmp (completion, "true"))
-					found = TRUE;
+	/* Add all available ESources.  alarm_notify_add_calendar() will
+	 * discard the ones we're not interested in (mail accounts, etc.). */
 
-			g_free (source_uri);
+	list = e_source_registry_list_sources (registry, NULL);
 
-			if (found)
-				return;
-		}
-	}
+	for (iter = list; iter != NULL; iter = g_list_next (iter))
+		alarm_notify_add_calendar (an, E_SOURCE (iter->data));
 
-	/* not found, so list it for removal */
-	prd->removals = g_list_prepend (prd->removals, (gpointer) uri);
+	g_list_free (list);
 }
 
 static void
-alarm_notify_list_changed_cb (ESourceList *source_list,
-                              AlarmNotify *an)
+alarm_notify_dispose (GObject *object)
 {
-	GSList *groups, *sources, *p, *q;
-	ECalSourceType source_type = E_CAL_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_SOURCE_TYPE_LAST; i++) {
-		if (source_list == an->priv->source_lists[i]) {
-			source_type = i;
-			break;
-		}
-	}
-	if (source_type == E_CAL_SOURCE_TYPE_LAST)
-		return;
+	AlarmNotify *notify;
+	GHashTableIter iter;
+	gpointer client;
 
-	/* 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);
-		}
-	}
+	notify = ALARM_NOTIFY (object);
 
-	/* 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);
+	g_hash_table_iter_init (&iter, notify->priv->clients);
+	while (g_hash_table_iter_next (&iter, NULL, &client))
+		alarm_queue_remove_client (client, TRUE);
 
-}
-
-static void
-alarm_notify_load_calendars (AlarmNotify *an,
-                             ECalSourceType source_type)
-{
-	ESourceList *source_list;
-	GSList *groups, *sources, *p, *q;
-
-	if (!e_cal_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;
-
-			uri = e_source_get_uri (source);
-			debug (("Loading Calendar %s", uri));
-			alarm_notify_add_calendar (an, source_type, source, FALSE);
-			g_free (uri);
-
-		}
-	}
-
-	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;
-}
-
-static void
-alarm_notify_dequeue_client (gpointer key,
-                             ECal *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;
+	AlarmNotify *notify;
 
-	priv = ALARM_NOTIFY (object)->priv;
+	notify = ALARM_NOTIFY (object);
 
-	for (ii = 0; ii < E_CAL_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 (notify->priv->clients);
 
 	alarm_queue_done ();
 
-	g_mutex_free (priv->mutex);
+	g_mutex_free (notify->priv->mutex);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (alarm_notify_parent_class)->finalize (object);
 }
 
 static void
@@ -226,66 +102,41 @@ alarm_notify_class_init (AlarmNotifyClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (AlarmNotifyPrivate));
 
-	object_class = (GObjectClass *) class;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = alarm_notify_dispose;
 	object_class->finalize = alarm_notify_finalize;
 }
 
 static void
 alarm_notify_init (AlarmNotify *an)
 {
-	gint ii;
+	ESourceRegistry *registry;
 
 	an->priv = G_TYPE_INSTANCE_GET_PRIVATE (
 		an, TYPE_ALARM_NOTIFY, AlarmNotifyPrivate);
 	an->priv->mutex = g_mutex_new ();
-	an->priv->selected_calendars = config_data_get_calendars (
-		"/apps/evolution/calendar/sources");
 
-	for (ii = 0; ii < E_CAL_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_SOURCE_TYPE_LAST; ii++)
-		alarm_notify_load_calendars (an, ii);
-}
+	registry = e_source_registry_get_default ();
 
-ESourceList *
-alarm_notify_get_selected_calendars (AlarmNotify *an)
-{
-	return an->priv->selected_calendars;
-}
+	alarm_notify_load_calendars (an, registry);
 
-GType
-alarm_notify_get_type (void)
-{
-	static GType type = 0;
-
-	if (G_UNLIKELY (type == 0)) {
-		const GTypeInfo type_info = {
-			sizeof (AlarmNotifyClass),
-			(GBaseInitFunc) NULL,
-			(GBaseFinalizeFunc) NULL,
-			(GClassInitFunc) alarm_notify_class_init,
-			(GClassFinalizeFunc) NULL,
-			NULL,  /* class_data */
-			sizeof (AlarmNotify),
-			0,     /* n_preallocs */
-			(GInstanceInitFunc) alarm_notify_init,
-			NULL   /* value_table */
-		};
-
-		type = g_type_register_static (
-			G_TYPE_OBJECT, "AlarmNotify", &type_info, 0);
-	}
+	g_signal_connect_swapped (
+		registry, "source-added",
+		G_CALLBACK (alarm_notify_add_calendar), an);
 
-	return type;
+	g_signal_connect_swapped (
+		registry, "source-removed",
+		G_CALLBACK (alarm_notify_remove_calendar), an);
 }
 
 /**
@@ -302,79 +153,81 @@ alarm_notify_new (void)
 }
 
 static void
-cal_opened_cb (ECal *client, const GError *error, gpointer user_data)
+cal_opened_cb (ECal *client,
+               const GError *error,
+               AlarmNotify *an)
 {
-	AlarmNotifyPrivate *priv;
-	AlarmNotify *an = ALARM_NOTIFY (user_data);
-
-	priv = an->priv;
-
-	debug (("%s - Calendar Status %d%s%s%s", e_cal_get_uri (client), error ? error->code : 0, error ? " (" : "", error ? error->message : "", error ? ")" : ""));
-
-	if (!error)
+	if (error == NULL)
 		alarm_queue_add_client (client);
 	else {
-		g_hash_table_remove (priv->uri_client_hash[e_cal_get_source_type (client)],
-				     e_cal_get_uri (client));
-		g_signal_handlers_disconnect_matched (G_OBJECT (client), G_SIGNAL_MATCH_DATA,
-						      0, 0, NULL, NULL, an);
+		ESource *source = e_cal_get_source (client);
+		g_hash_table_remove (an->priv->clients, source);
+		g_signal_handlers_disconnect_matched (
+			client, G_SIGNAL_MATCH_DATA,
+			0, 0, NULL, NULL, an);
 	}
 }
 
 /**
  * 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, ECalSourceType source_type,  ESource *source, gboolean load_afterwards)
+alarm_notify_add_calendar (AlarmNotify *an,
+                           ESource *source)
 {
-	AlarmNotifyPrivate *priv;
 	ECal *client;
-	EUri *e_uri;
-	gchar *str_uri;
-	gchar *pass_key;
-	g_return_if_fail (an != NULL);
-	g_return_if_fail (IS_ALARM_NOTIFY (an));
+	ECalSourceType source_type;
+	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 alarm dameon*/
 
-	if (e_source_get_property (source, "auth")) {
-		const gchar *name = e_source_get_property (source, "auth-domain");
+	/* Check if this is an ESource we're interested in. */
+	if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
+		source_type = E_CAL_SOURCE_TYPE_EVENT;
+	else if (e_source_has_extension (source, E_SOURCE_EXTENSION_MEMO_LIST))
+		source_type = E_CAL_SOURCE_TYPE_JOURNAL;
+	else if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST))
+		source_type = E_CAL_SOURCE_TYPE_TODO;
+	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 (!name)
-			name = "Calendar";
+	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 (name, 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;
 		}
 	}
@@ -382,31 +235,29 @@ alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type,  ESource
 	client = e_auth_new_cal_from_source (source, source_type);
 
 	if (client) {
-		debug (("%s - Calendar Open Async... %p", str_uri, client));
-		g_hash_table_insert (priv->uri_client_hash[source_type], g_strdup (str_uri), client);
-		g_signal_connect (G_OBJECT (client), "cal_opened_ex", G_CALLBACK (cal_opened_cb), an);
+		g_hash_table_insert (
+			an->priv->clients, g_object_ref (source), client);
+		g_signal_connect (
+			client, "cal_opened_ex",
+			G_CALLBACK (cal_opened_cb), an);
 		/* to resolve floating DATE-TIME properly */
-		e_cal_set_default_timezone (client, config_data_get_timezone (), NULL);
+		e_cal_set_default_timezone (
+			client, config_data_get_timezone (), NULL);
 		e_cal_open_async (client, FALSE);
 	}
 
-	g_free (str_uri);
-	g_free (pass_key);
 	g_mutex_unlock (an->priv->mutex);
 }
 
 void
-alarm_notify_remove_calendar (AlarmNotify *an, ECalSourceType source_type, const gchar *str_uri)
+alarm_notify_remove_calendar (AlarmNotify *an,
+                              ESource *source)
 {
-	AlarmNotifyPrivate *priv;
 	ECal *client;
 
-	priv = an->priv;
-
-	client = g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri);
-	if (client) {
-		debug (("Removing Client %p", client));
+	client = g_hash_table_lookup (an->priv->clients, source);
+	if (client != NULL) {
 		alarm_queue_remove_client (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 b3fb479..2d01692 100644
--- a/calendar/gui/alarm-notify/alarm-notify.h
+++ b/calendar/gui/alarm-notify/alarm-notify.h
@@ -65,14 +65,9 @@ struct _AlarmNotifyClass {
 GType		alarm_notify_get_type		(void);
 AlarmNotify *	alarm_notify_new		(void);
 void		alarm_notify_add_calendar	(AlarmNotify *an,
-						 ECalSourceType source_type,
-						 ESource *source,
-						 gboolean load_afterwards);
+						 ESource *source);
 void		alarm_notify_remove_calendar	(AlarmNotify *an,
-						 ECalSourceType 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 4f32335..a40d91f 100644
--- a/calendar/gui/alarm-notify/alarm-queue.c
+++ b/calendar/gui/alarm-notify/alarm-queue.c
@@ -937,7 +937,7 @@ edit_component (ECal *client, ECalComponent *comp)
 	 *     How are other apps expected to know this stuff? */
 
 	source = e_cal_get_source (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 2aab3ce..76e4a18 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,25 @@ 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 *
+void
 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
@@ -266,21 +208,23 @@ config_data_set_last_notification_time (ECal *cal, time_t t)
 
 	g_return_if_fail (t != -1);
 
-	if (cal) {
-		ESource *source = e_cal_get_source (cal);
-		if (source) {
-			GTimeVal tmval = {0};
-			gchar *as_text;
+	if (cal != NULL) {
+		ESource *source;
+		ESourceAlarms *extension;
+		GTimeVal tmval = {0};
+		const gchar *extension_name;
+		gchar *iso8601;
 
-			tmval.tv_sec = (glong) t;
-			as_text = g_time_val_to_iso8601 (&tmval);
+		source = e_cal_get_source (cal);
+		extension_name = E_SOURCE_EXTENSION_ALARMS;
+		extension = e_source_get_extension (source, extension_name);
 
-			if (as_text) {
-				e_source_set_property (source, "last-notified", as_text);
-				g_free (as_text);
-				return;
-			}
-		}
+		tmval.tv_sec = (glong) t;
+		iso8601 = g_time_val_to_iso8601 (&tmval);
+		e_source_alarms_set_last_notified (extension, iso8601);
+		g_free (iso8601);
+
+		return;
 	}
 
 	if (!(client = config_data_get_conf_client ()))
@@ -306,23 +250,39 @@ config_data_get_last_notification_time (ECal *cal)
 	GConfValue *value;
 	GConfClient *client;
 
-	if (cal) {
-		ESource *source = e_cal_get_source (cal);
-		if (source) {
-			const gchar *last_notified = e_source_get_property (source, "last-notified");
-			GTimeVal tmval = {0};
+	if (cal != NULL) {
+		ESource *source;
+		ESourceAlarms *extension;
+		GTimeVal tmval = {0};
+		const gchar *extension_name;
+		const gchar *last_notified;
+		time_t now, val;
 
-			if (last_notified && *last_notified &&
-				g_time_val_from_iso8601 (last_notified, &tmval)) {
-				time_t now = time (NULL), val = (time_t) tmval.tv_sec;
+		source = e_cal_get_source (cal);
+		extension_name = E_SOURCE_EXTENSION_ALARMS;
 
-				if (val > now)
-					val = now;
-				return val;
-			}
-		}
+		if (!e_source_has_extension (source, extension_name))
+			goto skip;
+
+		extension = e_source_get_extension (source, extension_name);
+		last_notified = e_source_alarms_get_last_notified (extension);
+
+		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 2a40950..ae92217 100644
--- a/calendar/gui/alarm-notify/config-data.h
+++ b/calendar/gui/alarm-notify/config-data.h
@@ -41,7 +41,7 @@ void          config_data_set_last_notification_time (ECal *cal, time_t t);
 time_t        config_data_get_last_notification_time (ECal *cal);
 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_get_calendars (const gchar *);
 void	      config_data_replace_string_list (const gchar *, const gchar *, const gchar *);
 
 void config_data_init_debugging (void);



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