core/event: Add utility functions for checking equality
This adds: - `gcal_event_alarms_equal()` - `gcal_event_schedule_equal()` - `gcal_event_strings_equal()` We aren't going to make use of it yet, but eventually these functions will be used for the event editor dialog, as well as writing tests for. Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/783>
This commit is contained in:
@@ -1668,6 +1668,157 @@ gcal_event_compare_with_current (GcalEvent *event1,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gcal_event_alarms_equal:
|
||||||
|
* @event1: a #GcalEvent
|
||||||
|
* @event2: a #GcalEvent
|
||||||
|
*
|
||||||
|
* Checks if the alarms set by @event1 and @event2 are identical.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the events' alarms are identical
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gcal_event_alarms_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2)
|
||||||
|
{
|
||||||
|
g_autoptr (GList) alarms1 = NULL;
|
||||||
|
g_autoptr (GList) alarms2 = NULL;
|
||||||
|
|
||||||
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
|
||||||
|
|
||||||
|
alarms1 = gcal_event_get_alarms (event1);
|
||||||
|
alarms2 = gcal_event_get_alarms (event2);
|
||||||
|
|
||||||
|
if (g_list_length (alarms1) != g_list_length (alarms2))
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
for (GList *l = alarms1; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
ECalComponentAlarm *other_alarm;
|
||||||
|
ECalComponentAlarm *alarm;
|
||||||
|
|
||||||
|
alarm = l->data;
|
||||||
|
other_alarm = NULL;
|
||||||
|
|
||||||
|
for (GList *i = alarms2; i != NULL; i = i->next)
|
||||||
|
{
|
||||||
|
ECalComponentAlarm *aux = i->data;
|
||||||
|
|
||||||
|
if (get_alarm_trigger_minutes (event1, alarm) != get_alarm_trigger_minutes (event1, aux))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
other_alarm = aux;
|
||||||
|
|
||||||
|
if (e_cal_component_alarm_get_action (alarm) != e_cal_component_alarm_get_action (aux))
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!other_alarm)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
/* TODO: this certainly needs deeper comparisons! */
|
||||||
|
}
|
||||||
|
|
||||||
|
GCAL_RETURN (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gcal_event_schedule_equal:
|
||||||
|
* @event1: a #GcalEvent
|
||||||
|
* @event2: a #GcalEvent
|
||||||
|
*
|
||||||
|
* Checks if the schedule set by @event1 and @event2 are identical.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the events' schedule are identical
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gcal_event_schedule_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2)
|
||||||
|
{
|
||||||
|
GcalRecurrence *recurrence1, *recurrence2;
|
||||||
|
GTimeZone *date_start_tz1, *date_start_tz2;
|
||||||
|
GTimeZone *date_end_tz1, *date_end_tz2;
|
||||||
|
GDateTime *date_start1, *date_start2;
|
||||||
|
GDateTime *date_end1, *date_end2;
|
||||||
|
|
||||||
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
|
||||||
|
|
||||||
|
if (gcal_event_has_recurrence (event1) != gcal_event_has_recurrence (event2))
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
recurrence1 = gcal_event_get_recurrence (event1);
|
||||||
|
recurrence2 = gcal_event_get_recurrence (event2);
|
||||||
|
|
||||||
|
if (recurrence1 == recurrence2)
|
||||||
|
GCAL_RETURN (TRUE);
|
||||||
|
if (!recurrence1 != !recurrence2)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
if (!gcal_recurrence_is_equal (recurrence1, recurrence2))
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
if (gcal_event_get_all_day (event1) != gcal_event_get_all_day (event2))
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
date_start1 = gcal_event_get_date_start (event1);
|
||||||
|
date_start2 = gcal_event_get_date_start (event2);
|
||||||
|
|
||||||
|
date_end1 = gcal_event_get_date_end (event1);
|
||||||
|
date_end2 = gcal_event_get_date_end (event2);
|
||||||
|
|
||||||
|
if (gcal_date_time_compare_date (date_start1, date_start2) < 0 ||
|
||||||
|
gcal_date_time_compare_date (date_end1, date_end2) > 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
date_start_tz1 = g_date_time_get_timezone (date_start1);
|
||||||
|
date_end_tz1 = g_date_time_get_timezone (date_end1);
|
||||||
|
date_start_tz2 = g_date_time_get_timezone (date_start2);
|
||||||
|
date_end_tz2 = g_date_time_get_timezone (date_end2);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_time_zone_get_identifier (date_start_tz1), g_time_zone_get_identifier (date_start_tz2)) != 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_time_zone_get_identifier (date_end_tz1), g_time_zone_get_identifier (date_end_tz2)) != 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
GCAL_RETURN (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gcal_event_strings_equal:
|
||||||
|
* @event1: a #GcalEvent
|
||||||
|
* @event2: a #GcalEvent
|
||||||
|
*
|
||||||
|
* Checks if the strings set by @event1 and @event2 are identical.
|
||||||
|
*
|
||||||
|
* Specifically, this checks whether [property@Gcal.Event:summary], [property@Gcal.Event:description],
|
||||||
|
* and [property@Gcal.Event:location] are identical.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the events' strings are identical
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gcal_event_strings_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2)
|
||||||
|
{
|
||||||
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
|
||||||
|
|
||||||
|
if (g_strcmp0 (gcal_event_get_summary (event1), gcal_event_get_summary (event2)) != 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
if (g_strcmp0 (gcal_event_get_description (event1), gcal_event_get_description (event2)) != 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
if (g_strcmp0 (gcal_event_get_location (event1), gcal_event_get_location (event2)) != 0)
|
||||||
|
GCAL_RETURN (FALSE);
|
||||||
|
|
||||||
|
GCAL_RETURN (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gcal_event_set_recurrence:
|
* gcal_event_set_recurrence:
|
||||||
* @self: a #GcalEvent
|
* @self: a #GcalEvent
|
||||||
|
|||||||
@@ -142,6 +142,15 @@ GListModel * gcal_event_get_attendees (GcalEvent
|
|||||||
|
|
||||||
GcalEventOrganizer * gcal_event_get_organizer (GcalEvent *self);
|
GcalEventOrganizer * gcal_event_get_organizer (GcalEvent *self);
|
||||||
|
|
||||||
|
gboolean gcal_event_alarms_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2);
|
||||||
|
|
||||||
|
gboolean gcal_event_schedule_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2);
|
||||||
|
|
||||||
|
gboolean gcal_event_strings_equal (GcalEvent *event1,
|
||||||
|
GcalEvent *event2);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* GCAL_EVENT_H */
|
#endif /* GCAL_EVENT_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user