You are here

function date_ical_import in Date 5

Same name in this branch
  1. 5 date_api_ical.inc \date_ical_import()
  2. 5 date_ical.inc \date_ical_import()
Same name and namespace in other branches
  1. 5.2 date_api_ical.inc \date_ical_import()
  2. 6.2 date_api_ical.inc \date_ical_import()
  3. 6 date_api_ical.inc \date_ical_import()
  4. 7.3 date_api/date_api_ical.inc \date_ical_import()
  5. 7 date_api/date_api_ical.inc \date_ical_import()
  6. 7.2 date_api/date_api_ical.inc \date_ical_import()

Given the location of a valid iCalendar file, will return an array of event information

Parameters

$filename: Location (local or remote) of a valid iCalendar file

Return value

An array of associative arrays where 'start' => Unix timestamp (GMT) of start time 'end' => Unix timestamp (GMT) of end time 'allday_start' => Start date of all-day event in YYYYMMDD format 'allday_end' => End date of all-day event in YYYYMMDD format 'summary' => Title of event 'description' => Description of event 'location' => Location of event 'uid' => ID of the event in calendaring program 'url' => URL of event information * 'start_raw' => the raw start date supplied in the ical file, 'start_timezone' => the timezone of the start date, 'start_offset' => the offset of the start date, 'end_raw' => the raw end date supplied in the ical file, 'end_timezone' => the timezone of the end date, 'end_offset' => the offset of the end date, 'vcal' => the complete vevent item,

2 calls to date_ical_import()
date_copy_import_ical_form_submit in ./date_copy.module
date_copy_import_ical_form_validate in ./date_copy.module
iCal import processing.

File

./date_ical.inc, line 104

Code

function date_ical_import($filename) {
  $items = array();

  // Fetch the iCal data. If file is a URL, use drupal_http_request. fopen
  // isn't always configured to allow network connections.
  if (substr($filename, 0, 4) == 'http') {

    // Fetch the ical data from the specified network location
    $icaldatafetch = drupal_http_request($filename);

    // Check the return result
    if ($icaldatafetch->error) {
      drupal_set_message('Request Error: ' . $icaldatafetch->error, 'error');
      return array();
    }

    // Break the return result into one array entry per lines
    $icaldatafolded = explode("\n", $icaldatafetch->data);
  }
  else {
    $icaldatafolded = @file($filename, FILE_IGNORE_NEW_LINES);
    if ($icaldatafolded === FALSE) {
      drupal_set_message('Failed to open file: ' . $filename, 'error');
      return array();
    }
  }

  // Verify this is iCal data
  if (trim($icaldatafolded[0]) != 'BEGIN:VCALENDAR') {
    drupal_set_message('Invalid calendar file:' . $filename, 'error');
    return array();
  }

  // "unfold" wrapped lines
  $icaldata = array();
  foreach ($icaldatafolded as $line) {
    if (substr($line, 0, 1) == ' ') {
      $line = array_pop($icaldata) . substr($line, 1);
    }
    $icaldata[] = $line;
  }
  $icaldatafolded = NULL;

  // Parse the iCal information
  foreach ($icaldata as $line) {
    $line = trim($line);
    $vcal .= $line . "\n";
    switch ($line) {
      case 'BEGIN:VEVENT':
        unset($start_unixtime, $start_date, $start_time, $end_unixtime, $end_date, $end_time, $allday_start, $allday_end, $the_duration, $uid, $summary, $description, $url, $location, $start_tz, $end_tz, $start_raw, $end_raw, $start_offset, $end_offset, $vcal);
        $vcal = $line . "\n";
        break;
      case 'END:VEVENT':
        if (empty($uid)) {
          $uid = $uid_counter;
          $uid_counter++;
        }
        if (empty($end_unixtime) && isset($the_duration)) {
          $end_unixtime = $start_unixtime + $the_duration;
          $end_time = date('Hi', $end_unixtime);
        }
        $items[$uid] = array(
          'start' => $start_unixtime,
          'end' => $end_unixtime,
          'allday_start' => $allday_start,
          'allday_end' => $allday_end,
          'summary' => $summary,
          'description' => $description,
          'location' => $location,
          'url' => $url,
          'uid' => $uid,
          'start_raw' => $start_raw,
          'start_timezone' => $start_tz,
          'start_offset' => $start_offset,
          'end_raw' => $end_raw,
          'end_timezone' => $end_tz,
          'end_offset' => $end_offset,
          'vcal' => $vcal,
        );
        break;
      default:
        unset($field, $data, $prop_pos, $property);
        ereg("([^:]+):(.*)", $line, $line);
        $field = $line[1];
        $data = $line[2];
        $property = $field;
        $prop_pos = strpos($property, ';');
        if ($prop_pos !== false) {
          $property = substr($property, 0, $prop_pos);
        }
        $property = strtoupper($property);
        switch ($property) {
          case 'DTSTART':
            $zulu_time = false;
            if (substr($data, -1) == 'Z') {
              $zulu_time = true;
            }
            $data = str_replace('T', '', $data);
            $data = str_replace('Z', '', $data);
            $field = str_replace(';VALUE=DATE-TIME', '', $field);
            if (preg_match("/^DTSTART;VALUE=DATE/i", $field) || ereg('^([0-9]{4})([0-9]{2})([0-9]{2})$', $data)) {
              ereg('([0-9]{4})([0-9]{2})([0-9]{2})', $data, $dtstart_check);
              $allday_start = $data;
              $start_date = $allday_start;
              $start_unixtime = strtotime($data);
            }
            else {
              if (preg_match("/^DTSTART;TZID=/i", $field)) {
                $tz_tmp = explode('=', $field);
                $tz_dtstart = $tz_tmp[1];
                unset($tz_tmp);
              }
              elseif ($zulu_time) {
                $tz_dtstart = 'GMT';
              }
              preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})/', $data, $regs);
              $start_date = $regs[1] . $regs[2] . $regs[3];
              $start_time = $regs[4] . $regs[5];
              $start_unixtime = gmmktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]);
              $dlst = date('I', $start_unixtime);
              $server_offset_tmp = _date_ical_chooseOffset($start_unixtime, 'Same as Server');
              if (isset($tz_dtstart)) {
                if ($tz = _date_ical_tz($tz_dtstart)) {
                  $offset_tmp = date('I', $start_unixtime) ? _date_ical_calcString($tz->offset_dst) : _date_ical_calcString($tz->offset);
                }
                else {
                  $offset_tmp = '+0000';
                }
              }
              else {
                if (isset($calendar_tz)) {
                  if ($tz = _date_ical_tz($calendar_tz)) {
                    $offset_tmp = date('I', $start_unixtime) ? _date_ical_calcString($tz->offset_dst) : _date_ical_calcString($tz->offset);
                  }
                  else {
                    $offset_tmp = '+0000';
                  }
                }
                else {
                  $offset_tmp = $server_offset_tmp;
                }
              }
              $start_unixtime = _date_ical_calcTime($offset_tmp, $server_offset_tmp, $start_unixtime);
              $start_date = gmdate('Ymd', $start_unixtime);
              $start_time = gmdate('Hi', $start_unixtime);
              $start_offset = $offset_tmp;
              $start_tz = $tz_dtstart;
              $start_raw = $data;
              unset($server_offset_tmp, $offset_tmp, $tz_dtstart);
            }
            break;
          case 'DTEND':
            $zulu_time = false;
            if (substr($data, -1) == 'Z') {
              $zulu_time = true;
            }
            $data = str_replace('T', '', $data);
            $data = str_replace('Z', '', $data);
            $field = str_replace(';VALUE=DATE-TIME', '', $field);
            if (preg_match("/^DTEND;VALUE=DATE/i", $field) || ereg('^([0-9]{4})([0-9]{2})([0-9]{2})$', $data)) {
              $allday_end = $data;
              $end_date = $allday_end;
              $end_unixtime = strtotime($data);
            }
            else {
              if (preg_match("/^DTEND;TZID=/i", $field)) {
                $tz_tmp = explode('=', $field);
                $tz_dtend = $tz_tmp[1];
                unset($tz_tmp);
              }
              elseif ($zulu_time) {
                $tz_dtend = 'GMT';
              }
              preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})/', $data, $regs);
              $end_date = $regs[1] . $regs[2] . $regs[3];
              $end_time = $regs[4] . $regs[5];
              $end_unixtime = gmmktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]);
              $server_offset_tmp = _date_ical_chooseOffset($end_unixtime, 'Same as Server');
              if (isset($tz_dtend)) {
                if ($tz = _date_ical_tz($tz_dtend)) {
                  $offset_tmp = date('I', $end_unixtime) ? _date_ical_calcString($tz->offset_dst) : _date_ical_calcString($tz->offset);
                }
                else {
                  $offset_tmp = '+0000';
                }
              }
              else {
                if (isset($calendar_tz)) {
                  if ($tz = _date_ical_tz($calendar_tz)) {
                    $offset_tmp = date('I', $end_unixtime) ? _date_ical_calcString($tz->offset_dst) : _date_ical_calcString($tz->offset);
                  }
                  else {
                    $offset_tmp = '+0000';
                  }
                }
                else {
                  $offset_tmp = $server_offset_tmp;
                }
              }
              $end_unixtime = _date_ical_calcTime($offset_tmp, $server_offset_tmp, $end_unixtime);
              $end_date = gmdate('Ymd', $end_unixtime);
              $end_time = gmdate('Hi', $end_unixtime);
              $end_offset = $offset_tmp;
              $end_tz = $tz_dtend;
              $end_raw = $data;
              unset($server_offset_tmp, $offset_tmp, $tz_dtend);
            }
            break;
          case 'DURATION':
            if (!stristr($field, '=DURATION')) {
              ereg('^P([0-9]{1,2}[W])?([0-9]{1,2}[D])?([T]{0,1})?([0-9]{1,2}[H])?([0-9]{1,2}[M])?([0-9]{1,2}[S])?', $data, $duration);
              $weeks = str_replace('W', '', $duration[1]);
              $days = str_replace('D', '', $duration[2]);
              $hours = str_replace('H', '', $duration[4]);
              $minutes = str_replace('M', '', $duration[5]);
              $seconds = str_replace('S', '', $duration[6]);
              $the_duration = $weeks * 60 * 60 * 24 * 7 + $days * 60 * 60 * 24 + $hours * 60 * 60 + $minutes * 60 + $seconds;
            }
            break;
          case 'SUMMARY':
            $summary = $data;
            break;
          case 'DESCRIPTION':
            $description = $data;
            break;
          case 'UID':
            $uid = $data;
            break;
          case 'X-WR-CALNAME':
            $actual_calname = $data;
            break;
          case 'X-WR-TIMEZONE':
            $calendar_tz = $data;
            break;
          case 'LOCATION':
            $location = $data;
            break;
          case 'URL':
            $url = $data;
            break;
        }
    }
  }
  return $items;
}