From bd4aac8f498d0012b9498839ff1e7d1943720552 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 18 Apr 2019 16:21:43 +0200 Subject: [PATCH] calendar-server: Port to libecal-2.0 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/501 --- .gitlab-ci.yml | 8 +- meson.build | 4 +- src/calendar-server/calendar-sources.c | 6 +- .../gnome-shell-calendar-server.c | 219 ++++++++++-------- 4 files changed, 129 insertions(+), 108 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4b97799a3..8dfb00190 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ variables: - merge_requests check_commit_log: - image: registry.gitlab.gnome.org/gnome/mutter/master:v1 + image: registry.gitlab.gnome.org/gnome/mutter/master:v2 stage: review variables: GIT_DEPTH: "100" @@ -40,7 +40,7 @@ js_check: when: on_failure build: - image: registry.gitlab.gnome.org/gnome/mutter/master:v1 + image: registry.gitlab.gnome.org/gnome/mutter/master:v2 stage: build before_script: - .gitlab-ci/checkout-mutter.sh @@ -58,7 +58,7 @@ build: - build test: - image: registry.gitlab.gnome.org/gnome/mutter/master:v1 + image: registry.gitlab.gnome.org/gnome/mutter/master:v2 stage: test before_script: - ninja -C mutter/build install @@ -72,7 +72,7 @@ test: when: on_failure test-pot: - image: registry.gitlab.gnome.org/gnome/mutter/master:v1 + image: registry.gitlab.gnome.org/gnome/mutter/master:v2 stage: test before_script: - ninja -C mutter/build install diff --git a/meson.build b/meson.build index 1801d5413..e57e1928f 100644 --- a/meson.build +++ b/meson.build @@ -14,7 +14,7 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version libmutter_pc = 'libmutter-' + mutter_api_version croco_req = '>= 0.6.8' -ecal_req = '>= 3.5.3' +ecal_req = '>= 3.33.1' eds_req = '>= 3.17.2' gcr_req = '>= 3.7.5' gdesktop_req = '>= 3.7.90' @@ -73,7 +73,7 @@ else endif atk_bridge_dep = dependency('atk-bridge-2.0') -ecal_dep = dependency('libecal-1.2', version: ecal_req) +ecal_dep = dependency('libecal-2.0', version: ecal_req) eds_dep = dependency('libedataserver-1.2', version: eds_req) gcr_dep = dependency('gcr-base-3', version: gcr_req) gdk_x11_dep = dependency('gdk-x11-3.0') diff --git a/src/calendar-server/calendar-sources.c b/src/calendar-server/calendar-sources.c index 628f89b07..38b765ecc 100644 --- a/src/calendar-server/calendar-sources.c +++ b/src/calendar-server/calendar-sources.c @@ -295,13 +295,13 @@ create_client_for_source (ESource *source, CalendarSourceData *source_data) { ClientData *data; - ECalClient *client; + EClient *client; GError *error = NULL; client = g_hash_table_lookup (source_data->clients, source); g_return_if_fail (client == NULL); - client = e_cal_client_new (source, source_type, &error); + client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error); if (!client) { g_warning ("Could not load source '%s': %s", @@ -312,7 +312,7 @@ create_client_for_source (ESource *source, } data = g_slice_new0 (ClientData); - data->client = client; /* takes ownership */ + data->client = E_CAL_CLIENT (client); /* takes ownership */ data->backend_died_id = g_signal_connect (client, "backend-died", G_CALLBACK (backend_died_cb), diff --git a/src/calendar-server/gnome-shell-calendar-server.c b/src/calendar-server/gnome-shell-calendar-server.c index 2ad8fb99e..d5b6e01f7 100644 --- a/src/calendar-server/gnome-shell-calendar-server.c +++ b/src/calendar-server/gnome-shell-calendar-server.c @@ -102,97 +102,120 @@ typedef struct } CollectAppointmentsData; static time_t -get_time_from_property (icalcomponent *ical, - icalproperty_kind prop_kind, - struct icaltimetype (* get_prop_func) (const icalproperty *prop), - icaltimezone *default_zone) +get_time_from_property (ICalComponent *icomp, + ICalPropertyKind prop_kind, + ICalTime * (* get_prop_func) (ICalProperty *prop), + ICalTimezone *default_zone) { - icalproperty *prop; - struct icaltimetype ical_time; - icalparameter *param; - icaltimezone *timezone = NULL; + ICalProperty *prop; + ICalTime *itt; + ICalParameter *param; + ICalTimezone *timezone = NULL; + time_t retval; - prop = icalcomponent_get_first_property (ical, prop_kind); + prop = i_cal_component_get_first_property (icomp, prop_kind); if (!prop) return 0; - ical_time = get_prop_func (prop); + itt = get_prop_func (prop); - param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); + param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER); if (param) - timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param)); - else if (icaltime_is_utc (ical_time)) - timezone = icaltimezone_get_utc_timezone (); + timezone = i_cal_timezone_get_builtin_timezone_from_tzid (i_cal_parameter_get_tzid (param)); + else if (i_cal_time_is_utc (itt)) + timezone = i_cal_timezone_get_utc_timezone (); else timezone = default_zone; - return icaltime_as_timet_with_zone (ical_time, timezone); + retval = i_cal_time_as_timet_with_zone (itt, timezone); + + g_clear_object (¶m); + g_clear_object (&prop); + g_clear_object (&itt); + + return retval; } static char * -get_ical_uid (icalcomponent *ical) +get_ical_uid (ICalComponent *icomp) { - return g_strdup (icalcomponent_get_uid (ical)); + return g_strdup (i_cal_component_get_uid (icomp)); } static char * -get_ical_summary (icalcomponent *ical) +get_ical_summary (ICalComponent *icomp) { - icalproperty *prop; + ICalProperty *prop; + char *retval; - prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY); + prop = i_cal_component_get_first_property (icomp, I_CAL_SUMMARY_PROPERTY); if (!prop) return NULL; - return g_strdup (icalproperty_get_summary (prop)); + retval = g_strdup (i_cal_property_get_summary (prop)); + + g_object_unref (prop); + + return retval; } static char * -get_ical_description (icalcomponent *ical) +get_ical_description (ICalComponent *icomp) { - icalproperty *prop; + ICalProperty *prop; + char *retval; - prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY); + prop = i_cal_component_get_first_property (icomp, I_CAL_DESCRIPTION_PROPERTY); if (!prop) return NULL; - return g_strdup (icalproperty_get_description (prop)); + retval = g_strdup (i_cal_property_get_description (prop)); + + g_object_unref (prop); + + return retval; } static inline time_t -get_ical_start_time (icalcomponent *ical, - icaltimezone *default_zone) +get_ical_start_time (ICalComponent *icomp, + ICalTimezone *default_zone) { - return get_time_from_property (ical, - ICAL_DTSTART_PROPERTY, - icalproperty_get_dtstart, + return get_time_from_property (icomp, + I_CAL_DTSTART_PROPERTY, + i_cal_property_get_dtstart, default_zone); } static inline time_t -get_ical_end_time (icalcomponent *ical, - icaltimezone *default_zone) +get_ical_end_time (ICalComponent *icomp, + ICalTimezone *default_zone) { - return get_time_from_property (ical, - ICAL_DTEND_PROPERTY, - icalproperty_get_dtend, + return get_time_from_property (icomp, + I_CAL_DTEND_PROPERTY, + i_cal_property_get_dtend, default_zone); } static gboolean -get_ical_is_all_day (icalcomponent *ical, +get_ical_is_all_day (ICalComponent *icomp, time_t start_time, - icaltimezone *default_zone) + ICalTimezone *default_zone) { - icalproperty *prop; - struct tm *start_tm; - time_t end_time; - struct icaldurationtype duration; - struct icaltimetype start_icaltime; + ICalProperty *prop; + ICalDuration *duration; + ICalTime *dtstart; + struct tm *start_tm; + time_t end_time; + gboolean retval; - start_icaltime = icalcomponent_get_dtstart (ical); - if (start_icaltime.is_date) - return TRUE; + dtstart = i_cal_component_get_dtstart (icomp); + if (dtstart && i_cal_time_is_date (dtstart)) + { + g_clear_object (&dtstart); + return TRUE; + } + + g_clear_object (&dtstart); start_tm = gmtime (&start_time); if (start_tm->tm_sec != 0 || @@ -200,35 +223,40 @@ get_ical_is_all_day (icalcomponent *ical, start_tm->tm_hour != 0) return FALSE; - if ((end_time = get_ical_end_time (ical, default_zone))) + if ((end_time = get_ical_end_time (icomp, default_zone))) return (end_time - start_time) % 86400 == 0; - prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY); + prop = i_cal_component_get_first_property (icomp, I_CAL_DURATION_PROPERTY); if (!prop) return FALSE; - duration = icalproperty_get_duration (prop); + duration = i_cal_property_get_duration (prop); - return icaldurationtype_as_int (duration) % 86400 == 0; + retval = duration && (i_cal_duration_as_int (duration) % 86400) == 0; + + g_clear_object (&duration); + g_clear_object (&prop); + + return retval; } static inline time_t -get_ical_due_time (icalcomponent *ical, - icaltimezone *default_zone) +get_ical_due_time (ICalComponent *icomp, + ICalTimezone *default_zone) { - return get_time_from_property (ical, - ICAL_DUE_PROPERTY, - icalproperty_get_due, + return get_time_from_property (icomp, + I_CAL_DUE_PROPERTY, + i_cal_property_get_due, default_zone); } static inline time_t -get_ical_completed_time (icalcomponent *ical, - icaltimezone *default_zone) +get_ical_completed_time (ICalComponent *icomp, + ICalTimezone *default_zone) { - return get_time_from_property (ical, - ICAL_COMPLETED_PROPERTY, - icalproperty_get_completed, + return get_time_from_property (icomp, + I_CAL_COMPLETED_PROPERTY, + i_cal_property_get_completed, default_zone); } @@ -365,67 +393,69 @@ calendar_appointment_free (CalendarAppointment *appointment) static void calendar_appointment_init (CalendarAppointment *appointment, - icalcomponent *ical, + ICalComponent *icomp, ECalClient *cal) { - icaltimezone *default_zone; + ICalTimezone *default_zone; const char *source_id; source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal))); default_zone = e_cal_client_get_default_timezone (cal); - appointment->uid = get_ical_uid (ical); + appointment->uid = get_ical_uid (icomp); appointment->source_id = g_strdup (source_id); appointment->backend_name = get_source_backend_name (cal); - appointment->summary = get_ical_summary (ical); - appointment->description = get_ical_description (ical); + appointment->summary = get_ical_summary (icomp); + appointment->description = get_ical_description (icomp); appointment->color_string = get_source_color (cal); - appointment->start_time = get_ical_start_time (ical, default_zone); - appointment->end_time = get_ical_end_time (ical, default_zone); - appointment->is_all_day = get_ical_is_all_day (ical, + appointment->start_time = get_ical_start_time (icomp, default_zone); + appointment->end_time = get_ical_end_time (icomp, default_zone); + appointment->is_all_day = get_ical_is_all_day (icomp, appointment->start_time, default_zone); } static CalendarAppointment * -calendar_appointment_new (icalcomponent *ical, +calendar_appointment_new (ICalComponent *icomp, ECalClient *cal) { CalendarAppointment *appointment; appointment = g_new0 (CalendarAppointment, 1); - calendar_appointment_init (appointment, ical, cal); + calendar_appointment_init (appointment, icomp, cal); return appointment; } static gboolean -generate_instances_cb (ECalComponent *comp, - time_t start, - time_t end, - gpointer data) +generate_instances_cb (ICalComponent *icomp, + ICalTime *instance_start, + ICalTime *instance_end, + gpointer user_data, + GCancellable *cancellable, + GError **error) { - ECalClient *cal = ((CollectAppointmentsData *)data)->client; - GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments; + ECalClient *cal = ((CollectAppointmentsData *)user_data)->client; + GHashTable *appointments = ((CollectAppointmentsData *)user_data)->appointments; CalendarAppointment *appointment; CalendarOccurrence *occurrence; - const char *uid; + ICalTimezone *default_zone; + const gchar *uid; - e_cal_component_get_uid (comp, &uid); + default_zone = e_cal_client_get_default_timezone (cal); + uid = i_cal_component_get_uid (icomp); appointment = g_hash_table_lookup (appointments, uid); if (appointment == NULL) { - icalcomponent *ical = e_cal_component_get_icalcomponent (comp); - - appointment = calendar_appointment_new (ical, cal); + appointment = calendar_appointment_new (icomp, cal); g_hash_table_insert (appointments, g_strdup (uid), appointment); } occurrence = g_new0 (CalendarOccurrence, 1); - occurrence->start_time = start; - occurrence->end_time = end; - occurrence->rid = e_cal_component_get_recurid_as_string (comp); + occurrence->start_time = i_cal_time_as_timet_with_zone (instance_start, default_zone); + occurrence->end_time = i_cal_time_as_timet_with_zone (instance_end, default_zone); + occurrence->rid = e_cal_util_component_get_recurid_as_string (icomp); appointment->occurrences = g_slist_append (appointment->occurrences, occurrence); @@ -442,7 +472,7 @@ struct _App time_t since; time_t until; - icaltimezone *zone; + ICalTimezone *zone; CalendarSources *sources; gulong sources_signal_id; @@ -468,9 +498,9 @@ app_update_timezone (App *app) if (g_strcmp0 (location, app->timezone_location) != 0) { if (location == NULL) - app->zone = icaltimezone_get_utc_timezone (); + app->zone = i_cal_timezone_get_utc_timezone (); else - app->zone = icaltimezone_get_builtin_timezone (location); + app->zone = i_cal_timezone_get_builtin_timezone (location); g_free (app->timezone_location); app->timezone_location = location; print_debug ("Using timezone %s", app->timezone_location); @@ -528,10 +558,10 @@ on_objects_added (ECalClientView *view, for (l = objects; l != NULL; l = l->next) { - icalcomponent *ical = l->data; + ICalComponent *icomp = l->data; const char *uid; - uid = icalcomponent_get_uid (ical); + uid = i_cal_component_get_uid (icomp); if (g_hash_table_lookup (app->appointments, uid) == NULL) { @@ -600,7 +630,7 @@ app_load_events (App *app) since_iso8601 = isodate_from_time_t (app->since); until_iso8601 = isodate_from_time_t (app->until); - tz_location = icaltimezone_get_location (app->zone); + tz_location = i_cal_timezone_get_location (app->zone); print_debug ("Loading events since %s until %s", since_iso8601, @@ -622,21 +652,12 @@ app_load_events (App *app) e_cal_client_set_default_timezone (cal, app->zone); - error = NULL; - if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error)) - { - ESource *source = e_client_get_source (E_CLIENT (cal)); - g_warning ("Error opening calendar %s: %s\n", - e_source_get_uid (source), error->message); - g_error_free (error); - continue; - } - data.client = cal; data.appointments = app->appointments; e_cal_client_generate_instances_sync (cal, app->since, app->until, + NULL, generate_instances_cb, &data);