[ Index ] |
|
Code source de eGroupWare 1.2.106-2 |
1 <?php 2 /**************************************************************************\ 3 * eGroupWare - iCalendar Parser * 4 * http://www.egroupware.org * 5 * Written by Lars Kneschke <lkneschke@egroupware.org> * 6 * -------------------------------------------- * 7 * This program is free software; you can redistribute it and/or modify it * 8 * under the terms of the GNU General Public License as published by the * 9 * Free Software Foundation; either version 2 of the License. * 10 \**************************************************************************/ 11 12 /* $Id: class.sifinfolog.inc.php 21682 2006-06-01 13:29:18Z lkneschke $ */ 13 14 require_once PHPGW_SERVER_ROOT.'/infolog/inc/class.boinfolog.inc.php'; 15 require_once EGW_SERVER_ROOT.'/phpgwapi/inc/horde/Horde/iCalendar.php'; 16 17 class sifinfolog extends boinfolog 18 { 19 // array containing the result of the xml parser 20 var $_extractedSIFData; 21 22 // array containing the current mappings(task or note) 23 var $_currentSIFMapping; 24 25 // mappings for SIFTask to InfologTask 26 var $_sifTaskMapping = array( 27 'ActualWork' => '', 28 'BillingInformation' => '', 29 'Body' => 'info_des', 30 'Categories' => '', 31 'Companies' => '', 32 'Complete' => '', 33 'DateCompleted' => 'info_datecompleted', 34 'DueDate' => 'info_enddate', 35 'Importance' => 'info_priority', 36 'IsRecurring' => '', 37 'Mileage' => '', 38 'PercentComplete' => 'info_percent', 39 'ReminderSet' => '', 40 'ReminderTime' => '', 41 'Sensitivity' => 'info_access', 42 'StartDate' => 'info_startdate', 43 'Status' => 'info_status', 44 'Subject' => 'info_subject', 45 'TeamTask' => '', 46 'TotalWork' => '', 47 'RecurrenceType' => '', 48 'Interval' => '', 49 'MonthOfYear' => '', 50 'DayOfMonth' => '', 51 'DayOfWeekMask' => '', 52 'Instance' => '', 53 'PatternStartDate' => '', 54 'NoEndDate' => '', 55 'PatternEndDate' => '', 56 'Occurrences' => '', 57 ); 58 59 60 61 function startElement($_parser, $_tag, $_attributes) { 62 } 63 64 function endElement($_parser, $_tag) { 65 if(!empty($this->_currentSIFMapping[$_tag])) { 66 $this->_extractedSIFData[$this->_currentSIFMapping[$_tag]] = $this->sifData; 67 } 68 unset($this->sifData); 69 } 70 71 function characterData($_parser, $_data) { 72 $this->sifData .= $_data; 73 } 74 75 function siftoegw($_sifData, $_sifType) { 76 $sysCharSet = $GLOBALS['egw']->translation->charset(); 77 $sifData = base64_decode($_sifData); 78 79 #$tmpfname = tempnam('/tmp/sync/contents','sift_'); 80 81 #$handle = fopen($tmpfname, "w"); 82 #fwrite($handle, $sifData); 83 #fclose($handle); 84 85 $this->_currentSIFMapping = $this->_sifTaskMapping; 86 $this->xml_parser = xml_parser_create('UTF-8'); 87 xml_set_object($this->xml_parser, $this); 88 xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, false); 89 xml_set_element_handler($this->xml_parser, "startElement", "endElement"); 90 xml_set_character_data_handler($this->xml_parser, "characterData"); 91 $this->strXmlData = xml_parse($this->xml_parser, $sifData); 92 if(!$this->strXmlData) { 93 error_log(sprintf("XML error: %s at line %d", 94 xml_error_string(xml_get_error_code($this->xml_parser)), 95 xml_get_current_line_number($this->xml_parser))); 96 return false; 97 } 98 99 if(!array($this->_extractedSIFData)) { 100 return false; 101 } 102 103 switch($_sifType) { 104 case 'task': 105 $taskData = array(); 106 $vcal = &new Horde_iCalendar; 107 108 $taskData['info_type'] = 'task'; 109 110 foreach($this->_extractedSIFData as $key => $value) { 111 $value = $GLOBALS['egw']->translation->convert($value, 'utf-8', $sysCharSet); 112 switch($key) { 113 case 'info_access': 114 $taskData[$key] = ((int)$value > 0) ? 'private' : 'public'; 115 break; 116 117 case 'info_datecompleted': 118 case 'info_enddate': 119 case 'info_startdate': 120 if(!empty($value)) { 121 $taskData[$key] = $vcal->_parseDateTime($value); 122 // somehow the client always deliver a timestamp about 3538 seconds, when no startdate set. 123 if($taskData[$key] < 10000) 124 $taskData[$key] = ''; 125 } else { 126 $taskData[$key] = ''; 127 } 128 break; 129 130 131 case 'info_priority': 132 $taskData[$key] = (int)$value; 133 break; 134 135 case 'info_status': 136 $taskData[$key] = ((int)$value == 2) ? 'done' : 'ongoing'; 137 switch($value) { 138 case '0': 139 $taskData[$key] = 'not-started'; 140 break; 141 case '1': 142 $taskData[$key] = 'ongoing'; 143 break; 144 case '2': 145 $taskData[$key] = 'done'; 146 break; 147 case '4': 148 $taskData[$key] = 'cancelled'; 149 break; 150 default: 151 $taskData[$key] = 'ongoing'; 152 break; 153 } 154 break; 155 156 default: 157 $taskData[$key] = $value; 158 break; 159 } 160 } 161 162 return $taskData; 163 break; 164 165 default: 166 return false; 167 } 168 } 169 170 function searchSIF($_sifData, $_sifType) { 171 if(!$egwData = $this->siftoegw($_sifData, $_sifType)) { 172 return false; 173 } 174 175 $filter = array('col_filter' => $egwData); 176 if($foundItems = $this->search($filter)) { 177 if(count($foundItems) > 0) { 178 $itemIDs = array_keys($foundItems); 179 return $itemIDs[0]; 180 } 181 } 182 183 return false; 184 } 185 186 function addSIF($_sifData, $_id, $_sifType) { 187 if(!$egwData = $this->siftoegw($_sifData, $_sifType)) { 188 return false; 189 } 190 191 if($_id > 0) 192 $egwData['info_id'] = $_id; 193 194 $egwID = $this->write($egwData, false); 195 196 return $egwID; 197 } 198 199 function getSIF($_id, $_sifType) { 200 switch($_sifType) { 201 case 'task': 202 if($taskData = $this->read($_id)) { 203 $sysCharSet = $GLOBALS['egw']->translation->charset(); 204 $vcal = &new Horde_iCalendar; 205 206 $sifTask = '<task>'; 207 208 foreach($this->_sifTaskMapping as $sifField => $egwField) 209 { 210 if(empty($egwField)) continue; 211 212 $value = $GLOBALS['egw']->translation->convert($taskData[$egwField], $sysCharSet, 'utf-8'); 213 214 switch($sifField) { 215 case 'DateCompleted': 216 case 'DueDate': 217 case 'StartDate': 218 if(!empty($value)) { 219 $value = $vcal->_exportDateTime($value); 220 } 221 $sifTask .= "<$sifField>$value</$sifField>"; 222 break; 223 224 case 'Importance': 225 if($value > 3) $value = 3; 226 $sifTask .= "<$sifField>$value</$sifField>"; 227 break; 228 229 case 'Sensitivity': 230 $value = ($value == 'private' ? '2' : '0'); 231 $sifTask .= "<$sifField>$value</$sifField>"; 232 break; 233 234 case 'Status': 235 switch($value) { 236 case 'cancelled': 237 $value = '4'; 238 break; 239 case 'done': 240 $value = '2'; 241 break; 242 case 'not-started': 243 $value = '0'; 244 break; 245 case 'ongoing': 246 $value = '1'; 247 break; 248 default: 249 $value = 1; 250 break; 251 } 252 $sifTask .= "<$sifField>$value</$sifField>"; 253 break; 254 255 default: 256 $sifTask .= "<$sifField>$value</$sifField>"; 257 break; 258 } 259 } 260 261 $sifTask .= '<ActualWork>0</ActualWork><IsRecurring>0</IsRecurring>'; 262 return base64_encode($sifTask); 263 264 /* return base64_encode("<task> 265 <ActualWork>0</ActualWork> 266 <BillingInformation></BillingInformation> 267 <Body></Body> 268 <Categories></Categories> 269 <Companies></Companies> 270 <Complete>0</Complete> 271 <DateCompleted></DateCompleted> 272 <DueDate></DueDate> 273 <Importance>1</Importance> 274 <IsRecurring>0</IsRecurring> 275 <Mileage></Mileage> 276 <PercentComplete>0</PercentComplete> 277 <ReminderSet>0</ReminderSet> 278 <ReminderTime></ReminderTime> 279 <Sensitivity>0</Sensitivity> 280 <StartDate>45001231T230000Z</StartDate> 281 <Status>3</Status> 282 <Subject>TARAAA3</Subject> 283 <TeamTask>0</TeamTask> 284 <TotalWork>0</TotalWork> 285 <RecurrenceType>1</RecurrenceType> 286 <Interval>1</Interval> 287 <MonthOfYear>0</MonthOfYear> 288 <DayOfMonth>0</DayOfMonth> 289 <DayOfWeekMask>4</DayOfWeekMask> 290 <Instance>0</Instance> 291 <PatternStartDate>20060320T230000Z</PatternStartDate> 292 <NoEndDate>1</NoEndDate> 293 <PatternEndDate></PatternEndDate> 294 <Occurrences>10</Occurrences> 295 </task> 296 "); */ 297 } 298 break; 299 300 default; 301 return false; 302 } 303 304 } 305 306 function exportVTODO($_taskID, $_version) 307 { 308 $taskData = $this->read($_taskID); 309 310 $taskData = $GLOBALS['egw']->translation->convert($taskData,$GLOBALS['egw']->translation->charset(),'UTF-8'); 311 312 //_debug_array($taskData); 313 314 $taskGUID = $GLOBALS['phpgw']->common->generate_uid('infolog_task',$_taskID); 315 316 $vcal = &new Horde_iCalendar; 317 $vcal->setAttribute('VERSION',$_version); 318 $vcal->setAttribute('METHOD','PUBLISH'); 319 320 $vevent = Horde_iCalendar::newComponent('VTODO',$vcal); 321 322 $options = array(); 323 324 $vevent->setAttribute('SUMMARY',$taskData['info_subject']); 325 $vevent->setAttribute('DESCRIPTION',$taskData['info_des']); 326 if($taskData['info_startdate']) 327 $vevent->setAttribute('DTSTART',$taskData['info_startdate']); 328 if($taskData['info_enddate']) 329 $vevent->setAttribute('DUE',$taskData['info_enddate']); 330 $vevent->setAttribute('DTSTAMP',time()); 331 $vevent->setAttribute('CREATED',$GLOBALS['phpgw']->contenthistory->getTSforAction($eventGUID,'add')); 332 $vevent->setAttribute('LAST-MODIFIED',$GLOBALS['phpgw']->contenthistory->getTSforAction($eventGUID,'modify')); 333 $vevent->setAttribute('UID',$taskGUID); 334 $vevent->setAttribute('CLASS',(($taskData['info_access'] == 'public')?'PUBLIC':'PRIVATE')); 335 $vevent->setAttribute('STATUS',(($taskData['info_status'] == 'completed')?'COMPLETED':'NEEDS-ACTION')); 336 // 3=urgent => 1, 2=high => 2, 1=normal => 3, 0=low => 4 337 $vevent->setAttribute('PRIORITY',4-$taskData['info_priority']); 338 339 #$vevent->setAttribute('TRANSP','OPAQUE'); 340 # status 341 # ATTENDEE 342 343 $options = array('CHARSET' => 'UTF-8','ENCODING' => 'QUOTED-PRINTABLE'); 344 $vevent->setParameter('SUMMARY', $options); 345 $vevent->setParameter('DESCRIPTION', $options); 346 347 $vcal->addComponent($vevent); 348 349 #print "<pre>"; 350 #print $vcal->exportvCalendar(); 351 #print "</pre>"; 352 353 return $vcal->exportvCalendar(); 354 } 355 356 function importVTODO(&$_vcalData, $_taskID=-1) 357 { 358 $botranslation = CreateObject('phpgwapi.translation'); 359 360 $vcal = &new Horde_iCalendar; 361 if(!$vcal->parsevCalendar($_vcalData)) 362 { 363 return FALSE; 364 } 365 $components = $vcal->getComponents(); 366 if(count($components) > 0) 367 { 368 $component = $components[0]; 369 if(is_a($component, 'Horde_iCalendar_vtodo')) 370 { 371 if($_taskID>0) 372 $taskData['info_id'] = $_taskID; 373 374 foreach($component->_attributes as $attributes) 375 { 376 #print $attributes['name'].' - '.$attributes['value'].'<br>'; 377 #$attributes['value'] = $GLOBALS['egw']->translation->convert($attributes['value'],'UTF-8'); 378 switch($attributes['name']) 379 { 380 case 'CLASS': 381 $taskData['info_access'] = strtolower($attributes['value']); 382 break; 383 case 'DESCRIPTION': 384 $taskData['info_des'] = $attributes['value']; 385 break; 386 case 'DUE': 387 $taskData['info_enddate'] = $attributes['value']; 388 break; 389 case 'DTSTART': 390 $taskData['info_startdate'] = $attributes['value']; 391 break; 392 case 'PRIORITY': 393 // 1 => 3=urgent, 2 => 2=high, 3 => 1=normal, 4 => 0=low 394 if (1 <= $attributes['value'] && $attributes['value'] <= 4) 395 { 396 $taskData['info_priority'] = 4 - $attributes['value']; 397 } 398 else 399 { 400 $taskData['info_priority'] = 1; // default = normal 401 } 402 break; 403 case 'STATUS': 404 $taskData['info_status'] = (strtolower($attributes['value']) == 'completed') ? 'done' : 'ongoing'; 405 break; 406 case 'SUMMARY': 407 $taskData['info_subject'] = $attributes['value']; 408 break; 409 } 410 } 411 #_debug_array($eventData);exit; 412 return $this->write($taskData); 413 } 414 } 415 416 return FALSE; 417 } 418 419 420 } 421 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 17:20:01 2007 | par Balluche grâce à PHPXref 0.7 |