steffen: server/kolab-resource-handlers/kolab-resource-handlers/freebusy recurrence.class.php, NONE, 1.1 freebusy.class.php, 1.16, 1.17
cvs at intevation.de
cvs at intevation.de
Sun Oct 31 22:02:21 CET 2004
Author: steffen
Update of /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/freebusy
In directory doto:/tmp/cvs-serv31402/kolab-resource-handlers/freebusy
Modified Files:
freebusy.class.php
Added Files:
recurrence.class.php
Log Message:
refactored recurrence handling into a separate class
--- NEW FILE: recurrence.class.php ---
<?php
/**
* Class for recurring event calculation
*
* Usage: Subclass and implement setBusy(...),
* Instantiate, call setter methods to fill
* in data, then call expand() to expand the
* recurrence. This will cause setBusy() to be
* called for each busy period
*/
/*abstract*/ class Recurrence {
/* public: */
function Recurrence() {}
function setStartDate( $ts ) { $this->initial_start = $ts; }
function setEndDate( $ts ) { $this->initial_end = $ts; }
function setCycletype( $ctype ) { $this->cycle_type = $ctype; }
function setType( $type ) { $this->type = $type; }
function setInterval( $interval ) { $this->interval = $interval; }
function setDaynumber( $num ) { $this->daynumber = $num; }
function setDay( $day ) { $this->day = $day; }
function setMonth( $month ) { $this->month = $month; }
function setRangetype( $type ) { $this->range_type = $type; }
function setRange( $range ) { $this->range = $range; }
function expand( $startstamp, $endstamp ) {
$duration = $this->initial_end-$this->initial_start;
myLog( "Recurring event ".$summary." recurring cycle ".$rec['cycle'], RM_LOG_DEBUG );
switch( $this->cycle_type ) {
case 'daily':
// Daily recurrence, every 'interval' days
$count = 0;
for( $t = $this->initial_start; $t < $endstamp; $t = strtotime( '+'.$this->interval.' days',$t) ) {
myLog("Adding recurrence $t -> ".($t+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $t, null, $duration, $extra);
$this->setBusy( $t, null, $duration );
$count++;
if( $this->range_type == 'number' && $count > $this->range ) {
break;
} else if( $this->range_type == 'date' && $t > strtotime( '+1 day',$this->range ) ) {
break;
}
}
break;
case 'weekly':
// Weekly recurrence, every 'interval' weeks on 'day' days
if( !$this->interval ) $this->interval = 1;
$count = 0;
for( $t = $this->initial_start; $t < $endstamp; $t = strtotime( "+$interval weeks", $t) ) {
foreach( $this->day as $day ) {
$tmp = strtotime( $day, $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
if( $this->range_type == 'number' && $count > $this->range ) {
break;
} else if( $this->range_type == 'date' && $t > strtotime( '+1 day',$this->range ) ) {
break;
}
}
case 'monthly':
// Weekly recurrence, every 'interval' weeks
if( !$this->interval ) $this->interval = 1;
$count = 0;
for( $t = $this->initial_start; $t < $endstamp; $t = strtotime( "+$interval months", $t) ) {
if( $this->type == 'daynumber') {
// On numbered days
foreach( $this->daynumber as $dayno ) {
$tmp = strtotime( "+$dayno days", $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
} else if( $this->type == 'weekday' ) {
// On named weekdays
for( $i = 0; $i < count($this->daynumber); $i++ ) {
$dayno = $this->daynumber[$i];
$wday = $this->day[$i];
$tmp = strtotime( "+$dayno $wday", $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
}
if( $this->range_type == 'number' && $count > $this->range ) {
break;
} else if( $this->range_type == 'date' && $t > strtotime( '+1 day',$this->range ) ) {
break;
}
}
case 'yearly':
if( !$this->interval ) $interval = 1;
$count = 0;
for( $t = $this->initial_start; $t < $endstamp; $t = strtotime( "+$interval years", $t) ) {
if( $this->type == 'yearday') {
foreach( $this->daynumber as $dayno ) {
$tmp = strtotime( "+$dayno days", $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
} else if( $this->type == 'monthday' ) {
for( $i = 0; $i < count($this->daynumber); $i++ ) {
$dayno = $this->daynumber[$i];
$month = $this->month[$i];
$tmp = strtotime( "+$dayno $month", $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
} else if( $this->type == 'weekday' ) {
for( $i = 0; $i < count($this->daynumber); $i++ ) {
$dayno = $this->daynumber[$i];
$wday = $this->day[$i];
$tmp = strtotime( "+$dayno $wday", $t);
if( $tmp < $endstamp ) {
myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
//$vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
$this->setBusy( $tmp, null, $duration );
} else {
break;
}
}
$count++;
}
if( $this->range_type == 'number' && $count > $this->range ) {
break;
} else if( $this->range_type == 'date' && $t > strtotime( '+1 day',$this->range ) ) {
break;
}
}
}
}
/* Abstract function, please override */
function setBusy( $start, $end, $duration ) {
echo "Warning: Abstract method Recurrence::setBusy( $start, $end, $duration ) called\n";
}
var $initial_start = NULL; // timestamp
var $initial_end = NULL; // timestamp
var $cycle_type = NULL; // string { 'daily', 'weekly', 'monthly', 'yearly'
var $type = NULL; // string { 'daynumber', 'weekday', 'monthday', 'yearday' }
var $interval = NULL; // int
var $daynumber = NULL; // array(int)
var $day = NULL; // array(string)
var $month = NULL; // array(int)
var $range_type = NULL; // string { 'number', 'date' }
var $range = NULL; // int or timestamp
};
?>
Index: freebusy.class.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/freebusy/freebusy.class.php,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- freebusy.class.php 31 Oct 2004 13:05:24 -0000 1.16
+++ freebusy.class.php 31 Oct 2004 21:02:19 -0000 1.17
@@ -1,5 +1,21 @@
<?php
+require_once 'freebusy/recurrence.class.php';
+
+class FreeBusyRecurrence extends Recurrence {
+ function FreeBusyRecurrence( &$vfb, &$extra ) {
+ $this->vfb =& $vfb;
+ $this->extra =& $extra;
+ }
+
+ function setBusy( $start, $end, $duration ) {
+ $this->vfb->addBusyPeriod('BUSY', $start, null, $duration, $this->extra);
+ }
+
+ var $vfb;
+ var $extra;
+};
+
class FreeBusy {
function FreeBusy( $username,
$password,
@@ -133,144 +149,26 @@
$extra['X-SID'] = base64_encode($event['scheduling-id']);
}
- // PENDING(steffen): Implement this!
if( array_key_exists( 'recurrence', $event ) ) {
- // We have a recurring event
$rec = $event['recurrence'];
- $duration = $initial_end-$initial_start;
+ $recurrence =& new FreeBusyRecurrence( $vFb, $extra );
+ $recurrence->setStartDate( $initial_start );
+ $recurrence->setEndDate( $initial_end );
+ $recurrence->setCycletype( $rec['cycle'] );
+ if( isset($rec['type']) ) $recurrence->setType( $rec['type'] );
+ $recurrence->setInterval( (int)$rec['interval'] );
+ $recurrence->setDaynumber( $rec['daynumber'] );
+ $recurrence->setDay( $rec['day'] );
+ $recurrence->setMonth( $rec['month'] );
$rangetype = $rec['rangetype'];
if( $rangetype == 'number' ) {
$range = (int)$rec['range'];
} else if( $rangetype == 'date' ) {
$range = $this->parseDateTime( $rec['range'] );
}
- myLog( "Recurring event ".$summary." recurring cycle ".$rec['cycle'], RM_LOG_DEBUG );
- switch( $rec['cycle'] ) {
- case 'daily':
- // Daily recurrence, every 'interval' days
- $count = 0;
- for( $t = $initial_start; $t < $endstamp; $t = strtotime( '+'.$rec['interval'].' days',$t) ) {
- myLog("Adding recurrence $t -> ".($t+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $t, null, $duration, $extra);
- $count++;
- if( $rangetype == 'number' && $count > $range ) {
- break;
- } else if( $rangetype == 'date' && $t > strtotime( '+1 day',$range ) ) {
- break;
- }
- }
- break;
- case 'weekly':
- // Weekly recurrence, every 'interval' weeks on 'day' days
- $interval = (int)$rec['interval'];
- if( !$interval ) $interval = 1;
- $count = 0;
- for( $t = $initial_start; $t < $endstamp; $t = strtotime( "+$interval weeks", $t) ) {
- foreach( $rec['day'] as $day ) {
- $tmp = strtotime( $day, $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- if( $rangetype == 'number' && $count > $range ) {
- break;
- } else if( $rangetype == 'date' && $t > strtotime( '+1 day',$range ) ) {
- break;
- }
- }
- case 'monthly':
- // Weekly recurrence, every 'interval' weeks
- $interval = (int)$rec['interval'];
- if( !$interval ) $interval = 1;
- $count = 0;
- for( $t = $initial_start; $t < $endstamp; $t = strtotime( "+$interval months", $t) ) {
- if( $rec['type'] == 'daynumber') {
- // On numbered days
- foreach( $rec['daynumber'] as $dayno ) {
- $tmp = strtotime( "+$dayno days", $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- } else if( $rec['type'] == 'weekday' ) {
- // On named weekdays
- for( $i = 0; $i < count($rec['daynumber']); $i++ ) {
- $dayno = $rec['daynumber'][$i];
- $wday = $rec['day'][$i];
- $tmp = strtotime( "+$dayno $wday", $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- }
- if( $rangetype == 'number' && $count > $range ) {
- break;
- } else if( $rangetype == 'date' && $t > strtotime( '+1 day',$range ) ) {
- break;
- }
- }
- case 'yearly':
- $interval = (int)$rec['interval'];
- if( !$interval ) $interval = 1;
- $count = 0;
- for( $t = $initial_start; $t < $endstamp; $t = strtotime( "+$interval years", $t) ) {
- if( $rec['type'] == 'yearday') {
- foreach( $rec['daynumber'] as $dayno ) {
- $tmp = strtotime( "+$dayno days", $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- } else if( $rec['type'] == 'monthday' ) {
- for( $i = 0; $i < count($rec['daynumber']); $i++ ) {
- $dayno = $rec['daynumber'][$i];
- $month = $rec['month'][$i];
- $tmp = strtotime( "+$dayno $month", $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- } else if( $rec['type'] == 'weekday' ) {
- for( $i = 0; $i < count($rec['daynumber']); $i++ ) {
- $dayno = $rec['daynumber'][$i];
- $wday = $rec['day'][$i];
- $tmp = strtotime( "+$dayno $wday", $t);
- if( $tmp < $endstamp ) {
- myLog("Adding recurrence $tmp -> ".($tmp+$duration), RM_LOG_DEBUG );
- $vFb->addBusyPeriod('BUSY', $tmp, null, $duration, $extra);
- } else {
- break;
- }
- }
- $count++;
- }
- if( $rangetype == 'number' && $count > $range ) {
- break;
- } else if( $rangetype == 'date' && $t > strtotime( '+1 day',$range ) ) {
- break;
- }
- }
- }
+ $recurrence->setRangetype( $rangetype );
+ $recurrence->setRange( $range );
+ $recurrence->expand( $startstamp, $endstamp );
} else {
// Normal event
More information about the commits
mailing list