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