[ Index ]
 

Code source de eGroupWare 1.2.106-2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/infolog/inc/ -> class.sifinfolog.inc.php (source)

   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  ?>


Généré le : Sun Feb 25 17:20:01 2007 par Balluche grâce à PHPXref 0.7