void sipe_cal_calendar_free(struct sipe_calendar *cal) { if (cal) { g_free(cal->email); g_free(cal->legacy_dn); g_free(cal->as_url); g_free(cal->oof_url); g_free(cal->oab_url); g_free(cal->domino_url); g_free(cal->oof_state); g_free(cal->oof_note); g_free(cal->free_busy); g_free(cal->working_hours_xml_str); sipe_cal_events_free(cal->cal_events); if (cal->request) sipe_http_request_cancel(cal->request); sipe_http_session_close(cal->session); g_free(cal); } }
static void sipe_ews_process_avail_response(int return_code, const char *body, SIPE_UNUSED_PARAMETER const char *content_type, HttpConn *conn, void *data) { struct sipe_calendar *cal = data; SIPE_DEBUG_INFO_NOFORMAT("sipe_ews_process_avail_response: cb started."); if(!sipe_strequal(cal->as_url, cal->oof_url)) { /* whether reuse conn */ http_conn_set_close(conn); cal->http_conn = NULL; } if (return_code == 200 && body) { const sipe_xml *node; const sipe_xml *resp; /** ref: [MS-OXWAVLS] */ sipe_xml *xml = sipe_xml_parse(body, strlen(body)); /* Envelope/Body/GetUserAvailabilityResponse/FreeBusyResponseArray/FreeBusyResponse/ResponseMessage@ResponseClass="Success" Envelope/Body/GetUserAvailabilityResponse/FreeBusyResponseArray/FreeBusyResponse/FreeBusyView/MergedFreeBusy Envelope/Body/GetUserAvailabilityResponse/FreeBusyResponseArray/FreeBusyResponse/FreeBusyView/CalendarEventArray/CalendarEvent Envelope/Body/GetUserAvailabilityResponse/FreeBusyResponseArray/FreeBusyResponse/FreeBusyView/WorkingHours */ resp = sipe_xml_child(xml, "Body/GetUserAvailabilityResponse/FreeBusyResponseArray/FreeBusyResponse"); if (!resp) return; /* rather soap:Fault */ if (!sipe_strequal(sipe_xml_attribute(sipe_xml_child(resp, "ResponseMessage"), "ResponseClass"), "Success")) { return; /* Error response */ } /* MergedFreeBusy */ g_free(cal->free_busy); cal->free_busy = sipe_xml_data(sipe_xml_child(resp, "FreeBusyView/MergedFreeBusy")); /* WorkingHours */ node = sipe_xml_child(resp, "FreeBusyView/WorkingHours"); g_free(cal->working_hours_xml_str); cal->working_hours_xml_str = sipe_xml_stringify(node); SIPE_DEBUG_INFO("sipe_ews_process_avail_response: cal->working_hours_xml_str:\n%s", cal->working_hours_xml_str ? cal->working_hours_xml_str : ""); sipe_cal_events_free(cal->cal_events); cal->cal_events = NULL; /* CalendarEvents */ for (node = sipe_xml_child(resp, "FreeBusyView/CalendarEventArray/CalendarEvent"); node; node = sipe_xml_twin(node)) { char *tmp; /* <CalendarEvent> <StartTime>2009-12-07T13:30:00</StartTime> <EndTime>2009-12-07T14:30:00</EndTime> <BusyType>Busy</BusyType> <CalendarEventDetails> <ID>0000000...</ID> <Subject>Lunch</Subject> <Location>Cafe</Location> <IsMeeting>false</IsMeeting> <IsRecurring>true</IsRecurring> <IsException>false</IsException> <IsReminderSet>true</IsReminderSet> <IsPrivate>false</IsPrivate> </CalendarEventDetails> </CalendarEvent> */ struct sipe_cal_event *cal_event = g_new0(struct sipe_cal_event, 1); cal->cal_events = g_slist_append(cal->cal_events, cal_event); tmp = sipe_xml_data(sipe_xml_child(node, "StartTime")); cal_event->start_time = sipe_utils_str_to_time(tmp); g_free(tmp); tmp = sipe_xml_data(sipe_xml_child(node, "EndTime")); cal_event->end_time = sipe_utils_str_to_time(tmp); g_free(tmp); tmp = sipe_xml_data(sipe_xml_child(node, "BusyType")); if (sipe_strequal("Free", tmp)) { cal_event->cal_status = SIPE_CAL_FREE; } else if (sipe_strequal("Tentative", tmp)) { cal_event->cal_status = SIPE_CAL_TENTATIVE; } else if (sipe_strequal("Busy", tmp)) { cal_event->cal_status = SIPE_CAL_BUSY; } else if (sipe_strequal("OOF", tmp)) { cal_event->cal_status = SIPE_CAL_OOF; } else { cal_event->cal_status = SIPE_CAL_NO_DATA; } g_free(tmp); cal_event->subject = sipe_xml_data(sipe_xml_child(node, "CalendarEventDetails/Subject")); cal_event->location = sipe_xml_data(sipe_xml_child(node, "CalendarEventDetails/Location")); tmp = sipe_xml_data(sipe_xml_child(node, "CalendarEventDetails/IsMeeting")); cal_event->is_meeting = tmp ? sipe_strequal(tmp, "true") : TRUE; g_free(tmp); } sipe_xml_free(xml); cal->state = SIPE_EWS_STATE_AVAILABILITY_SUCCESS; sipe_ews_run_state_machine(cal); } else { if (return_code < 0) {
static void sipe_domino_process_calendar_response(int return_code, const char *body, const char *content_type, HttpConn *conn, void *data) { struct sipe_calendar *cal = data; SIPE_DEBUG_INFO_NOFORMAT("sipe_domino_process_calendar_response: cb started."); http_conn_set_close(conn); cal->http_conn = NULL; if (content_type && !g_str_has_prefix(content_type, "text/xml")) { cal->is_domino_disabled = TRUE; SIPE_DEBUG_INFO_NOFORMAT("sipe_domino_process_calendar_response: not XML, disabling."); return; } if (return_code == 200 && body) { const sipe_xml *node, *node2, *node3; sipe_xml *xml; SIPE_DEBUG_INFO("sipe_domino_process_calendar_response: SUCCESS, ret=%d", return_code); xml = sipe_xml_parse(body, strlen(body)); sipe_cal_events_free(cal->cal_events); cal->cal_events = NULL; /* viewentry */ for (node = sipe_xml_child(xml, "viewentry"); node; node = sipe_xml_twin(node)) { struct sipe_cal_event *cal_event = g_new0(struct sipe_cal_event, 1); cal->cal_events = g_slist_append(cal->cal_events, cal_event); cal_event->cal_status = SIPE_CAL_BUSY; cal_event->is_meeting = TRUE; /* SIPE_DEBUG_INFO("viewentry unid=%s", sipe_xml_attribute(node, "unid")); */ /* entrydata */ for (node2 = sipe_xml_child(node, "entrydata"); node2; node2 = sipe_xml_twin(node2)) { const char *name = sipe_xml_attribute(node2, "name"); SIPE_DEBUG_INFO("\tentrydata name=%s", name); if (sipe_strequal(name, VIEWENTITY_START0_TIME) || sipe_strequal(name, VIEWENTITY_START_TIME) || sipe_strequal(name, VIEWENTITY_END_TIME)) { char *tmp = sipe_xml_data(sipe_xml_child(node2, "datetime")); time_t time_val = sipe_utils_str_to_time(tmp); if (sipe_strequal(name, VIEWENTITY_START_TIME)) { cal_event->start_time = time_val; } else if (sipe_strequal(name, VIEWENTITY_END_TIME)) { cal_event->end_time = time_val; } SIPE_DEBUG_INFO("\t\tdatetime=%s", asctime(gmtime(&time_val))); g_free(tmp); } else if (sipe_strequal(name, VIEWENTITY_TEXT_LIST)) { int i = 0; /* test */ for (node3 = sipe_xml_child(node2, "textlist/text"); node3; node3 = sipe_xml_twin(node3)) { char *tmp = sipe_xml_data(node3); if (!tmp) continue; SIPE_DEBUG_INFO("\t\ttext=%s", tmp); if (i == 0) { cal_event->subject = g_strdup(tmp); SIPE_DEBUG_INFO("\t\t*Subj.=%s", tmp); } else { /* plain English, don't localize! */ if (!g_ascii_strncasecmp(tmp, "Location:", 9)) { if (strlen(tmp) > 9) { cal_event->location = g_strdup(g_strstrip(tmp+9)); SIPE_DEBUG_INFO("\t\t*Loc.=%s", cal_event->location); } /* Translators: (!) should be as in localized Lotus Notes to be able to extract meeting location */ } else if (g_str_has_prefix(tmp, _("Location:"))) { guint len = strlen(_("Location:")); if (strlen(tmp) > len) { cal_event->location = g_strdup(g_strstrip(tmp+len)); SIPE_DEBUG_INFO("\t\t*Loc.=%s", cal_event->location); } } } i++; g_free(tmp); } } } } sipe_xml_free(xml); /* creates FreeBusy from cal->cal_events */ g_free(cal->free_busy); cal->free_busy = sipe_domino_get_free_busy(cal->fb_start, cal->cal_events); /* update SIP server */ cal->is_updated = TRUE; if (cal->sip->ocs2007) { /* sipe.h */ publish_calendar_status_self(cal->sip->private, NULL); } else {