summaryrefslogtreecommitdiff
path: root/src/calendar/libecal/e-cal-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/calendar/libecal/e-cal-util.c')
-rw-r--r--src/calendar/libecal/e-cal-util.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/calendar/libecal/e-cal-util.c b/src/calendar/libecal/e-cal-util.c
index c5afaecd9..996da1bdd 100644
--- a/src/calendar/libecal/e-cal-util.c
+++ b/src/calendar/libecal/e-cal-util.c
@@ -932,6 +932,7 @@ e_cal_util_generate_alarms_for_uid_sync (ECalClient *client,
GCancellable *cancellable,
GError **error)
{
+ GHashTable *alarm_uids_hash;
GSList *alarm_uids = NULL;
GSList *objects = NULL, *link;
time_t alarm_start = start, alarm_end = end;
@@ -944,16 +945,32 @@ e_cal_util_generate_alarms_for_uid_sync (ECalClient *client,
if (!e_cal_client_get_objects_for_uid_sync (client, uid, &objects, cancellable, error))
return NULL;
+ alarm_uids_hash = g_hash_table_new (g_str_hash, g_str_equal);
+
for (link = objects; link; link = g_slist_next (link)) {
ECalComponent *comp = link->data;
GSList *auids = e_cal_component_get_alarm_uids (comp);
if (auids) {
+ GSList *alink;
+
compute_alarm_range (comp, auids, alarm_start, alarm_end, &alarm_start, &alarm_end);
- alarm_uids = g_slist_concat (alarm_uids, auids);
+
+ for (alink = auids; alink; alink = g_slist_next (alink)) {
+ const gchar *auid = alink->data;
+ if (auid && !g_hash_table_contains (alarm_uids_hash, auid)) {
+ alarm_uids = g_slist_prepend (alarm_uids, (gpointer) auid);
+ g_hash_table_add (alarm_uids_hash, (gpointer) auid);
+ alink->data = NULL;
+ }
+ }
+
+ g_slist_free_full (auids, g_free);
}
}
+ g_clear_pointer (&alarm_uids_hash, g_hash_table_destroy);
+
aod.comp = NULL;
aod.alarm_uids = alarm_uids;
aod.start = start;