utils: Make date comparison follow time comparison semantics

Right now, comparing dates with gcal_date_time_compare_date() gives
the exact opposite result of when comparing using g_date_time_compare().

As shown by this patch, this was a source of *many* bugs.
This commit is contained in:
Georges Basile Stavracas Neto
2020-04-14 19:08:06 +00:00
parent bed8e10609
commit 12fd607d56
12 changed files with 75 additions and 158 deletions
+2 -2
View File
@@ -1890,8 +1890,8 @@ gcal_event_is_within_range (GcalEvent *self,
if (gcal_event_get_all_day (self))
{
return gcal_date_time_compare_date (range_end, event_start) < 0 &&
gcal_date_time_compare_date (range_start, event_end) > 0;
return gcal_date_time_compare_date (range_end, event_start) > 0 &&
gcal_date_time_compare_date (event_end, range_start) > 0;
}
return g_date_time_compare (range_end, event_start) > 0 &&
+4 -13
View File
@@ -384,20 +384,12 @@ on_manager_calendar_removed_cb (GcalManager *manager,
* GcalTimelineSubscriber iface
*/
static GDateTime*
gcal_shell_search_provider_get_range_start (GcalTimelineSubscriber *subscriber)
static GcalRange*
gcal_shell_search_provider_get_range (GcalTimelineSubscriber *subscriber)
{
GcalShellSearchProvider *self = GCAL_SHELL_SEARCH_PROVIDER (subscriber);
return g_date_time_ref (self->range_start);
}
static GDateTime*
gcal_shell_search_provider_get_range_end (GcalTimelineSubscriber *subscriber)
{
GcalShellSearchProvider *self = GCAL_SHELL_SEARCH_PROVIDER (subscriber);
return g_date_time_ref (self->range_end);
return gcal_range_new (self->range_start, self->range_end, GCAL_RANGE_DEFAULT);
}
static void
@@ -437,8 +429,7 @@ gcal_shell_search_provider_remove_event (GcalTimelineSubscriber *subscriber,
static void
gcal_timeline_subscriber_interface_init (GcalTimelineSubscriberInterface *iface)
{
iface->get_range_start = gcal_shell_search_provider_get_range_start;
iface->get_range_end = gcal_shell_search_provider_get_range_end;
iface->get_range = gcal_shell_search_provider_get_range;
iface->add_event = gcal_shell_search_provider_add_event;
iface->update_event = gcal_shell_search_provider_update_event;
iface->remove_event = gcal_shell_search_provider_remove_event;
+6 -22
View File
@@ -48,35 +48,19 @@ gcal_timeline_subscriber_default_init (GcalTimelineSubscriberInterface *iface)
}
/**
* gcal_timeline_subscriber_get_range_start:
* gcal_timeline_subscriber_get_range:
* @self: a #GcalTimelineSubscriber
*
* Retrieves the start of the range of @self.
* Retrieves the range of @self.
*
* Returns: (transfer full): a #GDateTime
* Returns: (transfer full): a #GcalRange
*/
GDateTime*
gcal_timeline_subscriber_get_range_start (GcalTimelineSubscriber *self)
GcalRange*
gcal_timeline_subscriber_get_range (GcalTimelineSubscriber *self)
{
g_return_val_if_fail (GCAL_IS_TIMELINE_SUBSCRIBER (self), NULL);
return GCAL_TIMELINE_SUBSCRIBER_GET_IFACE (self)->get_range_start (self);
}
/**
* gcal_timeline_subscriber_get_range_end:
* @self: a #GcalTimelineSubscriber
*
* Retrieves the end of the range of @self.
*
* Returns: (transfer full): a #GDateTime
*/
GDateTime*
gcal_timeline_subscriber_get_range_end (GcalTimelineSubscriber *self)
{
g_return_val_if_fail (GCAL_IS_TIMELINE_SUBSCRIBER (self), NULL);
return GCAL_TIMELINE_SUBSCRIBER_GET_IFACE (self)->get_range_end (self);
return GCAL_TIMELINE_SUBSCRIBER_GET_IFACE (self)->get_range (self);
}
/**
+3 -5
View File
@@ -25,6 +25,7 @@
#define LIBICAL_GLIB_UNSTABLE_API
#include <libical-glib/libical-glib.h>
#include "gcal-range.h"
#include "gcal-types.h"
G_BEGIN_DECLS
@@ -37,8 +38,7 @@ struct _GcalTimelineSubscriberInterface
{
GTypeInterface parent;
GDateTime* (*get_range_start) (GcalTimelineSubscriber *self);
GDateTime* (*get_range_end) (GcalTimelineSubscriber *self);
GcalRange* (*get_range) (GcalTimelineSubscriber *self);
void (*add_event) (GcalTimelineSubscriber *self,
GcalEvent *event);
@@ -50,9 +50,7 @@ struct _GcalTimelineSubscriberInterface
GcalEvent *event);
};
GDateTime* gcal_timeline_subscriber_get_range_start (GcalTimelineSubscriber *self);
GDateTime* gcal_timeline_subscriber_get_range_end (GcalTimelineSubscriber *self);
GcalRange* gcal_timeline_subscriber_get_range (GcalTimelineSubscriber *self);
void gcal_timeline_subscriber_range_changed (GcalTimelineSubscriber *self);
+19 -50
View File
@@ -57,12 +57,6 @@ typedef struct
GcalTimeline *timeline;
} TimelineSource;
typedef struct
{
GDateTime *range_start;
GDateTime *range_end;
} SubscriberData;
struct _GcalTimeline
{
GObject parent_instance;
@@ -163,26 +157,6 @@ increase_completed_calendars (GcalTimeline *self)
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]);
}
static SubscriberData*
subscriber_data_new (GcalTimelineSubscriber *subscriber)
{
SubscriberData *subscriber_data;
subscriber_data = g_new0 (SubscriberData, 1);
subscriber_data->range_start = gcal_timeline_subscriber_get_range_start (subscriber);
subscriber_data->range_end = gcal_timeline_subscriber_get_range_end (subscriber);
return g_steal_pointer (&subscriber_data);
}
static void
subscriber_data_free (SubscriberData *subscriber_data)
{
gcal_clear_date_time (&subscriber_data->range_start);
gcal_clear_date_time (&subscriber_data->range_end);
g_free (subscriber_data);
}
static void
add_event_to_subscriber (GcalTimelineSubscriber *subscriber,
GcalEvent *event)
@@ -223,9 +197,11 @@ subscriber_contains_event (GcalTimelineSubscriber *subscriber,
{
g_autoptr (GDateTime) subscriber_range_start = NULL;
g_autoptr (GDateTime) subscriber_range_end = NULL;
g_autoptr (GcalRange) subscriber_range = NULL;
subscriber_range_start = gcal_timeline_subscriber_get_range_start (subscriber);
subscriber_range_end = gcal_timeline_subscriber_get_range_end (subscriber);
subscriber_range = gcal_timeline_subscriber_get_range (subscriber);
subscriber_range_start = gcal_range_get_start (subscriber_range);
subscriber_range_end = gcal_range_get_end (subscriber_range);
return gcal_event_is_within_range (event, subscriber_range_start, subscriber_range_end);
}
@@ -250,11 +226,13 @@ update_range (GcalTimeline *self)
g_hash_table_iter_init (&iter, self->subscribers);
while (g_hash_table_iter_next (&iter, (gpointer*) &subscriber, NULL))
{
g_autoptr (GcalRange) subscriber_range = NULL;
g_autoptr (GDateTime) subscriber_start = NULL;
g_autoptr (GDateTime) subscriber_end = NULL;
subscriber_start = gcal_timeline_subscriber_get_range_start (subscriber);
subscriber_end = gcal_timeline_subscriber_get_range_end (subscriber);
subscriber_range = gcal_timeline_subscriber_get_range (subscriber);
subscriber_start = gcal_range_get_start (subscriber_range);
subscriber_end = gcal_range_get_end (subscriber_range);
if (!new_range_start || g_date_time_compare (subscriber_start, new_range_start) < 0)
{
@@ -427,9 +405,9 @@ add_cached_events_to_subscriber (GcalTimeline *self,
GCAL_ENTRY;
subscriber_start = gcal_timeline_subscriber_get_range_start (subscriber);
subscriber_end = gcal_timeline_subscriber_get_range_end (subscriber);
subscriber_range = gcal_range_new (subscriber_start, subscriber_end, GCAL_RANGE_DEFAULT);
subscriber_range = gcal_timeline_subscriber_get_range (subscriber);
subscriber_start = gcal_range_get_start (subscriber_range);
subscriber_end = gcal_range_get_end (subscriber_range);
events_to_add = gcal_range_tree_get_data_at_range (self->events, subscriber_range);
@@ -460,18 +438,13 @@ update_subscriber_range (GcalTimeline *self,
{
g_autoptr (GcalRange) old_range = NULL;
g_autoptr (GcalRange) new_range = NULL;
SubscriberData *subscriber_data;
GCAL_ENTRY;
subscriber_data = g_hash_table_lookup (self->subscribers, subscriber);
g_assert (subscriber_data != NULL);
old_range = g_hash_table_lookup (self->subscribers, subscriber);
g_assert (old_range != NULL);
old_range = gcal_range_new (subscriber_data->range_start, subscriber_data->range_end, GCAL_RANGE_DEFAULT);
new_range = gcal_range_new_take (gcal_timeline_subscriber_get_range_start (subscriber),
gcal_timeline_subscriber_get_range_end (subscriber),
GCAL_RANGE_DEFAULT);
new_range = gcal_timeline_subscriber_get_range (subscriber);
/* Diff new and old event ranges */
calculate_changed_events (self, subscriber, old_range, new_range);
@@ -480,11 +453,7 @@ update_subscriber_range (GcalTimeline *self,
gcal_range_tree_remove_data (self->subscriber_ranges, subscriber);
gcal_range_tree_add_range (self->subscriber_ranges, new_range, subscriber);
gcal_clear_date_time (&subscriber_data->range_start);
subscriber_data->range_start = gcal_range_get_start (new_range);
gcal_clear_date_time (&subscriber_data->range_end);
subscriber_data->range_end = gcal_range_get_end (new_range);
g_hash_table_insert (self->subscribers, g_object_ref (subscriber), g_steal_pointer (&new_range));
GCAL_EXIT;
}
@@ -861,7 +830,7 @@ gcal_timeline_init (GcalTimeline *self)
self->cancellable = g_cancellable_new ();
self->events = gcal_range_tree_new_with_free_func (g_object_unref);
self->calendars = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
self->subscribers = g_hash_table_new_full (NULL, NULL, g_object_unref, (GDestroyNotify) subscriber_data_free);
self->subscribers = g_hash_table_new_full (NULL, NULL, g_object_unref, (GDestroyNotify) gcal_range_unref);
self->subscriber_ranges = gcal_range_tree_new ();
self->event_queue = g_queue_new ();
@@ -952,7 +921,7 @@ void
gcal_timeline_add_subscriber (GcalTimeline *self,
GcalTimelineSubscriber *subscriber)
{
SubscriberData *subscriber_data;
g_autoptr (GcalRange) subscriber_range = NULL;
g_return_if_fail (GCAL_IS_TIMELINE (self));
g_return_if_fail (GCAL_IS_TIMELINE_SUBSCRIBER (subscriber));
@@ -964,9 +933,9 @@ gcal_timeline_add_subscriber (GcalTimeline *self,
g_debug ("Adding subscriber %s to timeline %p", G_OBJECT_TYPE_NAME (subscriber), self);
subscriber_data = subscriber_data_new (subscriber);
subscriber_range = gcal_timeline_subscriber_get_range (subscriber);
g_hash_table_insert (self->subscribers, g_object_ref (subscriber), g_steal_pointer (&subscriber_data));
g_hash_table_insert (self->subscribers, g_object_ref (subscriber), gcal_range_ref (subscriber_range));
g_signal_connect_object (subscriber,
"range-changed",
G_CALLBACK (on_subscriber_range_changed_cb),