From ebed1366e5d62a4fd0912abe2c725f31e8901444 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 8 Dec 2010 14:48:06 -0500 Subject: Adapt AlarmNotify to the new ESource API. --- calendar/alarm-notify/Makefile.am | 2 + calendar/alarm-notify/alarm-notify.c | 437 +++++++---------------------------- calendar/alarm-notify/alarm-notify.h | 6 +- calendar/alarm-notify/config-data.c | 207 ++++------------- calendar/alarm-notify/config-data.h | 4 - 5 files changed, 138 insertions(+), 518 deletions(-) (limited to 'calendar') diff --git a/calendar/alarm-notify/Makefile.am b/calendar/alarm-notify/Makefile.am index f267d38828..50cd85628b 100644 --- a/calendar/alarm-notify/Makefile.am +++ b/calendar/alarm-notify/Makefile.am @@ -47,7 +47,9 @@ evolution_alarm_notify_LDADD = \ $(top_builddir)/composer/libcomposer.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ $(top_builddir)/calendar/gui/libevolution-calendar.la \ + $(top_builddir)/calendar/importers/libevolution-calendar-importers.la \ $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \ + $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(top_builddir)/addressbook/util/libeabutil.la \ $(top_builddir)/libevolution-utils/libevolution-utils.la \ $(EVOLUTION_DATA_SERVER_LIBS) \ diff --git a/calendar/alarm-notify/alarm-notify.c b/calendar/alarm-notify/alarm-notify.c index 2c14196a68..3af3a206a7 100644 --- a/calendar/alarm-notify/alarm-notify.c +++ b/calendar/alarm-notify/alarm-notify.c @@ -27,9 +27,11 @@ #include #include #include -#include #include -#include +#include +#include +#include +#include #include #include "alarm.h" @@ -44,24 +46,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; - - GSList *offline_sources; - guint offline_timeout_id; + 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); @@ -71,206 +60,55 @@ 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) -{ - 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; - } - } - - /* not found, so list it for removal */ - prd->removals = g_list_prepend (prd->removals, (gpointer) uri); -} - -static gint -find_slist_source_uri_cb (gconstpointer a, - gconstpointer b) +alarm_notify_load_calendars (AlarmNotify *an) { - ESource *asource = (ESource *) a; - const gchar *buri = b; - gchar *auri; - gint res; - - auri = e_source_get_uri (asource); - res = g_strcmp0 (auri, buri); - g_free (auri); + GList *list, *iter; - return res; -} - -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; - - 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) && - !g_slist_find_custom ( - an->priv->offline_sources, uri, - find_slist_source_uri_cb)) { - debug (("Adding Calendar %s", uri)); - alarm_notify_add_calendar (an, source_type, source); - } - 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_full (list, (GDestroyNotify) g_object_unref); } 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; - - 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); - 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); - if (priv->offline_timeout_id) - g_source_remove (priv->offline_timeout_id); - priv->offline_timeout_id = 0; - g_slist_free_full (priv->offline_sources, g_object_unref); - priv->offline_sources = NULL; - - 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 (); - e_passwords_shutdown (); - g_mutex_free (priv->mutex); /* Chain up to parent's finalize() method. */ @@ -314,8 +152,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 @@ -327,6 +180,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); @@ -344,29 +198,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; } /** @@ -385,32 +226,6 @@ alarm_notify_new (GCancellable *cancellable, "application-id", APPLICATION_ID, NULL); } -static gboolean -try_open_offline_timeout_cb (gpointer user_data) -{ - AlarmNotify *an = ALARM_NOTIFY (user_data); - GSList *sources, *iter; - - g_return_val_if_fail (an != NULL, FALSE); - g_return_val_if_fail (an->priv != NULL, FALSE); - - sources = an->priv->offline_sources; - an->priv->offline_sources = NULL; - an->priv->offline_timeout_id = 0; - - for (iter = sources; iter; iter = iter->next) { - ESource *source = iter->data; - - alarm_notify_add_calendar (an, - GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (source), "source-type")), - source); - } - - g_slist_free_full (sources, g_object_unref); - - return FALSE; -} - static void client_opened_cb (GObject *source_object, GAsyncResult *result, @@ -420,36 +235,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; - GError *error = NULL; - - e_client_utils_open_new_finish (source, result, &client, &error); - - if (client == NULL) { - if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_REPOSITORY_OFFLINE)) { - if (an->priv->offline_timeout_id) - g_source_remove (an->priv->offline_timeout_id); - an->priv->offline_sources = g_slist_append ( - an->priv->offline_sources, - g_object_ref (source)); - an->priv->offline_timeout_id = - g_timeout_add_seconds ( - 5 * 60, try_open_offline_timeout_cb, an); - } - - g_clear_error (&error); - return; - } + e_client_utils_open_new_finish (source, result, &client, NULL); - cal_client = E_CAL_CLIENT (client); - source_type = e_cal_client_get_source_type (cal_client); - uri = e_client_get_uri (client); + if (client == NULL) + return; 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 ( @@ -460,123 +256,64 @@ client_opened_cb (GObject *source_object, /** * alarm_notify_add_calendar: - * @an: An alarm notification service. - * @uri: URI of the calendar to load. + * @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) { - 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; - /* 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. */ - - if (e_source_get_property (source, "auth")) { - - if (!e_passwords_get_password (NULL, pass_key)) { - g_mutex_unlock (an->priv->mutex); - g_free (str_uri); - g_free (pass_key); + /* 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; - } } - 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; - } - - g_object_set_data ( - G_OBJECT (source), "source-type", - GUINT_TO_POINTER (source_type)); - 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; - GSList *in_offline; - - 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); - } - - in_offline = g_slist_find_custom ( - priv->offline_sources, str_uri, find_slist_source_uri_cb); - if (in_offline) { - ESource *source = in_offline->data; - - priv->offline_sources = g_slist_remove (priv->offline_sources, source); - if (!priv->offline_sources && priv->offline_timeout_id) { - g_source_remove (priv->offline_timeout_id); - priv->offline_timeout_id = 0; - } - - g_object_unref (source); + g_hash_table_remove (an->priv->clients, source); } } diff --git a/calendar/alarm-notify/alarm-notify.h b/calendar/alarm-notify/alarm-notify.h index b48cd5a602..1dc46eed80 100644 --- a/calendar/alarm-notify/alarm-notify.h +++ b/calendar/alarm-notify/alarm-notify.h @@ -68,13 +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); 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/alarm-notify/config-data.c b/calendar/alarm-notify/config-data.c index 3fcbe598a5..5129ed5ce3 100644 --- a/calendar/alarm-notify/config-data.c +++ b/calendar/alarm-notify/config-data.c @@ -27,15 +27,13 @@ #endif #include -#include +#include #include "config-data.h" /* Whether we have initied ourselves by reading * the data from the configuration engine. */ static gboolean inited = FALSE; -static GConfClient *conf_client = NULL; static GSettings *calendar_settings = 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. @@ -53,19 +51,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; - g_object_unref (calendar_settings); calendar_settings = FALSE; @@ -81,112 +66,9 @@ ensure_inited (void) inited = TRUE; - conf_client = gconf_client_get_default (); - if (!GCONF_IS_CLIENT (conf_client)) { - inited = FALSE; - return; - } - calendar_settings = g_settings_new ("org.gnome.evolution.calendar"); 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 (); - calendar_settings = g_settings_new ("org.gnome.evolution.calendar"); - } - - 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 = g_settings_get_boolean (calendar_settings, "notify-with-tray"); - if (!state) /* Should be old client */ { - GSList *source; - - g_settings_set_boolean (calendar_settings, "notify-with-tray", TRUE); - 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 -config_data_replace_string_list (const gchar *key, - const gchar *old, - const gchar *new) -{ - GSList *source, *tmp; - - if (!inited) - conf_client = gconf_client_get_default (); - - source = gconf_client_get_list (conf_client, - key, - GCONF_VALUE_STRING, - NULL); - - for (tmp = source; tmp; tmp = tmp->next) { - - if (strcmp (tmp->data, old) == 0) { - g_free (tmp->data); - tmp->data = g_strdup ((gchar *) new); - gconf_client_set_list (conf_client, - key, - GCONF_VALUE_STRING, - source, - NULL); - break; - } - } - - if (source) { - g_slist_foreach (source, (GFunc) g_free, NULL); - g_slist_free (source); - } } icaltimezone * @@ -249,31 +131,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); + 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); } } @@ -296,27 +173,39 @@ config_data_get_last_notification_time (ECalClient *cal) { time_t value, now; - 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), value = (time_t) tmval.tv_sec; + extension = e_source_get_extension (source, extension_name); + last_notified = e_source_alarms_get_last_notified (extension); - if (value > now) - value = now; - return value; - } - } + 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: value = g_settings_get_int (calendar_settings, "last-notification-time"); now = time (NULL); if (value > now) diff --git a/calendar/alarm-notify/config-data.h b/calendar/alarm-notify/config-data.h index a7a0ca58e0..421ced56cc 100644 --- a/calendar/alarm-notify/config-data.h +++ b/calendar/alarm-notify/config-data.h @@ -42,10 +42,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 *); void config_data_init_debugging (void); gboolean config_data_start_debugging (void); -- cgit v1.2.3