/** * Merges the busy periods of another Horde_Icalendar_Vfreebusy object * into this one. * * This might lead to simplification no matter what you specify for the * "simplify" flag since periods with the same start date will lead to the * shorter period being removed (see addBusyPeriod). * * @param Horde_Icalendar_Vfreebusy $freebusy A freebusy object. * @param boolean $simplify If true, simplify() will * called after the merge. */ public function merge(Horde_Icalendar_Vfreebusy $freebusy, $simplify = true) { $extra = $freebusy->getExtraParams(); foreach ($freebusy->getBusyPeriods() as $start => $end) { // This might simplify the busy periods without taking the // "simplify" flag into account. $this->addBusyPeriod('BUSY', $start, $end, null, isset($extra[$start]) ? $extra[$start] : array()); } foreach (array('DTSTART', 'DTEND') as $val) { try { $thisattr = $this->getAttribute($val); } catch (Horde_Icalendar_Exception $e) { $thisattr = null; } try { $thatattr = $freebusy->getAttribute($val); } catch (Horde_Icalendar_Exception $e) { $thatattr = null; } if (is_null($thisattr) && !is_null($thatattr)) { $this->setAttribute($val, $thatattr, array(), false); } elseif (!is_null($thatattr)) { switch ($val) { case 'DTSTART': $set = $thatattr < $thisattr; break; case 'DTEND': $set = $thatattr > $thisattr; break; } if ($set) { $this->setAttribute($val, $thatattr, array(), false); } } } if ($simplify) { $this->simplify(); } return true; }
/** * Converts free/busy data to a simple object suitable to be transferred * as json. * * @param Horde_Icalendar_Vfreebusy $fb A Free/busy component. * * @return object A simple object representation. */ public static function toJson(Horde_Icalendar_Vfreebusy $fb) { $json = new stdClass(); $start = $fb->getStart(); if ($start) { $start = new Horde_Date($start); $json->s = $start->dateString(); } $end = $fb->getEnd(); if ($end) { $end = new Horde_Date($end); $json->e = $end->dateString(); } $b = $fb->getBusyPeriods(); if (empty($b)) { $b = new StdClass(); } $json->b = $b; return $json; }
/** * Converts free/busy data to a simple object suitable to be transferred * as json. * * @param Horde_Icalendar_Vfreebusy $fb A Free/busy component. * * @return object A simple object representation. */ public static function toJson(Horde_Icalendar_Vfreebusy $fb) { $json = new stdClass(); $start = $fb->getStart(); if ($start) { $start = new Horde_Date($start); $json->s = $start->dateString(); } $end = $fb->getEnd(); if ($end) { $end = new Horde_Date($end); $json->e = $end->dateString(); } $b = $fb->getBusyPeriods(); if (empty($b)) { $b = new StdClass(); } $new = new StdClass(); foreach ($b as $from => $to) { $from = new Horde_Date($from); $to = new Horde_Date($to); $new->{$from->toJson()} = $to->toJson(); } $json->b = $new; return $json; }
/** * @depends testRead */ public function testMerge($vfb) { // Create new freebusy object for merging $mfb = new Horde_Icalendar_Vfreebusy(); // 1. 3:55 / 10 minutes; summary "test4" $mfb->addBusyPeriod('BUSY', 1164254100, null, 600, array('X-SUMMARY' => 'dGVzdDQ=')); // 2. 4:00 / 1 hours 5 Minutes; summary "test3" $mfb->addBusyPeriod('BUSY', 1164254400, null, 3900, array('X-SUMMARY' => 'dGVzdDM=')); // 3. 5:55 / 10 minutes hours; summary "test5" $mfb->addBusyPeriod('BUSY', 1164261300, null, 600, array('X-SUMMARY' => 'dGVzdDU==')); // 4. 7:55 / 10 min $mfb->addBusyPeriod('BUSY', 1164268500, null, 600); // 5. 9:55 / 10 min $mfb->addBusyPeriod('BUSY', 1164275700, null, 600); // 6. 11:00 / 4 hours; summary "test2" $mfb->addBusyPeriod('BUSY', 1164279600, null, 14400, array('X-SUMMARY' => 'dGVzdDI=')); // 7. 14:00 / 2 min $mfb->addBusyPeriod('BUSY', 1164290400, null, 120); // 8. 14:30 / 5 min; summary "test3" $mfb->addBusyPeriod('BUSY', 1164292200, null, 300, array('X-SUMMARY' => 'dGVzdDM=')); // 9. 15:55 / 5 min $mfb->addBusyPeriod('BUSY', 1164297300, 1164297600); // Dump busy periods $this->assertEquals(array(1164254100 => 1164254700, 1164254400 => 1164258300, 1164261300 => 1164261900, 1164268500 => 1164269100, 1164275700 => 1164276300, 1164279600 => 1164294000, 1164290400 => 1164290520, 1164292200 => 1164292500, 1164297300 => 1164297600), $mfb->getBusyPeriods()); $mfb->setAttribute('DTSTART', 1004297300); $mfb->setAttribute('DTEND', 1014297300); // Merge freebusy components without simplification $vfb->merge($mfb, false); $this->assertEquals(1004297300, $vfb->getAttribute('DTSTART')); $this->assertEquals(1169420400, $vfb->getAttribute('DTEND')); // Merged periods (there are some entries having the same start time -> // merged to longer of the two) $busy = $vfb->getBusyPeriods(); $extra = $vfb->getExtraParams(); $this->assertEquals(array(1164258000 => 1164261600, 1164268800 => 1164276000, 1164279600 => 1164294000, 1164290400 => 1164297600, 1164254100 => 1164254700, 1164254400 => 1164258300, 1164261300 => 1164261900, 1164268500 => 1164269100, 1164275700 => 1164276300, 1164292200 => 1164292500, 1164297300 => 1164297600), $busy); // Check merging process (should have selected longer period) // and dump extra information alongside // 4 hours (instead of 2 hours) $this->assertEquals(14400, $busy[1164279600] - 1164279600); $this->assertEquals('test2', base64_decode($extra[1164279600]['X-SUMMARY'])); // 2 hours (instead of 2 minutes) $this->assertEquals(7200, $busy[1164290400] - 1164290400); $this->assertEquals('test', base64_decode($extra[1164290400]['X-SUMMARY'])); // Merge freebusy components again, simplify this time $vfb->merge($mfb); // Dump merged periods $busy = $vfb->getBusyPeriods(); $extra = $vfb->getExtraParams(); // 1. 3:55 / 10 Minutes / test4 $this->assertEquals('20061123T035500Z', $vfb->_exportDateTime(1164254100)); $this->assertEquals('20061123T040500Z', $vfb->_exportDateTime($busy[1164254100])); $this->assertEquals('test4', base64_decode($extra[1164254100]['X-SUMMARY'])); // 2. 4:05 / 1 hour / test3 $this->assertEquals('20061123T040500Z', $vfb->_exportDateTime(1164254700)); $this->assertEquals('20061123T050500Z', $vfb->_exportDateTime($busy[1164254700])); $this->assertEquals('test3', base64_decode($extra[1164254700]['X-SUMMARY'])); // 3. 5:05 / 55 Minutes / testtermin $this->assertEquals('20061123T050500Z', $vfb->_exportDateTime(1164258300)); $this->assertEquals('20061123T060000Z', $vfb->_exportDateTime($busy[1164258300])); $this->assertEquals('testtermin', base64_decode($extra[1164258300]['X-SUMMARY'])); // 4. 6:00 / 5 Minutes / test5 $this->assertEquals('20061123T060000Z', $vfb->_exportDateTime(1164261600)); $this->assertEquals('20061123T060500Z', $vfb->_exportDateTime($busy[1164261600])); $this->assertEquals('test5', base64_decode($extra[1164261600]['X-SUMMARY'])); // 5. 7:55 / 2 hours 10 Minutes $this->assertEquals('20061123T075500Z', $vfb->_exportDateTime(1164268500)); $this->assertEquals('20061123T100500Z', $vfb->_exportDateTime($busy[1164268500])); $this->assertArrayNotHasKey('X-SUMMARY', $extra[1164268500]); // 6. 11:00 / 4 hours / test2 $this->assertEquals('20061123T110000Z', $vfb->_exportDateTime(1164279600)); $this->assertEquals('20061123T150000Z', $vfb->_exportDateTime($busy[1164279600])); $this->assertEquals('test2', base64_decode($extra[1164279600]['X-SUMMARY'])); // 7. 15:00 / 1 hour / test $this->assertEquals('20061123T150000Z', $vfb->_exportDateTime(1164294000)); $this->assertEquals('20061123T160000Z', $vfb->_exportDateTime($busy[1164294000])); $this->assertEquals('test', base64_decode($extra[1164294000]['X-SUMMARY'])); }