From 79b1279028c249f99c91c91e5b32ca4491ce4cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Thu, 30 Jul 2009 20:52:13 +0000 Subject: [PATCH] Fixes Export of Yearly Recurring Events and eGW Coding Standards --- calendar/inc/class.calendar_sif.inc.php | 216 ++++++++++++++---------- 1 file changed, 126 insertions(+), 90 deletions(-) diff --git a/calendar/inc/class.calendar_sif.inc.php b/calendar/inc/class.calendar_sif.inc.php index a71b0658cf..c66d4d217f 100644 --- a/calendar/inc/class.calendar_sif.inc.php +++ b/calendar/inc/class.calendar_sif.inc.php @@ -11,7 +11,7 @@ * @version $Id$ */ -require_once EGW_SERVER_ROOT.'/phpgwapi/inc/horde/Horde/iCalendar.php'; +require_once EGW_SERVER_ROOT.'/phpgwapi/inc/horde/lib/core.php'; /** * SIF Parser for SyncML @@ -84,22 +84,27 @@ class calendar_sif extends calendar_boupdate const xml_decl = ''; const SIF_decl = '1.1'; - function startElement($_parser, $_tag, $_attributes) { + function startElement($_parser, $_tag, $_attributes) + { } - function endElement($_parser, $_tag) { + function endElement($_parser, $_tag) + { //error_log('endElem: ' . $_tag .' => '. trim($this->sifData)); - if(!empty($this->sifMapping[$_tag])) { + if(!empty($this->sifMapping[$_tag])) + { $this->event[$this->sifMapping[$_tag]] = trim($this->sifData); } unset($this->sifData); } - function characterData($_parser, $_data) { + function characterData($_parser, $_data) + { $this->sifData .= $_data; } - function siftoegw($sifData) { + function siftoegw($sifData) + { $vcal = new Horde_iCalendar; $finalEvent = array(); $sysCharSet = $GLOBALS['egw']->translation->charset(); @@ -117,7 +122,8 @@ class calendar_sif extends calendar_boupdate xml_set_element_handler($this->xml_parser, "startElement", "endElement"); xml_set_character_data_handler($this->xml_parser, "characterData"); $this->strXmlData = xml_parse($this->xml_parser, $sifData); - if(!$this->strXmlData) { + if (!$this->strXmlData) + { error_log(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); @@ -125,13 +131,16 @@ class calendar_sif extends calendar_boupdate } #error_log(print_r($this->event, true)); - foreach($this->event as $key => $value) { + foreach ($this->event as $key => $value) + { $value = preg_replace('/<\!\[CDATA\[(.+)\]\]>/Usim', '$1', $value); $value = $GLOBALS['egw']->translation->convert($value, 'utf-8', $sysCharSet); #error_log("$key => $value"); - switch($key) { + switch ($key) + { case 'alldayevent': - if($value == 1) { + if ($value == 1) + { $finalEvent['whole_day'] = true; $startParts = explode('-',$this->event['start']); $finalEvent['start']['hour'] = $finalEvent['start']['minute'] = $finalEvent['start']['second'] = 0; @@ -153,26 +162,31 @@ class calendar_sif extends calendar_boupdate break; case 'category': - if(!empty($value)) { + if (!empty($value)) + { $finalEvent[$key] = implode(',',$this->find_or_add_categories(explode(';', $value))); } break; case 'end': case 'start': - if($this->event['alldayevent'] < 1) { + if ($this->event['alldayevent'] < 1) + { $finalEvent[$key] = $vcal->_parseDateTime($value); error_log("event ".$key." val=".$value.", parsed=".$finalEvent[$key]); } break; case 'isrecurring': - if($value == 1) { + if ($value == 1) + { $finalEvent['recur_interval'] = $this->event['recur_interval']; - if($this->event['recur_noenddate'] == 0) { + if ($this->event['recur_noenddate'] == 0) + { $finalEvent['recur_enddate'] = $vcal->_parseDateTime($this->event['recur_enddate']); } - switch($this->event['recur_type']) { + switch ($this->event['recur_type']) + { case self::olRecursDaily: $finalEvent['recur_type'] = MCAL_RECUR_DAILY; break; @@ -199,11 +213,12 @@ class calendar_sif extends calendar_boupdate break; case 'priority': - $finalEvent[$key] = $value+1; + $finalEvent[$key] = $value + 1; break; case 'reminderset': - if($value == 1) { + if ($value == 1) + { $finalEvent['alarm'] = $this->event['reminderstart']; } break; @@ -217,7 +232,8 @@ class calendar_sif extends calendar_boupdate break; case 'description': - if (preg_match('/\s*\[UID:(.+)?\]/Usm', $value, $matches)) { + if (preg_match('/\s*\[UID:(.+)?\]/Usm', $value, $matches)) + { $finalEvent['uid'] = $matches[1]; } @@ -239,7 +255,7 @@ class calendar_sif extends calendar_boupdate { $result = false; - if($event = $this->siftoegw($_sifdata)) + if ($event = $this->siftoegw($_sifdata)) { if ($contentID) { $event['id'] = $contentID; @@ -266,35 +282,43 @@ class calendar_sif extends calendar_boupdate #error_log('ABID: '.$_abID); #error_log(base64_decode($_sifdata)); - if(!$event = $this->siftoegw($_sifdata)) { + if (!$event = $this->siftoegw($_sifdata)) + { return false; } - if(isset($event['alarm'])) { + if (isset($event['alarm'])) + { $alarm = $event['alarm']; unset($event['alarm']); } - if($_calID > 0) { + if ($_calID > 0) + { // update entry $event['id'] = $_calID; - } else { + } + else + { if (isset($event['whole_day']) && $event['whole_day'] && isset ($deviceInfo) && is_array($deviceInfo) && isset($deviceInfo['nonBlockingAllday']) - && $deviceInfo['nonBlockingAllday']) { + && $deviceInfo['nonBlockingAllday']) + { $event['non_blocking'] = '1'; } } - if($eventID = $this->update($event, TRUE)) { + if ($eventID = $this->update($event, TRUE)) + { $updatedEvent = $this->read($eventID); - foreach($updatedEvent['alarm'] as $alarmID => $alarmData) + foreach ($updatedEvent['alarm'] as $alarmID => $alarmData) { $this->delete_alarm($alarmID); } - if(isset($alarm)) { + if (isset($alarm)) + { $alarmData['time'] = $event['start'] - ($alarm*60); $alarmData['offset'] = $alarm*60; $alarmData['all'] = 1; @@ -322,10 +346,13 @@ class calendar_sif extends calendar_boupdate #$event = $this->read($_id,null,false,'server'); #error_log("FOUND EVENT: ". print_r($event, true)); - if($event = $this->read($_id,null,false,'server')) { + if (($event = $this->read($_id,null,false,'server'))) + { - if ($this->uidExtension) { - if (!preg_match('/\[UID:.+\]/m', $event['description'])) { + if ($this->uidExtension) + { + if (!preg_match('/\[UID:.+\]/m', $event['description'])) + { $event['description'] .= "\n[UID:" . $event['uid'] . "]"; } } @@ -335,16 +362,16 @@ class calendar_sif extends calendar_boupdate $sifEvent = self::xml_decl . "\n" . self::SIF_decl; - foreach($this->sifMapping as $sifField => $egwField) + foreach ($this->sifMapping as $sifField => $egwField) { - if(empty($egwField)) continue; + if (empty($egwField)) continue; #error_log("$sifField => $egwField"); #error_log('VALUE1: '.$event[$egwField]); $value = $GLOBALS['egw']->translation->convert($event[$egwField], $sysCharSet, 'utf-8'); #error_log('VALUE2: '.$value); - switch($sifField) + switch ($sifField) { case 'Importance': $value = $value-1; @@ -360,10 +387,26 @@ class calendar_sif extends calendar_boupdate break; case 'IsRecurring': - switch($event['recur_type']) { - case MCAL_RECUR_NONE: - $sifEvent .= "<$sifField>0"; - break; + if ($event['recur_type'] == MCAL_RECUR_NONE) + { + $sifEvent .= "<$sifField>0"; + break; + } + if ($event['recur_enddate'] == 0) + { + $sifEvent .= '1'; + } + else + { + $recurEndDate = mktime(24 , 0, 0, + date('m',$event['recur_enddate']), + date('d', $event['recur_enddate']), + date('Y', $event['recur_enddate'])); + $sifEvent .= '0'; + $sifEvent .= ''. $vcal->_exportDateTime($recurEndDate) .''; + } + switch ($event['recur_type']) + { case MCAL_RECUR_DAILY: $eventInterval = ($event['recur_interval'] > 1 ? $event['recur_interval'] : 1); @@ -373,13 +416,8 @@ class calendar_sif extends calendar_boupdate $sifEvent .= ''. self::olRecursDaily .''; $sifEvent .= ''. $eventInterval .''; $sifEvent .= ''. $vcal->_exportDateTime($recurStartDate) .''; - if($event['recur_enddate'] == 0) { - $sifEvent .= '1'; - } else { - $recurEndDate = mktime(24,0,0,date('m',$event['recur_enddate']), date('d', $event['recur_enddate']), date('Y', $event['recur_enddate'])); - - $sifEvent .= '0'; - $sifEvent .= ''. $vcal->_exportDateTime($recurEndDate) .''; + if ($event['recur_enddate']) + { $totalDays = ($recurEndDate - $recurStartDate) / 86400; $occurrences = ceil($totalDays / $eventInterval); $sifEvent .= ''. $occurrences .''; @@ -395,46 +433,44 @@ class calendar_sif extends calendar_boupdate $sifEvent .= ''. $eventInterval .''; $sifEvent .= ''. $vcal->_exportDateTime($recurStartDate) .''; $sifEvent .= ''. $event['recur_data'] .''; - if($event['recur_enddate'] == 0) { - $sifEvent .= '1'; - } else { - $recurEndDate = mktime(24, 0, 0, date('m',$event['recur_enddate']), date('d', $event['recur_enddate']), date('Y', $event['recur_enddate'])); - + if ($event['recur_enddate']) + { $daysPerWeek = substr_count(decbin($event['recur_data']),'1'); - $sifEvent .= '0'; - $sifEvent .= ''. $vcal->_exportDateTime($recurEndDate) .''; $totalWeeks = floor(($recurEndDate - $recurStartDate) / (86400*7)); #error_log("AAA: $daysPerWeek $totalWeeks"); $occurrences = ($totalWeeks / $eventInterval) * $daysPerWeek; - for($i = $recurEndDate; $i > $recurStartDate + ($totalWeeks * 86400*7); $i = $i - 86400) { - switch(date('w', $i-1)) { + for($i = $recurEndDate; $i > $recurStartDate + ($totalWeeks * 86400*7); $i = $i - 86400) + { + switch (date('w', $i-1)) + { case 0: - if($event['recur_data'] & 1) $occurrences++; + if ($event['recur_data'] & 1) $occurrences++; break; // monday case 1: - if($event['recur_data'] & 2) $occurrences++; + if ($event['recur_data'] & 2) $occurrences++; break; case 2: - if($event['recur_data'] & 4) $occurrences++; + if ($event['recur_data'] & 4) $occurrences++; break; case 3: - if($event['recur_data'] & 8) $occurrences++; + if ($event['recur_data'] & 8) $occurrences++; break; case 4: - if($event['recur_data'] & 16) $occurrences++; + if ($event['recur_data'] & 16) $occurrences++; break; case 5: - if($event['recur_data'] & 32) $occurrences++; + if ($event['recur_data'] & 32) $occurrences++; break; case 6: - if($event['recur_data'] & 64) $occurrences++; + if ($event['recur_data'] & 64) $occurrences++; break; } } $sifEvent .= ''. $occurrences .''; } break; + case MCAL_RECUR_MONTHLY_MDAY: $eventInterval = ($event['recur_interval'] > 1 ? $event['recur_interval'] : 1); $recurStartDate = mktime(0,0,0,date('m',$event['start']), date('d', $event['start']), date('Y', $event['start'])); @@ -443,15 +479,8 @@ class calendar_sif extends calendar_boupdate $sifEvent .= ''. self::olRecursMonthly .''; $sifEvent .= ''. $eventInterval .''; $sifEvent .= ''. $vcal->_exportDateTime($recurStartDate) .''; - if($event['recur_enddate'] == 0) { - $sifEvent .= '1'; - } else { - $recurEndDate = mktime(24, 0, 0, date('m',$event['recur_enddate']), date('d', $event['recur_enddate']), date('Y', $event['recur_enddate'])); - - $sifEvent .= '0'; - $sifEvent .= ''. $vcal->_exportDateTime($recurEndDate) .''; - } break; + case MCAL_RECUR_MONTHLY_WDAY: $weekMaskMap = array('Sun' => self::olSunday, 'Mon' => self::olMonday, 'Tue' => self::olTuesday, 'Wed' => self::olWednesday, 'Thu' => self::olThursday, 'Fri' => self::olFriday, @@ -464,18 +493,12 @@ class calendar_sif extends calendar_boupdate $sifEvent .= ''. $eventInterval .''; $sifEvent .= ''. $vcal->_exportDateTime($recurStartDate) .''; $sifEvent .= '' . (1 + (int) ((date('d',$event['start'])-1) / 7)) . ''; - if($event['recur_enddate'] == 0) { - $sifEvent .= '1'; - $sifEvent .= '' . $weekMaskMap[date('D',$event['start'])] . ''; - } else { - $recurEndDate = mktime(24, 0, 0, date('m',$event['recur_enddate']), date('d', $event['recur_enddate']), date('Y', $event['recur_enddate'])); - - $sifEvent .= '0'; - $sifEvent .= ''. $vcal->_exportDateTime($recurEndDate) .''; - $sifEvent .= '' . $weekMaskMap[date('D',$event['start'])] . ''; - } + $sifEvent .= '' . $weekMaskMap[date('D',$event['start'])] . ''; break; + case MCAL_RECUR_YEARLY: + $sifEvent .= "<$sifField>1"; + $sifEvent .= ''. self::olRecursYearly .''; break; } break; @@ -496,13 +519,16 @@ class calendar_sif extends calendar_boupdate break; case 'Start': - if ($this->isWholeDay($event)) { + if ($this->isWholeDay($event)) + { $value = date('Y-m-d', $event['start']); $sifEvent .= "$value"; $vaule = date('Y-m-d', $event['end']); $sifEvent .= "$value"; $sifEvent .= "1"; - } else { + } + else + { $value = $vcal->_exportDateTime($event['start']); $sifEvent .= "$value"; $value = $vcal->_exportDateTime($event['end']); @@ -515,24 +541,30 @@ class calendar_sif extends calendar_boupdate break; case 'ReminderSet': - if(count((array)$event['alarm']) > 0) { + if (count((array)$event['alarm']) > 0) + { $sifEvent .= "<$sifField>1"; - foreach($event['alarm'] as $alarmID => $alarmData) + foreach ($event['alarm'] as $alarmID => $alarmData) { $sifEvent .= ''. $alarmData['offset']/60 .''; // lets take only the first alarm break; } - } else { + } + else + { $sifEvent .= "<$sifField>0"; } break; case 'Categories': - if(!empty($value)) { + if (!empty($value)) + { $value = implode('; ', $this->get_categories(explode(',',$value))); $value = $GLOBALS['egw']->translation->convert($value, $sysCharSet, 'utf-8'); - } else { + } + else + { break; } @@ -567,16 +599,20 @@ class calendar_sif extends calendar_boupdate $state = &$_SESSION['SyncML.state']; $deviceInfo = $state->getClientDeviceInfo(); - if(isset($deviceInfo) && is_array($deviceInfo)) { - if(isset($deviceInfo['uidExtension']) && - $deviceInfo['uidExtension']){ + if (isset($deviceInfo) && is_array($deviceInfo)) + { + if (isset($deviceInfo['uidExtension']) && + $deviceInfo['uidExtension']) + { $this->uidExtension = true; } } // store product name and version, to be able to use it elsewhere - if ($_productName) { + if ($_productName) + { $this->productName = strtolower($_productName); - if (preg_match('/^[^\d]*(\d+\.?\d*)[\.|\d]*$/', $_productSoftwareVersion, $matches)) { + if (preg_match('/^[^\d]*(\d+\.?\d*)[\.|\d]*$/', $_productSoftwareVersion, $matches)) + { $this->productSoftwareVersion = $matches[1]; } }