Пример #1
0
 function PHPTest()
 {
     $result = '';
     $start = microtime(true);
     $rule = new RepeatRule($this->dtstart, $this->recur);
     $i = 0;
     while ($date = $rule->next()) {
         if ($i++ % 4 == 0) {
             $result .= "\n";
         }
         $result .= "   " . $date->format('Y-m-d H:i:s');
         if ($i >= $this->result_limit) {
             break;
         }
     }
     $this->PHP_time = microtime(true) - $start;
     return $result;
 }
Пример #2
0
/**
* Expand the event instances for an RRULE property
*
* @param object $dtstart A RepeatRuleDateTime which is the master dtstart
* @param string $property RDATE or EXDATE, depending...
* @param array $component A vComponent which is a VEVENT, VTODO or VJOURNAL
* @param array $range_end A date after which we care less about expansion
*
* @return array An array keyed on the UTC dates, referring to the component
*/
function rrule_expand($dtstart, $property, $component, $range_end, $is_date = null, $return_floating_times = false)
{
    $expansion = array();
    $recur = $component->GetProperty($property);
    if (!isset($recur)) {
        return $expansion;
    }
    $recur = $recur->Value();
    $this_start = $component->GetProperty('DTSTART');
    if (isset($this_start)) {
        $this_start = new RepeatRuleDateTime($this_start);
    } else {
        $this_start = clone $dtstart;
    }
    if ($return_floating_times) {
        $this_start->setAsFloat();
    }
    //  if ( DEBUG_RRULE ) print_r( $this_start );
    if (DEBUG_RRULE) {
        printf("RRULE: %s (floating: %s)\n", $recur, $return_floating_times ? "yes" : "no");
    }
    $rule = new RepeatRule($this_start, $recur, $is_date, $return_floating_times);
    $i = 0;
    $result_limit = 1000;
    while ($date = $rule->next($return_floating_times)) {
        //    if ( DEBUG_RRULE ) printf( "[%3d] %s\n", $i, $date->UTC() );
        $expansion[$date->FloatOrUTC($return_floating_times)] = $component;
        if ($i++ >= $result_limit || $date > $range_end) {
            break;
        }
    }
    //  if ( DEBUG_RRULE ) print_r( $expansion );
    return $expansion;
}
Пример #3
0
/**
* Expand the event instances for an RRULE property
*
* @param object $dtstart A RepeatRuleDateTime which is the master dtstart
* @param string $property RDATE or EXDATE, depending...
* @param array $component A vComponent which is a VEVENT, VTODO or VJOURNAL
* @param array $range_end A date after which we care less about expansion
*
* @return array An array keyed on the UTC dates, referring to the component
*/
function rrule_expand($dtstart, $property, $component, $range_end)
{
    $expansion = array();
    $recur = $component->GetProperty($property);
    if (!isset($recur)) {
        return $expansion;
    }
    $recur = $recur->Value();
    $this_start = $component->GetProperty('DTSTART');
    if (isset($this_start)) {
        $timezone = $this_start->GetParameterValue('TZID');
        $this_start = new RepeatRuleDateTime($this_start->Value(), $timezone);
    } else {
        $this_start = clone $dtstart;
    }
    //  print_r( $this_start );
    //  printf( "RRULE: %s\n", $recur );
    $rule = new RepeatRule($this_start, $recur);
    $i = 0;
    $result_limit = 1000;
    while ($date = $rule->next()) {
        //    printf( "[%3d] %s\n", $i, $date->UTC() );
        $expansion[$date->UTC()] = $component;
        if ($i++ >= $result_limit || $date > $range_end) {
            break;
        }
    }
    //  print_r( $expansion );
    return $expansion;
}
Пример #4
0
/**
* Expand the instances for a STANDARD or DAYLIGHT component of a VTIMEZONE 
*
* @param object $vResource is a VCALENDAR with a VTIMEZONE containing components needing expansion
* @param object $range_start A RepeatRuleDateTime which is the beginning of the range for events.
* @param object $range_end A RepeatRuleDateTime which is the end of the range for events.
* @param int $offset_from The offset from UTC in seconds at the onset time.
*
* @return array of onset datetimes with UTC from/to offsets
*/
function expand_timezone_onsets(vCalendar $vResource, RepeatRuleDateTime $range_start, RepeatRuleDateTime $range_end)
{
    global $c;
    $vtimezones = $vResource->GetComponents();
    $vtz = $vtimezones[0];
    $components = $vtz->GetComponents();
    $instances = array();
    $dtstart = null;
    $is_date = false;
    $has_repeats = false;
    $zone_tz = $vtz->GetPValue('TZID');
    foreach ($components as $k => $comp) {
        if (DEBUG_EXPAND) {
            printf("Starting TZ expansion for component '%s' in timezone '%s'\n", $comp->GetType(), $zone_tz);
            foreach ($instances as $k => $v) {
                print ' : ' . $k;
            }
            print "\n";
        }
        $dtstart_prop = $comp->GetProperty('DTSTART');
        if (!isset($dtstart_prop)) {
            continue;
        }
        $dtstart = new RepeatRuleDateTime($dtstart_prop);
        $dtstart->setTimeZone('UTC');
        $offset_from = $comp->GetPValue('TZOFFSETFROM');
        $offset_from = $offset_from / 100 * 3600 + abs($offset_from) % 100 * 60 * ($offset_from < 0 ? -1 : 0);
        $offset_from *= -1;
        $offset_from = "{$offset_from} seconds";
        dbg_error_log('tz/update', "%s of offset\n", $offset_from);
        $dtstart->modify($offset_from);
        $is_date = $dtstart->isDate();
        $instances[$dtstart->UTC('Y-m-d\\TH:i:s\\Z')] = $comp;
        $rrule = $comp->GetProperty('RRULE');
        $has_repeats = isset($rrule);
        if (!$has_repeats) {
            continue;
        }
        $recur = $comp->GetProperty('RRULE');
        if (isset($recur)) {
            $recur = $recur->Value();
            $this_start = clone $dtstart;
            $rule = new RepeatRule($this_start, $recur, $is_date);
            $i = 0;
            $result_limit = 1000;
            while ($date = $rule->next()) {
                $instances[$date->UTC('Y-m-d\\TH:i:s\\Z')] = $comp;
                if ($i++ >= $result_limit || $date > $range_end) {
                    break;
                }
            }
            if (DEBUG_EXPAND) {
                print "After rrule_expand";
                foreach ($instances as $k => $v) {
                    print ' : ' . $k;
                }
                print "\n";
            }
        }
        $properties = $comp->GetProperties('RDATE');
        if (count($properties)) {
            foreach ($properties as $p) {
                $timezone = $p->GetParameterValue('TZID');
                $rdate = $p->Value();
                $rdates = explode(',', $rdate);
                foreach ($rdates as $k => $v) {
                    $rdate = new RepeatRuleDateTime($v, $timezone, $is_date);
                    if ($return_floating_times) {
                        $rdate->setAsFloat();
                    }
                    $instances[$rdate->UTC('Y-m-d\\TH:i:s\\Z')] = $comp;
                    if ($rdate > $range_end) {
                        break;
                    }
                }
            }
            if (DEBUG_EXPAND) {
                print "After rdate_expand";
                foreach ($instances as $k => $v) {
                    print ' : ' . $k;
                }
                print "\n";
            }
        }
    }
    ksort($instances);
    $onsets = array();
    $start_utc = $range_start->UTC('Y-m-d\\TH:i:s\\Z');
    $end_utc = $range_end->UTC('Y-m-d\\TH:i:s\\Z');
    foreach ($instances as $utc => $comp) {
        if ($utc > $end_utc) {
            if (DEBUG_EXPAND) {
                printf("We're done: {$utc} is out of the range.\n");
            }
            break;
        }
        if ($utc < $start_utc) {
            continue;
        }
        $onsets[$utc] = array('from' => $comp->GetPValue('TZOFFSETFROM'), 'to' => $comp->GetPValue('TZOFFSETTO'), 'name' => $comp->GetPValue('TZNAME'), 'type' => $comp->GetType());
    }
    return $onsets;
}