diff -up evolution-mapi-3.12.10/src/libexchangemapi/e-mapi-cal-utils.c.freebusy-time-calc evolution-mapi-3.12.10/src/libexchangemapi/e-mapi-cal-utils.c --- evolution-mapi-3.12.10/src/libexchangemapi/e-mapi-cal-utils.c.freebusy-time-calc 2014-04-28 11:05:45.000000000 +0200 +++ evolution-mapi-3.12.10/src/libexchangemapi/e-mapi-cal-utils.c 2016-08-16 16:15:04.577028840 +0200 @@ -453,7 +453,6 @@ populate_freebusy_data (struct Binary_r uint16_t event_start; uint16_t event_end; uint32_t i; - uint32_t hour; uint32_t day; const gchar *month_name; uint32_t minutes; @@ -478,57 +477,47 @@ populate_freebusy_data (struct Binary_r event_start = (bin->lpb[i + 1] << 8) | bin->lpb[i]; event_end = (bin->lpb[i + 3] << 8) | bin->lpb[i + 2]; - for (hour = 0; hour < 24; hour++) { - if (!(((event_start - (60 * hour)) % 1440) && (((event_start - (60 * hour)) % 1440) - 30))) { - struct icalperiodtype ipt; - icalproperty *icalprop; - icaltimetype itt; - - day = ((event_start - (60 * hour)) / 1440) + 1; - minutes = (event_start - (60 * hour)) % 1440; - real_month = month - (year * 16); - - date_string = g_strdup_printf ("%.2u-%.2u-%.2u", year, real_month, day); - start = g_strdup_printf ("%sT%.2u:%.2u:00Z", date_string, hour + daylight, minutes); - g_free (date_string); - - day = ((event_end - (60 * hour)) / 1440) + 1; - minutes = (event_end - (60 * hour)) % 1440; - - if (minutes >= 60) { - hour += minutes / 60; - minutes %= 60; - } - - date_string = g_strdup_printf ("%.2u-%.2u-%.2u", year, real_month, day); - end = g_strdup_printf ("%sT%.2u:%.2u:00Z", date_string, hour + daylight, minutes); - g_free (date_string); - - start_date = mapi_get_date_from_string (start); - end_date = mapi_get_date_from_string (end); - - memset (&ipt, 0, sizeof (struct icalperiodtype)); - - itt = icaltime_from_timet_with_zone (start_date, 0, icaltimezone_get_utc_timezone ()); - ipt.start = itt; - - itt = icaltime_from_timet_with_zone (end_date, 0, icaltimezone_get_utc_timezone ()); - ipt.end = itt; - - icalcomp = e_cal_component_get_icalcomponent (comp); - icalprop = icalproperty_new_freebusy (ipt); - - if (!strcmp (accept_type, "Busy")) - icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY"); - else if (!strcmp (accept_type, "Tentative")) - icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY-TENTATIVE"); - else if (!strcmp (accept_type, "OutOfOffice")) - icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY-UNAVAILABLE"); - - icalcomponent_add_property(icalcomp, icalprop); - g_free (start); - g_free (end); - } + if (event_start <= event_end) { + struct icalperiodtype ipt; + icalproperty *icalprop; + icaltimetype itt; + + day = 1; + minutes = 0; + real_month = month - (year * 16); + + date_string = g_strdup_printf ("%.2u-%.2u-%.2u", year, real_month, day); + start = g_strdup_printf ("%sT%.2u:%.2u:00Z", date_string, 0, minutes); + g_free (date_string); + + date_string = g_strdup_printf ("%.2u-%.2u-%.2u", year, real_month, day); + end = g_strdup_printf ("%sT%.2u:%.2u:00Z", date_string, 0, minutes); + g_free (date_string); + + start_date = mapi_get_date_from_string (start) + (60 * event_start); + end_date = mapi_get_date_from_string (end) + (60 * event_end); + + memset (&ipt, 0, sizeof (struct icalperiodtype)); + + itt = icaltime_from_timet_with_zone (start_date, 0, icaltimezone_get_utc_timezone ()); + ipt.start = itt; + + itt = icaltime_from_timet_with_zone (end_date, 0, icaltimezone_get_utc_timezone ()); + ipt.end = itt; + + icalcomp = e_cal_component_get_icalcomponent (comp); + icalprop = icalproperty_new_freebusy (ipt); + + if (!strcmp (accept_type, "Busy")) + icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY"); + else if (!strcmp (accept_type, "Tentative")) + icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY-TENTATIVE"); + else if (!strcmp (accept_type, "OutOfOffice")) + icalproperty_set_parameter_from_string (icalprop, "FBTYPE", "BUSY-UNAVAILABLE"); + + icalcomponent_add_property(icalcomp, icalprop); + g_free (start); + g_free (end); } } }