steffen: server/kolab-resource-handlers/kolab-resource-handlers/resmgr resmgr.php, 1.44, 1.45

cvs at intevation.de cvs at intevation.de
Mon Nov 1 03:33:29 CET 2004


Author: steffen

Update of /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr
In directory doto:/tmp/cvs-serv22123/kolab-resource-handlers/kolab-resource-handlers/resmgr

Modified Files:
	resmgr.php 
Log Message:
recurrence stuff + versions

Index: resmgr.php
===================================================================
RCS file: /kolabrepository/server/kolab-resource-handlers/kolab-resource-handlers/resmgr/resmgr.php,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- resmgr.php	31 Oct 2004 13:05:24 -0000	1.44
+++ resmgr.php	1 Nov 2004 02:33:27 -0000	1.45
@@ -52,6 +52,7 @@
 require_once 'Horde/MIME/Structure.php';
 //include_once 'Horde/Kolab.php';
 require_once 'Horde/Text.php';
+require_once 'freebusy/recurrence.class.php';
 
 // Globals
 $imap = NULL;
@@ -62,6 +63,39 @@
 $suffix = '';
 $connected = false;
 
+/* Recurrence implementation for looking for
+   conflicts between an event and a freebusy list
+*/
+class ResmgrRecurrence extends Recurrence {
+  function ResmgrRecurrence() { 
+    $this->conflict = false;
+  }
+
+  function setBusy( $start, $end, $duration ) {
+    //myLog("ResmgrRecurrence::setBusy( $start, $end, $duration ), conflict=".$this->conflict, RM_LOG_DEBUG);
+    if( $this->conflict ) return;
+    if( is_null($end) ) $end = $start + $duration;
+    foreach ($this->busyperiods as $busyfrom => $busyto) {
+      if ( in_array(base64_decode($this->extraparams[$busyfrom]['X-UID']), $this->ignore) ||
+	   in_array(base64_decode($this->extraparams[$busyfrom]['X-SID']), $this->ignore) ) {
+	myLog("Ignoring $uid in fb check", RM_LOG_DEBUG);
+	continue;
+      }
+      if (($busyfrom >= $start && $busyfrom < $end) || ($start >= $busyfrom && $start < $busyto)) {
+	myLog('Request overlaps', RM_LOG_DEBUG);
+	$this->conflict = true;
+	break;
+      }
+    }
+  }
+
+  function hasConflict() { return $this->conflict; }
+
+  var $busyperiods;
+  var $extraparams;
+  var $ignore;
+  var $conflict;
+};
 
 function logInit($name = '')
 {
@@ -789,10 +823,11 @@
     return gmstrftime('%Y-%m-%dT%H:%M:%SZ', $ical_date);
 }
 
-function &buildKolabEvent()
+function &buildKolabEvent(&$itip)
 {
-    global $organiser, $itip, $resource, $uid, $sid;
+    global $organiser, $resource, $uid, $sid;
 
+    $recurrence = false;
     $kolab_xml = domxml_new_doc('1.0');
     $kolab_event = $kolab_xml->append_child($kolab_xml->create_element('event'));
     $kolab_event->set_attribute('version', '1.0');
@@ -878,7 +913,7 @@
 			   'TH' => 'thursday',
 			   'FR' => 'friday',
 			   'SA' => 'saturday',
-			   'SO' => 'sunday');
+			   'SU' => 'sunday');
 
       $rrule_list = split(';', $rrule_str);
       $rrule = array();
@@ -888,40 +923,61 @@
 	myLog('RRULE['.$k.']='.$v, RM_LOG_DEBUG);
       }
       $recur_node = $kolab_event->append_child($kolab_xml->create_element('recurrence'));
+      $recurrence =& new ResmgrRecurrence();
       $freq = strtolower($rrule['FREQ']);
       $recur_node->append_child( $kolab_xml->create_attribute( 'cycle', $freq ));
+      $recurrence->setCycletype( $freq );
+      $recurrence->setStartdate( $itip->getAttributeDefault('DTSTART', 0) );
+      $recurrence->setEnddate( $itip->getAttributeDefault('DTEND', 0) );
       switch( $freq ) {
       case 'daily':
 	break;
       case 'weekly':
 	$days = split(',', $rrule['BYDAY']);
+	$kdays = array();
 	foreach( $days as $day ) {
 	  $day_node = $recur_node->append_child( $kolab_xml->create_element( 'day'));	  
 	  $day_node->append_child($kolab_xml->create_text_node($kolab_days[$day]));
+	  $kdays[] = $kolab_days[$day];
 	}
+	$recurrence->setDay( $kdays );
+	break;
       case 'monthly':
 	if( $rrule['BYDAY'] ) {
 	  $recur_node->append_child( $kolab_xml->create_attribute( 'type', 'weekday' ));
+	  $recurrence->setType( 'weekday' );
 	  $wdays = split(',', $rrule['BYDAY']);
+	  $kdays = array();
+	  $kdaynumbers = array();
 	  foreach( $wdays as $wday ) {
 	    if( ereg('([+-]?[0-9])(.*)', $wday, $regs ) ) {
 	      $daynumber_node = $recur_node->append_child( $kolab_xml->create_element( 'daynumber'));
 	      $daynumber_node->append_child($kolab_xml->create_text_node( $regs[1] ));	      
 	      $day_node = $recur_node->append_child( $kolab_xml->create_element( 'day'));
 	      $day_node->append_child($kolab_xml->create_text_node( $kolab_days[$regs[2]] ));	      
+	      $kdaynumbers[] = $regs[1];
+	      $kdays[] = $kolab_days[$regs[2]];
 	    } else {
 	      $day_node = $recur_node->append_child( $kolab_xml->create_element( 'day'));
 	      $day_node->append_child($kolab_xml->create_text_node( $wday ));	      
+	      $kdays[] = $wday;
 	    }
-	  }	  
+	  }
+	  if( !empty($kdaynumbers) ) $recurrence->setDaynumber($kdaynumbers);
+	  $recurrence->setDay( $kday );
 	} else if( $rrule['BYMONTHDAY'] ) {
 	  $recur_node->append_child( $kolab_xml->create_attribute( 'type', 'daynumber' ));
+	  $recurrence->setType( 'daynumber' );
 	  $daynumbers = split(',', $rrule['BYMONTHDAY']);
+	  $kdaynumbers = array();
 	  foreach( $daynumbers as $daynumber ) {
 	    $daynumber_node = $recur_node->append_child( $kolab_xml->create_element( 'daynumber'));
 	    $daynumber_node->append_child($kolab_xml->create_text_node( $daynumber ));
+	    $kdaynumbers[] = $daynumber;
 	  }
+	  $recurrence->setDaynumber($kdaynumbers);
 	}
+	break;
       case 'yearly':
 	if( $rrule['BYDAY'] ) {
 	  // PENDING(steffen)
@@ -930,27 +986,33 @@
 	} else if( $rrule['BYYEARDAY'] ) {
 	  // PENDING(steffen)
 	}
+	break;
       default:
 	// Not supported
       }
       $interval_node = $recur_node->append_child( $kolab_xml->create_element( 'interval' ));
       $interval_node->append_child($kolab_xml->create_text_node($rrule['INTERVAL']));
+      $recurrence->setInterval( $rrule['INTERVAL']);
 
-      // PENDING(steffen): Implement ranges
       $range_node = $recur_node->append_child( $kolab_xml->create_element( 'range' ));
       if( $rrule['COUNT'] ) {
 	$range_node->append_child( $kolab_xml->create_attribute( 'type', 'number' ));      
 	$range_node->append_child($kolab_xml->create_text_node($rrule['COUNT']));
+	$recurrence->setRangetype('number');
+	$recurrence->setRange( $rrule['COUNT']);
       } else if( $rrule['UNTIL'] ) {
 	$range_node->append_child( $kolab_xml->create_attribute( 'type', 'date' ));      
 	$range_node->append_child($kolab_xml->create_text_node($rrule['UNTIL']));
+	$recurrence->setRangetype('date');
+	$recurrence->setRange( $rrule['UNTIL']);
       } else {
 	$range_node->append_child( $kolab_xml->create_attribute( 'type', 'none' ));      
+	$recurrence->setRangetype('none');
       }
     }
 
 
-    return $kolab_xml;
+    return array($kolab_xml,$recurrence);
 }
 
 
@@ -1079,6 +1141,7 @@
                 $updated_messages = array($updated_messages);
             }
         }
+        list($kolab_xml,$recurrence) = buildKolabEvent($itip);
 
         // Don't even bother checking free/busy info if RM_ACT_ALWAYS_ACCEPT
         // is specified
@@ -1098,10 +1161,17 @@
 
             // Check whether we are busy or not
             $busyperiods = $vfb->getBusyPeriods();
-            $conflict = false;
-
 	    $extraparams = $vfb->getExtraParams();
-            foreach ($busyperiods as $busyfrom => $busyto) {
+	    $conflict = false;	    
+	    if( $recurrence !== false ) {
+	      $recurrence->busyperiods =& $busyperiods;
+	      $recurrence->extraparams =& $extraparams;
+	      $recurrence->ignore = $ignore;
+	      myLog("Recurrence is ".print_r($recurrence,true), RM_LOG_DEBUG);
+	      $recurrence->expand( $vfbstart, $vfbend );
+	      $conflict = $recurrence->hasConflict();
+	    } else {	    
+	      foreach ($busyperiods as $busyfrom => $busyto) {
                 myLog('Busy period from ' . strftime('%a, %d %b %Y %H:%M:%S %z', $busyfrom) . ' to ' . strftime('%a, %d %b %Y %H:%M:%S %z', $busyto), RM_LOG_DEBUG);
 		if ( in_array(base64_decode($extraparams[$busyfrom]['X-UID']), $ignore) ||
 		     in_array(base64_decode($extraparams[$busyfrom]['X-SID']), $ignore) ) {
@@ -1109,11 +1179,12 @@
 		  continue;
 		}
                 if (($busyfrom >= $dtstart && $busyfrom < $dtend) || ($dtstart >= $busyfrom && $dtstart < $busyto)) {
-                    myLog('Request overlaps', RM_LOG_DEBUG);
-                    $conflict = true;
-		    break;
+		  myLog('Request overlaps', RM_LOG_DEBUG);
+		  $conflict = true;
+		  break;
                 }
-            }
+	      }
+	    }
 
             if ($conflict) {
                 if ($params['action'] == RM_ACT_MANUAL_IF_CONFLICTS) {
@@ -1135,8 +1206,6 @@
 
         myLog("Adding event $sid");
 
-        $kolab_xml = &buildKolabEvent();
-
         $message = &new MIME_Message();
 
         $kolabinfo = 'This is a Kolab Groupware object. To view this object you will need a client that understands the Kolab Groupware format. For a list of such clients please visit http:://www.kolab.org/kolab-clients.html';
@@ -1165,7 +1234,7 @@
             $message->toString(false)
         );
 
-        myLog("Appending message to $fullmbox", RM_LOG_DEBUG);
+        myLog("Appending message to $mcalbox", RM_LOG_DEBUG);
         $rc = $imap->appendMessage($message);
 	if( PEAR::isError($rc) ) {
 	  myLog("Error appending message: ".$rc->getMessage(), RM_LOG_ERROR);





More information about the commits mailing list