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



commit fe3c8206cb18505830db597ebecb39fd306797d8
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 |  344 +++++++++---------------------
 calendar/gui/alarm-notify/alarm-notify.h |    9 +-
 calendar/gui/alarm-notify/alarm-queue.c  |    2 +-
 calendar/gui/alarm-notify/config-data.c  |  149 ++++---------
 calendar/gui/alarm-notify/config-data.h  |    1 -
 5 files changed, 142 insertions(+), 363 deletions(-)
---
diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c
index 3256e39..1d69358 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>
 
@@ -40,193 +45,61 @@
 #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;
+	GHashTable *clients;
+	GMutex *mutex;
 };
 
-typedef struct {
-	AlarmNotify *an;
-	ESourceList *source_list;
-	GList *removals;
-} ProcessRemovalsData;
-
 G_DEFINE_TYPE (AlarmNotify, alarm_notify, GTK_TYPE_APPLICATION)
 
 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;
-	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;
-
-	/* 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);
-		}
-	}
+	AlarmNotify *notify;
+	GHashTableIter iter;
+	gpointer client;
 
-	/* 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);
-
-}
+	notify = ALARM_NOTIFY (object);
 
-static void
-alarm_notify_load_calendars (AlarmNotify *an,
-                             ECalClientSourceType source_type)
-{
-	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;
-
-			uri = e_source_get_uri (source);
-			debug (("Loading Calendar %s", uri));
-			alarm_notify_add_calendar (an, source_type, source, FALSE);
-			g_free (uri);
-
-		}
-	}
+	g_hash_table_iter_init (&iter, notify->priv->clients);
+	while (g_hash_table_iter_next (&iter, NULL, &client))
+		alarm_queue_remove_client (client, TRUE);
 
-	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,
-                             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;
+	AlarmNotify *notify;
 
-	priv = ALARM_NOTIFY (object)->priv;
+	notify = ALARM_NOTIFY (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 (notify->priv->clients);
 
 	alarm_queue_done ();
 	alarm_done ();
 
 	e_passwords_shutdown ();
 
-	g_mutex_free (priv->mutex);
+	g_mutex_free (notify->priv->mutex);
 
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (alarm_notify_parent_class)->finalize (object);
@@ -273,6 +146,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);
@@ -283,30 +157,31 @@ alarm_notify_class_init (AlarmNotifyClass *class)
 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_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);
-}
+	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);
+
+	g_signal_connect_swapped (
+		registry, "source-added",
+		G_CALLBACK (alarm_notify_add_calendar), an);
+
+	g_signal_connect_swapped (
+		registry, "source-removed",
+		G_CALLBACK (alarm_notify_remove_calendar), an);
 }
 
 /**
@@ -333,21 +208,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 (
@@ -358,107 +229,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 51837d2..e42c72e 100644
--- a/calendar/gui/alarm-notify/alarm-notify.h
+++ b/calendar/gui/alarm-notify/alarm-notify.h
@@ -67,14 +67,9 @@ struct _AlarmNotifyClass {
 GType		alarm_notify_get_type		(void);
 AlarmNotify *	alarm_notify_new		(void);
 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 d056131..f5b9126 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,21 +190,23 @@ 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) {
-			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_client_get_source (E_CLIENT (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 ()))
@@ -307,27 +232,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]