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