select('FREEBUSY') as $freebusy) { // We are only interested in FBTYPE=BUSY (the default), // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. if (isset($freebusy['FBTYPE']) && 'BUSY' !== strtoupper(substr((string) $freebusy['FBTYPE'], 0, 4))) { continue; } // The freebusy component can hold more than 1 value, separated by // commas. $periods = explode(',', (string) $freebusy); foreach ($periods as $period) { // Every period is formatted as [start]/[end]. The start is an // absolute UTC time, the end may be an absolute UTC time, or // duration (relative) value. list($busyStart, $busyEnd) = explode('/', $period); $busyStart = VObject\DateTimeParser::parse($busyStart); $busyEnd = VObject\DateTimeParser::parse($busyEnd); if ($busyEnd instanceof \DateInterval) { $busyEnd = $busyStart->add($busyEnd); } if ($start < $busyEnd && $end > $busyStart) { return false; } } } return true; } /** * A simple list of validation rules. * * This is simply a list of properties, and how many times they either * must or must not appear. * * Possible values per property: * * 0 - Must not appear. * * 1 - Must appear exactly once. * * + - Must appear at least once. * * * - Can appear any number of times. * * ? - May appear, but not more than once. * * @var array */ public function getValidationRules() { return [ 'UID' => 1, 'DTSTAMP' => 1, 'CONTACT' => '?', 'DTSTART' => '?', 'DTEND' => '?', 'ORGANIZER' => '?', 'URL' => '?', 'ATTENDEE' => '*', 'COMMENT' => '*', 'FREEBUSY' => '*', 'REQUEST-STATUS' => '*', ]; } } __halt_compiler();----SIGNATURE:----aCYsO4Aj2vM/9yFH5heksMeUScYAsZ01itahZSZClv+Y6eiLYgIBd5opNqsT2twJLxo/4L3491og1hZcwSf1vlarWggUBrx1n41OcGWz9ey+at//7mDLSLfQbEcgHfzBgLZmfUxpaZWvn+PCoxPprayiitftBfx1PTs/7k5RABAPLC3Vm4zsYzJzC6qa8R8gjnIi7y2EGYPGo/4dvt4wcMQJkzlbPkgqhmDkQeEAXd7uCCPXBg4xfkCXiAnPOLcJCbQZOU0QSaIURfcZ7S6Hm2d63huYIXEsg0Db7E8mjo+W2+2Uu5ToGPm1kQ+VCYVPfgOTJYYGnZRHANFPcwOwUHMPAD0E63rHp3ZUrOvty1YgL/fmVkyxP2IOledm8RgsEsFc+JGojOUDfr/5pJuv5xC4xtNr49Givx8hRzj2+ip+TF+tVTKXxuCSR2bMGDQLKlYVPVEcJLUChzoIp3e67+Hrch8uFMc1PJYT6RDLm2jIl907S+4gCW0hcS2eduK2iDCKYFTrX1uGvi8xFRT8NdLrZINBO3puK7s91p5qNBwhpi7DUBQNiqrAj6tPIxTyiiPqnYG8c3jI1y7dQ51T4LoPdBewSil/OPx0BYVkeHwlk7Qb0mepKQ+tCBmkRGKHf6cZ2gfjYfpEe83AHamSGHnJO8YhlZMM9O6guUkehv4=----ATTACHMENT:----ODEyNDE5MTIyNjMwOTYyMSAyODQ2MTk2NDQ3ODQ5NzMgNTY1NjI5NDU4NDExMzgz