Skip to content
Commits on Source (8)
Major changes in 41.2:
* Various fixes to timezone handling
* Updated translations
Major changes in 41.1:
* Fix Google Meet URL detection
* Updated translations
......
......@@ -45,6 +45,7 @@
<project_group>GNOME</project_group>
<releases>
<release date="2021-12-10" version="41.2" />
<release date="2021-11-05" version="41.1">
<description>
<p>
......
project(
'gnome-calendar',
'c',
version: '41.1',
version: '41.2',
license: 'GPL3+',
meson_version: '>= 0.53.0'
)
......
......@@ -148,11 +148,12 @@ clear_range (GcalEvent *self)
}
static GTimeZone*
get_timezone_from_ical (ECalComponentDateTime *comp)
get_timezone_from_ical (GcalEvent *self,
ECalComponentDateTime *comp)
{
g_autoptr (GTimeZone) tz = NULL;
ICalTimezone *zone;
ICalTime *itt;
GTimeZone *tz;
itt = e_cal_component_datetime_get_value (comp);
zone = i_cal_time_get_timezone (itt);
......@@ -168,16 +169,29 @@ get_timezone_from_ical (ECalComponentDateTime *comp)
}
else if (e_cal_component_datetime_get_tzid (comp))
{
const gchar *real_tzid;
const gchar *original_tzid, *tzid;
tzid = e_cal_component_datetime_get_tzid (comp);
original_tzid = tzid;
if (g_str_has_prefix (tzid, LIBICAL_TZID_PREFIX))
tzid += strlen (LIBICAL_TZID_PREFIX);
real_tzid = e_cal_component_datetime_get_tzid (comp);
tz = g_time_zone_new_identifier (tzid);
if (!tz && self->calendar)
{
ICalTimezone *tzone = NULL;
ECalClient *client;
if (g_str_has_prefix (real_tzid, LIBICAL_TZID_PREFIX))
real_tzid += strlen (LIBICAL_TZID_PREFIX);
client = gcal_calendar_get_client (self->calendar);
tz = g_time_zone_new_identifier (real_tzid);
if (client && e_cal_client_get_timezone_sync (client, original_tzid, &tzone, NULL, NULL))
zone = tzone;
}
}
else if (zone)
if (!tz && zone)
{
g_autofree gchar *tzid = NULL;
gint offset;
......@@ -186,10 +200,6 @@ get_timezone_from_ical (ECalComponentDateTime *comp)
tzid = format_utc_offset (offset);
tz = g_time_zone_new_identifier (tzid);
}
else
{
tz = g_time_zone_new_utc ();
}
/*
* If tz is NULL, the timezone identifier is invalid. Fallback to UTC
......@@ -200,7 +210,7 @@ get_timezone_from_ical (ECalComponentDateTime *comp)
GCAL_TRACE_MSG ("%s (%p)", g_time_zone_get_identifier (tz), tz);
return tz;
return g_steal_pointer (&tz);
}
static ECalComponentDateTime*
......@@ -340,7 +350,7 @@ gcal_event_set_component_internal (GcalEvent *self,
GCAL_TRACE_MSG ("Retrieving start timezone");
date = i_cal_time_normalize (e_cal_component_datetime_get_value (start));
zone_start = get_timezone_from_ical (start);
zone_start = get_timezone_from_ical (self, start);
date_start = g_date_time_new (zone_start,
i_cal_time_get_year (date),
i_cal_time_get_month (date),
......@@ -366,7 +376,7 @@ gcal_event_set_component_internal (GcalEvent *self,
GCAL_TRACE_MSG ("Retrieving end timezone");
date = i_cal_time_normalize (e_cal_component_datetime_get_value (end));
zone_end = get_timezone_from_ical (end);
zone_end = get_timezone_from_ical (self, end);
date_end = g_date_time_new (zone_end,
i_cal_time_get_year (date),
i_cal_time_get_month (date),
......
......@@ -220,6 +220,7 @@ format_datetime_for_display (GDateTime *date,
gboolean all_day)
{
g_autofree gchar *formatted_date = NULL;
g_autoptr (GDateTime) local_dt = NULL;
g_autoptr (GDateTime) now = NULL;
GString *string;
gint days_diff;
......@@ -227,7 +228,8 @@ format_datetime_for_display (GDateTime *date,
string = g_string_new ("");
now = g_date_time_new_now_local ();
days_diff = gcal_date_time_compare_date (date, now);
local_dt = all_day ? g_date_time_ref (date) : g_date_time_to_local (date);
days_diff = gcal_date_time_compare_date (local_dt, now);
switch (days_diff)
{
......@@ -238,7 +240,7 @@ format_datetime_for_display (GDateTime *date,
case -3:
case -2:
/* Translators: %A is the weekday name (e.g. Sunday, Monday, etc) */
formatted_date = g_date_time_format (date, _("Last %A"));
formatted_date = g_date_time_format (local_dt, _("Last %A"));
break;
case -1:
......@@ -260,11 +262,11 @@ format_datetime_for_display (GDateTime *date,
case 6:
case 7:
/* Translators: %A is the weekday name (e.g. Sunday, Monday, etc) */
formatted_date = g_date_time_format (date, _("This %A"));
formatted_date = g_date_time_format (local_dt, _("This %A"));
break;
default:
formatted_date = g_date_time_format (date, "%x");
formatted_date = g_date_time_format (local_dt, "%x");
break;
}
......@@ -275,11 +277,11 @@ format_datetime_for_display (GDateTime *date,
switch (format)
{
case GCAL_TIME_FORMAT_12H:
formatted_time = g_date_time_format (date, "%I:%M %P");
formatted_time = g_date_time_format (local_dt, "%I:%M %P");
break;
case GCAL_TIME_FORMAT_24H:
formatted_time = g_date_time_format (date, "%R");
formatted_time = g_date_time_format (local_dt, "%R");
break;
default:
......
......@@ -412,7 +412,7 @@ gcal_application_command_line (GApplication *app,
g_autoptr (GDateTime) initial_date = NULL;
initial_date = g_date_time_new (gcal_context_get_timezone (self->context),
result.tm_year,
result.tm_year + 1900,
result.tm_mon,
result.tm_mday,
result.tm_hour,
......
......@@ -352,9 +352,9 @@ format_single_day (GcalEventPopover *self,
static void
update_date_time_label (GcalEventPopover *self)
{
g_autoptr (GDateTime) start_dt = NULL;
g_autoptr (GDateTime) end_dt = NULL;
g_autoptr (GString) string = NULL;
GDateTime *end_dt;
GDateTime *start_dt;
gboolean show_hours;
gboolean multiday;
gboolean all_day;
......@@ -364,8 +364,16 @@ update_date_time_label (GcalEventPopover *self)
multiday = gcal_event_is_multiday (self->event);
show_hours = !all_day;
end_dt = gcal_event_get_date_end (self->event);
start_dt = gcal_event_get_date_start (self->event);
if (all_day)
{
start_dt = g_date_time_ref (gcal_event_get_date_start (self->event));
end_dt = g_date_time_ref (gcal_event_get_date_end (self->event));
}
else
{
start_dt = g_date_time_to_local (gcal_event_get_date_start (self->event));
end_dt = g_date_time_to_local (gcal_event_get_date_end (self->event));
}
if (multiday)
{
......
......@@ -29,6 +29,13 @@
#include <glib/gi18n.h>
typedef struct
{
ECalClient *client;
GSList *components;
GSList *zones;
} ImportData;
struct _GcalImportDialog
{
HdyWindow parent;
......@@ -84,6 +91,20 @@ static GParamSpec *properties [N_PROPS];
* Auxiliary methods
*/
static void
import_data_free (gpointer data)
{
ImportData *import_data = data;
if (!import_data)
return;
g_clear_object (&import_data->client);
g_slist_free_full (import_data->components, g_object_unref);
g_slist_free_full (import_data->zones, g_object_unref);
g_free (import_data);
}
static GtkWidget*
create_calendar_row (GcalManager *manager,
GcalCalendar *calendar)
......@@ -252,7 +273,7 @@ on_events_created_cb (GObject *source_object,
self = GCAL_IMPORT_DIALOG (user_data);
e_cal_client_create_objects_finish (E_CAL_CLIENT (source_object), result, NULL, &error);
g_task_propagate_boolean (G_TASK (result), &error);
if (error)
g_warning ("Error creating events: %s", error->message);
......@@ -281,14 +302,54 @@ on_cancel_button_clicked_cb (GtkButton *button,
gtk_widget_destroy (GTK_WIDGET (self));
}
static void
import_data_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
{
ImportData *id = task_data;
GError *error = NULL;
GSList *uids = NULL;
GSList *l = NULL;
for (l = id->zones; l && !g_cancellable_is_cancelled (cancellable); l = l->next)
{
g_autoptr (GError) local_error = NULL;
ICalTimezone *zone = l->data;
e_cal_client_add_timezone_sync (id->client, zone, cancellable, &local_error);
if (local_error)
g_warning ("Import: Failed to add timezone: %s", local_error->message);
}
e_cal_client_create_objects_sync (id->client,
id->components,
E_CAL_OPERATION_FLAG_NONE,
&uids,
cancellable,
&error);
g_slist_free_full (uids, g_free);
if (error)
g_task_return_error (task, error);
else
g_task_return_boolean (task, TRUE);
}
static void
on_import_button_clicked_cb (GtkButton *button,
GcalImportDialog *self)
{
g_autoptr (GList) children = NULL;
g_autoptr (GTask) task = NULL;
GcalCalendar *calendar;
ImportData *import_data;
ECalClient *client;
GSList *slist;
GSList *slist = NULL;
GSList *zones = NULL;
GList *l;
GCAL_ENTRY;
......@@ -302,6 +363,7 @@ on_import_button_clicked_cb (GtkButton *button,
{
GcalImportFileRow *row = l->data;
GPtrArray *ical_components;
GPtrArray *ical_timezones;
guint i;
ical_components = gcal_import_file_row_get_ical_components (row);
......@@ -309,7 +371,20 @@ on_import_button_clicked_cb (GtkButton *button,
continue;
for (i = 0; i < ical_components->len; i++)
slist = g_slist_prepend (slist, g_ptr_array_index (ical_components, i));
{
ICalComponent *comp = g_ptr_array_index (ical_components, i);
slist = g_slist_prepend (slist, g_object_ref (comp));
}
ical_timezones = gcal_import_file_row_get_timezones (row);
if (!ical_timezones)
continue;
for (i = 0; i < ical_timezones->len; i++)
{
ICalTimezone *zone = g_ptr_array_index (ical_timezones, i);
zones = g_slist_prepend (zones, g_object_ref (zone));
}
}
if (!slist)
......@@ -320,12 +395,16 @@ on_import_button_clicked_cb (GtkButton *button,
gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
client = gcal_calendar_get_client (calendar);
e_cal_client_create_objects (client,
slist,
E_CAL_OPERATION_FLAG_NONE,
self->cancellable,
on_events_created_cb,
self);
import_data = g_new0 (ImportData, 1);
import_data->client = g_object_ref (client);
import_data->components = g_slist_reverse (slist);
import_data->zones = g_slist_reverse (zones);
task = g_task_new (NULL, self->cancellable, on_events_created_cb, self);
g_task_set_task_data (task, import_data, import_data_free);
g_task_set_source_tag (task, on_import_button_clicked_cb);
g_task_run_in_thread (task, import_data_thread);
GCAL_EXIT;
}
......
......@@ -38,6 +38,7 @@ struct _GcalImportFileRow
GCancellable *cancellable;
GFile *file;
GPtrArray *ical_components;
GPtrArray *ical_timezones;
};
static void read_calendar_finished_cb (GObject *source_object,
......@@ -212,6 +213,37 @@ filter_event_components (ICalComponent *component)
return g_steal_pointer (&event_components);
}
static GPtrArray*
filter_timezones (ICalComponent *component)
{
g_autoptr (GPtrArray) timezones = NULL;
ICalComponent *aux;
if (!component || i_cal_component_isa (component) != I_CAL_VCALENDAR_COMPONENT)
return NULL;
timezones = g_ptr_array_new_full (2, g_object_unref);
for (aux = i_cal_component_get_first_component (component, I_CAL_VTIMEZONE_COMPONENT);
aux;
aux = i_cal_component_get_next_component (component, I_CAL_VTIMEZONE_COMPONENT))
{
ICalTimezone *zone = i_cal_timezone_new ();
ICalComponent *clone = i_cal_component_clone (aux);
if (i_cal_timezone_set_component (zone, clone))
g_ptr_array_add (timezones, g_steal_pointer (&zone));
g_clear_object (&clone);
g_clear_object (&zone);
g_clear_object (&aux);
}
if (!timezones->len)
return NULL;
return g_steal_pointer (&timezones);
}
static void
setup_file (GcalImportFileRow *self)
{
......@@ -237,6 +269,7 @@ read_calendar_finished_cb (GObject *source_object,
gpointer user_data)
{
g_autoptr (GPtrArray) event_components = NULL;
g_autoptr (GPtrArray) timezones = NULL;
g_autoptr (GError) error = NULL;
g_autofree gchar *subtitle = NULL;
ICalComponent *component;
......@@ -245,6 +278,7 @@ read_calendar_finished_cb (GObject *source_object,
self = GCAL_IMPORT_FILE_ROW (user_data);
component = gcal_importer_import_file_finish (res, &error);
event_components = filter_event_components (component);
timezones = filter_timezones (component);
gtk_widget_set_sensitive (GTK_WIDGET (self), !error && event_components && event_components->len > 0);
......@@ -254,6 +288,7 @@ read_calendar_finished_cb (GObject *source_object,
add_events_to_listbox (self, event_components);
self->ical_components = g_ptr_array_ref (event_components);
self->ical_timezones = g_ptr_array_ref (timezones);
g_signal_emit (self, signals[FILE_LOADED], 0, event_components);
}
......@@ -272,6 +307,7 @@ gcal_import_file_row_finalize (GObject *object)
g_clear_object (&self->cancellable);
g_clear_object (&self->file);
g_clear_pointer (&self->ical_components, g_ptr_array_unref);
g_clear_pointer (&self->ical_timezones, g_ptr_array_unref);
G_OBJECT_CLASS (gcal_import_file_row_parent_class)->finalize (object);
}
......@@ -386,3 +422,11 @@ gcal_import_file_row_get_ical_components (GcalImportFileRow *self)
return self->ical_components;
}
GPtrArray*
gcal_import_file_row_get_timezones (GcalImportFileRow *self)
{
g_return_val_if_fail (GCAL_IS_IMPORT_FILE_ROW (self), NULL);
return self->ical_timezones;
}
......@@ -33,5 +33,6 @@ GtkWidget* gcal_import_file_row_new (GFile
void gcal_import_file_row_show_filename (GcalImportFileRow *self);
GPtrArray* gcal_import_file_row_get_ical_components (GcalImportFileRow *self);
GPtrArray* gcal_import_file_row_get_timezones (GcalImportFileRow *self);
G_END_DECLS