/** * e2k_freebusy_add_from_calendar_uri: * @fb: an #E2kFreebusy * @uri: the URI of a calendar folder * @start_tt: start of the range to add * @end_tt: end of the range to add * * This queries the server for events between @start_tt and @end_tt in * the calendar at @uri (which the caller must have permission to * read) and adds them @fb. Any previously-existing events during that * range are removed. * * Return value: an HTTP status code. **/ E2kHTTPStatus e2k_freebusy_add_from_calendar_uri (E2kFreebusy *fb, const char *uri, time_t start_tt, time_t end_tt) { char *start, *end, *busystatus; E2kBusyStatus busy; E2kRestriction *rn; E2kResultIter *iter; E2kResult *result; e2k_freebusy_clear_interval (fb, start_tt, end_tt); start = e2k_make_timestamp (start_tt); end = e2k_make_timestamp (end_tt); rn = e2k_restriction_andv ( e2k_restriction_prop_string (E2K_PR_DAV_CONTENT_CLASS, E2K_RELOP_EQ, "urn:content-classes:appointment"), e2k_restriction_prop_date (E2K_PR_CALENDAR_DTEND, E2K_RELOP_GT, start), e2k_restriction_prop_date (E2K_PR_CALENDAR_DTSTART, E2K_RELOP_LT, end), e2k_restriction_prop_string (E2K_PR_CALENDAR_BUSY_STATUS, E2K_RELOP_NE, "FREE"), NULL); iter = e2k_context_search_start (fb->ctx, NULL, uri, freebusy_props, n_freebusy_props, rn, NULL, TRUE); e2k_restriction_unref (rn); g_free (start); g_free (end); while ((result = e2k_result_iter_next (iter))) { start = e2k_properties_get_prop (result->props, E2K_PR_CALENDAR_DTSTART); end = e2k_properties_get_prop (result->props, E2K_PR_CALENDAR_DTEND); busystatus = e2k_properties_get_prop (result->props, E2K_PR_CALENDAR_BUSY_STATUS); if (!start || !end || !busystatus) continue; if (!strcmp (busystatus, "TENTATIVE")) busy = E2K_BUSYSTATUS_TENTATIVE; else if (!strcmp (busystatus, "OUTOFOFFICE")) busy = E2K_BUSYSTATUS_OOF; else busy = E2K_BUSYSTATUS_BUSY; e2k_freebusy_add_interval (fb, busy, e2k_parse_timestamp (start), e2k_parse_timestamp (end)); } return e2k_result_iter_free (iter); }
/** * e2k_freebusy_save: * @fb: an #E2kFreebusy * * Saves the data in @fb back to the server. * * Return value: a libsoup or HTTP status code **/ E2kHTTPStatus e2k_freebusy_save (E2kFreebusy *fb) { E2kProperties *props; char *timestamp; E2kHTTPStatus status; props = e2k_properties_new (); e2k_properties_set_string (props, E2K_PR_EXCHANGE_MESSAGE_CLASS, g_strdup ("IPM.Post")); e2k_properties_set_int (props, PR_FREEBUSY_START_RANGE, fb->start); e2k_properties_set_int (props, PR_FREEBUSY_END_RANGE, fb->end); e2k_properties_set_string (props, PR_FREEBUSY_EMAIL_ADDRESS, g_strdup (fb->dn)); add_events (fb->events[E2K_BUSYSTATUS_ALL], props, PR_FREEBUSY_ALL_MONTHS, PR_FREEBUSY_ALL_EVENTS); add_events (fb->events[E2K_BUSYSTATUS_TENTATIVE], props, PR_FREEBUSY_TENTATIVE_MONTHS, PR_FREEBUSY_TENTATIVE_EVENTS); add_events (fb->events[E2K_BUSYSTATUS_BUSY], props, PR_FREEBUSY_BUSY_MONTHS, PR_FREEBUSY_BUSY_EVENTS); add_events (fb->events[E2K_BUSYSTATUS_OOF], props, PR_FREEBUSY_OOF_MONTHS, PR_FREEBUSY_OOF_EVENTS); timestamp = e2k_make_timestamp (e2k_context_get_last_timestamp (fb->ctx)); e2k_properties_set_date (props, PR_FREEBUSY_LAST_MODIFIED, timestamp); status = e2k_context_proppatch (fb->ctx, NULL, fb->uri, props, TRUE, NULL); e2k_properties_free (props); return status; }
/** * e2k_timestamp_from_icaltime: * @itt: an #icaltimetype * * Converts @itt to an Exchange timestamp string * * Return value: the timestamp, which the caller must free. **/ gchar * e2k_timestamp_from_icaltime (struct icaltimetype itt) { return e2k_make_timestamp (icaltime_as_timet_with_zone (itt, itt.zone)); }