events: fix handling of event with no end date
Fix the sigsegv in edit-dialog and event-widgets when there's no end-date set. Set a guard in Utils::gcal_dup_icaltime function. There's still some problems with the events showing the first time but not anymore. Bug: https://bugzilla.gnome.org/show_bug.cgi?id=736002
This commit is contained in:
+22
-22
@@ -861,40 +861,40 @@ gcal_edit_dialog_set_event_data (GcalEditDialog *dialog,
|
|||||||
dtstart.value->month,
|
dtstart.value->month,
|
||||||
dtstart.value->year);
|
dtstart.value->year);
|
||||||
|
|
||||||
/* end date */
|
|
||||||
e_cal_component_get_dtend (priv->component, &dtend);
|
|
||||||
|
|
||||||
gcal_date_entry_set_date (GCAL_DATE_ENTRY (priv->end_date_entry),
|
|
||||||
dtend.value->day,
|
|
||||||
dtend.value->month,
|
|
||||||
dtend.value->year);
|
|
||||||
|
|
||||||
/* all_day */
|
|
||||||
all_day = (dtstart.value->is_date == 1 && dtend.value->is_date == 1);
|
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_day_check), all_day);
|
|
||||||
|
|
||||||
/* start time */
|
/* start time */
|
||||||
if (all_day)
|
if (all_day)
|
||||||
{
|
{
|
||||||
dtstart.value->hour = 0;
|
dtstart.value->hour = 0;
|
||||||
dtstart.value->minute = 0;
|
dtstart.value->minute = 0;
|
||||||
}
|
}
|
||||||
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->start_time_entry),
|
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->start_time_entry), dtstart.value->hour, dtstart.value->minute);
|
||||||
dtstart.value->hour,
|
|
||||||
dtstart.value->minute);
|
/* end date */
|
||||||
/* end time */
|
e_cal_component_get_dtend (priv->component, &dtend);
|
||||||
if (all_day)
|
if (dtend.value != NULL)
|
||||||
{
|
{
|
||||||
dtend.value->hour = 0;
|
gcal_date_entry_set_date (GCAL_DATE_ENTRY (priv->end_date_entry),
|
||||||
dtend.value->minute = 0;
|
dtend.value->day, dtend.value->month, dtend.value->year);
|
||||||
|
all_day = (dtstart.value->is_date == 1 && dtend.value->is_date == 1);
|
||||||
|
|
||||||
|
if (!all_day)
|
||||||
|
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry), dtend.value->hour, dtend.value->minute);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gcal_date_entry_set_date (GCAL_DATE_ENTRY (priv->end_date_entry),
|
||||||
|
dtstart.value->day, dtstart.value->month, dtstart.value->year);
|
||||||
|
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry), dtstart.value->hour, dtstart.value->minute);
|
||||||
|
all_day = FALSE;
|
||||||
}
|
}
|
||||||
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry),
|
|
||||||
dtend.value->hour,
|
|
||||||
dtend.value->minute);
|
|
||||||
|
|
||||||
e_cal_component_free_datetime (&dtstart);
|
e_cal_component_free_datetime (&dtstart);
|
||||||
e_cal_component_free_datetime (&dtend);
|
e_cal_component_free_datetime (&dtend);
|
||||||
|
|
||||||
|
/* all_day */
|
||||||
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_day_check), all_day);
|
||||||
|
|
||||||
|
|
||||||
/* location */
|
/* location */
|
||||||
e_cal_component_get_location (priv->component, &const_text);
|
e_cal_component_get_location (priv->component, &const_text);
|
||||||
gtk_entry_set_text (GTK_ENTRY (priv->location_entry),
|
gtk_entry_set_text (GTK_ENTRY (priv->location_entry),
|
||||||
|
|||||||
+16
-12
@@ -796,20 +796,23 @@ gcal_event_widget_new_from_data (GcalEventData *data)
|
|||||||
|
|
||||||
/* end date */
|
/* end date */
|
||||||
e_cal_component_get_dtend (priv->component, &dt);
|
e_cal_component_get_dtend (priv->component, &dt);
|
||||||
date = gcal_dup_icaltime (dt.value);
|
if (dt.value != NULL)
|
||||||
|
{
|
||||||
|
date = gcal_dup_icaltime (dt.value);
|
||||||
|
|
||||||
/* FIXME: fix the timezone issue */
|
/* FIXME: fix the timezone issue */
|
||||||
/* if (date->is_date != 1) */
|
/* if (date->is_date != 1) */
|
||||||
/* *date = icaltime_convert_to_zone (*(dt.value), */
|
/* *date = icaltime_convert_to_zone (*(dt.value), */
|
||||||
/* priv->system_timezone); */
|
/* priv->system_timezone); */
|
||||||
end_is_date = date->is_date == 1;
|
end_is_date = date->is_date == 1;
|
||||||
|
|
||||||
gcal_event_widget_set_end_date (event, date);
|
gcal_event_widget_set_end_date (event, date);
|
||||||
e_cal_component_free_datetime (&dt);
|
e_cal_component_free_datetime (&dt);
|
||||||
g_free (date);
|
g_free (date);
|
||||||
|
|
||||||
/* set_all_day */
|
/* set_all_day */
|
||||||
gcal_event_widget_set_all_day (event, start_is_date && end_is_date);
|
gcal_event_widget_set_all_day (event, start_is_date && end_is_date);
|
||||||
|
}
|
||||||
|
|
||||||
/* set_has_reminders */
|
/* set_has_reminders */
|
||||||
gcal_event_widget_set_has_reminders (
|
gcal_event_widget_set_has_reminders (
|
||||||
@@ -900,7 +903,8 @@ gcal_event_widget_set_end_date (GcalEventWidget *event,
|
|||||||
* gcal_event_widget_get_end_date:
|
* gcal_event_widget_get_end_date:
|
||||||
* @event: a #GcalEventWidget
|
* @event: a #GcalEventWidget
|
||||||
*
|
*
|
||||||
* Return the end date of the event
|
* Return the end date of the event. If the event has no end_date
|
||||||
|
* (as Google does on 0 sec events) %NULL will be returned
|
||||||
*
|
*
|
||||||
* Returns: (transfer full): Release with g_free()
|
* Returns: (transfer full): Release with g_free()
|
||||||
**/
|
**/
|
||||||
|
|||||||
@@ -128,6 +128,9 @@ gcal_dup_icaltime (const icaltimetype *date)
|
|||||||
{
|
{
|
||||||
icaltimetype *new_date;
|
icaltimetype *new_date;
|
||||||
|
|
||||||
|
if (date == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
new_date= g_new (icaltimetype, 1);
|
new_date= g_new (icaltimetype, 1);
|
||||||
new_date->year = date->year;
|
new_date->year = date->year;
|
||||||
new_date->month = date->month;
|
new_date->month = date->month;
|
||||||
|
|||||||
Reference in New Issue
Block a user