* * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ define('FOLD_LENGTH', 75); define('VEVENT', 1); define('VTODO', 2); define('NONE', 0); define('CHAIR', 1); define('REQ_PARTICIPANT', 2); define('OPT_PARTICIPANT', 3); define('NON_PARTICIPANT', 4); define('INDIVIDUAL', 1); define('GROUP', 2); define('RESOURCE', 4); define('ROOM', 8); define('UNKNOWN', 16); define('NEEDS_ACTION', 0); define('ACCEPTED', 1); define('DECLINED', 2); define('TENTATIVE', 3); define('DELEGATED', 4); define('COMPLETED', 5); define('IN_PROCESS', 6); /* * Class */ define('_PRIVATE', 0); define('_PUBLIC', 1); define('_CONFIDENTIAL', 3); /* * Transparency */ define('TRANSPARENT', 0); define('OPAQUE', 1); /* * Frequency */ define('SECONDLY', 1); define('MINUTELY', 2); define('HOURLY', 3); define('DAILY', 4); define('WEEKLY', 5); define('MONTHLY', 6); define('YEARLY', 7); define('FREE', 0); define('BUSY', 1); define('BUSY_UNAVAILABLE', 2); define('BUSY_TENTATIVE', 3); define('THISANDPRIOR', 0); define('THISANDFUTURE', 1); define('START', 0); define('END', 1); define('_8BIT', 0); define('_BASE64', 1); define('OTHER', 99); class boicalendar { var $public_functions = array ( 'import' => True, 'export' => True, 'freebusy' => True, ); var $ical; var $line = 0; var $event = Array (); var $todo = Array (); var $journal = Array (); var $freebusy = Array (); var $timezone = Array (); var $property = Array (); var $parameter = Array (); var $debug_str = False; var $api = True; var $chunk_split = True; /* * Base Functions */ function boicalendar() { $this->property = Array ( 'action' => Array ( 'type' => 'text', 'to_text' => True, 'valarm' => Array ( 'state' => 'required', 'multiples' => False ) ), 'attach' => Array ( 'type' => 'uri', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'valarm' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'attendee' => Array ( 'type' => 'cal-address', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'valarm' => Array ( 'state' => 'optional', 'multiples' => True ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'categories' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'class' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'comment' => Array ( 'type' => 'text', 'to_text' => True, 'daylight' => Array ( 'state' => 'optional', 'multiples' => True ), 'standard' => Array ( 'state' => 'optional', 'multiples' => True ), 'valarm' => Array ( 'state' => 'optional', 'multiples' => True ), 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'completed' => Array ( 'type' => 'date-time', 'to_text' => False, 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'contact' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'created' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'description' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'valarm' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'dtend' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'dtstamp' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'dtstart' => Array ( 'type' => 'date-time', 'to_text' => False, 'daylight' => Array ( 'state' => 'required', 'multiples' => False ), 'standard' => Array ( 'state' => 'required', 'multiples' => False ), 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'due' => Array ( 'type' => 'date-time', 'to_text' => False, 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'duration' => Array ( 'type' => 'duration', 'to_text' => False, 'valarm' => Array ( 'state' => 'optional', 'multiples' => False ), 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'exdate' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'exrule' => Array ( 'type' => 'recur', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'freebusy' => Array ( 'type' => 'freebusy', 'to_text' => False, 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'geo' => Array ( 'type' => 'float', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'last_modified' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtimezone' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'location' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'method' => Array ( 'type' => 'text', 'to_text' => True, 'ical' => Array ( 'state' => 'required', 'multiples' => False ) ), 'organizer' => Array ( 'type' => 'cal-address', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'percent_complete' => Array ( 'type' => 'integer', 'to_text' => False, 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'priority' => Array ( 'type' => 'integer', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'prodid' => Array ( 'type' => 'text', 'to_text' => True, 'ical' => Array ( 'state' => 'required', 'multiples' => False ) ), 'rdate' => Array ( 'type' => 'date-time', 'to_text' => False, 'daylight' => Array ( 'state' => 'optional', 'multiples' => True ), 'standard' => Array ( 'state' => 'optional', 'multiples' => True ), 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'recurrence_id' => Array ( 'type' => 'date-time', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'related_to' => Array ( 'type' => 'text', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'request_status' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ), 'vfreebusy' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'resources' => Array ( 'type' => 'text', 'to_text' => False, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'rrule' => Array ( 'type' => 'recur', 'to_text' => False, 'daylight' => Array ( 'state' => 'optional', 'multiples' => True ), 'standard' => Array ( 'state' => 'optional', 'multiples' => True ), 'vevent' => Array ( 'state' => 'optional', 'multiples' => True ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => True ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'sequence' => Array ( 'type' => 'integer', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'status' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'summary' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'optional', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'valarm' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'transp' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'trigger' => Array ( 'type' => 'text', 'to_text' => True, 'valarm' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'tzid' => Array ( 'type' => 'text', 'to_text' => True, 'vtimezone' => Array ( 'state' => 'required', 'multiples' => False ) ), 'tzname' => Array ( 'type' => 'text', 'to_text' => True, 'daylight' => Array ( 'state' => 'optional', 'multiples' => True ), 'standard' => Array ( 'state' => 'optional', 'multiples' => True ) ), 'tzoffsetfrom' => Array ( 'type' => 'utc-offset', 'to_text' => True, 'daylight' => Array ( 'state' => 'required', 'multiples' => False ), 'standard' => Array ( 'state' => 'required', 'multiples' => False ) ), 'tzoffsetto' => Array ( 'type' => 'utc-offset', 'to_text' => True, 'daylight' => Array ( 'state' => 'required', 'multiples' => False ), 'standard' => Array ( 'state' => 'required', 'multiples' => False ) ), 'tzurl' => Array ( 'type' => 'uri', 'to_text' => True, 'vtimezone' => Array ( 'state' => 'optional', 'multiples' => False ) ), 'uid' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'required', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'required', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'required', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'required', 'multiples' => False ) ), 'url' => Array ( 'type' => 'text', 'to_text' => True, 'vevent' => Array ( 'state' => 'required', 'multiples' => False ), 'vfreebusy' => Array ( 'state' => 'required', 'multiples' => False ), 'vjournal' => Array ( 'state' => 'optional', 'multiples' => False ), 'vtodo' => Array ( 'state' => 'required', 'multiples' => False ) ), 'version' => Array ( 'type' => 'text', 'to_text' => True, 'ical' => Array ( 'state' => 'required', 'multiples' => False ) ) ); $this->parameter = Array ( 'altrep' => Array ( 'type' => 'uri', 'quoted' => True, 'to_text' => True, 'properties' => Array ( 'comment' => True, 'description' => True, 'location' => True, 'prodid' => True, 'resources' => True, 'summary' => True, 'contact' => True ) ), 'byday' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'byhour' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'byminute' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'bymonth' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'bymonthday' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'bysecond' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'bysetpos' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'byweekno' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'byyearday' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'class' => Array ( 'type' => 'function', 'function' => 'switch_class', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'class' => True ) ), 'cn' => Array ( 'type' => 'text', 'quoted' => True, 'to_text' => False, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'count' => Array ( 'type' => 'integer', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'cu' => Array ( 'type' => 'function', 'function' => 'switch_cu', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attendee' => True ) ), 'delegated_from' => Array ( 'type' => 'function', 'function' => 'switch_mailto', 'quoted' => True, 'to_text' => False, 'properties' => Array ( 'attendee' => True ) ), 'delegated_to' => Array ( 'type' => 'function', 'function' => 'switch_mailto', 'quoted' => True, 'to_text' => False, 'properties' => Array ( 'attendee' => True ) ), 'dir' => Array ( 'type' => 'dir', 'quoted' => True, 'to_text' => True, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'dtend' => Array ( 'type' => 'function', 'function' => 'switch_date', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'dtend' => True ) ), 'dtstamp' => Array ( 'type' => 'function', 'function' => 'switch_date', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'dtstamp' => True ) ), 'dtstart' => Array ( 'type' => 'function', 'function' => 'switch_date', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'dtstart' => True ) ), 'encoding' => Array (// was enocding ??? 'type' => 'function', 'function' => 'switch_encoding', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attach' => True ) ), 'fmttype' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attach' => True ) ), 'fbtype' => Array ( 'type' => 'function', 'function' => 'switch_fbtype', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attach' => True ) ), 'freq' => Array ( 'type' => 'function', 'function' => 'switch_freq', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'interval' => Array ( 'type' => 'integer', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'language' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'categories' => True, 'comment' => True, 'description' => True, 'location' => True, 'resources' => True, 'summary' => True, 'tzname' => True, 'attendee' => True, 'contact' => True, 'organizer' => True, 'x-type' => True ) ), 'last_modified' => Array ( 'type' => 'function', 'function' => 'switch_date', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'last_modified' => True ) ), 'mailto' => Array ( 'type' => 'function', 'function' => 'switch_mailto', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'member' => Array ( 'type' => 'function', 'function' => 'switch_mailto', 'quoted' => True, 'to_text' => False, 'properties' => Array ( 'attendee' => True ) ), 'partstat' => Array ( 'type' => 'function', 'function' => 'switch_partstat', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'range' => Array ( 'type' => 'function', 'function' => 'switch_range', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'recurrence_id' => True ) ), 'related' => Array ( 'type' => 'function', 'function' => 'switch_related', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'related_to' => True ) ), 'role' => Array ( 'type' => 'function', 'function' => 'switch_role', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'rsvp' => Array ( 'type' => 'function', 'function' => 'switch_rsvp', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'attendee' => True ) ), 'sent_by' => Array ( 'type' => 'function', 'function' => 'parse_user_host', 'quoted' => True, 'to_text' => False, 'properties' => Array ( 'attendee' => True, 'organizer' => True ) ), 'tzid' => Array ( 'type' => 'text', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'dtend' => True, 'due' => True, 'dtstart' => True, 'exdate' => True, 'rdate' => True, 'recurrence_id' => True ) ), 'until' => Array ( 'type' => 'function', 'function' => 'switch_date', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'value' => Array ( 'type' => 'value', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'calscale' => True, 'prodid' => True, 'method' => True, 'version' => True, 'attach' => True, 'categories' => True, 'class' => True, 'comment' => True, 'description' => True, 'geo' => True, 'location' => True, 'percent' => True, 'priority' => True, 'resources' => True, 'status' => True, 'summary' => True, 'completed' => True, 'dtend' => True, 'due' => True, 'dtstart' => True, 'duration' => True, 'freebusy' => True, 'transp' => True, 'tzid' => True, 'tzname' => True, 'tzoffsetfrom' => True, 'tzoffsetto' => True, 'tzurl' => True, 'attendee' => True, 'contact' => True, 'organizer' => True, 'recurrence_id' => True, 'url' => True, 'uid' => True, 'exdate' => True, 'exrule' => True, 'rdate' => True, 'rrule' => True, 'action' => True, 'repeat' => True, 'trigger' => True, 'created' => True, 'dtstamp' => True, 'last_modified' => True, 'sequence' => True, 'x_type' => True, 'request_status' => True ) ), 'wkst' => Array ( 'type' => 'string', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'rrule' => True ) ), 'x_type' => Array ( 'type' => 'x_type', 'quoted' => False, 'to_text' => False, 'properties' => Array ( 'calscale' => True, 'method' => True, 'prodid' => True, 'version' => True, 'attach' => True, 'categories' => True, 'class' => True, 'comment' => True, 'description' => True, 'geo' => True, 'location' => True, 'percent' => True, 'priority' => True, 'resources' => True, 'status' => True, 'summary' => True, 'completed' => True, 'dtend' => True, 'due' => True, 'dtstart' => True, 'duration' => True, 'freebusy' => True, 'transp' => True, 'tzid' => True, 'tzname' => True, 'tzoffsetfrom' => True, 'tzoffsetto' => True, 'tzurl' => True, 'attendee' => True, 'contact' => True, 'organizer' => True, 'recurrence_id' => True, 'url' => True, 'uid' => True, 'exdate' => True, 'exrule' => True, 'rdate' => True, 'rrule' => True, 'action' => True, 'repeat' => True, 'trigger' => True, 'created' => True, 'dtstamp' => True, 'last_modified' => True, 'sequence' => True, 'x_type' => True, 'request_status' => True ) ) ); if (!is_object($GLOBALS['phpgw']->datetime)) { $GLOBALS['phpgw']->datetime = createobject('phpgwapi.date_time'); } } function set_var(& $event, $type, $value) { $type = strtolower(str_replace('-', '_', $type)); $event[$type] = $value; /* if(is_string($value)) { $this->debug("Setting ".$type." = ".$value); } else { $this->debug("Setting ".$type." = "._debug_array($value,False)); } */ } function read_line_unfold($ical_text) { if ($this->line < count($ical_text)) { $str = str_replace(array ( "\r\n", "\r", "\n" ), '', $ical_text[$this->line]); $this->line = $this->line + 1; while (preg_match('/^[[:space:]]/', $ical_text[$this->line])) { $str .= substr(str_replace("\r\n", '', $ical_text[$this->line]), 1); $this->line = $this->line + 1; } // Corrige a codificacao dos caracteres, caso haja suporte a mesma. $str = trim($str); if (mb_detect_encoding($str, 'auto') == 'UTF-8') if ($conv = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e", "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)", $str)) $str = $conv; //$this->debug("LINE : ".$str); return $str; } else { return False; } } function fold($str) { return $this->chunk_split == True ? chunk_split($str, FOLD_LENGTH, "\r\n") : $str . "\r\n"; } function strip_quotes($str) { return str_replace('"', '', $str); } function from_text($str) { $str = str_replace("\\,", ",", $str); $str = str_replace("\\;", ";", $str); $str = str_replace("\\N", "\n", $str); $str = str_replace("\\n", "\n", $str); $str = str_replace("\\\\", "\\", $str); return "$str"; } function to_text($str) { $str = str_replace("\\", "\\\\", $str); $str = str_replace(",", "\\,", $str); $str = str_replace(";", "\\;", $str); $str = str_replace("\n", "\\n", $str); return "$str"; } function from_dir($str) { return str_replace('=3D', '=', str_replace('%20', ' ', $str)); } function to_dir($str) { return str_replace('=', '=3D', str_replace(' ', '%20', $str)); } function find_parameters($property) { static $cached_returns; if (isset ($cached_returns[$property])) { reset($cached_returns[$property]); return $cached_returns[$property]; } reset($this->parameter); while (list ($key, $param_array) = each($this->parameter)) { if ($param_array['properties'][$property]) { $param[] = $key; $this->debug('Property : ' . $property . ' = Parameter : ' . $key); } } reset($param); $cached_returns[$property] = $param; return $param; } function find_properties($ical_type) { static $cached_returns; if (isset ($cached_returns[$ical_type])) { reset($cached_returns[$ical_type]); return $cached_returns[$ical_type]; } reset($this->property); while (list ($key, $param_array) = each($this->property)) { if ($param_array[$ical_type]) { $prop[] = $key; } } reset($prop); $cached_returns[$ical_type] = $prop; return $prop; } function new_ical() { return Array (); } /* * Parse Functions */ function parse_geo(& $event, $value) { // $return_value = $this->explode_param($value,True); if (count($return_value) == 2) { $event['lat'] = $return_value[0]; $event['lon'] = $return_value[1]; } } function parse_xtype(& $event, $majortype, $value) { $temp_x_type['name'] = strtoupper(substr($majortype, 2)); $temp_x_type['value'] = $value; $event['x_type'][] = $temp_x_type; } function parse_parameters(& $event, $majortype, $value) { //$this->debug ('value: '.$value); if (!preg_match('/[\=\;]/', $value)) { $return_value[] = Array ( 'param' => $majortype, 'value' => $value ); $value = ''; } elseif (preg_match('/(.*(\:\\\\)?.*):(.*)/', $value, $temp)) { //$this->debug('Value : '._debug_array($temp,False)); //$this->debug('Param '.$majortype.' Value : '.$temp[3]); if ($temp[3]) { $return_value[] = Array ( 'param' => $majortype, 'value' => $temp[3] ); $value = str_replace(':MAILTO', '', $temp[1]); } while (preg_match('/(([A-Z\-]*)[=]([[:alnum:] \_\)\(\/\$\.\,\:\\\|\*\&\^\%\#\!\~\"\?\&\@\<\>\-]*))([\;]?)(.*)/', $value, $temp)) { //$this->debug('Value : '._debug_array($temp,False)); //$this->debug('Param '.$temp[2].' Value : '.$temp[3]); $return_value[] = Array ( 'param' => $temp[2], 'value' => $temp[3] ); $value = chop($temp[5]); //$this->debug('Value would be = '.$value); } } else { while (preg_match('/(([A-Z\-]*)[=]([[:alnum:] \_\)\(\/\$\.\,\:\\\|\*\&\^\%\#\!\~\"\?\&\@\<\>\-]*))([\;]?)(.*)/', $value, $temp)) { $this->debug('Value : ' . _debug_array($temp, False)); $this->debug('Param ' . $temp[2] . ' Value : ' . $temp[3]); $return_value[] = Array ( 'param' => $temp[2], 'value' => $temp[3] ); $value = chop($temp[5]); $this->debug('Value would be = ' . $value); } } //$this->debug('parse_parameters array return_value: '._debug_array($return_value,False)); $return_value_count = count($return_value); for ($i = 0; $i < $return_value_count; ++$i) { $name = strtolower($return_value[$i]['param']); $value = $this->strip_quotes($return_value[$i]['value']); if (substr($name, 0, 2) == 'x-') { $param = 'x_type'; $name = str_replace('-', '_', $return_value[$i]['param']); } else { $param = str_replace('-', '_', strtolower($name)); if (!isset ($this->parameter[$param]) || $majortype == 'tzid') { if ($majortype == 'attendee' || $majortype == 'organizer') { $param = 'mailto'; $name = $param; } else { $param = 'value'; } } } //$this->debug('name : '.$name.' : Param = '.$param); if (@ $this->parameter[$param]['properties'][$majortype]) { switch (@ $this->parameter[$param]['type']) { case 'dir' : $this->set_var($event, $name, $this->from_dir($value)); break; case 'text' : $this->set_var($event, $name, $value); break; case 'x_type' : $this->parse_xtype($event, $name, $value); break; case 'function' : $function = $this->parameter[$param]['function']; $this->set_var($event, $name, $this-> $function ($value)); break; case 'uri' : if (@ $this->parameter[$param]['to_text']) { $value = $this->to_text($value); } $this->set_var($event, $name, $value); break; case 'integer' : $this->set_var($event, $name, (int) $value); break; case 'value' : if (@ $this->property[$majortype]['type'] == 'date-time') { $this->set_var($event, $param, $this->switch_date($name)); } elseif ($value <> "\\n" && $value) { $this->set_var($event[$majortype], $param, $value); } $this->debug('Event : ' . _debug_array($event, False)); break; } } } } function parse_value(& $event, $majortype, $value, $mode) { $var = Array (); //$this->debug('Mode : '.$mode.' Majortype : '.$majortype); $this->parse_parameters($var, $majortype, $value); if ($this->property[$majortype][$mode]['multiples']) { //$this->debug('parse_value var array: '._debug_array($var,False)); $event[$majortype][] = $var; } else { //$this->debug('Majortype : '.$majortype); //$this->debug('Property : '.$this->property[$majortype]['type']); if ($this->property[$majortype]['type'] == 'date-time') { //$this->debug('Got a DATE-TIME type!'); $t_var = $var[$majortype]; unset ($var[$majortype]); if ($t_var) { reset($t_var); while (list ($key, $val) = each($t_var)) { $var[$key] = $val; } //$this->debug($majortype.' : '._debug_array($var,False)); } } $this->set_var($event, $majortype, $var); } } /* * Build-Card Functions */ function build_xtype($x_type, $seperator = '=') { $quote = ''; if ($seperator == '=') { $quote = '"'; } $return_value = $this->fold('X-' . $x_type['name'] . $seperator . $quote . $x_type['value'] . $quote); if ($seperator == '=') { return str_replace("\r\n", '', $return_value); } else { return $return_value; } } function build_parameters($event, $property) { $str = ''; $include_mailto = False; $include_datetime = False; $param = $this->find_parameters($property); if ($property == 'exdate') { while (list ($key, $value) = each($event)) { $exdates[] = $this->switch_date($value); } return ':' . implode($exdates, ','); } else { while (list ($dumb_key, $key) = each($param)) { if ($key == 'value') { continue; } if ($key == 'mailto') { $include_mailto = True; continue; } $param_array = @ $this->parameter[$key]; $type = @ $this->parameter[$key]['type']; if ($type == 'date-time') { $include_datetime = True; continue; } $quote = (@ $this->parameter[$key]['quoted'] ? '"' : ''); if (isset ($event[$key]) && @ $this->parameter[$key]['properties'][$property]) { $change_text = @ $this->parameter[$key]['to_text']; $value = $event[$key]; if ($change_text && $type == 'text') { $value = $this->to_text($value); } switch ($type) { case 'dir' : $str .= ';' . str_replace('_', '-', strtoupper($key)) . '=' . $quote . $this->to_dir($value) . $quote; break; case 'function' : $str .= ';' . str_replace('_', '-', strtoupper($key)) . '='; $function = $this->parameter[$key]['function']; $this->debug($key . ' Function Param : ' . $value); $str .= $quote . $this-> $function ($value) . $quote; break; case 'text' : case 'string' : $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote; break; case 'date-time' : $str .= ($key == 'until' ? ':' : ';UNTIL=') . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : ''); break; } unset ($value); } } if (!empty ($event['x_type'])) { $c_x_type = count($event['x_type']); for ($j = 0; $j < $c_x_type; ++$j) { $str .= ';' . $this->build_xtype($event['x_type'][$j], '='); } } if (!empty ($event['value'])) { if ($property == 'trigger') { $seperator = ';'; } else { $seperator = ':'; } $str .= $seperator . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']); } if ($include_mailto == True) { $key = 'mailto'; $function = $this->parameter[$key]['function']; $ret_value = $this-> $function ($event[$key]); $str .= ($ret_value ? ':' . $ret_value : ''); } if ($include_datetime == True || @ $this->property[$property]['type'] == 'date-time') { $str .= ':' . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : ''); } return ($property == 'rrule' ? ':' . substr($str, 1) : $str); } } function build_text($event, $property) { $str = ''; $param = $this->find_parameters($property); while (list ($dumb_key, $key) = each($param)) { if (!empty ($event[$key]) && $key != 'value') { $type = @ $this->parameter[$key]['type']; $quote = @ $this->parameter[$key]['quote']; if (@ $this->parameter[$key]['to_text'] == True) { $value = $this->to_text($event[$key]); } else { $value = $event[$key]; } switch ($type) { case 'text' : $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote; break; } } } if (!empty ($event['x_type'])) { $c_x_type = count($event['x_type']); for ($j = 0; $j < $c_x_type; ++$j) { $str .= ';' . $this->build_xtype($event['x_type'][$j], '='); } } if (!empty ($event['value'])) { $str .= ':' . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']); } return $str; } function build_card_internals($ical_item, $event) { $prop = $this->find_properties($ical_item); reset($prop); while (list ($dumb_key, $key) = each($prop)) { $value = $key; $varray = $this->property[$key]; $type = $varray['type']; $to_text = $varray['to_text']; $state = @ $varray[$ical_item]['state']; $multiples = @ $varray[$ical_item]['multiples']; switch ($type) { case 'date-time' : if (!empty ($event[$value])) { if ($multiples && $value != 'exdate') { $event_value_count = count($event[$value]); for ($i = 0; $i < $event_value_count; ++$i) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); } } else { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); } } elseif ($value == 'dtstamp' || $value == 'created') { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . gmdate('Ymd\THis\Z')); } break; case 'uri' : if (!empty ($event[$value])) { $event_value_count = count($event[$value]); for ($i = 0; $i < $event_value_count; ++$i) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $to_text)); } } break; case 'recur' : if (!empty ($event[$value])) { if ($multiples) { $event_value_count = count($event[$value]); for ($i = 0; $i < $event_value_count; ++$i) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); } } else { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); } } break; case 'integer' : if (!empty ($event[$value])) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]); } elseif ($value == 'sequence' || $value == 'percent_complete') { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':0'); } break; case 'function' : $str .= ';' . str_replace('_', '-', strtoupper($value)) . '='; $function = @ $this->parameter[$key]['function']; $str .= (@ $this->parameter[$key]['quoted'] ? '"' : '') . $this-> $function ($event[$key]) . (@ $this->parameter[$key]['quoted'] ? '"' : ''); break; case 'float' : if (!empty ($event[$value])) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]['lat'] . ';' . $event[$value]['lon']); } break; case 'text' : if (isset ($event[$value])) { if (@ $this->parameter[$key]['type'] != 'function') { if ($multiples && count($event[$value]) > 1) { $event_value_count = count($event[$value]); for ($i = 0; $i < $event_value_count; ++$i) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); } } else { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); } } else { $function = $this->parameter[$value]['function']; if ($multiples) { $event_value_count = count($event[$value]); for ($i = 0; $i < $event_value_count; ++$i) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value][$i])); } } else { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value])); } } } break; case 'cal-address' : if (is_array($event[$value][0])) { $event_value_count = count($event[$value]); for ($j = 0; $j < $event_value_count; ++$j) { $temp_output = $this->build_parameters($event[$value][$j], $value); if ($temp_output) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output); } } } else { $temp_output = $this->build_parameters($event[$value], $value); if ($temp_output) { $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output); } } break; } } if (!empty ($event['x_type'])) { $event_x_type_count = count($event['x_type']); for ($i = 0; $i < $event_x_type_count; ++$i) { $str .= $this->build_xtype($event['x_type'][$i], ':'); } } if ($ical_item == 'vtimezone') { if ($event['tzdata']) { $event_tzdata_count = count($event['tzdata']); for ($k = 0; $k < $event_tzdata_count; ++$k) { $str .= 'BEGIN:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n"; $str .= $this->build_card_internals(strtolower($event['tzdata'][$k]['type']), $event['tzdata'][$k]); $str .= 'END:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n"; } } } elseif ($event['alarm']) { $event_alarm_count = count($event['alarm']); for ($k = 0; $k < $event_alarm_count; ++$k) { $str .= 'BEGIN:VALARM' . "\r\n"; $str .= $this->build_card_internals('valarm', $event['alarm'][$k]); $str .= 'END:VALARM' . "\r\n"; } } return $str; } /* * Switching Functions */ function parse_user_host($var) { return $this->switch_mailto($var); } function switch_class($var) { if (is_string($var)) { switch ($var) { case '_PRIVATE' : $var = _PRIVATE; break; case '_PUBLIC' : $var = _PUBLIC; break; case '_CONFIDENTIAL' : $var = _CONFIDENTIAL; break; } } elseif (is_int($var)) { switch ((int) $var) { case _PRIVATE : $var = '_PRIVATE'; break; case _PUBLIC : $var = '_PUBLIC'; break; case _CONFIDENTIAL : $var = '_CONFIDENTIAL'; break; } } return $var; } function switch_cu($var) { if (gettype($var) == 'string') { switch ($var) { case 'INDIVIDUAL' : return INDIVIDUAL; break; case 'GROUP' : return GROUP; break; case 'RESOURCE' : return RESOURCE; break; case 'ROOM' : return ROOM; break; case 'UNKNOWN' : return UNKNOWN; break; default : return OTHER; break; } } elseif (gettype($var) == 'integer') { switch ($var) { case INDIVIDUAL : return 'INDIVIDUAL'; break; case GROUP : return 'GROUP'; break; case RESOURCE : return 'RESOURCE'; break; case ROOM : return 'ROOM'; break; case UNKNOWN : return 'UNKNOWN'; break; default : return 'X-OTHER'; break; } } else { return $var; } } function switch_date($var) { $this->debug('SWITCH_DATE: gettype = ' . gettype($var)); if (is_string($var)) { $dtime = Array (); if (strpos($var, ':')) { $pos = explode(':', $var); $var = $pos[1]; } $this->set_var($dtime, 'year', (int) (substr($var, 0, 4))); $this->set_var($dtime, 'month', (int) (substr($var, 4, 2))); $this->set_var($dtime, 'mday', (int) (substr($var, 6, 2))); if (substr($var, 8, 1) == 'T') { $this->set_var($dtime, 'hour', (int) (substr($var, 9, 2))); $this->set_var($dtime, 'min', (int) (substr($var, 11, 2))); $this->set_var($dtime, 'sec', (int) (substr($var, 13, 2))); if (strlen($var) > 14) { if (substr($var, 14, 1) != 'Z') { if ($this->api) { $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; if ($dtime['hour'] < 0) { $dtime['mday'] -= 1; $dtime['hour'] = 24 - $dtime['hour']; } elseif ($dtime['hour'] >= 24) { $dtime['mday'] += 1; $dtime['hour'] = $dtime['hour'] - 24; } } } } else { /* * The time provided by the iCal is considered local time. * * The implementor will need to consider how to convert that time to UTC. */ // if($this->api) // { // $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; // if($dtime['hour'] < 0) // { // $dtime['mday'] -= 1; // $dtime['hour'] = 24 - $dtime['hour']; // } // elseif($dtime['hour'] >= 24) // { // $dtime['mday'] += 1; // $dtime['hour'] = $dtime['hour'] - 24; // } // } } } else { $this->set_var($dtime, 'hour', 0); $this->set_var($dtime, 'min', 0); $this->set_var($dtime, 'sec', 0); if ($this->api) { $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; if ($dtime['hour'] < 0) { $dtime['mday'] -= 1; $dtime['hour'] = 24 - $dtime['hour']; } elseif ($dtime['hour'] >= 24) { $dtime['mday'] += 1; $dtime['hour'] = $dtime['hour'] - 24; } } } $this->debug('DATETIME : ' . _debug_array($dtime, False)); return $dtime; } elseif (is_array($var)) { return date('Ymd\THis\Z', mktime($var['hour'], $var['min'], $var['sec'], $var['month'], $var['mday'], $var['year'])); } else { return $var; } } function switch_encoding($var) { if (is_string($var)) { switch ($var) { case '8BIT' : return _8BIT; break; case 'BASE64' : return _BASE64; break; default : return OTHER; break; } } elseif (is_int($var)) { switch ($var) { case _8BIT : return '8BIT'; break; case _BASE64 : return 'BASE64'; break; case OTHER : return 'OTHER'; break; } } else { return $var; } } function switch_fbtype($var) { if (is_string($var)) { switch ($var) { case 'FREE' : return FREE; break; case 'BUSY' : return BUSY; break; case 'BUSY-UNAVAILABLE' : return BUSY_UNAVAILABLE; break; case 'BUSY-TENTATIVE' : return BUSY_TENTATIVE; break; default : return OTHER; break; } } elseif (is_int($var)) { switch ($var) { case FREE : return 'FREE'; break; case BUSY : return 'BUSY'; break; case BUSY_UNAVAILABLE : return 'BUSY-UNAVAILABLE'; break; case BUSY_TENTATIVE : return 'BUSY-TENTATIVE'; break; default : return 'OTHER'; break; } } else { return $var; } } function switch_freq($var) { if (is_string($var)) { switch ($var) { case 'SECONDLY' : return SECONDLY; break; case 'MINUTELY' : return MINUTELY; break; case 'HOURLY' : return HOURLY; break; case 'DAILY' : return DAILY; break; case 'WEEKLY' : return WEEKLY; break; case 'MONTHLY' : return MONTHLY; break; case 'YEARLY' : return YEARLY; break; } } elseif (is_int($var)) { switch ($var) { case SECONDLY : return 'SECONDLY'; break; case MINUTELY : return 'MINUTELY'; break; case HOURLY : return 'HOURLY'; break; case DAILY : return 'DAILY'; break; case WEEKLY : return 'WEEKLY'; break; case MONTHLY : return 'MONTHLY'; break; case YEARLY : return 'YEARLY'; break; } } else { return $var; } } function switch_mailto($var) { if (is_string($var)) { $var = str_replace(array ( "\r\n", "\n", "\r" ), "", $var); if (strpos(' ' . $var, ':')) { $parts = explode(':', $var); $var = $parts[1]; } $parts = explode('@', $var); //$this->debug("Count of mailto parts : ".count($parts)); if (count($parts) == 2) { //$this->debug("Splitting ".$parts[0]." @ ".$parts[1]); $temp_address = Array (); $temp_address['user'] = $parts[0]; $temp_address['host'] = $parts[1]; return $temp_address; } else { return False; } } elseif (is_array($var)) { // return 'MAILTO:'.$var['user'].'@'.$var['host']; return $var['user'] . '@' . $var['host']; } } function switch_partstat($var) { $this->debug('PARTSTAT = ' . $var); if (is_string($var)) { switch ($var) { case 'NEEDS-ACTION' : return 0; // NEEDS_ACTION; break; case 'ACCEPTED' : return 1; // ACCEPTED; break; case 'DECLINED' : return 2; // DECLINED; break; case 'TENTATIVE' : return 3; // TENTATIVE; break; case 'DELEGATED' : return 4; // DELEGATED; break; case 'COMPLETED' : return 5; // COMPLETED; break; case 'IN-PROCESS' : return 6; // IN_PROCESS; break; default : return 99; // OTHER; break; } } elseif (is_int($var)) { switch ((int) $var) { case 0 : // NEEDS_ACTION: return 'NEEDS-ACTION'; break; case 1 : // ACCEPTED: return 'ACCEPTED'; break; case 2 : // DECLINED: return 'DECLINED'; break; case 3 : // TENTATIVE: return 'TENTATIVE'; break; case 4 : // DELEGATED: return 'DELEGATED'; break; case 5 : // COMPLETED: return 'COMPLETED'; break; case 6 : // IN_PROCESS: return 'IN-PROCESS'; break; default : return 'X-OTHER'; break; } } else { return $var; } } function switch_range($var) { if (is_string($var)) { switch ($var) { case 'THISANDPRIOR' : return THISANDPRIOR; break; case 'THISANDFUTURE' : return THISANDFUTURE; break; } } elseif (is_int($var)) { switch ($var) { case THISANDPRIOR : return 'THISANDPRIOR'; break; case THISANDFUTURE : return 'THISANDFUTURE'; break; } } else { return $var; } } function switch_related($var) { if (is_string($var)) { switch ($var) { case 'START' : return START; break; case 'END' : return END; break; } } elseif (is_int($var)) { switch ($var) { case START : return 'START'; break; case END : return 'END'; break; } } else { return $var; } } function switch_reltype($var) { if (is_string($var)) { switch ($var) { case 'PARENT' : return PARENT; break; case 'CHILD' : return CHILD; break; case 'SIBLING' : return SIBLING; break; } } elseif (is_int($var)) { switch ($var) { case PARENT : return 'PARENT'; break; case CHILD : return 'CHILD'; break; case SIBLING : return 'SIBLING'; break; } } else { return $var; } } function switch_role($var) { if (is_string($var)) { switch ($var) { case 'NONE' : return NONE; break; case 'CHAIR' : return CHAIR; break; case 'REQ-PARTICIPANT' : return REQ_PARTICIPANT; break; case 'OPT-PARTICIPANT' : return OPT_PARTICIPANT; break; case 'NON-PARTICIPANT' : return NON_PARTICIPANT; break; } } elseif (is_int($var)) { switch ($var) { case NONE : return 'NONE'; break; case CHAIR : return 'CHAIR'; break; case REQ_PARTICIPANT : return 'REQ-PARTICIPANT'; break; case OPT_PARTICIPANT : return 'OPT-PARTICIPANT'; break; case NON_PARTICIPANT : return 'NON-PARTICIPANT'; break; } } else { return $var; } } function switch_rsvp($var) { if (is_string($var)) { if ($var == 'TRUE') { return 1; } elseif ($var == 'FALSE') { return 0; } } elseif (is_int($var) || $var == False) { if ($var == 1) { return 'TRUE'; } elseif ($var == 0) { return 'FALSE'; } } else { return $var; } } function switch_transp($var) { if (is_string($var)) { switch ($var) { case 'TRANSPARENT' : return TRANSPARENT; break; case 'OPAQUE' : return OPAQUE; break; } } elseif (is_int($var)) { switch ($var) { case TRANSPARENT : return 'TRANSPARENT'; break; case OPAQUE : return 'OPAQUE'; break; } } else { return $var; } } /* * The brunt of the class */ function parse($ical_text) { $begin_regexp = '^'; $semi_colon_regexp = '[\;\:]'; $colon_regexp = '[\:]'; $catch_all_regexp = '(.*)'; $end_regexp = '$'; $property_regexp = $begin_regexp . '([A-Z\-]*)' . $semi_colon_regexp . $catch_all_regexp . $end_regexp; $param_regexp = $begin_regexp . $catch_all_regexp . ':' . $catch_all_regexp . $end_regexp; $mode = 'none'; $text = $this->read_line_unfold($ical_text); while ($text) { // if(strlen($ical_text[$i]) > 75) // { // continue; // } preg_match("/$property_regexp/", $text, $temp); //$this->debug ('Majortype dump: '._debug_array($temp, false) ); $majortype = str_replace('-', '_', strtolower($temp[1])); $value = chop($temp[2]); if ($mode != 'none' && ($majortype != 'begin' && $majortype != 'end')) { //$this->debug('PARSE:MAJORTYPE : '.$majortype); if (isset ($this->property[$majortype])) { $state = @ $this->property[$majortype]["$mode"]['state']; $type = @ $this->property[$majortype]['type']; $multiples = @ $this->property[$majortype]["$mode"]['multiples']; $do_to_text = @ $this->property[$majortype]['to_text']; } elseif (substr($majortype, 0, 2) == 'x_') { $state = 'optional'; $type = 'xtype'; $multiples = True; $do_to_test = True; } else { $state = ''; } } else { $state = 'required'; } if ($majortype == 'duration') { // Unset dur var unset ($dur); // Split DURATION list ($_f_['day_raw'], $_f_['time_raw']) = preg_split('/T/', substr($value, 1, strlen($value) - 1)); /* Datecode */ if (isset ($_f_['day_raw']) OR $_f_['day_raw']) { // Days // if(preg_match('/D/', $_f_['day_raw'])) if (strstr($_f_['day_raw'], 'D')) { $dur['days'] = preg_replace('/([0-9]+)D(.*)/i', '\\1', $_f_['day_raw']); } // Weeks // if(preg_match('/W/', $_f_["day_raw"])) if (strstr($_f_['day_raw'], 'W')) { $dur['weeks'] = preg_replace('/([^|.*]+D)?([0-9]+)W/i', '\\2', $_f_['day_raw']); } } /* Timecode */ if (isset ($_f_['time_raw']) OR $_f_['time_raw']) { // Hours // if(preg_match('/H/', $_f_["time_raw"])) if (strstr($_f_['time_raw'], 'H')) { $dur['hours'] = preg_replace('/([0-9]+)H(.*)/i', '\\1', $_f_['time_raw']); } // Minutes /* If you find better, contact me very quickly :) */ // if(preg_match('/M/', $_f_["time_raw"])) if (strstr($_f_['time_raw'], 'M')) { $dur['minutes'] = preg_replace('/([^|.*]+H)?([0-9]+)M(.*)/i', '\\2', $_f_['time_raw']); } // Seconds /* Same comment :) */ // if(preg_match('/S/', $_f_["time_raw"]) ) if (strstr($_f_['time_raw'], 'S')) { $dur['seconds'] = preg_replace('/([^|.*]+M)?([0-9]+)S(.*)/i', '\\2', $_f_['time_raw']); } } $dur['raw'] = Array ( 'timecode' => $_f_['time_raw'], 'datecode' => $_f_['day_raw'], 'all' => $value ); // Add new parameters in Event $this->set_var($event, $majortype, $dur); } if ($majortype == 'begin') { $tmode = $mode; $mode = strtolower($value); switch (strtolower($value)) { case 'daylight' : case 'standard' : $t_event = Array (); $t_event = $event; $event = Array (); break; case 'valarm' : if ($tmode == 'vevent' || $tmode == 'vtodo') { $t_event = $event; unset ($event); $event = Array (); } else { $mode = $tmode; } break; case 'vcalendar' : $ical = $this->new_ical(); break; case 'vevent' : case 'vfreebusy' : case 'vjournal' : case 'vtimezone' : case 'vtodo' : $event = Array (); break; } $event['type'] = strtolower($value); } elseif ($majortype == 'end') { $mode = 'none'; switch (strtolower($value)) { case 'daylight' : case 'standard' : $tzdata[] = $event; unset ($event); $event = $t_event; unset ($t_event); $mode = 'vtimezone'; break; case 'valarm' : $alarm[] = $event; unset ($event); $event = $t_event; unset ($t_event); $mode = $tmode; break; case 'vevent' : if (!empty ($alarm)) { $event['alarm'] = $alarm; unset ($alarm); } $this->event[] = $event; unset ($event); break; case 'vfreebusy' : $this->freebusy[] = $event; unset ($event); break; case 'vjournal' : $this->journal[] = $event; unset ($event); break; case 'vtimezone' : if (!empty ($tzdata)) { $event['tzdata'] = $tzdata; unset ($tzdata); } $this->timezone[] = $event; unset ($event); break; case 'vtodo' : if (!empty ($alarm)) { $event['alarm'] = $alarm; unset ($alarm); } $this->todo[] = $event['alarm']; unset ($event); break; case 'vcalendar' : $this->ical = $ical; $this->ical['event'] = $this->event; $this->ical['freebusy'] = $this->freebusy; $this->ical['journal'] = $this->journal; $this->ical['timezone'] = $this->timezone; $this->ical['todo'] = $this->todo; break 2; } } elseif ($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method' || $majortype == 'calscale') { $this->parse_parameters($ical, $majortype, $this->from_text($value)); } elseif ($state == 'optional' || $state == 'required') { //$this->debug('Mode : '.$mode.' Majortype : '.$majortype . ' Type : '.$type); if ($do_to_text) { $value = $this->from_text($value); } switch ($type) { case 'text' : $this->parse_parameters($event, $majortype, $value); break; case 'recur' : case 'date-time' : case 'cal-address' : $this->parse_value($event, $majortype, $value, $mode); break; case 'integer' : if ($multiples) { $event[$majortype][] = (int) $value; } else { $this->set_var($event, $majortype, (int) $value); } break; case 'float' : $event-> $majortype = new class_geo; $this->parse_geo($event-> $majortype, $value); break; case 'utc-offset' : $this->set_var($event, $majortype, (int) $value); break; case 'uri' : $new_var = Array (); $this->parse_parameters($new_var, $majortype, $value); if ($multiples) { switch ($mode) { case 'valarm' : $alarm['attach'][] = $new_var; break; default : $event[$majortype][] = $new_var; break; } } else { $event[$majortype] = $new_var; } unset ($new_var); break; case 'xtype' : $this->parse_xtype($event, $majortype, $value); break; } } $text = $this->read_line_unfold($ical_text); } return $this->ical; } function switch_to_phpgw_status($partstat) { switch ($partstat) { case 0 : return 'U'; break; case 1 : return 'A'; break; case 2 : return 'R'; break; case 3 : return 'T'; break; default : return 'U'; break; } } function switch_phpgw_status($status) { switch ($status) { case 'U' : return 0; break; case 'A' : return 1; break; case 'R' : return 2; break; case 'T' : return 3; break; } } function is_owner($part_record) { if (($part_record['user'] . '@' . $part_record['host'] == $GLOBALS['phpgw_info']['user']['preferences']['email']['address']) || ($part_record['cn'] == $GLOBALS['phpgw_info']['user']['account_lid']) || ($part_record['mailto']['user'] == $GLOBALS['phpgw_info']['user']['account_lid'])) { return True; } else { return False; } } function check_owner(& $event, $ical, $so_event) { if (!isset ($event['participant'][$GLOBALS['phpgw_info']['user']['account_id']])) { if (isset ($ical['organizer'])) { if ($this->is_owner($ical['organizer'])) { $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['organizer']['partstat']), $GLOBALS['phpgw_info']['user']['account_id']); } } elseif (isset ($ical['attendee'])) { $attendee_count = count($ical['attendee']); for ($j = 0; $j < $attendee_count; ++$j) { if ($this->is_owner($ical['attendee'][$j])) { $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['attendee'][$j]['partstat']), (int) $GLOBALS['phpgw_info']['user']['account_id']); } } } else { $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); $so_event->add_attribute('participants', 'A', $GLOBALS['phpgw_info']['user']['account_id']); } } } function import_file() { if ($_FILES['uploadedfile']['tmp_name'] == 'none' || $_FILES['uploadedfile']['tmp_name'] == '') { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( 'menuaction' => 'calendar.uiicalendar.import', 'action' => 'GetFile' ))); $GLOBALS['phpwg']->common->phpgw_exit(); } $uploaddir = $GLOBALS['phpgw_info']['server']['temp_dir'] . SEP; srand((double) microtime() * 1000000); $random_number = rand(100000000, 999999999); $newfilename = md5($_FILES['uploadedfile']['tmp_name'] . ", " . $uploadedfile_name . ", " . time() . getenv("REMOTE_ADDR") . $random_number); $filename = $uploaddir . $newfilename; move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $filename); // $ftp = fopen($uploaddir . $newfilename . '.info','wb'); // fputs($ftp,$uploadedfile_type."\n".$uploadedfile_name."\n"); // fclose($ftp); return $filename; } function safeBitCheck($number, $comparison) { $binNumber = base_convert($number, 10, 2); $binComparison = strrev(base_convert($comparison, 10, 2)); $str = strlen($binNumber); if (($str <= strlen($binComparison)) && ($binComparison { $str -1 } === "1")) return '1'; else return '0'; } function import($mime_msg = '', $from_ajax = false, $importAccount = false) { /* * Caso seja uma importação para conta compartilhada carrega as acls do usuario */ if ($importAccount != false) { $colunas = array ( 'acl_appname', 'acl_location', 'acl_account', 'acl_rights' ); $where = array ( 'acl_appname' => 'calendar', 'acl_account' => $importAccount['uidnumber'], 'acl_location' => $GLOBALS['phpgw_info']['user']['account_id'] ); $db = $GLOBALS['phpgw']->db; $db->select('phpgw_acl', $colunas, $where, null, null); $row = $db->row(true); if (!$this->safeBitCheck(2, $row['acl_rights'])) //Se o usuario não tem permisão de adicionar eventos return 'You do not have permission to add events'; } if ($_FILES['uploadedfile']['tmp_name'] != 'none' && $_FILES['uploadedfile']['tmp_name'] != '') { $filename = $this->import_file(); $fp = fopen($filename, 'rt'); $mime_msg = explode("\n", fread($fp, filesize($filename))); fclose($fp); unlink($filename); } elseif (!$mime_msg) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( 'menuaction' => 'calendar.uiicalendar.import', 'action' => 'GetFile' ))); $GLOBALS['phpwg']->common->phpgw_exit(); } if (!is_object($GLOBALS['uicalendar'])) { $so_event = createobject('calendar.socalendar', Array ( 'owner' => 0, 'filter' => '', 'category' => '' )); } else { $so_event = $GLOBALS['uicalendar']->bo->so; } $datetime_vars = Array ( 'start' => 'dtstart', 'end' => 'dtend', 'modtime' => 'dtstamp', 'modtime' => 'last_modified' ); $date_array = Array ( 'Y' => 'year', 'm' => 'month', 'd' => 'mday', 'H' => 'hour', 'i' => 'min', 's' => 'sec' ); // time limit should be controlled elsewhere @ set_time_limit(0); $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences(); $users_email = $GLOBALS['phpgw_info']['user']['preferences']['email']['address']; $cats = CreateObject('phpgwapi.categories'); $ical = $this->parse($mime_msg); switch ($ical['version']['value']) { case '1.0' : $cat_sep = ';'; break; case '2.0' : default : $cat_sep = ','; break; } /* * Caso seja um Reply. */ if (strtoupper($ical['method']['value']) == 'REPLY') { //atualiza evento caso seja evento externo if (isset ($ical['event']['0']['x_type'])) foreach ($ical['event']['0']['x_type'] as $property) if ($property['name'] === 'MICROSOFT_CDO_IMPORTANCE') return $this->updateHour($ical); //Ignora respostas externas return 'The import was executed successfully.'; } /*-------------------------------------------------------------*/ /* * Ativa a flag de cancelamento caso o ical for do method CANCEL */ $cancelEvent = false; if (strtoupper($ical['method']['value']) == 'CANCEL') $cancelEvent = true; /*-------------------------------------------------------------*/ require_once (dirname(__FILE__) . '/class.ex_participants.inc.php'); $c_events = count($ical['event']); for ($i = 0; $i < $c_events; ++$i) { $ex_participants = new exParticipants(); if ($ical['event'][$i]['uid']['value']) $uid_exists = $so_event->find_cal_id($ical['event'][$i]['uid']['value']); else $uid_exists = False; if ($cancelEvent) // If cancelamento { if ($importAccount != false && !$this->safeBitCheck(8, $row['acl_rights'])) // se for em uma conta compartilhada e se tem permisão de deletar return 'You do not have permission to delete events'; if ($uid_exists) // If o evento existe na agenda $so_event->delete_entry($uid_exists); // Adicona o id a lista de eventos a deletar continue; // Continua o for nenhum processamento mais é nescessario } if ($uid_exists) { $event = $so_event->read_entry($uid_exists); $this->check_owner($event, $ical['event'][$i], $so_event); } else { $so_event->event_init(); $so_event->add_attribute('id', 0); $so_event->add_attribute('reference', 0); } if ($ical['event'][$i]['uid']['value']) { $so_event->add_attribute('uid', $ical['event'][$i]['uid']['value']); } if ($ical['event'][$i]['summary']['value']) { $so_event->set_title($ical['event'][$i]['summary']['value']); } if ($ical['event'][$i]['description']['value']) { $so_event->set_description($ical['event'][$i]['description']['value']); } if ($ical['event'][$i]['ex_participants']['value']) { $ex_participants->setParticipantsByString($ical['event'][$i]['ex_participants']['value']); } // Compatibilidade com agendamentos vindos do outlook/exchange if (isset ($ical['event'][$i]['attendee'])) { $c_attendees = count($ical['event'][$i]['attendee']); $all_attendees = ''; for ($a = 0; $a < $c_attendees; ++$a) { $cname = '"' . $ical['event'][$i]['attendee'][$a]['cn'] . '"'; $email = $ical['event'][$i]['attendee'][$a]['mailto']['user']; if ($email) { // Remove os espaços, tabs e quebra-de-linha no dominio //$email_domain = preg_replace('/\s*/m', '', $ical['event'][$i]['attendee'][$a]['mailto']['host']); $email_domain = $ical['event'][$i]['attendee'][$a]['mailto']['host']; $email = '<' . $email . '@' . $email_domain . '>'; } else $email = ''; $all_attendees .= $cname . $email . ', '; } $this->debug('All attendees: ' . $all_attendees); $ex_participants->setParticipantsByString($all_attendees); } if ($ical['event'][$i]['location']['value']) { $so_event->add_attribute('location', $ical['event'][$i]['location']['value']); } if (isset ($ical['event'][$i]['priority'])) { $so_event->add_attribute('priority', $ical['event'][$i]['priority']); } else { $so_event->add_attribute('priority', 2); } if (!isset ($ical['event'][$i]['class'])) { $ical['event'][$i]['class'] = 1; } $so_event->set_class($ical['event'][$i]['class']); @ reset($datetime_vars); while (list ($e_datevar, $i_datevar) = each($datetime_vars)) { if (isset ($ical['event'][$i][$i_datevar])) { $temp_time = $so_event->maketime($ical['event'][$i][$i_datevar]) + $GLOBALS['phpgw']->datetime->tz_offset; @ reset($date_array); while (list ($key, $var) = each($date_array)) { $event[$e_datevar][$var] = (int) (date($key, $temp_time)); } $so_event->set_date($e_datevar, $event[$e_datevar]['year'], $event[$e_datevar]['month'], $event[$e_datevar]['mday'], $event[$e_datevar]['hour'], $event[$e_datevar]['min'], $event[$e_datevar]['sec']); } } if (!isset ($ical['event'][$i]['categories']['value']) || !$ical['event'][$i]['categories']['value']) { $so_event->set_category(0); } else { $ical_cats = Array (); if (strpos($ical['event'][$i]['categories']['value'], $cat_sep)) { $ical_cats = explode($cat_sep, $ical['event'][$i]['categories']['value']); } else { $ical_cats[] = $ical['event'][$i]['categories']['value']; } @ reset($ical_cats); $cat_id_nums = Array (); while (list ($key, $cat) = each($ical_cats)) { if (!$cats->exists('appandmains', $cat)) { $cats->add(Array ( 'name' => $cat, 'descr' => $cat, 'parent' => '', 'access' => 'private', 'data' => '' )); } // $temp_id = $cats->name2id($cat); // echo 'Category Name : '.$cat.' : Category ID :'.$temp_id."
\n"; // $cat_id_nums[] = $temp_id; $cat_id_nums[] = $cats->name2id($cat); } @ reset($cat_id_nums); if (count($cat_id_nums) > 1) { $so_event->set_category(implode($cat_id_nums, ',')); } else { $so_event->set_category($cat_id_nums[0]); } } //rrule if (isset ($ical['event'][$i]['rrule']) OR isset ($ical['event'][$i]['duration'])) { // recur_enddate if (isset ($ical['event'][$i]['rrule']['until'])) { $recur_enddate['year'] = (int) ($ical['event'][$i]['rrule']['until']['year']); $recur_enddate['month'] = (int) ($ical['event'][$i]['rrule']['until']['month']); $recur_enddate['mday'] = (int) ($ical['event'][$i]['rrule']['until']['mday']); } elseif (isset ($ical['event'][$i]['duration'])) { // Create timecode for strtotime $ptimer = mktime($ical['event'][$i]['dtstart']['hour'], $ical['event'][$i]['dtstart']['min'], $ical['event'][$i]['dtstart']['sec'], $ical['event'][$i]['dtstart']['month'], $ical['event'][$i]['dtstart']['mday'], $ical['event'][$i]['dtstart']['year']); /* -- Fixbug -- * if "DURATION" has 1 day (for example). * Event takes places between the first date * (this define in "start" tag) and next day :( * This "fix" destroy one day and set hours as "23" and minutes as "59" */ // Weeks::Day-- if ($ical['event'][$i]['duration']['weeks'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) { $ical['event'][$i]['duration']['days'] = ($ical['event'][$i]['duration']['days'] + ($ical['event'][$i]['duration']['weeks'] * 7)) - 1; unset ($ical['event'][$i]['duration']['weeks']); $ical['event'][$i]['duration']['hours'] = "23"; $ical['event'][$i]['duration']['minutes'] = "59"; $ical['event'][$i]['duration']['seconds'] = "59"; } // Days::Day-- if ($ical['event'][$i]['duration']['days'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) { $ical['event'][$i]['duration']['days']--; $ical['event'][$i]['duration']['hours'] = "23"; $ical['event'][$i]['duration']['minutes'] = "59"; $ical['event'][$i]['duration']['seconds'] = "59"; } // Create string contains datetime for strtotime $pdate = "+"; if (isset ($ical['event'][$i]['duration']['weeks'])) $pdate .= $ical['event'][$i]['duration']['weeks'] . " weeks "; if (isset ($ical['event'][$i]['duration']['days'])) $pdate .= $ical['event'][$i]['duration']['days'] . " days "; if (isset ($ical['event'][$i]['duration']['hours'])) $pdate .= $ical['event'][$i]['duration']['hours'] . " hours "; if (isset ($ical['event'][$i]['duration']['minutes'])) $pdate .= $ical['event'][$i]['duration']['minutes'] . " minutes "; if (isset ($ical['event'][$i]['duration']['seconds'])) $pdate .= $ical['event'][$i]['duration']['seconds'] . " seconds "; // What is datetime in 2192 ? $enddate = strtotime($pdate, $ptimer); list ($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $recur_enddate['hour'], $recur_enddate['min'], $recur_enddate['sec']) = preg_split('/:/', date("Y:m:d:H:i:s", $enddate)); // Set End of event $so_event->set_end($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $recur_enddate['hour'], $recur_enddate['min'], $recur_enddate['sec']); } else { $recur_enddate['year'] = 0; $recur_enddate['month'] = 0; $recur_enddate['mday'] = 0; } // recur_data $recur_data = 0; if (isset ($ical['event'][$i]['rrule']['byday'])) { $week_days = Array ( MCAL_M_SUNDAY => 'SU', MCAL_M_MONDAY => 'MO', MCAL_M_TUESDAY => 'TU', MCAL_M_WEDNESDAY => 'WE', MCAL_M_THURSDAY => 'TH', MCAL_M_FRIDAY => 'FR', MCAL_M_SATURDAY => 'SA' ); @ reset($week_days); while (list ($key, $val) = each($week_days)) { if (strpos(' ' . $ical['event'][$i]['rrule']['byday'], $val)) { $recur_data += $key; } } } // interval if (!isset ($ical['event'][$i]['rrule']['interval'])) { $interval = 1; } else { $interval = (int) $ical['event'][$i]['rrule']['interval']; } // recur_type switch ($ical['event'][$i]['rrule']['freq']) { case DAILY : $recur_type = MCAL_RECUR_DAILY; break; case WEEKLY : $so_event->set_recur_weekly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval, $recur_data); break; case MONTHLY : // Still need to determine if this is by day or by week for the month.. // $recur_type = MCAL_RECUR_M??????; break; case YEARLY : $so_event->set_recur_yearly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval); break; } } else { $so_event->set_recur_none(); } // Owner $organizer = $ical['event'][$i]['organizer']; if (isset ($organizer)) { if ($this->is_owner($organizer) || $organizer == -2) { $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); } else { $so_event->add_attribute('owner', -2); $aux = explode(':', $organizer['cn']); $so_event->add_attribute('organizer', '' . $aux[0] . ' <' . $organizer['mailto']['user'] . '@'. $organizer['mailto']['host'].'>'); } } // se for importação para conta compartilhada $user = (int) ($importAccount ? $importAccount['uidnumber'] : $GLOBALS['phpgw_info']['user']['account_id']); $userMail = $importAccount['mail'] ? $importAccount['mail'] : $GLOBALS['phpgw_info']['user']['email']; $so_event->add_attribute('participants', 'A', $user); $event = $so_event->get_cached_event(); /* * Remove Email do participantes externos */ $usersToRemove = array (); $usersToRemove[] = $user; foreach ($event['participants'] as $auxi=> $v) $usersToRemove[] = $auxi; $ldapService = ServiceLocator :: getService('ldap'); foreach ($usersToRemove as $v) { $ex_participants->removeParticipant($ldapService->getMailByUidNumber($v)); $alternates = $ldapService->getMailAlternateByUidNumber($v); foreach ($alternates as $ii => $vv) $ex_participants->removeParticipant($vv); } $ex_participants->removeParticipant($event['organizer']); /// -------------------------------------------------------- /// $event['ex_participants'] = $ex_participants->getParticipantsSerializable(); if (!isset ($this->bo)) { require_once (dirname(__FILE__) . '/class.bocalendar.inc.php'); $this->bo = new bocalendar(); } if ($c_events < 2) //Ignora verificação de conflito quando o ical é de varios eventos { if ($overlapping_events = $this->bo->event_overlap($event, (!$from_ajax), null, $user)) { if ($_GET['calendarImport'] == 1) //caso venha do modulo calendar { $url = 'expressoMail1_2/controller.php?action=' . implode("&", array ( 'calendar.uicalendar.overlap', 'o_events=' . implode(';', $overlapping_events), 'this_event=' . $event['id'], 'this_account=' . $user )); echo ""; exit; } else return array ( 'url' => implode("&", array ( 'calendar.uicalendar.overlap', 'o_events=' . implode(';', $overlapping_events), 'this_event=' . $event['id'], 'this_account=' . $user )) ); } } if ($importAccount) $so_event->add_entry($event, true, $importAccount); else $so_event->add_entry($event); } /* * Exclue os eventos que estão na lista para serem deletados */ if ($cancelEvent) $so_event->expunge(); /*----------------------------------------------------------*/ if (!$from_ajax) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( 'menuaction' => 'calendar.uicalendar.view', 'cal_id' => $event['id'] ))); $GLOBALS['phpgw']->common->phpgw_exit(); } else // checando se o icalendar veio no formato esperado, ou seja, foi parseado corretamente if (!empty ($ical)) return true; else return 'Cannot import target event. Please check if the format is right.'; } function updateHour($ical) { if (!is_object($GLOBALS['uicalendar'])) { $so_event = createobject('calendar.socalendar', Array ( 'owner' => 0, 'filter' => '', 'category' => '' )); } else $so_event = $GLOBALS['uicalendar']->bo->so; $cal_id = $so_event->find_cal_id($ical['event'][0]['uid']['value']); //Agendamento nao ecnontrado if (!$cal_id) return 'The event was not found in your calendar'; $event = $so_event->read_entry($cal_id); $datetime_vars = Array ( 'start' => 'dtstart', 'end' => 'dtend', 'modtime' => 'dtstamp', 'modtime' => 'last_modified' ); $date_array = Array ( 'Y' => 'year', 'm' => 'month', 'd' => 'mday', 'H' => 'hour', 'i' => 'min', 's' => 'sec' ); @ reset($datetime_vars); while (list ($e_datevar, $i_datevar) = each($datetime_vars)) { if (isset ($ical['event'][0][$i_datevar])) { $temp_time = $so_event->maketime($ical['event'][0][$i_datevar]); @ reset($date_array); while (list ($key, $var) = each($date_array)) $event[$e_datevar][$var] = (int) (date($key, $temp_time)); $so_event->set_date($e_datevar, $event[$e_datevar]['year'], $event[$e_datevar]['month'], $event[$e_datevar]['mday'], $event[$e_datevar]['hour'], $event[$e_datevar]['min'], $event[$e_datevar]['sec']); } } $so_event->add_entry($event, false); $bo_event = createobject('calendar.bocalendar'); $bo_event->send_update(MSG_MODIFIED, $event['participants'], $event, $event); return 'Event successfully updated'; } function export($params) { $event_id = $params['l_event_id'] ? $params['l_event_id'] : $_GET['cal_id']; $this->chunk_split = $params['chunk_split']; $method = $params['method'] ? $params['method'] : 'publish'; $vtype = $params['vtype'] ? $params['vtype'] : 'event'; $string_array = Array ( 'summary' => 'description', 'location' => 'location', 'description' => 'title', 'uid' => 'uid' ); $cats = CreateObject('phpgwapi.categories'); include (PHPGW_SERVER_ROOT . '/calendar/setup/setup.inc.php'); if (!is_array($event_id)) { $ids[] = $event_id; } else { $ids = $event_id; } $ical = $this->new_ical(); $this->set_var($ical['prodid'], 'value', '-//eGroupWare//eGroupWare ' . $setup_info['calendar']['version'] . ' MIMEDIR//' . strtoupper($GLOBALS['phpgw_info']['user']['preferences']['common']['lang'])); $this->set_var($ical['version'], 'value', '2.0'); $this->set_var($ical['method'], 'value', strtoupper($method)); if (!$GLOBALS['phpgw_info']['flags']['included_classes']['uicalendar']) { if (!$GLOBALS['phpgw_info']['flags']['included_classes']['bocalendar']) { $so_event = createobject('calendar.socalendar', Array ( 'owner' => 0, 'filter' => '', 'category' => '' )); } else { $so_event = $GLOBALS['bocalendar']->so; } } else { $so_event = $GLOBALS['uicalendar']->bo->so; } foreach ($ids as $event) { $ical_event = Array (); if (!is_array($event)) { $event = $so_event->read_entry($event); } if ($event['alarm']) { foreach ($event['alarm'] as $alarm) { $ical_temp = Array (); $ical_temp['action']['value'] = 'DISPLAY'; $ical_temp['description']['value'] = $alarm['text']; $this->set_var($ical_temp['trigger'], 'value', 'VALUE=DATE-TIME:' . date('Ymd\THis\Z', $alarm['time']), 'valarm'); $ical_event['alarm'][] = $ical_temp; } } // use system's date info for caluculating local timezone's offset in minutes // $gmt_offset = date('O', $GLOBALS['phpgw']->datetime->users_localtime); // offset to GMT $offset = (int) (substr($gmt_offset, 0, 3)) * 60 + (int) (substr($gmt_offset, 3, 2)); $event['start']['min'] -= $offset; $event['end']['min'] -= $offset; $event['modtime']['min'] -= $offset; $ical_event['priority'] = $event['priority']; $ical_event['class'] = (int) $event['public']; $dtstart_mktime = $so_event->maketime($event['start']); $this->parse_value($ical_event, 'dtstart', date('Ymd\THis\Z', $dtstart_mktime), 'vevent'); $dtend_mktime = $so_event->maketime($event['end']); $this->parse_value($ical_event, 'dtend', date('Ymd\THis\Z', $dtend_mktime), 'vevent'); $mod_mktime = $so_event->maketime($event['modtime']); $this->parse_value($ical_event, 'last_modified', date('Ymd\THis\Z', $mod_mktime), 'vevent'); foreach ($string_array as $ical_value => $event_value) { if ($event[$event_value]) { $this->set_var($ical_event[$ical_value], 'value', $event[$event_value]); } } if ($event['category']) { $cats->categories(0, 'calendar'); foreach (explode(',', $event['category']) as $cat) { $_cat = $cats->return_single($cat); $cat_string[] = $_cat[0]['name']; } @ reset($cat_string); $this->set_var($ical_event['categories'], 'value', implode($cat_string, ',')); } if (count($event['participants']) > 1) { if (!is_object($db)) { $db = $GLOBALS['phpgw']->db; } foreach ($event['participants'] as $part => $status) { $GLOBALS['phpgw']->accounts->get_account_name($part, $lid, $fname, $lname); $name = $fname . ' ' . $lname; $owner_status = $this->switch_partstat((int) $this->switch_phpgw_status($event['participants'][$part])); $mail_prefs = $GLOBALS['phpgw']->preferences->create_email_preferences($part); $mailto = $mail_prefs['email']['address']; $str = 'CN="' . $name . '";PARTSTAT=' . $owner_status . ':' . $mailto; if ($part == $event['owner']) { $str = 'ROLE=CHAIR;' . $str; } else { $str = 'ROLE=REQ-PARTICIPANT;' . $str; } if ($method != 'reply' || $part == $GLOBALS['phpgw_info']['user']['account_id']) { $this->parse_value($ical_event, 'attendee', $str, 'vevent'); } if ($part == $event['owner']) { $this->parse_value($ical_event, 'organizer', $str, 'vevent'); } } } if ($event['recur_type']) { $str = ''; switch ($event['recur_type']) { case MCAL_RECUR_DAILY : $str .= 'FREQ=DAILY'; break; case MCAL_RECUR_WEEKLY : $str .= 'FREQ=WEEKLY'; if ($event['recur_data']) { $str .= ';BYDAY='; for ($i = 1; $i < MCAL_M_ALLDAYS; $i = $i * 2) { if ($i & $event['recur_data']) { switch ($i) { case MCAL_M_SUNDAY : $day[] = 'SU'; break; case MCAL_M_MONDAY : $day[] = 'MO'; break; CASE MCAL_M_TUESDAY : $day[] = 'TU'; break; case MCAL_M_WEDNESDAY : $day[] = 'WE'; break; case MCAL_M_THURSDAY : $day[] = 'TH'; break; case MCAL_M_FRIDAY : $day[] = 'FR'; break; case MCAL_M_SATURDAY : $day[] = 'SA'; break; } } } $str .= implode(',', $day); } break; case MCAL_RECUR_MONTHLY_MDAY : break; case MCAL_RECUR_MONTHLY_WDAY : break; case MCAL_RECUR_YEARLY : $str .= 'FREQ=YEARLY'; break; } if ($event['recur_interval']) { $str .= ';INTERVAL=' . $event['recur_interval']; } if ($event['recur_enddate']['month'] != 0 && $event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['year'] != 0) { $recur_mktime = $so_event->maketime($event['recur_enddate']) - $GLOBALS['phpgw']->datetime->tz_offset; $str .= ';UNTIL=' . date('Ymd\THis\Z', $recur_mktime); } $this->parse_value($ical_event, 'rrule', $str, 'vevent'); $exceptions = $event['recur_exception']; if (is_array($exceptions)) { foreach ($exceptions as $except_datetime) { $ical_event['exdate'][] = $this->switch_date(date('Ymd\THis\Z', $except_datetime)); } } } $ical_events[] = $ical_event; } $ical[$vtype] = $ical_events; // iCals are by default utf-8 return $GLOBALS['phpgw']->translation->convert($this->build_ical($ical), $GLOBALS['phpgw']->translation->charset(), 'utf-8'); } function freebusy($params = False) { if (!$params) $params = $_GET; $user = is_numeric($params['user']) ? (int) $params['user'] : $GLOBALS['phpgw']->accounts->name2id($params['user']); $start = isset ($params['start']) ? $params['start'] : date('Ymd'); $end = isset ($params['end']) ? $params['end'] : (date('Y') + 1) . date('md'); $this->bo = CreateObject('calendar.bocalendar'); $events_per_day = $this->bo->store_to_cache(array ( 'owner' => $user, 'syear' => (int) substr($start, 0, 4), 'smonth' => (int) substr($start, 4, 2), 'sday' => (int) substr($start, 6, 2), 'eyear' => (int) substr($end, 0, 4), 'emonth' => (int) substr($end, 4, 2), 'eday' => (int) substr($end, 6, 2), 'no_doubles' => True, // report events only on the startday )); if (!is_array($events_per_day)) $events_per_day = array (); $ids = array (); foreach ($events_per_day as $day => $events) { foreach ($events as $event) { $ids[] = $event; } } $browser = CreateObject('phpgwapi.browser'); $browser->content_header($GLOBALS['phpgw']->accounts->id2name($user) . '.ifb', 'text/calendar'); echo $this->export(array ( 'vtype' => 'freebusy', 'l_event_id' => $ids, )); } function debug($str = '') { if ($this->debug_str) { //echo $str."
\n"; $log = fopen('/tmp/calendar.log', 'a') or die("nao foi possivel abrir o arquivo /tmp/calendar.log"); fwrite($log, $str . "\n"); fclose($log); } } function updateExParticipantState($cal_uid, $mail, $situation, $cn = false) { $db = $GLOBALS['phpgw']->db; $query = 'SELECT ex_participants FROM phpgw_cal WHERE uid = \'' . trim($cal_uid) . '\''; if (!$db->query($query)) return false; $row = $db->row(true); if (!$row) return false; include_once (dirname(__FILE__) . '/class.ex_participants.inc.php'); $exParticipants = new exParticipants(); $exParticipants->setParticipantsBySerializable($row['ex_participants']); $exParticipants->updateParticipant($mail, $situation, $cn); $query = 'UPDATE phpgw_cal SET ex_participants = \'' . $exParticipants->getParticipantsSerializable() . '\' WHERE uid = \'' . trim($cal_uid) . '\''; if (!$db->query($query)) return false; return true; } } ?>