/** * Entry point for scheduling on DELETE, for which there are thee outcomes: * - We don't do scheduling (disabled, no organizer, ...) * - We are an ATTENDEE declining the meeting. * - We are the ORGANIZER canceling the meeting. * * @param DAVResource $deleted_resource The resource which has already been deleted */ function do_scheduling_for_delete(DAVResource $deleted_resource) { // By the time we arrive here the resource *has* actually been deleted from disk // we can only fail to (de-)schedule the activity... global $request, $c; if (!isset($request) || isset($c->enable_auto_schedule) && !$c->enable_auto_schedule) { return true; } if ($deleted_resource->IsInSchedulingCollection()) { return true; } $caldav_data = $deleted_resource->GetProperty('dav-data'); if (empty($caldav_data)) { return true; } $vcal = new vCalendar($caldav_data); $organizer = $vcal->GetOrganizer(); if ($organizer === false || empty($organizer)) { dbg_error_log('schedule', 'Event has no organizer - no scheduling required.'); return true; } if ($vcal->GetScheduleAgent() != 'SERVER') { dbg_error_log('schedule', 'SCHEDULE-AGENT=%s - no scheduling required.', $vcal->GetScheduleAgent()); return true; } $organizer_email = preg_replace('/^mailto:/i', '', $organizer->Value()); if ($request->principal->email() == $organizer_email) { return doItipOrganizerCancel($vcal); } else { if (isset($_SERVER['HTTP_SCHEDULE_REPLY']) && $_SERVER['HTTP_SCHEDULE_REPLY'] == 'F') { dbg_error_log('schedule', 'Schedule-Reply header set to "F" - no scheduling required.'); return true; } return doItipAttendeeReply($vcal, 'DECLINED', $request->principal->email()); } }