diff options
Diffstat (limited to 'vendor/sabre/vobject')
87 files changed, 3737 insertions, 2816 deletions
diff --git a/vendor/sabre/vobject/.gitignore b/vendor/sabre/vobject/.gitignore index f08b31359..95935f798 100644 --- a/vendor/sabre/vobject/.gitignore +++ b/vendor/sabre/vobject/.gitignore @@ -16,7 +16,6 @@ bin/hoa # Development stuff testdata/ -.php_cs.cache # OS X .DS_Store diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml index 2619562ab..531ad5be4 100644 --- a/vendor/sabre/vobject/.travis.yml +++ b/vendor/sabre/vobject/.travis.yml @@ -1,39 +1,20 @@ language: php -sudo: required php: - 5.5 - 5.6 - 7.0 - 7.1 - 7.2 - - 7.3 -env: - global: - - RUN_PHPSTAN="FALSE" +sudo: false -matrix: - include: - - name: 'PHPStan' - php: 7.2 - env: RUN_PHPSTAN="TRUE" - fast_finish: true - allow_failures: - - php: 5.5 - -install: - - if [ $RUN_PHPSTAN == "TRUE" ]; then wget https://github.com/phpstan/phpstan/releases/download/0.10.3/phpstan.phar; fi +script: + - ./bin/phpunit --configuration tests/phpunit.xml + - ./bin/sabre-cs-fixer fix . --dry-run --diff before_script: - composer install -script: - - if [ $RUN_PHPSTAN == "FALSE" ]; then ./bin/phpunit --configuration tests/phpunit.xml --coverage-clover=coverage.xml; fi - - if [ $RUN_PHPSTAN == "TRUE" ]; then php phpstan.phar analyse -c phpstan.neon lib; fi - -after_success: - - bash <(curl -s https://codecov.io/bash) - cache: directories: - $HOME/.composer/cache diff --git a/vendor/sabre/vobject/CHANGELOG.md b/vendor/sabre/vobject/CHANGELOG.md index 7a2c935fb..6cfec988e 100644 --- a/vendor/sabre/vobject/CHANGELOG.md +++ b/vendor/sabre/vobject/CHANGELOG.md @@ -1,19 +1,6 @@ ChangeLog ========= -4.2.0 (2019-02-19) ------------------- - -* #432: DTSTAMP must be specified in UTC -* #435: ORGANIZER e-mail address are case-insensitive -* #441: Repairing BASE64 encoded vCard version 3 - -4.2.0-alpha1 (2018-09-26) -------------------------- - -* #412: Broker: add timezone to CANCEL messages -* #424: Support php7.3 - 4.1.6 (2018-04-20) ------------------ @@ -42,7 +29,7 @@ ChangeLog * #363: Repair script and de-duplicate properties that are only allowed once, but appear more than once. (@ddolcimascolo). -* #377: Added Pacific Time (US & Canada) as exchange timezone +* #377: Addes Pacific Time (US & Canada) as exchange timezone * #384: Added fallback for VCards without `FN` diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php index 0a2736fa6..807b40777 100644 --- a/vendor/sabre/vobject/bin/bench.php +++ b/vendor/sabre/vobject/bin/bench.php @@ -1,7 +1,7 @@ #!/usr/bin/env php <?php -include __DIR__.'/../vendor/autoload.php'; +include __DIR__ . '/../vendor/autoload.php'; $data = stream_get_contents(STDIN); @@ -9,4 +9,4 @@ $start = microtime(true); $lol = Sabre\VObject\Reader::read($data); -echo 'time: '.(microtime(true) - $start)."\n"; +echo "time: " . (microtime(true) - $start) . "\n"; diff --git a/vendor/sabre/vobject/bin/bench_freebusygenerator.php b/vendor/sabre/vobject/bin/bench_freebusygenerator.php index 1299c14fb..2c51b2a32 100644 --- a/vendor/sabre/vobject/bin/bench_freebusygenerator.php +++ b/vendor/sabre/vobject/bin/bench_freebusygenerator.php @@ -1,16 +1,16 @@ <?php -include __DIR__.'/../vendor/autoload.php'; +include __DIR__ . '/../vendor/autoload.php'; if ($argc < 2) { - echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " freebusy benchmark\n"; + echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " freebusy benchmark\n"; echo "\n"; echo "This script can be used to measure the speed of generating a\n"; echo "free-busy report based on a calendar.\n"; echo "\n"; echo "The process will be repeated 100 times to get accurate stats\n"; echo "\n"; - echo 'Usage: '.$argv[0]." inputfile.ics\n"; + echo "Usage: " . $argv[0] . " inputfile.ics\n"; die(); } @@ -30,24 +30,33 @@ $timeZone = new \DateTimeZone('America/Toronto'); $bench->fb->start(); -for ($i = 0; $i < $repeat; ++$i) { +for ($i = 0; $i < $repeat; $i++) { + $fb = new Sabre\VObject\FreeBusyGenerator($start, $end, $vcal, $timeZone); $results = $fb->getResult(); + } $bench->fb->stop(); + + echo $bench,"\n"; -function formatMemory($input) -{ +function formatMemory($input) { + if (strlen($input) > 6) { - return round($input / (1024 * 1024)).'M'; + + return round($input / (1024 * 1024)) . 'M'; + } elseif (strlen($input) > 3) { - return round($input / 1024).'K'; + + return round($input / 1024) . 'K'; + } + } unset($input, $splitter); -echo 'peak memory usage: '.formatMemory(memory_get_peak_usage()), "\n"; -echo 'current memory usage: '.formatMemory(memory_get_usage()), "\n"; +echo "peak memory usage: " . formatMemory(memory_get_peak_usage()), "\n"; +echo "current memory usage: " . formatMemory(memory_get_usage()), "\n"; diff --git a/vendor/sabre/vobject/bin/bench_manipulatevcard.php b/vendor/sabre/vobject/bin/bench_manipulatevcard.php index f229091db..adc198e9b 100644 --- a/vendor/sabre/vobject/bin/bench_manipulatevcard.php +++ b/vendor/sabre/vobject/bin/bench_manipulatevcard.php @@ -1,15 +1,15 @@ <?php -include __DIR__.'/../vendor/autoload.php'; +include __DIR__ . '/../vendor/autoload.php'; if ($argc < 2) { - echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " manipulation benchmark\n"; + echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " manipulation benchmark\n"; echo "\n"; echo "This script can be used to measure the speed of opening a large amount of\n"; echo "vcards, making a few alterations and serializing them again.\n"; - echo 'system.'; + echo "system."; echo "\n"; - echo 'Usage: '.$argv[0]." inputfile.vcf\n"; + echo "Usage: " . $argv[0] . " inputfile.vcf\n"; die(); } @@ -22,21 +22,18 @@ $splitter = new Sabre\VObject\Splitter\VCard($input); $bench = new Hoa\Bench\Bench(); while (true) { + $bench->parse->start(); $vcard = $splitter->getNext(); $bench->parse->pause(); - if (!$vcard) { - break; - } + if (!$vcard) break; $bench->manipulate->start(); $vcard->{'X-FOO'} = 'Random new value!'; $emails = []; - if (isset($vcard->EMAIL)) { - foreach ($vcard->EMAIL as $email) { - $emails[] = (string) $email; - } + if (isset($vcard->EMAIL)) foreach ($vcard->EMAIL as $email) { + $emails[] = (string)$email; } $bench->manipulate->pause(); @@ -45,20 +42,28 @@ while (true) { $bench->serialize->pause(); $vcard->destroy(); + } + + echo $bench,"\n"; -function formatMemory($input) -{ +function formatMemory($input) { + if (strlen($input) > 6) { - return round($input / (1024 * 1024)).'M'; + + return round($input / (1024 * 1024)) . 'M'; + } elseif (strlen($input) > 3) { - return round($input / 1024).'K'; + + return round($input / 1024) . 'K'; + } + } unset($input, $splitter); -echo 'peak memory usage: '.formatMemory(memory_get_peak_usage()), "\n"; -echo 'current memory usage: '.formatMemory(memory_get_usage()), "\n"; +echo "peak memory usage: " . formatMemory(memory_get_peak_usage()), "\n"; +echo "current memory usage: " . formatMemory(memory_get_usage()), "\n"; diff --git a/vendor/sabre/vobject/bin/fetch_windows_zones.php b/vendor/sabre/vobject/bin/fetch_windows_zones.php index 9c4e51abd..3f2a00f7a 100644 --- a/vendor/sabre/vobject/bin/fetch_windows_zones.php +++ b/vendor/sabre/vobject/bin/fetch_windows_zones.php @@ -2,9 +2,9 @@ <?php $windowsZonesUrl = 'http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml'; -$outputFile = __DIR__.'/../lib/timezonedata/windowszones.php'; +$outputFile = __DIR__ . '/../lib/timezonedata/windowszones.php'; -echo 'Fetching timezone map from: '.$windowsZonesUrl, "\n"; +echo "Fetching timezone map from: " . $windowsZonesUrl, "\n"; $data = file_get_contents($windowsZonesUrl); @@ -13,14 +13,16 @@ $xml = simplexml_load_string($data); $map = []; foreach ($xml->xpath('//mapZone') as $mapZone) { - $from = (string) $mapZone['other']; - $to = (string) $mapZone['type']; + + $from = (string)$mapZone['other']; + $to = (string)$mapZone['type']; list($to) = explode(' ', $to, 2); if (!isset($map[$from])) { $map[$from] = $to; } + } ksort($map); @@ -31,19 +33,19 @@ fwrite($f, "<?php\n\n"); fwrite($f, "/**\n"); fwrite($f, " * Automatically generated timezone file\n"); fwrite($f, " *\n"); -fwrite($f, ' * Last update: '.date(DATE_W3C)."\n"); -fwrite($f, ' * Source: '.$windowsZonesUrl."\n"); +fwrite($f, " * Last update: " . date(DATE_W3C) . "\n"); +fwrite($f, " * Source: " . $windowsZonesUrl . "\n"); fwrite($f, " *\n"); fwrite($f, " * @copyright Copyright (C) fruux GmbH (https://fruux.com/).\n"); fwrite($f, " * @license http://sabre.io/license/ Modified BSD License\n"); fwrite($f, " */\n"); fwrite($f, "\n"); -fwrite($f, 'return '); -fwrite($f, var_export($map, true).';'); +fwrite($f, "return "); +fwrite($f, var_export($map, true) . ';'); fclose($f); echo "Formatting\n"; -exec(__DIR__.'/sabre-cs-fixer fix '.escapeshellarg($outputFile)); +exec(__DIR__ . '/sabre-cs-fixer fix ' . escapeshellarg($outputFile)); echo "Done\n"; diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php index 62b6107c5..a2df3c63a 100644 --- a/vendor/sabre/vobject/bin/generateicalendardata.php +++ b/vendor/sabre/vobject/bin/generateicalendardata.php @@ -23,53 +23,54 @@ HI $events = 100; -if (isset($argv[1])) { - $events = (int) $argv[1]; -} +if (isset($argv[1])) $events = (int)$argv[1]; -include __DIR__.'/../vendor/autoload.php'; +include __DIR__ . '/../vendor/autoload.php'; -fwrite(STDERR, 'Generating '.$events." events\n"); +fwrite(STDERR, "Generating " . $events . " events\n"); -$currentDate = new DateTime('-'.round($events / 2).' days'); +$currentDate = new DateTime('-' . round($events / 2) . ' days'); $calendar = new VObject\Component\VCalendar(); $ii = 0; while ($ii < $events) { - ++$ii; + + $ii++; $event = $calendar->add('VEVENT'); $event->DTSTART = 'bla'; - $event->SUMMARY = 'Event #'.$ii; + $event->SUMMARY = 'Event #' . $ii; $event->UID = md5(microtime(true)); $doctorRandom = mt_rand(1, 1000); switch ($doctorRandom) { // All-day event - case 1: + case 1 : $event->DTEND = 'bla'; $dtStart = clone $currentDate; $dtEnd = clone $currentDate; - $dtEnd->modify('+'.mt_rand(1, 3).' days'); + $dtEnd->modify('+' . mt_rand(1, 3) . ' days'); $event->DTSTART->setDateTime($dtStart); $event->DTSTART['VALUE'] = 'DATE'; $event->DTEND->setDateTime($dtEnd); break; - case 2: - $event->RRULE = 'FREQ=DAILY;COUNT='.mt_rand(1, 10); - // no break intentional - default: + case 2 : + $event->RRULE = 'FREQ=DAILY;COUNT=' . mt_rand(1, 10); + // No break intentional + default : $dtStart = clone $currentDate; $dtStart->setTime(mt_rand(1, 23), mt_rand(0, 59), mt_rand(0, 59)); $event->DTSTART->setDateTime($dtStart); - $event->DURATION = 'PT'.mt_rand(1, 3).'H'; + $event->DURATION = 'PT' . mt_rand(1, 3) . 'H'; break; + } + + $currentDate->modify('+ ' . mt_rand(0, 3) . ' days'); - $currentDate->modify('+ '.mt_rand(0, 3).' days'); } fwrite(STDERR, "Validating\n"); diff --git a/vendor/sabre/vobject/bin/mergeduplicates.php b/vendor/sabre/vobject/bin/mergeduplicates.php index e6cde73dd..076524d36 100644 --- a/vendor/sabre/vobject/bin/mergeduplicates.php +++ b/vendor/sabre/vobject/bin/mergeduplicates.php @@ -6,8 +6,8 @@ namespace Sabre\VObject; // This sucks.. we have to try to find the composer autoloader. But chances // are, we can't find it this way. So we'll do our bestest $paths = [ - __DIR__.'/../vendor/autoload.php', // In case vobject is cloned directly - __DIR__.'/../../../autoload.php', // In case vobject is a composer dependency. + __DIR__ . '/../vendor/autoload.php', // In case vobject is cloned directly + __DIR__ . '/../../../autoload.php', // In case vobject is a composer dependency. ]; foreach ($paths as $path) { @@ -22,12 +22,14 @@ if (!class_exists('Sabre\\VObject\\Version')) { die(1); } -echo 'sabre/vobject ', Version::VERSION, " duplicate contact merge tool\n"; +echo "sabre/vobject ", Version::VERSION, " duplicate contact merge tool\n"; if ($argc < 3) { + echo "\n"; - echo 'Usage: ', $argv[0], " input.vcf output.vcf [debug.log]\n"; + echo "Usage: ", $argv[0], " input.vcf output.vcf [debug.log]\n"; die(1); + } $input = fopen($argv[1], 'r'); @@ -40,72 +42,83 @@ $splitter = new Splitter\VCard($input); // but not in others, we don't consider them for the sake of finding // differences. $ignoredProperties = [ - 'PRODID', - 'VERSION', - 'REV', - 'UID', - 'X-ABLABEL', + "PRODID", + "VERSION", + "REV", + "UID", + "X-ABLABEL", ]; + $collectedNames = []; $stats = [ - 'Total vcards' => 0, - 'No FN property' => 0, - 'Ignored duplicates' => 0, - 'Merged values' => 0, - 'Error' => 0, - 'Unique cards' => 0, - 'Total written' => 0, + "Total vcards" => 0, + "No FN property" => 0, + "Ignored duplicates" => 0, + "Merged values" => 0, + "Error" => 0, + "Unique cards" => 0, + "Total written" => 0, ]; -function writeStats() -{ +function writeStats() { + global $stats; foreach ($stats as $name => $value) { - echo str_pad($name, 23, ' ', STR_PAD_RIGHT), str_pad($value, 6, ' ', STR_PAD_LEFT), "\n"; + echo str_pad($name, 23, " ", STR_PAD_RIGHT), str_pad($value, 6, " ", STR_PAD_LEFT), "\n"; } // Moving cursor back a few lines. - echo "\033[".count($stats).'A'; + echo "\033[" . count($stats) . "A"; + } -function write($vcard) -{ +function write($vcard) { + global $stats, $output; - ++$stats['Total written']; - fwrite($output, $vcard->serialize()."\n"); + $stats["Total written"]++; + fwrite($output, $vcard->serialize() . "\n"); + } while ($vcard = $splitter->getNext()) { - ++$stats['Total vcards']; + + $stats["Total vcards"]++; writeStats(); - $fn = isset($vcard->FN) ? (string) $vcard->FN : null; + $fn = isset($vcard->FN) ? (string)$vcard->FN : null; if (empty($fn)) { + // Immediately write this vcard, we don't compare it. - ++$stats['No FN property']; - ++$stats['Unique cards']; + $stats["No FN property"]++; + $stats['Unique cards']++; write($vcard); $vcard->destroy(); continue; + } if (!isset($collectedNames[$fn])) { + $collectedNames[$fn] = $vcard; - ++$stats['Unique cards']; + $stats['Unique cards']++; continue; + } else { + // Starting comparison for all properties. We only check if properties // in the current vcard exactly appear in the earlier vcard as well. foreach ($vcard->children() as $newProp) { + if (in_array($newProp->name, $ignoredProperties)) { // We don't care about properties such as UID and REV. continue; } $ok = false; foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) { + if ($compareProp->serialize() === $newProp->serialize()) { $ok = true; break; @@ -113,11 +126,14 @@ while ($vcard = $splitter->getNext()) { } if (!$ok) { - if ('EMAIL' === $newProp->name || 'TEL' === $newProp->name) { + + if ($newProp->name === 'EMAIL' || $newProp->name === 'TEL') { + // We're going to make another attempt to find this // property, this time just by value. If we find it, we // consider it a success. foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) { + if ($compareProp->getValue() === $newProp->getValue()) { $ok = true; break; @@ -125,36 +141,44 @@ while ($vcard = $splitter->getNext()) { } if (!$ok) { + // Merging the new value in the old vcard. $collectedNames[$fn]->add(clone $newProp); $ok = true; - ++$stats['Merged values']; + $stats['Merged values']++; + } + } + } if (!$ok) { - // echo $newProp->serialize() . " does not appear in earlier vcard!\n"; - ++$stats['Error']; - if ($debug) { - fwrite($debug, "Missing '".$newProp->name."' property in duplicate. Earlier vcard:\n".$collectedNames[$fn]->serialize()."\n\nLater:\n".$vcard->serialize()."\n\n"); - } + // echo $newProp->serialize() . " does not appear in earlier vcard!\n"; + $stats['Error']++; + if ($debug) fwrite($debug, "Missing '" . $newProp->name . "' property in duplicate. Earlier vcard:\n" . $collectedNames[$fn]->serialize() . "\n\nLater:\n" . $vcard->serialize() . "\n\n"); + $vcard->destroy(); continue 2; } + } + } $vcard->destroy(); - ++$stats['Ignored duplicates']; + $stats['Ignored duplicates']++; + } foreach ($collectedNames as $vcard) { + // Overwriting any old PRODID - $vcard->PRODID = '-//Sabre//Sabre VObject '.Version::VERSION.'//EN'; + $vcard->PRODID = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN'; write($vcard); writeStats(); + } echo str_repeat("\n", count($stats)), "\nDone.\n"; diff --git a/vendor/sabre/vobject/bin/rrulebench.php b/vendor/sabre/vobject/bin/rrulebench.php index 583da574c..af26b4765 100644 --- a/vendor/sabre/vobject/bin/rrulebench.php +++ b/vendor/sabre/vobject/bin/rrulebench.php @@ -1,14 +1,14 @@ <?php -include __DIR__.'/../vendor/autoload.php'; +include __DIR__ . '/../vendor/autoload.php'; if ($argc < 4) { - echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " RRULE benchmark\n"; + echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " RRULE benchmark\n"; echo "\n"; echo "This script can be used to measure the speed of the 'recurrence expansion'\n"; - echo 'system.'; + echo "system."; echo "\n"; - echo 'Usage: '.$argv[0]." inputfile.ics startdate enddate\n"; + echo "Usage: " . $argv[0] . " inputfile.ics startdate enddate\n"; die(); } diff --git a/vendor/sabre/vobject/composer.json b/vendor/sabre/vobject/composer.json index ad026879e..2407cabb1 100644 --- a/vendor/sabre/vobject/composer.json +++ b/vendor/sabre/vobject/composer.json @@ -37,7 +37,9 @@ "sabre/xml" : ">=1.5 <3.0" }, "require-dev" : { - "phpunit/phpunit" : "> 4.8.35, <6.0.0" + "phpunit/phpunit" : "> 4.8.35, <6.0.0", + "sabre/cs" : "^1.0.0" + }, "suggest" : { "hoa/bench" : "If you would like to run the benchmark scripts" diff --git a/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php b/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php index fade50e16..553912249 100644 --- a/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php +++ b/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php @@ -11,8 +11,8 @@ use Sabre\VObject\Component\VCalendar; * @author Dominik Tobschall (http://tobschall.de/) * @license http://sabre.io/license/ Modified BSD License */ -class BirthdayCalendarGenerator -{ +class BirthdayCalendarGenerator { + /** * Input objects. * @@ -41,11 +41,12 @@ class BirthdayCalendarGenerator * * @param mixed $objects */ - public function __construct($objects = null) - { + function __construct($objects = null) { + if ($objects) { $this->setObjects($objects); } + } /** @@ -55,38 +56,52 @@ class BirthdayCalendarGenerator * It's also possible to supply an array of strings or objects. * * @param mixed $objects + * + * @return void */ - public function setObjects($objects) - { + function setObjects($objects) { + if (!is_array($objects)) { $objects = [$objects]; } $this->objects = []; foreach ($objects as $object) { + if (is_string($object)) { + $vObj = Reader::read($object); if (!$vObj instanceof Component\VCard) { throw new \InvalidArgumentException('String could not be parsed as \\Sabre\\VObject\\Component\\VCard by setObjects'); } $this->objects[] = $vObj; + } elseif ($object instanceof Component\VCard) { + $this->objects[] = $object; + } else { + throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component\\VCard arguments to setObjects'); + } + } + } /** - * Sets the output format for the SUMMARY. + * Sets the output format for the SUMMARY * * @param string $format + * + * @return void */ - public function setFormat($format) - { + function setFormat($format) { + $this->format = $format; + } /** @@ -94,11 +109,12 @@ class BirthdayCalendarGenerator * * @return Component/VCalendar */ - public function getResult() - { + function getResult() { + $calendar = new VCalendar(); foreach ($this->objects as $object) { + // Skip if there is no BDAY property. if (!$object->select('BDAY')) { continue; @@ -136,7 +152,7 @@ class BirthdayCalendarGenerator $unknownYear = false; if (!$dateParts['year']) { - $object->BDAY = self::DEFAULT_YEAR.'-'.$dateParts['month'].'-'.$dateParts['date']; + $object->BDAY = self::DEFAULT_YEAR . '-' . $dateParts['month'] . '-' . $dateParts['date']; $unknownYear = true; } @@ -145,8 +161,8 @@ class BirthdayCalendarGenerator $event = $calendar->add('VEVENT', [ 'SUMMARY' => sprintf($this->format, $object->FN->getValue()), 'DTSTART' => new \DateTime($object->BDAY->getValue()), - 'RRULE' => 'FREQ=YEARLY', - 'TRANSP' => 'TRANSPARENT', + 'RRULE' => 'FREQ=YEARLY', + 'TRANSP' => 'TRANSPARENT', ]); // add VALUE=date @@ -156,17 +172,20 @@ class BirthdayCalendarGenerator if ($unknownYear) { $event->add('X-SABRE-BDAY', 'BDAY', [ 'X-SABRE-VCARD-UID' => $object->UID->getValue(), - 'X-SABRE-VCARD-FN' => $object->FN->getValue(), + 'X-SABRE-VCARD-FN' => $object->FN->getValue(), 'X-SABRE-OMIT-YEAR' => self::DEFAULT_YEAR, ]); } else { $event->add('X-SABRE-BDAY', 'BDAY', [ 'X-SABRE-VCARD-UID' => $object->UID->getValue(), - 'X-SABRE-VCARD-FN' => $object->FN->getValue(), + 'X-SABRE-VCARD-FN' => $object->FN->getValue(), ]); } + } return $calendar; + } + } diff --git a/vendor/sabre/vobject/lib/Cli.php b/vendor/sabre/vobject/lib/Cli.php index 70b5e8d6e..df7ac22f3 100644 --- a/vendor/sabre/vobject/lib/Cli.php +++ b/vendor/sabre/vobject/lib/Cli.php @@ -12,8 +12,8 @@ use * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Cli -{ +class Cli { + /** * No output. * @@ -96,8 +96,8 @@ class Cli * * @return int */ - public function main(array $argv) - { + function main(array $argv) { + // @codeCoverageIgnoreStart // We cannot easily test this, so we'll skip it. Pretty basic anyway. @@ -113,96 +113,103 @@ class Cli // @codeCoverageIgnoreEnd + try { + list($options, $positional) = $this->parseArguments($argv); if (isset($options['q'])) { $this->quiet = true; } - $this->log($this->colorize('green', 'sabre/vobject ').$this->colorize('yellow', Version::VERSION)); + $this->log($this->colorize('green', "sabre/vobject ") . $this->colorize('yellow', Version::VERSION)); foreach ($options as $name => $value) { + switch ($name) { - case 'q': + + case 'q' : // Already handled earlier. break; - case 'h': - case 'help': + case 'h' : + case 'help' : $this->showHelp(); - return 0; break; - case 'format': + case 'format' : switch ($value) { + // jcard/jcal documents - case 'jcard': - case 'jcal': + case 'jcard' : + case 'jcal' : // specific document versions - case 'vcard21': - case 'vcard30': - case 'vcard40': - case 'icalendar20': + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : // specific formats - case 'json': - case 'mimedir': + case 'json' : + case 'mimedir' : // icalendar/vcad - case 'icalendar': - case 'vcard': + case 'icalendar' : + case 'vcard' : $this->format = $value; break; - default: - throw new InvalidArgumentException('Unknown format: '.$value); + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + } break; - case 'pretty': + case 'pretty' : if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $this->pretty = true; } break; - case 'forgiving': + case 'forgiving' : $this->forgiving = true; break; - case 'inputformat': + case 'inputformat' : switch ($value) { // json formats - case 'jcard': - case 'jcal': - case 'json': + case 'jcard' : + case 'jcal' : + case 'json' : $this->inputFormat = 'json'; break; // mimedir formats - case 'mimedir': - case 'icalendar': - case 'vcard': - case 'vcard21': - case 'vcard30': - case 'vcard40': - case 'icalendar20': + case 'mimedir' : + case 'icalendar' : + case 'vcard' : + case 'vcard21' : + case 'vcard30' : + case 'vcard40' : + case 'icalendar20' : $this->inputFormat = 'mimedir'; break; - default: - throw new InvalidArgumentException('Unknown format: '.$value); + default : + throw new InvalidArgumentException('Unknown format: ' . $value); + } break; - default: - throw new InvalidArgumentException('Unknown option: '.$name); + default : + throw new InvalidArgumentException('Unknown option: ' . $name); + } + } - if (0 === count($positional)) { + if (count($positional) === 0) { $this->showHelp(); - return 1; } - if (1 === count($positional)) { + if (count($positional) === 1) { throw new InvalidArgumentException('Inputfile is a required argument'); } @@ -211,12 +218,12 @@ class Cli } if (!in_array($positional[0], ['validate', 'repair', 'convert', 'color'])) { - throw new InvalidArgumentException('Uknown command: '.$positional[0]); + throw new InvalidArgumentException('Uknown command: ' . $positional[0]); } + } catch (InvalidArgumentException $e) { $this->showHelp(); - $this->log('Error: '.$e->getMessage(), 'red'); - + $this->log('Error: ' . $e->getMessage(), 'red'); return 1; } @@ -225,71 +232,76 @@ class Cli $this->inputPath = $positional[1]; $this->outputPath = isset($positional[2]) ? $positional[2] : '-'; - if ('-' !== $this->outputPath) { + if ($this->outputPath !== '-') { $this->stdout = fopen($this->outputPath, 'w'); } if (!$this->inputFormat) { - if ('.json' === substr($this->inputPath, -5)) { + if (substr($this->inputPath, -5) === '.json') { $this->inputFormat = 'json'; } else { $this->inputFormat = 'mimedir'; } } if (!$this->format) { - if ('.json' === substr($this->outputPath, -5)) { + if (substr($this->outputPath, -5) === '.json') { $this->format = 'json'; } else { $this->format = 'mimedir'; } } + $realCode = 0; try { + while ($input = $this->readInput()) { + $returnCode = $this->$command($input); - if (0 !== $returnCode) { - $realCode = $returnCode; - } + if ($returnCode !== 0) $realCode = $returnCode; + } + } catch (EofException $e) { // end of file } catch (\Exception $e) { - $this->log('Error: '.$e->getMessage(), 'red'); - + $this->log('Error: ' . $e->getMessage(), 'red'); return 2; } return $realCode; + } /** * Shows the help message. + * + * @return void */ - protected function showHelp() - { + protected function showHelp() { + $this->log('Usage:', 'yellow'); - $this->log(' vobject [options] command [arguments]'); + $this->log(" vobject [options] command [arguments]"); $this->log(''); $this->log('Options:', 'yellow'); - $this->log($this->colorize('green', ' -q ')."Don't output anything."); - $this->log($this->colorize('green', ' -help -h ').'Display this help message.'); - $this->log($this->colorize('green', ' --format ').'Convert to a specific format. Must be one of: vcard, vcard21,'); - $this->log($this->colorize('green', ' --forgiving ').'Makes the parser less strict.'); - $this->log(' vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir.'); - $this->log($this->colorize('green', ' --inputformat ').'If the input format cannot be guessed from the extension, it'); - $this->log(' must be specified here.'); + $this->log($this->colorize('green', ' -q ') . "Don't output anything."); + $this->log($this->colorize('green', ' -help -h ') . "Display this help message."); + $this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,"); + $this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict."); + $this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir."); + $this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it"); + $this->log(" must be specified here."); // Only PHP 5.4 and up if (version_compare(PHP_VERSION, '5.4.0') >= 0) { - $this->log($this->colorize('green', ' --pretty ').'json pretty-print.'); + $this->log($this->colorize('green', ' --pretty ') . "json pretty-print."); } $this->log(''); $this->log('Commands:', 'yellow'); - $this->log($this->colorize('green', ' validate').' source_file Validates a file for correctness.'); - $this->log($this->colorize('green', ' repair').' source_file [output_file] Repairs a file.'); - $this->log($this->colorize('green', ' convert').' source_file [output_file] Converts a file.'); - $this->log($this->colorize('green', ' color').' source_file Colorize a file, useful for debbugging.'); + $this->log($this->colorize('green', ' validate') . ' source_file Validates a file for correctness.'); + $this->log($this->colorize('green', ' repair') . ' source_file [output_file] Repairs a file.'); + $this->log($this->colorize('green', ' convert') . ' source_file [output_file] Converts a file.'); + $this->log($this->colorize('green', ' color') . ' source_file Colorize a file, useful for debbugging.'); $this->log( <<<HELP @@ -307,6 +319,7 @@ HELP $this->log(' vobject color calendar.ics'); $this->log(''); $this->log('https://github.com/fruux/sabre-vobject', 'purple'); + } /** @@ -316,23 +329,24 @@ HELP * * @return int */ - protected function validate(Component $vObj) - { + protected function validate(Component $vObj) { + $returnCode = 0; switch ($vObj->name) { - case 'VCALENDAR': - $this->log('iCalendar: '.(string) $vObj->VERSION); + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); break; - case 'VCARD': - $this->log('vCard: '.(string) $vObj->VERSION); + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); break; } $warnings = $vObj->validate(); if (!count($warnings)) { - $this->log(' No warnings!'); + $this->log(" No warnings!"); } else { + $levels = [ 1 => 'REPAIRED', 2 => 'WARNING', @@ -340,15 +354,19 @@ HELP ]; $returnCode = 2; foreach ($warnings as $warn) { + $extra = ''; if ($warn['node'] instanceof Property) { - $extra = ' (property: "'.$warn['node']->name.'")'; + $extra = ' (property: "' . $warn['node']->name . '")'; } - $this->log(' ['.$levels[$warn['level']].'] '.$warn['message'].$extra); + $this->log(" [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra); + } + } return $returnCode; + } /** @@ -358,23 +376,24 @@ HELP * * @return int */ - protected function repair(Component $vObj) - { + protected function repair(Component $vObj) { + $returnCode = 0; switch ($vObj->name) { - case 'VCALENDAR': - $this->log('iCalendar: '.(string) $vObj->VERSION); + case 'VCALENDAR' : + $this->log("iCalendar: " . (string)$vObj->VERSION); break; - case 'VCARD': - $this->log('vCard: '.(string) $vObj->VERSION); + case 'VCARD' : + $this->log("vCard: " . (string)$vObj->VERSION); break; } $warnings = $vObj->validate(Node::REPAIR); if (!count($warnings)) { - $this->log(' No warnings!'); + $this->log(" No warnings!"); } else { + $levels = [ 1 => 'REPAIRED', 2 => 'WARNING', @@ -382,16 +401,20 @@ HELP ]; $returnCode = 2; foreach ($warnings as $warn) { + $extra = ''; if ($warn['node'] instanceof Property) { - $extra = ' (property: "'.$warn['node']->name.'")'; + $extra = ' (property: "' . $warn['node']->name . '")'; } - $this->log(' ['.$levels[$warn['level']].'] '.$warn['message'].$extra); + $this->log(" [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra); + } + } fwrite($this->stdout, $vObj->serialize()); return $returnCode; + } /** @@ -401,46 +424,47 @@ HELP * * @return int */ - protected function convert($vObj) - { + protected function convert($vObj) { + $json = false; $convertVersion = null; $forceInput = null; switch ($this->format) { - case 'json': + case 'json' : $json = true; - if ('VCARD' === $vObj->name) { + if ($vObj->name === 'VCARD') { $convertVersion = Document::VCARD40; } break; - case 'jcard': + case 'jcard' : $json = true; $forceInput = 'VCARD'; $convertVersion = Document::VCARD40; break; - case 'jcal': + case 'jcal' : $json = true; $forceInput = 'VCALENDAR'; break; - case 'mimedir': - case 'icalendar': - case 'icalendar20': - case 'vcard': + case 'mimedir' : + case 'icalendar' : + case 'icalendar20' : + case 'vcard' : break; - case 'vcard21': + case 'vcard21' : $convertVersion = Document::VCARD21; break; - case 'vcard30': + case 'vcard30' : $convertVersion = Document::VCARD30; break; - case 'vcard40': + case 'vcard40' : $convertVersion = Document::VCARD40; break; + } if ($forceInput && $vObj->name !== $forceInput) { - throw new \Exception('You cannot convert a '.strtolower($vObj->name).' to '.$this->format); + throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format); } if ($convertVersion) { $vObj = $vObj->convert($convertVersion); @@ -456,6 +480,7 @@ HELP } return 0; + } /** @@ -465,9 +490,10 @@ HELP * * @return int */ - protected function color($vObj) - { + protected function color($vObj) { + fwrite($this->stdout, $this->serializeComponent($vObj)); + } /** @@ -477,19 +503,19 @@ HELP * * @return string */ - protected function colorize($color, $str, $resetTo = 'default') - { + protected function colorize($color, $str, $resetTo = 'default') { + $colors = [ - 'cyan' => '1;36', - 'red' => '1;31', - 'yellow' => '1;33', - 'blue' => '0;34', - 'green' => '0;32', + 'cyan' => '1;36', + 'red' => '1;31', + 'yellow' => '1;33', + 'blue' => '0;34', + 'green' => '0;32', 'default' => '0', - 'purple' => '0;35', + 'purple' => '0;35', ]; + return "\033[" . $colors[$color] . 'm' . $str . "\033[" . $colors[$resetTo] . "m"; - return "\033[".$colors[$color].'m'.$str."\033[".$colors[$resetTo].'m'; } /** @@ -497,17 +523,20 @@ HELP * * @param string $color * @param string $str + * + * @return void */ - protected function cWrite($color, $str) - { + protected function cWrite($color, $str) { + fwrite($this->stdout, $this->colorize($color, $str)); + } - protected function serializeComponent(Component $vObj) - { + protected function serializeComponent(Component $vObj) { + $this->cWrite('cyan', 'BEGIN'); $this->cWrite('red', ':'); - $this->cWrite('yellow', $vObj->name."\n"); + $this->cWrite('yellow', $vObj->name . "\n"); /** * Gives a component a 'score' for sorting purposes. @@ -519,51 +548,52 @@ HELP * space to accomodate elements. The $key is added to the $score to * preserve the original relative order of elements. * - * @param int $key + * @param int $key * @param array $array * * @return int */ - $sortScore = function ($key, $array) { + $sortScore = function($key, $array) { + if ($array[$key] instanceof Component) { + // We want to encode VTIMEZONE first, this is a personal // preference. - if ('VTIMEZONE' === $array[$key]->name) { + if ($array[$key]->name === 'VTIMEZONE') { $score = 300000000; - return $score + $key; } else { $score = 400000000; - return $score + $key; } } else { // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first if ($array[$key] instanceof Property) { - if ('VERSION' === $array[$key]->name) { + if ($array[$key]->name === 'VERSION') { $score = 100000000; - return $score + $key; } else { // All other properties $score = 200000000; - return $score + $key; } } } + }; $children = $vObj->children(); $tmp = $children; uksort( $children, - function ($a, $b) use ($sortScore, $tmp) { + function($a, $b) use ($sortScore, $tmp) { + $sA = $sortScore($a, $tmp); $sB = $sortScore($b, $tmp); return $sA - $sB; + } ); @@ -577,16 +607,19 @@ HELP $this->cWrite('cyan', 'END'); $this->cWrite('red', ':'); - $this->cWrite('yellow', $vObj->name."\n"); + $this->cWrite('yellow', $vObj->name . "\n"); + } /** * Colorizes a property. * * @param Property $property + * + * @return void */ - protected function serializeProperty(Property $property) - { + protected function serializeProperty(Property $property) { + if ($property->group) { $this->cWrite('default', $property->group); $this->cWrite('red', '.'); @@ -595,14 +628,19 @@ HELP $this->cWrite('yellow', $property->name); foreach ($property->parameters as $param) { + $this->cWrite('red', ';'); $this->cWrite('blue', $param->serialize()); + } $this->cWrite('red', ':'); if ($property instanceof Property\Binary) { - $this->cWrite('default', 'embedded binary stripped. ('.strlen($property->getValue()).' bytes)'); + + $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)'); + } else { + $parts = $property->getParts(); $first1 = true; // Looping through property values @@ -614,7 +652,7 @@ HELP } $first2 = true; // Looping through property sub-values - foreach ((array) $part as $subPart) { + foreach ((array)$part as $subPart) { if ($first2) { $first2 = false; } else { @@ -626,39 +664,42 @@ HELP $subPart, [ '\\' => $this->colorize('purple', '\\\\', 'green'), - ';' => $this->colorize('purple', '\;', 'green'), - ',' => $this->colorize('purple', '\,', 'green'), + ';' => $this->colorize('purple', '\;', 'green'), + ',' => $this->colorize('purple', '\,', 'green'), "\n" => $this->colorize('purple', "\\n\n\t", 'green'), - "\r" => '', + "\r" => "", ] ); $this->cWrite('green', $subPart); } } + } - $this->cWrite('default', "\n"); + $this->cWrite("default", "\n"); + } /** * Parses the list of arguments. * * @param array $argv + * + * @return void */ - protected function parseArguments(array $argv) - { + protected function parseArguments(array $argv) { + $positional = []; $options = []; - for ($ii = 0; $ii < count($argv); ++$ii) { + for ($ii = 0; $ii < count($argv); $ii++) { + // Skipping the first argument. - if (0 === $ii) { - continue; - } + if ($ii === 0) continue; $v = $argv[$ii]; - if ('--' === substr($v, 0, 2)) { + if (substr($v, 0, 2) === '--') { // This is a long-form option. $optionName = substr($v, 2); $optionValue = true; @@ -666,17 +707,22 @@ HELP list($optionName, $optionValue) = explode('=', $optionName); } $options[$optionName] = $optionValue; - } elseif ('-' === substr($v, 0, 1) && strlen($v) > 1) { + } elseif (substr($v, 0, 1) === '-' && strlen($v) > 1) { // This is a short-form option. foreach (str_split(substr($v, 1)) as $option) { $options[$option] = true; } + } else { + $positional[] = $v; + } + } return [$options, $positional]; + } protected $parser; @@ -686,14 +732,14 @@ HELP * * @return Component */ - protected function readInput() - { + protected function readInput() { + if (!$this->parser) { - if ('-' !== $this->inputPath) { + if ($this->inputPath !== '-') { $this->stdin = fopen($this->inputPath, 'r'); } - if ('mimedir' === $this->inputFormat) { + if ($this->inputFormat === 'mimedir') { $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving ? Reader::OPTION_FORGIVING : 0)); } else { $this->parser = new Parser\Json($this->stdin, ($this->forgiving ? Reader::OPTION_FORGIVING : 0)); @@ -701,20 +747,25 @@ HELP } return $this->parser->parse(); + } /** * Sends a message to STDERR. * * @param string $msg + * + * @return void */ - protected function log($msg, $color = 'default') - { + protected function log($msg, $color = 'default') { + if (!$this->quiet) { - if ('default' !== $color) { + if ($color !== 'default') { $msg = $this->colorize($color, $msg); } - fwrite($this->stderr, $msg."\n"); + fwrite($this->stderr, $msg . "\n"); } + } + } diff --git a/vendor/sabre/vobject/lib/Component.php b/vendor/sabre/vobject/lib/Component.php index a33b7d577..ac87a10ec 100644 --- a/vendor/sabre/vobject/lib/Component.php +++ b/vendor/sabre/vobject/lib/Component.php @@ -14,8 +14,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Component extends Node -{ +class Component extends Node { + /** * Component name. * @@ -44,12 +44,14 @@ class Component extends Node * ensure that this does not happen, set $defaults to false. * * @param Document $root - * @param string $name such as VCALENDAR, VEVENT - * @param array $children - * @param bool $defaults + * @param string $name such as VCALENDAR, VEVENT. + * @param array $children + * @param bool $defaults + * + * @return void */ - public function __construct(Document $root, $name, array $children = [], $defaults = true) - { + function __construct(Document $root, $name, array $children = [], $defaults = true) { + $this->name = strtoupper($name); $this->root = $root; @@ -82,11 +84,13 @@ class Component extends Node // Component or Property $this->add($child); } else { + // Property key=>value $this->add($k, $child); } } } + } /** @@ -102,8 +106,8 @@ class Component extends Node * * @return Node */ - public function add() - { + function add() { + $arguments = func_get_args(); if ($arguments[0] instanceof Node) { @@ -112,10 +116,15 @@ class Component extends Node } $arguments[0]->parent = $this; $newNode = $arguments[0]; + } elseif (is_string($arguments[0])) { + $newNode = call_user_func_array([$this->root, 'create'], $arguments); + } else { + throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string'); + } $name = $newNode->name; @@ -124,8 +133,8 @@ class Component extends Node } else { $this->children[$name] = [$newNode]; } - return $newNode; + } /** @@ -137,34 +146,36 @@ class Component extends Node * exact item will be removed. * * @param string|Property|Component $item + * @return void */ - public function remove($item) - { + function remove($item) { + if (is_string($item)) { // If there's no dot in the name, it's an exact property name and // we can just wipe out all those properties. // - if (false === strpos($item, '.')) { + if (strpos($item, '.') === false) { unset($this->children[strtoupper($item)]); - return; } // If there was a dot, we need to ask select() to help us out and // then we just call remove recursively. foreach ($this->select($item) as $child) { + $this->remove($child); + } } else { foreach ($this->select($item->name) as $k => $child) { if ($child === $item) { unset($this->children[$item->name][$k]); - return; } } } throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); + } /** @@ -173,14 +184,14 @@ class Component extends Node * * @return array */ - public function children() - { + function children() { + $result = []; foreach ($this->children as $childGroup) { $result = array_merge($result, $childGroup); } - return $result; + } /** @@ -189,8 +200,8 @@ class Component extends Node * * @return array */ - public function getComponents() - { + function getComponents() { + $result = []; foreach ($this->children as $childGroup) { @@ -200,8 +211,8 @@ class Component extends Node } } } - return $result; + } /** @@ -215,21 +226,19 @@ class Component extends Node * has not been assigned a group, specify ".EMAIL". * * @param string $name - * * @return array */ - public function select($name) - { + function select($name) { + $group = null; $name = strtoupper($name); - if (false !== strpos($name, '.')) { + if (strpos($name, '.') !== false) { list($group, $name) = explode('.', $name, 2); } - if ('' === $name) { - $name = null; - } + if ($name === '') $name = null; if (!is_null($name)) { + $result = isset($this->children[$name]) ? $this->children[$name] : []; if (is_null($group)) { @@ -239,25 +248,32 @@ class Component extends Node // more. return array_filter( $result, - function ($child) use ($group) { + function($child) use ($group) { + return $child instanceof Property && strtoupper($child->group) === $group; + } ); } + } // If we got to this point, it means there was no 'name' specified for // searching, implying that this is a group-only search. $result = []; foreach ($this->children as $childGroup) { + foreach ($childGroup as $child) { + if ($child instanceof Property && strtoupper($child->group) === $group) { $result[] = $child; } + } - } + } return $result; + } /** @@ -265,9 +281,9 @@ class Component extends Node * * @return string */ - public function serialize() - { - $str = 'BEGIN:'.$this->name."\r\n"; + function serialize() { + + $str = "BEGIN:" . $this->name . "\r\n"; /** * Gives a component a 'score' for sorting purposes. @@ -279,60 +295,60 @@ class Component extends Node * space to accomodate elements. The $key is added to the $score to * preserve the original relative order of elements. * - * @param int $key + * @param int $key * @param array $array * * @return int */ - $sortScore = function ($key, $array) { + $sortScore = function($key, $array) { + if ($array[$key] instanceof Component) { + // We want to encode VTIMEZONE first, this is a personal // preference. - if ('VTIMEZONE' === $array[$key]->name) { + if ($array[$key]->name === 'VTIMEZONE') { $score = 300000000; - return $score + $key; } else { $score = 400000000; - return $score + $key; } } else { // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first if ($array[$key] instanceof Property) { - if ('VERSION' === $array[$key]->name) { + if ($array[$key]->name === 'VERSION') { $score = 100000000; - return $score + $key; } else { // All other properties $score = 200000000; - return $score + $key; } } } + }; $children = $this->children(); $tmp = $children; uksort( $children, - function ($a, $b) use ($sortScore, $tmp) { + function($a, $b) use ($sortScore, $tmp) { + $sA = $sortScore($a, $tmp); $sB = $sortScore($b, $tmp); return $sA - $sB; + } ); - foreach ($children as $child) { - $str .= $child->serialize(); - } - $str .= 'END:'.$this->name."\r\n"; + foreach ($children as $child) $str .= $child->serialize(); + $str .= "END:" . $this->name . "\r\n"; return $str; + } /** @@ -341,8 +357,8 @@ class Component extends Node * * @return array */ - public function jsonSerialize() - { + function jsonSerialize() { + $components = []; $properties = []; @@ -359,18 +375,21 @@ class Component extends Node return [ strtolower($this->name), $properties, - $components, + $components ]; + } /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - public function xmlSerialize(Xml\Writer $writer) - { + function xmlSerialize(Xml\Writer $writer) { + $components = []; $properties = []; @@ -387,6 +406,7 @@ class Component extends Node $writer->startElement(strtolower($this->name)); if (!empty($properties)) { + $writer->startElement('properties'); foreach ($properties as $property) { @@ -394,9 +414,11 @@ class Component extends Node } $writer->endElement(); + } if (!empty($components)) { + $writer->startElement('components'); foreach ($components as $component) { @@ -407,6 +429,7 @@ class Component extends Node } $writer->endElement(); + } /** @@ -414,9 +437,10 @@ class Component extends Node * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return []; + } /* Magic property accessors {{{ */ @@ -435,22 +459,24 @@ class Component extends Node * * @return Property */ - public function __get($name) - { - if ('children' === $name) { + function __get($name) { + + if ($name === 'children') { + throw new \RuntimeException('Starting sabre/vobject 4.0 the children property is now protected. You should use the children() method instead'); + } $matches = $this->select($name); - if (0 === count($matches)) { + if (count($matches) === 0) { return; } else { $firstMatch = current($matches); - /* @var $firstMatch Property */ + /** @var $firstMatch Property */ $firstMatch->setIterator(new ElementList(array_values($matches))); - return $firstMatch; } + } /** @@ -460,11 +486,11 @@ class Component extends Node * * @return bool */ - public function __isset($name) - { - $matches = $this->select($name); + function __isset($name) { + $matches = $this->select($name); return count($matches) > 0; + } /** @@ -477,10 +503,12 @@ class Component extends Node * a new item with the same name, always use the add() method. * * @param string $name - * @param mixed $value + * @param mixed $value + * + * @return void */ - public function __set($name, $value) - { + function __set($name, $value) { + $name = strtoupper($name); $this->remove($name); if ($value instanceof self || $value instanceof Property) { @@ -495,10 +523,13 @@ class Component extends Node * specified name. * * @param string $name + * + * @return void */ - public function __unset($name) - { + function __unset($name) { + $this->remove($name); + } /* }}} */ @@ -506,9 +537,11 @@ class Component extends Node /** * This method is automatically called when the object is cloned. * Specifically, this will ensure all child elements are also cloned. + * + * @return void */ - public function __clone() - { + function __clone() { + foreach ($this->children as $childName => $childGroup) { foreach ($childGroup as $key => $child) { $clonedChild = clone $child; @@ -517,6 +550,7 @@ class Component extends Node $this->children[$childName][$key] = $clonedChild; } } + } /** @@ -540,9 +574,10 @@ class Component extends Node * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return []; + } /** @@ -569,8 +604,8 @@ class Component extends Node * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $rules = $this->getValidationRules(); $defaults = $this->getDefaults(); @@ -583,48 +618,49 @@ class Component extends Node if (!isset($propertyCounters[$name])) { $propertyCounters[$name] = 1; } else { - ++$propertyCounters[$name]; + $propertyCounters[$name]++; } $messages = array_merge($messages, $child->validate($options)); } foreach ($rules as $propName => $rule) { + switch ($rule) { - case '0': + case '0' : if (isset($propertyCounters[$propName])) { $messages[] = [ - 'level' => 3, - 'message' => $propName.' MUST NOT appear in a '.$this->name.' component', - 'node' => $this, + 'level' => 3, + 'message' => $propName . ' MUST NOT appear in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '1': - if (!isset($propertyCounters[$propName]) || 1 !== $propertyCounters[$propName]) { + case '1' : + if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] !== 1) { $repaired = false; if ($options & self::REPAIR && isset($defaults[$propName])) { $this->add($propName, $defaults[$propName]); $repaired = true; } $messages[] = [ - 'level' => $repaired ? 1 : 3, - 'message' => $propName.' MUST appear exactly once in a '.$this->name.' component', - 'node' => $this, + 'level' => $repaired ? 1 : 3, + 'message' => $propName . ' MUST appear exactly once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '+': + case '+' : if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] < 1) { $messages[] = [ - 'level' => 3, - 'message' => $propName.' MUST appear at least once in a '.$this->name.' component', - 'node' => $this, + 'level' => 3, + 'message' => $propName . ' MUST appear at least once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '*': + case '*' : break; - case '?': + case '?' : if (isset($propertyCounters[$propName]) && $propertyCounters[$propName] > 1) { $level = 3; @@ -633,7 +669,7 @@ class Component extends Node if ($options & self::REPAIR) { $properties = array_unique($this->select($propName), SORT_REGULAR); - if (1 === count($properties)) { + if (count($properties) === 1) { $this->remove($propName); $this->add($properties[0]); @@ -642,16 +678,18 @@ class Component extends Node } $messages[] = [ - 'level' => $level, - 'message' => $propName.' MUST NOT appear more than once in a '.$this->name.' component', - 'node' => $this, + 'level' => $level, + 'message' => $propName . ' MUST NOT appear more than once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; + } - } + } return $messages; + } /** @@ -659,9 +697,11 @@ class Component extends Node * * It's intended to remove all circular references, so PHP can easily clean * it up. + * + * @return void */ - public function destroy() - { + function destroy() { + parent::destroy(); foreach ($this->children as $childGroup) { foreach ($childGroup as $child) { @@ -669,5 +709,7 @@ class Component extends Node } } $this->children = []; + } + } diff --git a/vendor/sabre/vobject/lib/Component/Available.php b/vendor/sabre/vobject/lib/Component/Available.php index 5510b9e0a..b3aaf08af 100644 --- a/vendor/sabre/vobject/lib/Component/Available.php +++ b/vendor/sabre/vobject/lib/Component/Available.php @@ -14,8 +14,8 @@ use Sabre\VObject; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class Available extends VObject\Component -{ +class Available extends VObject\Component { + /** * Returns the 'effective start' and 'effective end' of this VAVAILABILITY * component. @@ -28,8 +28,8 @@ class Available extends VObject\Component * * @return array */ - public function getEffectiveStartEnd() - { + function getEffectiveStartEnd() { + $effectiveStart = $this->DTSTART->getDateTime(); if (isset($this->DTEND)) { $effectiveEnd = $this->DTEND->getDateTime(); @@ -38,6 +38,7 @@ class Available extends VObject\Component } return [$effectiveStart, $effectiveEnd]; + } /** @@ -55,31 +56,32 @@ class Available extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'UID' => 1, + 'UID' => 1, 'DTSTART' => 1, 'DTSTAMP' => 1, - 'DTEND' => '?', + 'DTEND' => '?', 'DURATION' => '?', - 'CREATED' => '?', - 'DESCRIPTION' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', 'LAST-MODIFIED' => '?', 'RECURRENCE-ID' => '?', - 'RRULE' => '?', - 'SUMMARY' => '?', + 'RRULE' => '?', + 'SUMMARY' => '?', 'CATEGORIES' => '*', - 'COMMENT' => '*', - 'CONTACT' => '*', - 'EXDATE' => '*', - 'RDATE' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'EXDATE' => '*', + 'RDATE' => '*', 'AVAILABLE' => '*', ]; + } /** @@ -106,18 +108,19 @@ class Available extends VObject\Component * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $result = parent::validate($options); if (isset($this->DTEND) && isset($this->DURATION)) { $result[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'DTEND and DURATION cannot both be present', - 'node' => $this, + 'node' => $this ]; } return $result; + } } diff --git a/vendor/sabre/vobject/lib/Component/VAlarm.php b/vendor/sabre/vobject/lib/Component/VAlarm.php index bd00eb600..faa8a5e74 100644 --- a/vendor/sabre/vobject/lib/Component/VAlarm.php +++ b/vendor/sabre/vobject/lib/Component/VAlarm.php @@ -16,8 +16,8 @@ use Sabre\VObject\InvalidDataException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VAlarm extends VObject\Component -{ +class VAlarm extends VObject\Component { + /** * Returns a DateTime object when this alarm is going to trigger. * @@ -25,16 +25,17 @@ class VAlarm extends VObject\Component * * @return DateTimeImmutable */ - public function getEffectiveTriggerTime() - { + function getEffectiveTriggerTime() { + $trigger = $this->TRIGGER; - if (!isset($trigger['VALUE']) || 'DURATION' === strtoupper($trigger['VALUE'])) { + if (!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); - $related = (isset($trigger['RELATED']) && 'END' == strtoupper($trigger['RELATED'])) ? 'END' : 'START'; + $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; $parentComponent = $this->parent; - if ('START' === $related) { - if ('VTODO' === $parentComponent->name) { + if ($related === 'START') { + + if ($parentComponent->name === 'VTODO') { $propName = 'DUE'; } else { $propName = 'DTSTART'; @@ -43,9 +44,9 @@ class VAlarm extends VObject\Component $effectiveTrigger = $parentComponent->$propName->getDateTime(); $effectiveTrigger = $effectiveTrigger->add($triggerDuration); } else { - if ('VTODO' === $parentComponent->name) { + if ($parentComponent->name === 'VTODO') { $endProp = 'DUE'; - } elseif ('VEVENT' === $parentComponent->name) { + } elseif ($parentComponent->name === 'VEVENT') { $endProp = 'DTEND'; } else { throw new InvalidDataException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); @@ -67,8 +68,8 @@ class VAlarm extends VObject\Component } else { $effectiveTrigger = $trigger->getDateTime(); } - return $effectiveTrigger; + } /** @@ -83,29 +84,30 @@ class VAlarm extends VObject\Component * * @return bool */ - public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) - { + function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) { + $effectiveTrigger = $this->getEffectiveTriggerTime(); if (isset($this->DURATION)) { $duration = VObject\DateTimeParser::parseDuration($this->DURATION); - $repeat = (string) $this->REPEAT; + $repeat = (string)$this->REPEAT; if (!$repeat) { $repeat = 1; } - $period = new \DatePeriod($effectiveTrigger, $duration, (int) $repeat); + $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); foreach ($period as $occurrence) { + if ($start <= $occurrence && $end > $occurrence) { return true; } } - return false; } else { - return $start <= $effectiveTrigger && $end > $effectiveTrigger; + return ($start <= $effectiveTrigger && $end > $effectiveTrigger); } + } /** @@ -123,16 +125,18 @@ class VAlarm extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'ACTION' => 1, + 'ACTION' => 1, 'TRIGGER' => 1, 'DURATION' => '?', - 'REPEAT' => '?', + 'REPEAT' => '?', 'ATTACH' => '?', ]; + } + } diff --git a/vendor/sabre/vobject/lib/Component/VAvailability.php b/vendor/sabre/vobject/lib/Component/VAvailability.php index 6f3e7f13c..66b3310c5 100644 --- a/vendor/sabre/vobject/lib/Component/VAvailability.php +++ b/vendor/sabre/vobject/lib/Component/VAvailability.php @@ -15,8 +15,8 @@ use Sabre\VObject; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class VAvailability extends VObject\Component -{ +class VAvailability extends VObject\Component { + /** * Returns true or false depending on if the event falls in the specified * time-range. This is used for filtering purposes. @@ -31,14 +31,14 @@ class VAvailability extends VObject\Component * * @return bool */ - public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) - { - list($effectiveStart, $effectiveEnd) = $this->getEffectiveStartEnd(); + function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) { - return + list($effectiveStart, $effectiveEnd) = $this->getEffectiveStartEnd(); + return ( (is_null($effectiveStart) || $start < $effectiveEnd) && (is_null($effectiveEnd) || $end > $effectiveStart) - ; + ); + } /** @@ -53,8 +53,8 @@ class VAvailability extends VObject\Component * * @return array */ - public function getEffectiveStartEnd() - { + function getEffectiveStartEnd() { + $effectiveStart = null; $effectiveEnd = null; @@ -68,8 +68,10 @@ class VAvailability extends VObject\Component } return [$effectiveStart, $effectiveEnd]; + } + /** * A simple list of validation rules. * @@ -85,30 +87,31 @@ class VAvailability extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'UID' => 1, + 'UID' => 1, 'DTSTAMP' => 1, - 'BUSYTYPE' => '?', - 'CLASS' => '?', - 'CREATED' => '?', - 'DESCRIPTION' => '?', - 'DTSTART' => '?', + 'BUSYTYPE' => '?', + 'CLASS' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', + 'DTSTART' => '?', 'LAST-MODIFIED' => '?', - 'ORGANIZER' => '?', - 'PRIORITY' => '?', - 'SEQUENCE' => '?', - 'SUMMARY' => '?', - 'URL' => '?', - 'DTEND' => '?', - 'DURATION' => '?', + 'ORGANIZER' => '?', + 'PRIORITY' => '?', + 'SEQUENCE' => '?', + 'SUMMARY' => '?', + 'URL' => '?', + 'DTEND' => '?', + 'DURATION' => '?', 'CATEGORIES' => '*', - 'COMMENT' => '*', - 'CONTACT' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', ]; + } /** @@ -135,18 +138,19 @@ class VAvailability extends VObject\Component * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $result = parent::validate($options); if (isset($this->DTEND) && isset($this->DURATION)) { $result[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'DTEND and DURATION cannot both be present', - 'node' => $this, + 'node' => $this ]; } return $result; + } } diff --git a/vendor/sabre/vobject/lib/Component/VCalendar.php b/vendor/sabre/vobject/lib/Component/VCalendar.php index 4687a092b..1b3137d38 100644 --- a/vendor/sabre/vobject/lib/Component/VCalendar.php +++ b/vendor/sabre/vobject/lib/Component/VCalendar.php @@ -20,8 +20,8 @@ use Sabre\VObject\Recur\NoInstancesException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VCalendar extends VObject\Document -{ +class VCalendar extends VObject\Document { + /** * The default name for this component. * @@ -29,23 +29,23 @@ class VCalendar extends VObject\Document * * @var string */ - public static $defaultName = 'VCALENDAR'; + static $defaultName = 'VCALENDAR'; /** * This is a list of components, and which classes they should map to. * * @var array */ - public static $componentMap = [ - 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar', - 'VALARM' => 'Sabre\\VObject\\Component\\VAlarm', - 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent', - 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy', + static $componentMap = [ + 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar', + 'VALARM' => 'Sabre\\VObject\\Component\\VAlarm', + 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent', + 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy', 'VAVAILABILITY' => 'Sabre\\VObject\\Component\\VAvailability', - 'AVAILABLE' => 'Sabre\\VObject\\Component\\Available', - 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal', - 'VTIMEZONE' => 'Sabre\\VObject\\Component\\VTimeZone', - 'VTODO' => 'Sabre\\VObject\\Component\\VTodo', + 'AVAILABLE' => 'Sabre\\VObject\\Component\\Available', + 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal', + 'VTIMEZONE' => 'Sabre\\VObject\\Component\\VTimeZone', + 'VTODO' => 'Sabre\\VObject\\Component\\VTodo', ]; /** @@ -53,22 +53,22 @@ class VCalendar extends VObject\Document * * @var array */ - public static $valueMap = [ - 'BINARY' => 'Sabre\\VObject\\Property\\Binary', - 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', + static $valueMap = [ + 'BINARY' => 'Sabre\\VObject\\Property\\Binary', + 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', 'CAL-ADDRESS' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', - 'DATE' => 'Sabre\\VObject\\Property\\ICalendar\\Date', - 'DATE-TIME' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', - 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue', - 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue', - 'PERIOD' => 'Sabre\\VObject\\Property\\ICalendar\\Period', - 'RECUR' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', - 'TEXT' => 'Sabre\\VObject\\Property\\Text', - 'TIME' => 'Sabre\\VObject\\Property\\Time', - 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. - 'URI' => 'Sabre\\VObject\\Property\\Uri', - 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', + 'DATE' => 'Sabre\\VObject\\Property\\ICalendar\\Date', + 'DATE-TIME' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', + 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue', + 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue', + 'PERIOD' => 'Sabre\\VObject\\Property\\ICalendar\\Period', + 'RECUR' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', + 'TEXT' => 'Sabre\\VObject\\Property\\Text', + 'TIME' => 'Sabre\\VObject\\Property\\Time', + 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'Sabre\\VObject\\Property\\Uri', + 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', ]; /** @@ -76,80 +76,81 @@ class VCalendar extends VObject\Document * * @var array */ - public static $propertyMap = [ + static $propertyMap = [ // Calendar properties 'CALSCALE' => 'Sabre\\VObject\\Property\\FlatText', - 'METHOD' => 'Sabre\\VObject\\Property\\FlatText', - 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', - 'VERSION' => 'Sabre\\VObject\\Property\\FlatText', + 'METHOD' => 'Sabre\\VObject\\Property\\FlatText', + 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', + 'VERSION' => 'Sabre\\VObject\\Property\\FlatText', // Component properties - 'ATTACH' => 'Sabre\\VObject\\Property\\Uri', - 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', - 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', - 'COMMENT' => 'Sabre\\VObject\\Property\\FlatText', - 'DESCRIPTION' => 'Sabre\\VObject\\Property\\FlatText', - 'GEO' => 'Sabre\\VObject\\Property\\FloatValue', - 'LOCATION' => 'Sabre\\VObject\\Property\\FlatText', + 'ATTACH' => 'Sabre\\VObject\\Property\\Uri', + 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', + 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', + 'COMMENT' => 'Sabre\\VObject\\Property\\FlatText', + 'DESCRIPTION' => 'Sabre\\VObject\\Property\\FlatText', + 'GEO' => 'Sabre\\VObject\\Property\\FloatValue', + 'LOCATION' => 'Sabre\\VObject\\Property\\FlatText', 'PERCENT-COMPLETE' => 'Sabre\\VObject\\Property\\IntegerValue', - 'PRIORITY' => 'Sabre\\VObject\\Property\\IntegerValue', - 'RESOURCES' => 'Sabre\\VObject\\Property\\Text', - 'STATUS' => 'Sabre\\VObject\\Property\\FlatText', - 'SUMMARY' => 'Sabre\\VObject\\Property\\FlatText', + 'PRIORITY' => 'Sabre\\VObject\\Property\\IntegerValue', + 'RESOURCES' => 'Sabre\\VObject\\Property\\Text', + 'STATUS' => 'Sabre\\VObject\\Property\\FlatText', + 'SUMMARY' => 'Sabre\\VObject\\Property\\FlatText', // Date and Time Component Properties 'COMPLETED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DTEND' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DUE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DTSTART' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', - 'FREEBUSY' => 'Sabre\\VObject\\Property\\ICalendar\\Period', - 'TRANSP' => 'Sabre\\VObject\\Property\\FlatText', + 'DTEND' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DUE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTART' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', + 'FREEBUSY' => 'Sabre\\VObject\\Property\\ICalendar\\Period', + 'TRANSP' => 'Sabre\\VObject\\Property\\FlatText', // Time Zone Component Properties - 'TZID' => 'Sabre\\VObject\\Property\\FlatText', - 'TZNAME' => 'Sabre\\VObject\\Property\\FlatText', + 'TZID' => 'Sabre\\VObject\\Property\\FlatText', + 'TZNAME' => 'Sabre\\VObject\\Property\\FlatText', 'TZOFFSETFROM' => 'Sabre\\VObject\\Property\\UtcOffset', - 'TZOFFSETTO' => 'Sabre\\VObject\\Property\\UtcOffset', - 'TZURL' => 'Sabre\\VObject\\Property\\Uri', + 'TZOFFSETTO' => 'Sabre\\VObject\\Property\\UtcOffset', + 'TZURL' => 'Sabre\\VObject\\Property\\Uri', // Relationship Component Properties - 'ATTENDEE' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', - 'CONTACT' => 'Sabre\\VObject\\Property\\FlatText', - 'ORGANIZER' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', + 'ATTENDEE' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', + 'CONTACT' => 'Sabre\\VObject\\Property\\FlatText', + 'ORGANIZER' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress', 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'RELATED-TO' => 'Sabre\\VObject\\Property\\FlatText', - 'URL' => 'Sabre\\VObject\\Property\\Uri', - 'UID' => 'Sabre\\VObject\\Property\\FlatText', + 'RELATED-TO' => 'Sabre\\VObject\\Property\\FlatText', + 'URL' => 'Sabre\\VObject\\Property\\Uri', + 'UID' => 'Sabre\\VObject\\Property\\FlatText', // Recurrence Component Properties 'EXDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'RDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'RRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', + 'RDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'RRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', 'EXRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545 // Alarm Component Properties - 'ACTION' => 'Sabre\\VObject\\Property\\FlatText', - 'REPEAT' => 'Sabre\\VObject\\Property\\IntegerValue', + 'ACTION' => 'Sabre\\VObject\\Property\\FlatText', + 'REPEAT' => 'Sabre\\VObject\\Property\\IntegerValue', 'TRIGGER' => 'Sabre\\VObject\\Property\\ICalendar\\Duration', // Change Management Component Properties - 'CREATED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'DTSTAMP' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'CREATED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'DTSTAMP' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'SEQUENCE' => 'Sabre\\VObject\\Property\\IntegerValue', + 'SEQUENCE' => 'Sabre\\VObject\\Property\\IntegerValue', // Request Status 'REQUEST-STATUS' => 'Sabre\\VObject\\Property\\Text', // Additions from draft-daboo-valarm-extensions-04 - 'ALARM-AGENT' => 'Sabre\\VObject\\Property\\Text', - 'ACKNOWLEDGED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', - 'PROXIMITY' => 'Sabre\\VObject\\Property\\Text', + 'ALARM-AGENT' => 'Sabre\\VObject\\Property\\Text', + 'ACKNOWLEDGED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime', + 'PROXIMITY' => 'Sabre\\VObject\\Property\\Text', 'DEFAULT-ALARM' => 'Sabre\\VObject\\Property\\Boolean', // Additions from draft-daboo-calendar-availability-05 'BUSYTYPE' => 'Sabre\\VObject\\Property\\Text', + ]; /** @@ -157,9 +158,10 @@ class VCalendar extends VObject\Document * * @return int */ - public function getDocumentType() - { + function getDocumentType() { + return self::ICALENDAR20; + } /** @@ -173,20 +175,21 @@ class VCalendar extends VObject\Document * * @return VObject\Component[] */ - public function getBaseComponents($componentName = null) - { - $isBaseComponent = function ($component) { + function getBaseComponents($componentName = null) { + + $isBaseComponent = function($component) { + if (!$component instanceof VObject\Component) { return false; } - if ('VTIMEZONE' === $component->name) { + if ($component->name === 'VTIMEZONE') { return false; } if (isset($component->{'RECURRENCE-ID'})) { return false; } - return true; + }; if ($componentName) { @@ -199,7 +202,9 @@ class VCalendar extends VObject\Document $components = []; foreach ($this->children as $childGroup) { + foreach ($childGroup as $child) { + if (!$child instanceof Component) { // If one child is not a component, they all are so we skip // the entire group. @@ -208,10 +213,12 @@ class VCalendar extends VObject\Document if ($isBaseComponent($child)) { $components[] = $child; } + } - } + } return $components; + } /** @@ -224,20 +231,21 @@ class VCalendar extends VObject\Document * * @return VObject\Component|null */ - public function getBaseComponent($componentName = null) - { - $isBaseComponent = function ($component) { + function getBaseComponent($componentName = null) { + + $isBaseComponent = function($component) { + if (!$component instanceof VObject\Component) { return false; } - if ('VTIMEZONE' === $component->name) { + if ($component->name === 'VTIMEZONE') { return false; } if (isset($component->{'RECURRENCE-ID'})) { return false; } - return true; + }; if ($componentName) { @@ -246,7 +254,6 @@ class VCalendar extends VObject\Document return $child; } } - return null; } @@ -257,9 +264,10 @@ class VCalendar extends VObject\Document return $child; } } - } + } return null; + } /** @@ -269,7 +277,7 @@ class VCalendar extends VObject\Document * If this calendar object, has events with recurrence rules, this method * can be used to expand the event into multiple sub-events. * - * Each event will be stripped from its recurrence information, and only + * Each event will be stripped from it's recurrence information, and only * the instances of the event in the specified timerange will be left * alone. * @@ -278,13 +286,12 @@ class VCalendar extends VObject\Document * * @param DateTimeInterface $start * @param DateTimeInterface $end - * @param DateTimeZone $timeZone reference timezone for floating dates and - * times - * + * @param DateTimeZone $timeZone reference timezone for floating dates and + * times. * @return VCalendar */ - public function expand(DateTimeInterface $start, DateTimeInterface $end, DateTimeZone $timeZone = null) - { + function expand(DateTimeInterface $start, DateTimeInterface $end, DateTimeZone $timeZone = null) { + $newChildren = []; $recurringEvents = []; @@ -292,9 +299,11 @@ class VCalendar extends VObject\Document $timeZone = new DateTimeZone('UTC'); } - $stripTimezones = function (Component $component) use ($timeZone, &$stripTimezones) { + $stripTimezones = function(Component $component) use ($timeZone, &$stripTimezones) { + foreach ($component->children() as $componentChild) { if ($componentChild instanceof Property\ICalendar\DateTime && $componentChild->hasTime()) { + $dt = $componentChild->getDateTimes($timeZone); // We only need to update the first timezone, because // setDateTimes will match all other timezones to the @@ -304,22 +313,25 @@ class VCalendar extends VObject\Document } elseif ($componentChild instanceof Component) { $stripTimezones($componentChild); } - } + } return $component; + }; foreach ($this->children() as $child) { - if ($child instanceof Property && 'PRODID' !== $child->name) { + + if ($child instanceof Property && $child->name !== 'PRODID') { // We explictly want to ignore PRODID, because we want to // overwrite it with our own. $newChildren[] = clone $child; - } elseif ($child instanceof Component && 'VTIMEZONE' !== $child->name) { + } elseif ($child instanceof Component && $child->name !== 'VTIMEZONE') { + // We're also stripping all VTIMEZONE objects because we're // converting everything to UTC. - if ('VEVENT' === $child->name && (isset($child->{'RECURRENCE-ID'}) || isset($child->RRULE) || isset($child->RDATE))) { + if ($child->name === 'VEVENT' && (isset($child->{'RECURRENCE-ID'}) || isset($child->RRULE) || isset($child->RDATE))) { // Handle these a bit later. - $uid = (string) $child->UID; + $uid = (string)$child->UID; if (!$uid) { throw new InvalidDataException('Every VEVENT object must have a UID property'); } @@ -328,15 +340,19 @@ class VCalendar extends VObject\Document } else { $recurringEvents[$uid] = [clone $child]; } - } elseif ('VEVENT' === $child->name && $child->isInTimeRange($start, $end)) { + } elseif ($child->name === 'VEVENT' && $child->isInTimeRange($start, $end)) { $newChildren[] = $stripTimezones(clone $child); } + } + } foreach ($recurringEvents as $events) { + try { $it = new EventIterator($events, $timeZone); + } catch (NoInstancesException $e) { // This event is recurring, but it doesn't have a single // instance. We are skipping this event from the output @@ -346,14 +362,20 @@ class VCalendar extends VObject\Document $it->fastForward($start); while ($it->valid() && $it->getDTStart() < $end) { + if ($it->getDTEnd() > $start) { + $newChildren[] = $stripTimezones($it->getEventObject()); + } $it->next(); + } + } return new self($newChildren); + } /** @@ -361,13 +383,14 @@ class VCalendar extends VObject\Document * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return [ - 'VERSION' => '2.0', - 'PRODID' => '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN', + 'VERSION' => '2.0', + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', 'CALSCALE' => 'GREGORIAN', ]; + } /** @@ -385,15 +408,16 @@ class VCalendar extends VObject\Document * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'PRODID' => 1, + 'PRODID' => 1, 'VERSION' => 1, 'CALSCALE' => '?', - 'METHOD' => '?', + 'METHOD' => '?', ]; + } /** @@ -420,18 +444,19 @@ class VCalendar extends VObject\Document * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $warnings = parent::validate($options); if ($ver = $this->VERSION) { - if ('2.0' !== (string) $ver) { + if ((string)$ver !== '2.0') { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', - 'node' => $this, + 'node' => $this, ]; } + } $uidList = []; @@ -440,75 +465,77 @@ class VCalendar extends VObject\Document foreach ($this->children() as $child) { if ($child instanceof Component) { - ++$componentsFound; + $componentsFound++; if (!in_array($child->name, ['VEVENT', 'VTODO', 'VJOURNAL'])) { continue; } $componentTypes[] = $child->name; - $uid = (string) $child->UID; + $uid = (string)$child->UID; $isMaster = isset($child->{'RECURRENCE-ID'}) ? 0 : 1; if (isset($uidList[$uid])) { - ++$uidList[$uid]['count']; + $uidList[$uid]['count']++; if ($isMaster && $uidList[$uid]['hasMaster']) { $warnings[] = [ - 'level' => 3, - 'message' => 'More than one master object was found for the object with UID '.$uid, - 'node' => $this, + 'level' => 3, + 'message' => 'More than one master object was found for the object with UID ' . $uid, + 'node' => $this, ]; } $uidList[$uid]['hasMaster'] += $isMaster; } else { $uidList[$uid] = [ - 'count' => 1, + 'count' => 1, 'hasMaster' => $isMaster, ]; } + } } - if (0 === $componentsFound) { + if ($componentsFound === 0) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'An iCalendar object must have at least 1 component.', - 'node' => $this, + 'node' => $this, ]; } if ($options & self::PROFILE_CALDAV) { if (count($uidList) > 1) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'A calendar object on a CalDAV server may only have components with the same UID.', - 'node' => $this, + 'node' => $this, ]; } - if (0 === count($componentTypes)) { + if (count($componentTypes) === 0) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'A calendar object on a CalDAV server must have at least 1 component (VTODO, VEVENT, VJOURNAL).', - 'node' => $this, + 'node' => $this, ]; } if (count(array_unique($componentTypes)) > 1) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'A calendar object on a CalDAV server may only have 1 type of component (VEVENT, VTODO or VJOURNAL).', - 'node' => $this, + 'node' => $this, ]; } if (isset($this->METHOD)) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'A calendar object on a CalDAV server MUST NOT have a METHOD property.', - 'node' => $this, + 'node' => $this, ]; } } return $warnings; + } /** @@ -516,15 +543,19 @@ class VCalendar extends VObject\Document * * @return array */ - public function getByUID($uid) - { - return array_filter($this->getComponents(), function ($item) use ($uid) { + function getByUID($uid) { + + return array_filter($this->getComponents(), function($item) use ($uid) { + if (!$itemUid = $item->select('UID')) { return false; } $itemUid = current($itemUid)->getValue(); - return $uid === $itemUid; + }); + } + + } diff --git a/vendor/sabre/vobject/lib/Component/VCard.php b/vendor/sabre/vobject/lib/Component/VCard.php index 860e45ffa..bca623d5e 100644 --- a/vendor/sabre/vobject/lib/Component/VCard.php +++ b/vendor/sabre/vobject/lib/Component/VCard.php @@ -15,8 +15,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VCard extends VObject\Document -{ +class VCard extends VObject\Document { + /** * The default name for this component. * @@ -24,7 +24,7 @@ class VCard extends VObject\Document * * @var string */ - public static $defaultName = 'VCARD'; + static $defaultName = 'VCARD'; /** * Caching the version number. @@ -38,7 +38,7 @@ class VCard extends VObject\Document * * @var array */ - public static $componentMap = [ + static $componentMap = [ 'VCARD' => 'Sabre\\VObject\\Component\\VCard', ]; @@ -47,23 +47,23 @@ class VCard extends VObject\Document * * @var array */ - public static $valueMap = [ - 'BINARY' => 'Sabre\\VObject\\Property\\Binary', - 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', - 'CONTENT-ID' => 'Sabre\\VObject\\Property\\FlatText', // vCard 2.1 only - 'DATE' => 'Sabre\\VObject\\Property\\VCard\\Date', - 'DATE-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateTime', + static $valueMap = [ + 'BINARY' => 'Sabre\\VObject\\Property\\Binary', + 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean', + 'CONTENT-ID' => 'Sabre\\VObject\\Property\\FlatText', // vCard 2.1 only + 'DATE' => 'Sabre\\VObject\\Property\\VCard\\Date', + 'DATE-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateTime', 'DATE-AND-OR-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only - 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue', - 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue', - 'LANGUAGE-TAG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', - 'TIMESTAMP' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', - 'TEXT' => 'Sabre\\VObject\\Property\\Text', - 'TIME' => 'Sabre\\VObject\\Property\\Time', - 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. - 'URI' => 'Sabre\\VObject\\Property\\Uri', - 'URL' => 'Sabre\\VObject\\Property\\Uri', // vCard 2.1 only - 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', + 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue', + 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue', + 'LANGUAGE-TAG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', + 'TIMESTAMP' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', + 'TEXT' => 'Sabre\\VObject\\Property\\Text', + 'TIME' => 'Sabre\\VObject\\Property\\Time', + 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only. + 'URI' => 'Sabre\\VObject\\Property\\Uri', + 'URL' => 'Sabre\\VObject\\Property\\Uri', // vCard 2.1 only + 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset', ]; /** @@ -71,70 +71,72 @@ class VCard extends VObject\Document * * @var array */ - public static $propertyMap = [ + static $propertyMap = [ + // vCard 2.1 properties and up - 'N' => 'Sabre\\VObject\\Property\\Text', - 'FN' => 'Sabre\\VObject\\Property\\FlatText', - 'PHOTO' => 'Sabre\\VObject\\Property\\Binary', - 'BDAY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', - 'ADR' => 'Sabre\\VObject\\Property\\Text', - 'LABEL' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 - 'TEL' => 'Sabre\\VObject\\Property\\FlatText', - 'EMAIL' => 'Sabre\\VObject\\Property\\FlatText', + 'N' => 'Sabre\\VObject\\Property\\Text', + 'FN' => 'Sabre\\VObject\\Property\\FlatText', + 'PHOTO' => 'Sabre\\VObject\\Property\\Binary', + 'BDAY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + 'ADR' => 'Sabre\\VObject\\Property\\Text', + 'LABEL' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'TEL' => 'Sabre\\VObject\\Property\\FlatText', + 'EMAIL' => 'Sabre\\VObject\\Property\\FlatText', 'MAILER' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 - 'GEO' => 'Sabre\\VObject\\Property\\FlatText', - 'TITLE' => 'Sabre\\VObject\\Property\\FlatText', - 'ROLE' => 'Sabre\\VObject\\Property\\FlatText', - 'LOGO' => 'Sabre\\VObject\\Property\\Binary', + 'GEO' => 'Sabre\\VObject\\Property\\FlatText', + 'TITLE' => 'Sabre\\VObject\\Property\\FlatText', + 'ROLE' => 'Sabre\\VObject\\Property\\FlatText', + 'LOGO' => 'Sabre\\VObject\\Property\\Binary', // 'AGENT' => 'Sabre\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so // not supported at the moment - 'ORG' => 'Sabre\\VObject\\Property\\Text', - 'NOTE' => 'Sabre\\VObject\\Property\\FlatText', - 'REV' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', - 'SOUND' => 'Sabre\\VObject\\Property\\FlatText', - 'URL' => 'Sabre\\VObject\\Property\\Uri', - 'UID' => 'Sabre\\VObject\\Property\\FlatText', + 'ORG' => 'Sabre\\VObject\\Property\\Text', + 'NOTE' => 'Sabre\\VObject\\Property\\FlatText', + 'REV' => 'Sabre\\VObject\\Property\\VCard\\TimeStamp', + 'SOUND' => 'Sabre\\VObject\\Property\\FlatText', + 'URL' => 'Sabre\\VObject\\Property\\Uri', + 'UID' => 'Sabre\\VObject\\Property\\FlatText', 'VERSION' => 'Sabre\\VObject\\Property\\FlatText', - 'KEY' => 'Sabre\\VObject\\Property\\FlatText', - 'TZ' => 'Sabre\\VObject\\Property\\Text', + 'KEY' => 'Sabre\\VObject\\Property\\FlatText', + 'TZ' => 'Sabre\\VObject\\Property\\Text', // vCard 3.0 properties - 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', + 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text', 'SORT-STRING' => 'Sabre\\VObject\\Property\\FlatText', - 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', - 'NICKNAME' => 'Sabre\\VObject\\Property\\Text', - 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 + 'PRODID' => 'Sabre\\VObject\\Property\\FlatText', + 'NICKNAME' => 'Sabre\\VObject\\Property\\Text', + 'CLASS' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0 // rfc2739 properties - 'FBURL' => 'Sabre\\VObject\\Property\\Uri', - 'CAPURI' => 'Sabre\\VObject\\Property\\Uri', - 'CALURI' => 'Sabre\\VObject\\Property\\Uri', + 'FBURL' => 'Sabre\\VObject\\Property\\Uri', + 'CAPURI' => 'Sabre\\VObject\\Property\\Uri', + 'CALURI' => 'Sabre\\VObject\\Property\\Uri', 'CALADRURI' => 'Sabre\\VObject\\Property\\Uri', // rfc4770 properties 'IMPP' => 'Sabre\\VObject\\Property\\Uri', // vCard 4.0 properties - 'SOURCE' => 'Sabre\\VObject\\Property\\Uri', - 'XML' => 'Sabre\\VObject\\Property\\FlatText', - 'ANNIVERSARY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + 'SOURCE' => 'Sabre\\VObject\\Property\\Uri', + 'XML' => 'Sabre\\VObject\\Property\\FlatText', + 'ANNIVERSARY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', 'CLIENTPIDMAP' => 'Sabre\\VObject\\Property\\Text', - 'LANG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', - 'GENDER' => 'Sabre\\VObject\\Property\\Text', - 'KIND' => 'Sabre\\VObject\\Property\\FlatText', - 'MEMBER' => 'Sabre\\VObject\\Property\\Uri', - 'RELATED' => 'Sabre\\VObject\\Property\\Uri', + 'LANG' => 'Sabre\\VObject\\Property\\VCard\\LanguageTag', + 'GENDER' => 'Sabre\\VObject\\Property\\Text', + 'KIND' => 'Sabre\\VObject\\Property\\FlatText', + 'MEMBER' => 'Sabre\\VObject\\Property\\Uri', + 'RELATED' => 'Sabre\\VObject\\Property\\Uri', // rfc6474 properties 'BIRTHPLACE' => 'Sabre\\VObject\\Property\\FlatText', 'DEATHPLACE' => 'Sabre\\VObject\\Property\\FlatText', - 'DEATHDATE' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', + 'DEATHDATE' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', // rfc6715 properties - 'EXPERTISE' => 'Sabre\\VObject\\Property\\FlatText', - 'HOBBY' => 'Sabre\\VObject\\Property\\FlatText', - 'INTEREST' => 'Sabre\\VObject\\Property\\FlatText', + 'EXPERTISE' => 'Sabre\\VObject\\Property\\FlatText', + 'HOBBY' => 'Sabre\\VObject\\Property\\FlatText', + 'INTEREST' => 'Sabre\\VObject\\Property\\FlatText', 'ORG-DIRECTORY' => 'Sabre\\VObject\\Property\\FlatText', + ]; /** @@ -142,22 +144,23 @@ class VCard extends VObject\Document * * @return int */ - public function getDocumentType() - { + function getDocumentType() { + if (!$this->version) { - $version = (string) $this->VERSION; + + $version = (string)$this->VERSION; switch ($version) { - case '2.1': + case '2.1' : $this->version = self::VCARD21; break; - case '3.0': + case '3.0' : $this->version = self::VCARD30; break; - case '4.0': + case '4.0' : $this->version = self::VCARD40; break; - default: + default : // We don't want to cache the version if it's unknown, // because we might get a version property in a bit. return self::UNKNOWN; @@ -165,6 +168,7 @@ class VCard extends VObject\Document } return $this->version; + } /** @@ -181,11 +185,11 @@ class VCard extends VObject\Document * * @return VCard */ - public function convert($target) - { - $converter = new VObject\VCardConverter(); + function convert($target) { + $converter = new VObject\VCardConverter(); return $converter->convert($this, $target); + } /** @@ -217,8 +221,8 @@ class VCard extends VObject\Document * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $warnings = []; $versionMap = [ @@ -228,28 +232,29 @@ class VCard extends VObject\Document ]; $version = $this->select('VERSION'); - if (1 === count($version)) { - $version = (string) $this->VERSION; - if ('2.1' !== $version && '3.0' !== $version && '4.0' !== $version) { + if (count($version) === 1) { + $version = (string)$this->VERSION; + if ($version !== '2.1' && $version !== '3.0' && $version !== '4.0') { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', - 'node' => $this, + 'node' => $this, ]; if ($options & self::REPAIR) { $this->VERSION = $versionMap[self::DEFAULT_VERSION]; } } - if ('2.1' === $version && ($options & self::PROFILE_CARDDAV)) { + if ($version === '2.1' && ($options & self::PROFILE_CARDDAV)) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'CardDAV servers are not allowed to accept vCard 2.1.', - 'node' => $this, + 'node' => $this, ]; } + } $uid = $this->select('UID'); - if (0 === count($uid)) { + if (count($uid) === 0) { if ($options & self::PROFILE_CARDDAV) { // Required for CardDAV $warningLevel = 3; @@ -264,22 +269,23 @@ class VCard extends VObject\Document $warningLevel = 1; } $warnings[] = [ - 'level' => $warningLevel, + 'level' => $warningLevel, 'message' => $message, - 'node' => $this, + 'node' => $this, ]; } $fn = $this->select('FN'); - if (1 !== count($fn)) { + if (count($fn) !== 1) { + $repaired = false; - if (($options & self::REPAIR) && 0 === count($fn)) { + if (($options & self::REPAIR) && count($fn) === 0) { // We're going to try to see if we can use the contents of the // N property. if (isset($this->N)) { - $value = explode(';', (string) $this->N); + $value = explode(';', (string)$this->N); if (isset($value[1]) && $value[1]) { - $this->FN = $value[1].' '.$value[0]; + $this->FN = $value[1] . ' ' . $value[0]; } else { $this->FN = $value[0]; } @@ -287,19 +293,20 @@ class VCard extends VObject\Document // Otherwise, the ORG property may work } elseif (isset($this->ORG)) { - $this->FN = (string) $this->ORG; + $this->FN = (string)$this->ORG; $repaired = true; // Otherwise, the EMAIL property may work } elseif (isset($this->EMAIL)) { - $this->FN = (string) $this->EMAIL; + $this->FN = (string)$this->EMAIL; $repaired = true; } + } $warnings[] = [ - 'level' => $repaired ? 1 : 3, + 'level' => $repaired ? 1 : 3, 'message' => 'The FN property must appear in the VCARD component exactly 1 time', - 'node' => $this, + 'node' => $this, ]; } @@ -307,6 +314,7 @@ class VCard extends VObject\Document parent::validate($options), $warnings ); + } /** @@ -324,49 +332,50 @@ class VCard extends VObject\Document * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'ADR' => '*', - 'ANNIVERSARY' => '?', - 'BDAY' => '?', - 'CALADRURI' => '*', - 'CALURI' => '*', - 'CATEGORIES' => '*', + 'ADR' => '*', + 'ANNIVERSARY' => '?', + 'BDAY' => '?', + 'CALADRURI' => '*', + 'CALURI' => '*', + 'CATEGORIES' => '*', 'CLIENTPIDMAP' => '*', - 'EMAIL' => '*', - 'FBURL' => '*', - 'IMPP' => '*', - 'GENDER' => '?', - 'GEO' => '*', - 'KEY' => '*', - 'KIND' => '?', - 'LANG' => '*', - 'LOGO' => '*', - 'MEMBER' => '*', - 'N' => '?', - 'NICKNAME' => '*', - 'NOTE' => '*', - 'ORG' => '*', - 'PHOTO' => '*', - 'PRODID' => '?', - 'RELATED' => '*', - 'REV' => '?', - 'ROLE' => '*', - 'SOUND' => '*', - 'SOURCE' => '*', - 'TEL' => '*', - 'TITLE' => '*', - 'TZ' => '*', - 'URL' => '*', - 'VERSION' => '1', - 'XML' => '*', + 'EMAIL' => '*', + 'FBURL' => '*', + 'IMPP' => '*', + 'GENDER' => '?', + 'GEO' => '*', + 'KEY' => '*', + 'KIND' => '?', + 'LANG' => '*', + 'LOGO' => '*', + 'MEMBER' => '*', + 'N' => '?', + 'NICKNAME' => '*', + 'NOTE' => '*', + 'ORG' => '*', + 'PHOTO' => '*', + 'PRODID' => '?', + 'RELATED' => '*', + 'REV' => '?', + 'ROLE' => '*', + 'SOUND' => '*', + 'SOURCE' => '*', + 'TEL' => '*', + 'TITLE' => '*', + 'TZ' => '*', + 'URL' => '*', + 'VERSION' => '1', + 'XML' => '*', // FN is commented out, because it's already handled by the // validate function, which may also try to repair it. // 'FN' => '+', 'UID' => '?', ]; + } /** @@ -383,11 +392,12 @@ class VCard extends VObject\Document * * @return VObject\Property|null */ - public function preferred($propertyName) - { + function preferred($propertyName) { + $preferred = null; $lastPref = 101; foreach ($this->select($propertyName) as $field) { + $pref = 101; if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) { $pref = 1; @@ -399,9 +409,10 @@ class VCard extends VObject\Document $preferred = $field; $lastPref = $pref; } - } + } return $preferred; + } /** @@ -415,8 +426,7 @@ class VCard extends VObject\Document * * @return VObject\Property|null */ - public function getByType($propertyName, $type) - { + function getByType($propertyName, $type) { foreach ($this->select($propertyName) as $field) { if (isset($field['TYPE']) && $field['TYPE']->has($type)) { return $field; @@ -429,13 +439,14 @@ class VCard extends VObject\Document * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return [ 'VERSION' => '4.0', - 'PRODID' => '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN', - 'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(), + 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', + 'UID' => 'sabre-vobject-' . VObject\UUIDUtil::getUUID(), ]; + } /** @@ -444,8 +455,8 @@ class VCard extends VObject\Document * * @return array */ - public function jsonSerialize() - { + function jsonSerialize() { + // A vcard does not have sub-components, so we're overriding this // method to remove that array element. $properties = []; @@ -458,19 +469,23 @@ class VCard extends VObject\Document strtolower($this->name), $properties, ]; + } /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - public function xmlSerialize(Xml\Writer $writer) - { + function xmlSerialize(Xml\Writer $writer) { + $propertiesByGroup = []; foreach ($this->children() as $property) { + $group = $property->group; if (!isset($propertiesByGroup[$group])) { @@ -478,20 +493,25 @@ class VCard extends VObject\Document } $propertiesByGroup[$group][] = $property; + } $writer->startElement(strtolower($this->name)); foreach ($propertiesByGroup as $group => $properties) { + if (!empty($group)) { + $writer->startElement('group'); $writer->writeAttribute('name', strtolower($group)); + } foreach ($properties as $property) { switch ($property->name) { + case 'VERSION': - break; + continue; case 'XML': $value = $property->getParts(); @@ -502,15 +522,18 @@ class VCard extends VObject\Document default: $property->xmlSerialize($writer); break; + } } if (!empty($group)) { $writer->endElement(); } + } $writer->endElement(); + } /** @@ -520,15 +543,16 @@ class VCard extends VObject\Document * * @return string */ - public function getClassNameForPropertyName($propertyName) - { + function getClassNameForPropertyName($propertyName) { + $className = parent::getClassNameForPropertyName($propertyName); // In vCard 4, BINARY no longer exists, and we need URI instead. - if ('Sabre\\VObject\\Property\\Binary' == $className && self::VCARD40 === $this->getDocumentType()) { + if ($className == 'Sabre\\VObject\\Property\\Binary' && $this->getDocumentType() === self::VCARD40) { return 'Sabre\\VObject\\Property\\Uri'; } - return $className; + } + } diff --git a/vendor/sabre/vobject/lib/Component/VEvent.php b/vendor/sabre/vobject/lib/Component/VEvent.php index 09f37033c..7f6861190 100644 --- a/vendor/sabre/vobject/lib/Component/VEvent.php +++ b/vendor/sabre/vobject/lib/Component/VEvent.php @@ -16,8 +16,8 @@ use Sabre\VObject\Recur\NoInstancesException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VEvent extends VObject\Component -{ +class VEvent extends VObject\Component { + /** * Returns true or false depending on if the event falls in the specified * time-range. This is used for filtering purposes. @@ -30,15 +30,20 @@ class VEvent extends VObject\Component * * @return bool */ - public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) - { + function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) { + if ($this->RRULE) { + try { + $it = new EventIterator($this, null, $start->getTimezone()); + } catch (NoInstancesException $e) { + // If we've catched this exception, there are no instances // for the event that fall into the specified time-range. return false; + } $it->fastForward($start); @@ -49,11 +54,13 @@ class VEvent extends VObject\Component // // If the starttime of the recurrence did not exceed the // end of the time range as well, we have a match. - return $it->getDTStart() < $end && $it->getDTEnd() > $start; + return ($it->getDTStart() < $end && $it->getDTEnd() > $start); + } $effectiveStart = $this->DTSTART->getDateTime($start->getTimezone()); if (isset($this->DTEND)) { + // The DTEND property is considered non inclusive. So for a 3 day // event in july, dtstart and dtend would have to be July 1st and // July 4th respectively. @@ -61,6 +68,7 @@ class VEvent extends VObject\Component // See: // http://tools.ietf.org/html/rfc5545#page-54 $effectiveEnd = $this->DTEND->getDateTime($end->getTimezone()); + } elseif (isset($this->DURATION)) { $effectiveEnd = $effectiveStart->add(VObject\DateTimeParser::parseDuration($this->DURATION)); } elseif (!$this->DTSTART->hasTime()) { @@ -68,10 +76,10 @@ class VEvent extends VObject\Component } else { $effectiveEnd = $effectiveStart; } - - return + return ( ($start < $effectiveEnd) && ($end > $effectiveStart) - ; + ); + } /** @@ -79,12 +87,13 @@ class VEvent extends VObject\Component * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return [ - 'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(), - 'DTSTAMP' => gmdate('Ymd\\THis\\Z'), + 'UID' => 'sabre-vobject-' . VObject\UUIDUtil::getUUID(), + 'DTSTAMP' => date('Ymd\\THis\\Z'), ]; + } /** @@ -102,42 +111,43 @@ class VEvent extends VObject\Component * * @var array */ - public function getValidationRules() - { - $hasMethod = isset($this->parent->METHOD); + function getValidationRules() { + $hasMethod = isset($this->parent->METHOD); return [ - 'UID' => 1, - 'DTSTAMP' => 1, - 'DTSTART' => $hasMethod ? '?' : '1', - 'CLASS' => '?', - 'CREATED' => '?', - 'DESCRIPTION' => '?', - 'GEO' => '?', + 'UID' => 1, + 'DTSTAMP' => 1, + 'DTSTART' => $hasMethod ? '?' : '1', + 'CLASS' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', + 'GEO' => '?', 'LAST-MODIFIED' => '?', - 'LOCATION' => '?', - 'ORGANIZER' => '?', - 'PRIORITY' => '?', - 'SEQUENCE' => '?', - 'STATUS' => '?', - 'SUMMARY' => '?', - 'TRANSP' => '?', - 'URL' => '?', + 'LOCATION' => '?', + 'ORGANIZER' => '?', + 'PRIORITY' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'TRANSP' => '?', + 'URL' => '?', 'RECURRENCE-ID' => '?', - 'RRULE' => '?', - 'DTEND' => '?', - 'DURATION' => '?', - - 'ATTACH' => '*', - 'ATTENDEE' => '*', - 'CATEGORIES' => '*', - 'COMMENT' => '*', - 'CONTACT' => '*', - 'EXDATE' => '*', + 'RRULE' => '?', + 'DTEND' => '?', + 'DURATION' => '?', + + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'EXDATE' => '*', 'REQUEST-STATUS' => '*', - 'RELATED-TO' => '*', - 'RESOURCES' => '*', - 'RDATE' => '*', + 'RELATED-TO' => '*', + 'RESOURCES' => '*', + 'RDATE' => '*', ]; + } + } diff --git a/vendor/sabre/vobject/lib/Component/VFreeBusy.php b/vendor/sabre/vobject/lib/Component/VFreeBusy.php index 558a85233..72294cc9f 100644 --- a/vendor/sabre/vobject/lib/Component/VFreeBusy.php +++ b/vendor/sabre/vobject/lib/Component/VFreeBusy.php @@ -15,8 +15,8 @@ use Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VFreeBusy extends VObject\Component -{ +class VFreeBusy extends VObject\Component { + /** * Checks based on the contained FREEBUSY information, if a timeslot is * available. @@ -26,18 +26,19 @@ class VFreeBusy extends VObject\Component * * @return bool */ - public function isFree(DateTimeInterface $start, DatetimeInterface $end) - { + function isFree(DateTimeInterface $start, DatetimeInterface $end) { + foreach ($this->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))) { + if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'], 0, 4)) !== 'BUSY') { continue; } // The freebusy component can hold more than 1 value, separated by // commas. - $periods = explode(',', (string) $freebusy); + $periods = explode(',', (string)$freebusy); foreach ($periods as $period) { // Every period is formatted as [start]/[end]. The start is an @@ -54,10 +55,13 @@ class VFreeBusy extends VObject\Component if ($start < $busyEnd && $end > $busyStart) { return false; } + } + } return true; + } /** @@ -75,22 +79,24 @@ class VFreeBusy extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'UID' => 1, + 'UID' => 1, 'DTSTAMP' => 1, - 'CONTACT' => '?', - 'DTSTART' => '?', - 'DTEND' => '?', + 'CONTACT' => '?', + 'DTSTART' => '?', + 'DTEND' => '?', 'ORGANIZER' => '?', - 'URL' => '?', + 'URL' => '?', - 'ATTENDEE' => '*', - 'COMMENT' => '*', - 'FREEBUSY' => '*', + 'ATTENDEE' => '*', + 'COMMENT' => '*', + 'FREEBUSY' => '*', 'REQUEST-STATUS' => '*', ]; + } + } diff --git a/vendor/sabre/vobject/lib/Component/VJournal.php b/vendor/sabre/vobject/lib/Component/VJournal.php index 9bd336776..a1b1a863d 100644 --- a/vendor/sabre/vobject/lib/Component/VJournal.php +++ b/vendor/sabre/vobject/lib/Component/VJournal.php @@ -14,8 +14,8 @@ use Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VJournal extends VObject\Component -{ +class VJournal extends VObject\Component { + /** * Returns true or false depending on if the event falls in the specified * time-range. This is used for filtering purposes. @@ -28,8 +28,8 @@ class VJournal extends VObject\Component * * @return bool */ - public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) - { + function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) { + $dtstart = isset($this->DTSTART) ? $this->DTSTART->getDateTime() : null; if ($dtstart) { $effectiveEnd = $dtstart; @@ -37,10 +37,11 @@ class VJournal extends VObject\Component $effectiveEnd = $effectiveEnd->modify('+1 day'); } - return $start <= $effectiveEnd && $end > $dtstart; - } + return ($start <= $effectiveEnd && $end > $dtstart); + } return false; + } /** @@ -58,35 +59,36 @@ class VJournal extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'UID' => 1, + 'UID' => 1, 'DTSTAMP' => 1, - 'CLASS' => '?', - 'CREATED' => '?', - 'DTSTART' => '?', + 'CLASS' => '?', + 'CREATED' => '?', + 'DTSTART' => '?', 'LAST-MODIFIED' => '?', - 'ORGANIZER' => '?', + 'ORGANIZER' => '?', 'RECURRENCE-ID' => '?', - 'SEQUENCE' => '?', - 'STATUS' => '?', - 'SUMMARY' => '?', - 'URL' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'URL' => '?', 'RRULE' => '?', - 'ATTACH' => '*', - 'ATTENDEE' => '*', - 'CATEGORIES' => '*', - 'COMMENT' => '*', - 'CONTACT' => '*', + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', 'DESCRIPTION' => '*', - 'EXDATE' => '*', - 'RELATED-TO' => '*', - 'RDATE' => '*', + 'EXDATE' => '*', + 'RELATED-TO' => '*', + 'RDATE' => '*', ]; + } /** @@ -94,11 +96,12 @@ class VJournal extends VObject\Component * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return [ - 'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(), - 'DTSTAMP' => gmdate('Ymd\\THis\\Z'), + 'UID' => 'sabre-vobject-' . VObject\UUIDUtil::getUUID(), + 'DTSTAMP' => date('Ymd\\THis\\Z'), ]; + } } diff --git a/vendor/sabre/vobject/lib/Component/VTimeZone.php b/vendor/sabre/vobject/lib/Component/VTimeZone.php index 21c062377..f6eb6cba1 100644 --- a/vendor/sabre/vobject/lib/Component/VTimeZone.php +++ b/vendor/sabre/vobject/lib/Component/VTimeZone.php @@ -14,8 +14,8 @@ use Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VTimeZone extends VObject\Component -{ +class VTimeZone extends VObject\Component { + /** * Returns the PHP DateTimeZone for this VTIMEZONE component. * @@ -24,9 +24,10 @@ class VTimeZone extends VObject\Component * * @return \DateTimeZone */ - public function getTimeZone() - { - return VObject\TimeZoneUtil::getTimeZone((string) $this->TZID, $this->root); + function getTimeZone() { + + return VObject\TimeZoneUtil::getTimeZone((string)$this->TZID, $this->root); + } /** @@ -44,13 +45,13 @@ class VTimeZone extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ 'TZID' => 1, 'LAST-MODIFIED' => '?', - 'TZURL' => '?', + 'TZURL' => '?', // At least 1 STANDARD or DAYLIGHT must appear. // @@ -59,5 +60,7 @@ class VTimeZone extends VObject\Component 'STANDARD' => '*', 'DAYLIGHT' => '*', ]; + } + } diff --git a/vendor/sabre/vobject/lib/Component/VTodo.php b/vendor/sabre/vobject/lib/Component/VTodo.php index 9de77e841..144ced694 100644 --- a/vendor/sabre/vobject/lib/Component/VTodo.php +++ b/vendor/sabre/vobject/lib/Component/VTodo.php @@ -14,8 +14,8 @@ use Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VTodo extends VObject\Component -{ +class VTodo extends VObject\Component { + /** * Returns true or false depending on if the event falls in the specified * time-range. This is used for filtering purposes. @@ -28,8 +28,8 @@ class VTodo extends VObject\Component * * @return bool */ - public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) - { + function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) { + $dtstart = isset($this->DTSTART) ? $this->DTSTART->getDateTime() : null; $duration = isset($this->DURATION) ? VObject\DateTimeParser::parseDuration($this->DURATION) : null; $due = isset($this->DUE) ? $this->DUE->getDateTime() : null; @@ -39,7 +39,6 @@ class VTodo extends VObject\Component if ($dtstart) { if ($duration) { $effectiveEnd = $dtstart->add($duration); - return $start <= $effectiveEnd && $end > $dtstart; } elseif ($due) { return @@ -50,7 +49,7 @@ class VTodo extends VObject\Component } } if ($due) { - return $start < $due && $end >= $due; + return ($start < $due && $end >= $due); } if ($completed && $created) { return @@ -58,13 +57,13 @@ class VTodo extends VObject\Component ($end >= $created || $end >= $completed); } if ($completed) { - return $start <= $completed && $end >= $completed; + return ($start <= $completed && $end >= $completed); } if ($created) { - return $end > $created; + return ($end > $created); } - return true; + } /** @@ -82,44 +81,45 @@ class VTodo extends VObject\Component * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return [ - 'UID' => 1, + 'UID' => 1, 'DTSTAMP' => 1, - 'CLASS' => '?', - 'COMPLETED' => '?', - 'CREATED' => '?', - 'DESCRIPTION' => '?', - 'DTSTART' => '?', - 'GEO' => '?', + 'CLASS' => '?', + 'COMPLETED' => '?', + 'CREATED' => '?', + 'DESCRIPTION' => '?', + 'DTSTART' => '?', + 'GEO' => '?', 'LAST-MODIFIED' => '?', - 'LOCATION' => '?', - 'ORGANIZER' => '?', - 'PERCENT' => '?', - 'PRIORITY' => '?', + 'LOCATION' => '?', + 'ORGANIZER' => '?', + 'PERCENT' => '?', + 'PRIORITY' => '?', 'RECURRENCE-ID' => '?', - 'SEQUENCE' => '?', - 'STATUS' => '?', - 'SUMMARY' => '?', - 'URL' => '?', + 'SEQUENCE' => '?', + 'STATUS' => '?', + 'SUMMARY' => '?', + 'URL' => '?', - 'RRULE' => '?', - 'DUE' => '?', + 'RRULE' => '?', + 'DUE' => '?', 'DURATION' => '?', - 'ATTACH' => '*', - 'ATTENDEE' => '*', - 'CATEGORIES' => '*', - 'COMMENT' => '*', - 'CONTACT' => '*', - 'EXDATE' => '*', + 'ATTACH' => '*', + 'ATTENDEE' => '*', + 'CATEGORIES' => '*', + 'COMMENT' => '*', + 'CONTACT' => '*', + 'EXDATE' => '*', 'REQUEST-STATUS' => '*', - 'RELATED-TO' => '*', - 'RESOURCES' => '*', - 'RDATE' => '*', + 'RELATED-TO' => '*', + 'RESOURCES' => '*', + 'RDATE' => '*', ]; + } /** @@ -144,29 +144,36 @@ class VTodo extends VObject\Component * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $result = parent::validate($options); if (isset($this->DUE) && isset($this->DTSTART)) { + $due = $this->DUE; $dtStart = $this->DTSTART; if ($due->getValueType() !== $dtStart->getValueType()) { + $result[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'The value type (DATE or DATE-TIME) must be identical for DUE and DTSTART', - 'node' => $due, + 'node' => $due, ]; + } elseif ($due->getDateTime() < $dtStart->getDateTime()) { + $result[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'DUE must occur after DTSTART', - 'node' => $due, + 'node' => $due, ]; + } + } return $result; + } /** @@ -174,11 +181,13 @@ class VTodo extends VObject\Component * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return [ - 'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(), + 'UID' => 'sabre-vobject-' . VObject\UUIDUtil::getUUID(), 'DTSTAMP' => date('Ymd\\THis\\Z'), ]; + } + } diff --git a/vendor/sabre/vobject/lib/DateTimeParser.php b/vendor/sabre/vobject/lib/DateTimeParser.php index 1c253437a..f9a802d25 100644 --- a/vendor/sabre/vobject/lib/DateTimeParser.php +++ b/vendor/sabre/vobject/lib/DateTimeParser.php @@ -16,8 +16,8 @@ use DateTimeZone; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class DateTimeParser -{ +class DateTimeParser { + /** * Parses an iCalendar (rfc5545) formatted datetime and returns a * DateTimeImmutable object. @@ -26,48 +26,49 @@ class DateTimeParser * if the non-UTC format is used. The argument is used as a reference, the * returned DateTimeImmutable object will still be in the UTC timezone. * - * @param string $dt + * @param string $dt * @param DateTimeZone $tz * * @return DateTimeImmutable */ - public static function parseDateTime($dt, DateTimeZone $tz = null) - { + static function parseDateTime($dt, DateTimeZone $tz = null) { + // Format is YYYYMMDD + "T" + hhmmss $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/', $dt, $matches); if (!$result) { - throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: '.$dt); + throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: ' . $dt); } - if ('Z' === $matches[7] || is_null($tz)) { + if ($matches[7] === 'Z' || is_null($tz)) { $tz = new DateTimeZone('UTC'); } try { - $date = new DateTimeImmutable($matches[1].'-'.$matches[2].'-'.$matches[3].' '.$matches[4].':'.$matches[5].':'.$matches[6], $tz); + $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] . ':' . $matches[6], $tz); } catch (\Exception $e) { - throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: '.$dt); + throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: ' . $dt); } return $date; + } /** * Parses an iCalendar (rfc5545) formatted date and returns a DateTimeImmutable object. * - * @param string $date + * @param string $date * @param DateTimeZone $tz * * @return DateTimeImmutable */ - public static function parseDate($date, DateTimeZone $tz = null) - { + static function parseDate($date, DateTimeZone $tz = null) { + // Format is YYYYMMDD $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/', $date, $matches); if (!$result) { - throw new InvalidDataException('The supplied iCalendar date value is incorrect: '.$date); + throw new InvalidDataException('The supplied iCalendar date value is incorrect: ' . $date); } if (is_null($tz)) { @@ -75,12 +76,13 @@ class DateTimeParser } try { - $date = new DateTimeImmutable($matches[1].'-'.$matches[2].'-'.$matches[3], $tz); + $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3], $tz); } catch (\Exception $e) { - throw new InvalidDataException('The supplied iCalendar date value is incorrect: '.$date); + throw new InvalidDataException('The supplied iCalendar date value is incorrect: ' . $date); } return $date; + } /** @@ -90,21 +92,22 @@ class DateTimeParser * suitable for strtotime or DateTime::modify. * * @param string $duration - * @param bool $asString + * @param bool $asString * * @return DateInterval|string */ - public static function parseDuration($duration, $asString = false) - { + static function parseDuration($duration, $asString = false) { + $result = preg_match('/^(?<plusminus>\+|-)?P((?<week>\d+)W)?((?<day>\d+)D)?(T((?<hour>\d+)H)?((?<minute>\d+)M)?((?<second>\d+)S)?)?$/', $duration, $matches); if (!$result) { - throw new InvalidDataException('The supplied iCalendar duration value is incorrect: '.$duration); + throw new InvalidDataException('The supplied iCalendar duration value is incorrect: ' . $duration); } if (!$asString) { + $invert = false; - if ('-' === $matches['plusminus']) { + if ($matches['plusminus'] === '-') { $invert = true; } @@ -117,7 +120,7 @@ class DateTimeParser ]; foreach ($parts as $part) { - $matches[$part] = isset($matches[$part]) && $matches[$part] ? (int) $matches[$part] : 0; + $matches[$part] = isset($matches[$part]) && $matches[$part] ? (int)$matches[$part] : 0; } // We need to re-construct the $duration string, because weeks and @@ -130,26 +133,28 @@ class DateTimeParser } if ($days) { - $duration .= $days.'D'; + $duration .= $days . 'D'; } if ($matches['minute'] || $matches['second'] || $matches['hour']) { + $duration .= 'T'; if ($matches['hour']) { - $duration .= $matches['hour'].'H'; + $duration .= $matches['hour'] . 'H'; } if ($matches['minute']) { - $duration .= $matches['minute'].'M'; + $duration .= $matches['minute'] . 'M'; } if ($matches['second']) { - $duration .= $matches['second'].'S'; + $duration .= $matches['second'] . 'S'; } + } - if ('P' === $duration) { + if ($duration === 'P') { $duration = 'PT0S'; } @@ -160,6 +165,7 @@ class DateTimeParser } return $iv; + } $parts = [ @@ -174,36 +180,38 @@ class DateTimeParser foreach ($parts as $part) { if (isset($matches[$part]) && $matches[$part]) { - $newDur .= ' '.$matches[$part].' '.$part.'s'; + $newDur .= ' ' . $matches[$part] . ' ' . $part . 's'; } } - $newDur = ('-' === $matches['plusminus'] ? '-' : '+').trim($newDur); + $newDur = ($matches['plusminus'] === '-' ? '-' : '+') . trim($newDur); - if ('+' === $newDur) { + if ($newDur === '+') { $newDur = '+0 seconds'; - } + }; return $newDur; + } /** * Parses either a Date or DateTime, or Duration value. * - * @param string $date + * @param string $date * @param DateTimeZone|string $referenceTz * * @return DateTimeImmutable|DateInterval */ - public static function parse($date, $referenceTz = null) - { - if ('P' === $date[0] || ('-' === $date[0] && 'P' === $date[1])) { + static function parse($date, $referenceTz = null) { + + if ($date[0] === 'P' || ($date[0] === '-' && $date[1] === 'P')) { return self::parseDuration($date); - } elseif (8 === strlen($date)) { + } elseif (strlen($date) === 8) { return self::parseDate($date, $referenceTz); } else { return self::parseDateTime($date, $referenceTz); } + } /** @@ -262,8 +270,8 @@ class DateTimeParser * * @return array */ - public static function parseVCardDateTime($date) - { + static function parseVCardDateTime($date) { + $regex = '/^ (?: # date part (?: @@ -288,6 +296,7 @@ class DateTimeParser $/x'; if (!preg_match($regex, $date, $matches)) { + // Attempting to parse the extended format. $regex = '/^ (?: # date part @@ -312,8 +321,9 @@ class DateTimeParser $/x'; if (!preg_match($regex, $date, $matches)) { - throw new InvalidDataException('Invalid vCard date-time string: '.$date); + throw new InvalidDataException('Invalid vCard date-time string: ' . $date); } + } $parts = [ 'year', @@ -322,21 +332,24 @@ class DateTimeParser 'hour', 'minute', 'second', - 'timezone', + 'timezone' ]; $result = []; foreach ($parts as $part) { + if (empty($matches[$part])) { $result[$part] = null; - } elseif ('-' === $matches[$part] || '--' === $matches[$part]) { + } elseif ($matches[$part] === '-' || $matches[$part] === '--') { $result[$part] = null; } else { $result[$part] = $matches[$part]; } + } return $result; + } /** @@ -381,8 +394,8 @@ class DateTimeParser * * @return array */ - public static function parseVCardTime($date) - { + static function parseVCardTime($date) { + $regex = '/^ (?<hour> [0-9]{2} | -) (?<minute> [0-9]{2} | -)? @@ -396,7 +409,9 @@ class DateTimeParser )? $/x'; + if (!preg_match($regex, $date, $matches)) { + // Attempting to parse the extended format. $regex = '/^ (?: (?<hour> [0-9]{2}) : | -) @@ -412,28 +427,32 @@ class DateTimeParser $/x'; if (!preg_match($regex, $date, $matches)) { - throw new InvalidDataException('Invalid vCard time string: '.$date); + throw new InvalidDataException('Invalid vCard time string: ' . $date); } + } $parts = [ 'hour', 'minute', 'second', - 'timezone', + 'timezone' ]; $result = []; foreach ($parts as $part) { + if (empty($matches[$part])) { $result[$part] = null; - } elseif ('-' === $matches[$part]) { + } elseif ($matches[$part] === '-') { $result[$part] = null; } else { $result[$part] = $matches[$part]; } + } return $result; + } /** @@ -487,32 +506,32 @@ class DateTimeParser * * @return array */ - public static function parseVCardDateAndOrTime($date) - { + static function parseVCardDateAndOrTime($date) { + // \d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d - $valueDate = '/^(?J)(?:'. - '(?<year>\d{4})(?<month>\d\d)(?<date>\d\d)'. - '|(?<year>\d{4})-(?<month>\d\d)'. - '|--(?<month>\d\d)(?<date>\d\d)?'. - '|---(?<date>\d\d)'. + $valueDate = '/^(?J)(?:' . + '(?<year>\d{4})(?<month>\d\d)(?<date>\d\d)' . + '|(?<year>\d{4})-(?<month>\d\d)' . + '|--(?<month>\d\d)(?<date>\d\d)?' . + '|---(?<date>\d\d)' . ')$/'; // (\d\d(\d\d(\d\d)?)?|-\d\d(\d\d)?|--\d\d)(Z|[+\-]\d\d(\d\d)?)? - $valueTime = '/^(?J)(?:'. - '((?<hour>\d\d)((?<minute>\d\d)(?<second>\d\d)?)?'. - '|-(?<minute>\d\d)(?<second>\d\d)?'. - '|--(?<second>\d\d))'. - '(?<timezone>(Z|[+\-]\d\d(\d\d)?))?'. + $valueTime = '/^(?J)(?:' . + '((?<hour>\d\d)((?<minute>\d\d)(?<second>\d\d)?)?' . + '|-(?<minute>\d\d)(?<second>\d\d)?' . + '|--(?<second>\d\d))' . + '(?<timezone>(Z|[+\-]\d\d(\d\d)?))?' . ')$/'; // (\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?(Z|[+\-]\d\d(\d\d?)? - $valueDateTime = '/^(?:'. - '((?<year0>\d{4})(?<month0>\d\d)(?<date0>\d\d)'. - '|--(?<month1>\d\d)(?<date1>\d\d)'. - '|---(?<date2>\d\d))'. - 'T'. - '(?<hour>\d\d)((?<minute>\d\d)(?<second>\d\d)?)?'. - '(?<timezone>(Z|[+\-]\d\d(\d\d?)))?'. + $valueDateTime = '/^(?:' . + '((?<year0>\d{4})(?<month0>\d\d)(?<date0>\d\d)' . + '|--(?<month1>\d\d)(?<date1>\d\d)' . + '|---(?<date2>\d\d))' . + 'T' . + '(?<hour>\d\d)((?<minute>\d\d)(?<second>\d\d)?)?' . + '(?<timezone>(Z|[+\-]\d\d(\d\d?)))?' . ')$/'; // date-and-or-time is date | date-time | time @@ -521,17 +540,17 @@ class DateTimeParser if (0 === preg_match($valueDate, $date, $matches) && 0 === preg_match($valueDateTime, $date, $matches) && 0 === preg_match($valueTime, $date, $matches)) { - throw new InvalidDataException('Invalid vCard date-time string: '.$date); + throw new InvalidDataException('Invalid vCard date-time string: ' . $date); } $parts = [ - 'year' => null, - 'month' => null, - 'date' => null, - 'hour' => null, - 'minute' => null, - 'second' => null, - 'timezone' => null, + 'year' => null, + 'month' => null, + 'date' => null, + 'hour' => null, + 'minute' => null, + 'second' => null, + 'timezone' => null ]; // The $valueDateTime expression has a bug with (?J) so we simulate it. @@ -556,5 +575,6 @@ class DateTimeParser unset($parts['year0']); return $parts; + } } diff --git a/vendor/sabre/vobject/lib/Document.php b/vendor/sabre/vobject/lib/Document.php index 0cb2e0978..03252ab06 100644 --- a/vendor/sabre/vobject/lib/Document.php +++ b/vendor/sabre/vobject/lib/Document.php @@ -16,8 +16,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -abstract class Document extends Component -{ +abstract class Document extends Component { + /** * Unknown document type. */ @@ -55,28 +55,28 @@ abstract class Document extends Component * * @var string */ - public static $defaultName; + static $defaultName; /** * List of properties, and which classes they map to. * * @var array */ - public static $propertyMap = []; + static $propertyMap = []; /** * List of components, along with which classes they map to. * * @var array */ - public static $componentMap = []; + static $componentMap = []; /** * List of value-types, and which classes they map to. * * @var array */ - public static $valueMap = []; + static $valueMap = []; /** * Creates a new document. @@ -91,20 +91,20 @@ abstract class Document extends Component * * new Document(array $children = [], $defaults = true); * new Document(string $name, array $children = [], $defaults = true) + * + * @return void */ - public function __construct() - { + function __construct() { + $args = func_get_args(); - $name = static::$defaultName; - if (0 === count($args) || is_array($args[0])) { - $children = isset($args[0]) ? $args[0] : []; - $defaults = isset($args[1]) ? $args[1] : true; + if (count($args) === 0 || is_array($args[0])) { + array_unshift($args, $this, static::$defaultName); + call_user_func_array(['parent', '__construct'], $args); } else { - $name = $args[0]; - $children = isset($args[1]) ? $args[1] : []; - $defaults = isset($args[2]) ? $args[2] : true; + array_unshift($args, $this); + call_user_func_array(['parent', '__construct'], $args); } - parent::__construct($this, $name, $children, $defaults); + } /** @@ -112,9 +112,10 @@ abstract class Document extends Component * * @return int */ - public function getDocumentType() - { + function getDocumentType() { + return self::UNKNOWN; + } /** @@ -128,13 +129,18 @@ abstract class Document extends Component * * @return mixed */ - public function create($name) - { + function create($name) { + if (isset(static::$componentMap[strtoupper($name)])) { + return call_user_func_array([$this, 'createComponent'], func_get_args()); + } else { + return call_user_func_array([$this, 'createProperty'], func_get_args()); + } + } /** @@ -152,24 +158,22 @@ abstract class Document extends Component * ensure that this does not happen, set $defaults to false. * * @param string $name - * @param array $children - * @param bool $defaults + * @param array $children + * @param bool $defaults * * @return Component */ - public function createComponent($name, array $children = null, $defaults = true) - { + function createComponent($name, array $children = null, $defaults = true) { + $name = strtoupper($name); $class = 'Sabre\\VObject\\Component'; if (isset(static::$componentMap[$name])) { $class = static::$componentMap[$name]; } - if (is_null($children)) { - $children = []; - } - + if (is_null($children)) $children = []; return new $class($this, $name, $children, $defaults); + } /** @@ -183,16 +187,16 @@ abstract class Document extends Component * Parameter objects. * * @param string $name - * @param mixed $value - * @param array $parameters - * @param string $valueType Force a specific valuetype, such as URI or TEXT + * @param mixed $value + * @param array $parameters + * @param string $valueType Force a specific valuetype, such as URI or TEXT * * @return Property */ - public function createProperty($name, $value = null, array $parameters = null, $valueType = null) - { + function createProperty($name, $value = null, array $parameters = null, $valueType = null) { + // If there's a . in the name, it means it's prefixed by a groupname. - if (false !== ($i = strpos($name, '.'))) { + if (($i = strpos($name, '.')) !== false) { $group = substr($name, 0, $i); $name = strtoupper(substr($name, $i + 1)); } else { @@ -213,17 +217,17 @@ abstract class Document extends Component if (isset($parameters['VALUE'])) { $class = $this->getClassNameForPropertyValue($parameters['VALUE']); if (is_null($class)) { - throw new InvalidDataException('Unsupported VALUE parameter for '.$name.' property. You supplied "'.$parameters['VALUE'].'"'); + throw new InvalidDataException('Unsupported VALUE parameter for ' . $name . ' property. You supplied "' . $parameters['VALUE'] . '"'); } - } else { + } + else { $class = $this->getClassNameForPropertyName($name); } } - if (is_null($parameters)) { - $parameters = []; - } + if (is_null($parameters)) $parameters = []; return new $class($this, $name, $value, $parameters, $group); + } /** @@ -235,15 +239,15 @@ abstract class Document extends Component * This method returns null if we don't have a specialized class. * * @param string $valueParam - * * @return string|null */ - public function getClassNameForPropertyValue($valueParam) - { + function getClassNameForPropertyValue($valueParam) { + $valueParam = strtoupper($valueParam); if (isset(static::$valueMap[$valueParam])) { return static::$valueMap[$valueParam]; } + } /** @@ -253,12 +257,14 @@ abstract class Document extends Component * * @return string */ - public function getClassNameForPropertyName($propertyName) - { + function getClassNameForPropertyName($propertyName) { + if (isset(static::$propertyMap[$propertyName])) { return static::$propertyMap[$propertyName]; } else { return 'Sabre\\VObject\\Property\\Unknown'; } + } + } diff --git a/vendor/sabre/vobject/lib/ElementList.php b/vendor/sabre/vobject/lib/ElementList.php index 56058cbd5..959249247 100644 --- a/vendor/sabre/vobject/lib/ElementList.php +++ b/vendor/sabre/vobject/lib/ElementList.php @@ -15,19 +15,23 @@ use LogicException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class ElementList extends ArrayIterator -{ +class ElementList extends ArrayIterator { + + /* {{{ ArrayAccess Interface */ /** * Sets an item through ArrayAccess. * - * @param int $offset + * @param int $offset * @param mixed $value + * + * @return void */ - public function offsetSet($offset, $value) - { + function offsetSet($offset, $value) { + throw new LogicException('You can not add new objects to an ElementList'); + } /** @@ -36,11 +40,15 @@ class ElementList extends ArrayIterator * This method just forwards the request to the inner iterator * * @param int $offset + * + * @return void */ - public function offsetUnset($offset) - { + function offsetUnset($offset) { + throw new LogicException('You can not remove objects from an ElementList'); + } /* }}} */ + } diff --git a/vendor/sabre/vobject/lib/EofException.php b/vendor/sabre/vobject/lib/EofException.php index 837af7eb7..e9bd55878 100644 --- a/vendor/sabre/vobject/lib/EofException.php +++ b/vendor/sabre/vobject/lib/EofException.php @@ -10,6 +10,6 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class EofException extends ParseException -{ +class EofException extends ParseException { + } diff --git a/vendor/sabre/vobject/lib/FreeBusyData.php b/vendor/sabre/vobject/lib/FreeBusyData.php index d05dfc799..0a6c72bb2 100644 --- a/vendor/sabre/vobject/lib/FreeBusyData.php +++ b/vendor/sabre/vobject/lib/FreeBusyData.php @@ -9,17 +9,17 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class FreeBusyData -{ +class FreeBusyData { + /** - * Start timestamp. + * Start timestamp * * @var int */ protected $start; /** - * End timestamp. + * End timestamp * * @var int */ @@ -32,31 +32,35 @@ class FreeBusyData */ protected $data; - public function __construct($start, $end) - { + function __construct($start, $end) { + $this->start = $start; $this->end = $end; $this->data = []; $this->data[] = [ 'start' => $this->start, - 'end' => $this->end, - 'type' => 'FREE', + 'end' => $this->end, + 'type' => 'FREE', ]; + } /** * Adds free or busytime to the data. * - * @param int $start - * @param int $end - * @param string $type FREE, BUSY, BUSY-UNAVAILABLE or BUSY-TENTATIVE + * @param int $start + * @param int $end + * @param string $type FREE, BUSY, BUSY-UNAVAILABLE or BUSY-TENTATIVE + * @return void */ - public function add($start, $end, $type) - { + function add($start, $end, $type) { + if ($start > $this->end || $end < $this->start) { + // This new data is outside our timerange. return; + } if ($start < $this->start) { @@ -71,7 +75,7 @@ class FreeBusyData // Finding out where we need to insert the new item. $currentIndex = 0; while ($start > $this->data[$currentIndex]['end']) { - ++$currentIndex; + $currentIndex++; } // The standard insertion point will be one _after_ the first @@ -80,14 +84,14 @@ class FreeBusyData $newItem = [ 'start' => $start, - 'end' => $end, - 'type' => $type, + 'end' => $end, + 'type' => $type, ]; $preceedingItem = $this->data[$insertStartIndex - 1]; if ($this->data[$insertStartIndex - 1]['start'] === $start) { // The old item starts at the exact same point as the new item. - --$insertStartIndex; + $insertStartIndex--; } // Now we know where to insert the item, we need to know where it @@ -101,32 +105,32 @@ class FreeBusyData } while ($end > $this->data[$currentIndex]['end']) { - ++$currentIndex; + + $currentIndex++; + } // What we are about to insert into the array $newItems = [ - $newItem, + $newItem ]; // This is the amount of items that are completely overwritten by the // new item. $itemsToDelete = $currentIndex - $insertStartIndex; - if ($this->data[$currentIndex]['end'] <= $end) { - ++$itemsToDelete; - } + if ($this->data[$currentIndex]['end'] <= $end) $itemsToDelete++; // If itemsToDelete was -1, it means that the newly inserted item is // actually sitting inside an existing one. This means we need to split // the item at the current position in two and insert the new item in // between. - if (-1 === $itemsToDelete) { + if ($itemsToDelete === -1) { $itemsToDelete = 0; if ($newItem['end'] < $preceedingItem['end']) { $newItems[] = [ 'start' => $newItem['end'] + 1, - 'end' => $preceedingItem['end'], - 'type' => $preceedingItem['type'], + 'end' => $preceedingItem['end'], + 'type' => $preceedingItem['type'] ]; } } @@ -151,8 +155,8 @@ class FreeBusyData // merge them into one item. if ($this->data[$insertStartIndex - 1]['type'] === $this->data[$insertStartIndex]['type']) { $doMerge = true; - --$mergeOffset; - ++$mergeDelete; + $mergeOffset--; + $mergeDelete++; $mergeItem['start'] = $this->data[$insertStartIndex - 1]['start']; } } @@ -164,9 +168,10 @@ class FreeBusyData // merge them into one item. if ($this->data[$insertStartIndex + 1]['type'] === $this->data[$insertStartIndex]['type']) { $doMerge = true; - ++$mergeDelete; + $mergeDelete++; $mergeItem['end'] = $this->data[$insertStartIndex + 1]['end']; } + } if ($doMerge) { array_splice( @@ -176,10 +181,13 @@ class FreeBusyData [$mergeItem] ); } + } - public function getData() - { + function getData() { + return $this->data; + } + } diff --git a/vendor/sabre/vobject/lib/FreeBusyGenerator.php b/vendor/sabre/vobject/lib/FreeBusyGenerator.php index adb214c08..e30b136c4 100644 --- a/vendor/sabre/vobject/lib/FreeBusyGenerator.php +++ b/vendor/sabre/vobject/lib/FreeBusyGenerator.php @@ -23,8 +23,8 @@ use Sabre\VObject\Recur\NoInstancesException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class FreeBusyGenerator -{ +class FreeBusyGenerator { + /** * Input objects. * @@ -71,7 +71,7 @@ class FreeBusyGenerator /** * A VAVAILABILITY document. * - * If this is set, its information will be included when calculating + * If this is set, it's information will be included when calculating * freebusy time. * * @var Document @@ -86,11 +86,11 @@ class FreeBusyGenerator * * @param DateTimeInterface $start * @param DateTimeInterface $end - * @param mixed $objects - * @param DateTimeZone $timeZone + * @param mixed $objects + * @param DateTimeZone $timeZone */ - public function __construct(DateTimeInterface $start = null, DateTimeInterface $end = null, $objects = null, DateTimeZone $timeZone = null) - { + function __construct(DateTimeInterface $start = null, DateTimeInterface $end = null, $objects = null, DateTimeZone $timeZone = null) { + $this->setTimeRange($start, $end); if ($objects) { @@ -100,6 +100,7 @@ class FreeBusyGenerator $timeZone = new DateTimeZone('UTC'); } $this->setTimeZone($timeZone); + } /** @@ -111,20 +112,24 @@ class FreeBusyGenerator * The VFREEBUSY object will be automatically added though. * * @param Document $vcalendar + * @return void */ - public function setBaseObject(Document $vcalendar) - { + function setBaseObject(Document $vcalendar) { + $this->baseObject = $vcalendar; + } /** * Sets a VAVAILABILITY document. * * @param Document $vcalendar + * @return void */ - public function setVAvailability(Document $vcalendar) - { + function setVAvailability(Document $vcalendar) { + $this->vavailability = $vcalendar; + } /** @@ -135,15 +140,18 @@ class FreeBusyGenerator * It's also possible to specify multiple objects as an array. * * @param mixed $objects + * + * @return void */ - public function setObjects($objects) - { + function setObjects($objects) { + if (!is_array($objects)) { $objects = [$objects]; } $this->objects = []; foreach ($objects as $object) { + if (is_string($object) || is_resource($object)) { $this->objects[] = Reader::read($object); } elseif ($object instanceof Component) { @@ -151,7 +159,9 @@ class FreeBusyGenerator } else { throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects'); } + } + } /** @@ -161,9 +171,11 @@ class FreeBusyGenerator * * @param DateTimeInterface $start * @param DateTimeInterface $end + * + * @return void */ - public function setTimeRange(DateTimeInterface $start = null, DateTimeInterface $end = null) - { + function setTimeRange(DateTimeInterface $start = null, DateTimeInterface $end = null) { + if (!$start) { $start = new DateTimeImmutable(Settings::$minDate); } @@ -172,16 +184,20 @@ class FreeBusyGenerator } $this->start = $start; $this->end = $end; + } /** * Sets the reference timezone for floating times. * * @param DateTimeZone $timeZone + * + * @return void */ - public function setTimeZone(DateTimeZone $timeZone) - { + function setTimeZone(DateTimeZone $timeZone) { + $this->timeZone = $timeZone; + } /** @@ -190,19 +206,23 @@ class FreeBusyGenerator * * @return Component */ - public function getResult() - { + function getResult() { + $fbData = new FreeBusyData( $this->start->getTimeStamp(), $this->end->getTimeStamp() ); if ($this->vavailability) { + $this->calculateAvailability($fbData, $this->vavailability); + } $this->calculateBusy($fbData, $this->objects); return $this->generateFreeBusyCalendar($fbData); + + } /** @@ -210,30 +230,29 @@ class FreeBusyGenerator * available times. * * @param FreeBusyData $fbData - * @param VCalendar $vavailability + * @param VCalendar $vavailability + * @return void */ - protected function calculateAvailability(FreeBusyData $fbData, VCalendar $vavailability) - { + protected function calculateAvailability(FreeBusyData $fbData, VCalendar $vavailability) { + $vavailComps = iterator_to_array($vavailability->VAVAILABILITY); usort( $vavailComps, - function ($a, $b) { + function($a, $b) { + // We need to order the components by priority. Priority 1 // comes first, up until priority 9. Priority 0 comes after // priority 9. No priority implies priority 0. // // Yes, I'm serious. - $priorityA = isset($a->PRIORITY) ? (int) $a->PRIORITY->getValue() : 0; - $priorityB = isset($b->PRIORITY) ? (int) $b->PRIORITY->getValue() : 0; + $priorityA = isset($a->PRIORITY) ? (int)$a->PRIORITY->getValue() : 0; + $priorityB = isset($b->PRIORITY) ? (int)$b->PRIORITY->getValue() : 0; - if (0 === $priorityA) { - $priorityA = 10; - } - if (0 === $priorityB) { - $priorityB = 10; - } + if ($priorityA === 0) $priorityA = 10; + if ($priorityB === 0) $priorityB = 10; return $priorityA - $priorityB; + } ); @@ -248,6 +267,7 @@ class FreeBusyGenerator $new = []; foreach ($old as $vavail) { + list($compStart, $compEnd) = $vavail->getEffectiveStartEnd(); // We don't care about datetimes that are earlier or later than the @@ -268,19 +288,24 @@ class FreeBusyGenerator // Going through our existing list of components to see if there's // a higher priority component that already fully covers this one. foreach ($new as $higherVavail) { + list($higherStart, $higherEnd) = $higherVavail->getEffectiveStartEnd(); if ( (is_null($higherStart) || $higherStart < $compStart) && (is_null($higherEnd) || $higherEnd > $compEnd) ) { + // Component is fully covered by a higher priority // component. We can skip this component. continue 2; + } + } // We're keeping it! $new[] = $vavail; + } // Lastly, we need to traverse the remaining components and fill in the @@ -289,6 +314,7 @@ class FreeBusyGenerator // We traverse the components in reverse, because we want the higher // priority components to override the lower ones. foreach (array_reverse($new) as $vavail) { + $busyType = isset($vavail->BUSYTYPE) ? strtoupper($vavail->BUSYTYPE) : 'BUSY-UNAVAILABLE'; list($vavailStart, $vavailEnd) = $vavail->getEffectiveStartEnd(); @@ -310,53 +336,57 @@ class FreeBusyGenerator ); // Looping over the AVAILABLE components. - if (isset($vavail->AVAILABLE)) { - foreach ($vavail->AVAILABLE as $available) { - list($availStart, $availEnd) = $available->getEffectiveStartEnd(); - $fbData->add( + if (isset($vavail->AVAILABLE)) foreach ($vavail->AVAILABLE as $available) { + + list($availStart, $availEnd) = $available->getEffectiveStartEnd(); + $fbData->add( $availStart->getTimeStamp(), $availEnd->getTimeStamp(), 'FREE' ); - if ($available->RRULE) { - // Our favourite thing: recurrence!! + if ($available->RRULE) { + // Our favourite thing: recurrence!! - $rruleIterator = new Recur\RRuleIterator( + $rruleIterator = new Recur\RRuleIterator( $available->RRULE->getValue(), $availStart ); - $rruleIterator->fastForward($vavailStart); + $rruleIterator->fastForward($vavailStart); - $startEndDiff = $availStart->diff($availEnd); + $startEndDiff = $availStart->diff($availEnd); - while ($rruleIterator->valid()) { - $recurStart = $rruleIterator->current(); - $recurEnd = $recurStart->add($startEndDiff); + while ($rruleIterator->valid()) { - if ($recurStart > $vavailEnd) { - // We're beyond the legal timerange. - break; - } + $recurStart = $rruleIterator->current(); + $recurEnd = $recurStart->add($startEndDiff); - if ($recurEnd > $vavailEnd) { - // Truncating the end if it exceeds the - // VAVAILABILITY end. - $recurEnd = $vavailEnd; - } + if ($recurStart > $vavailEnd) { + // We're beyond the legal timerange. + break; + } - $fbData->add( + if ($recurEnd > $vavailEnd) { + // Truncating the end if it exceeds the + // VAVAILABILITY end. + $recurEnd = $vavailEnd; + } + + $fbData->add( $recurStart->getTimeStamp(), $recurEnd->getTimeStamp(), 'FREE' ); - $rruleIterator->next(); - } + $rruleIterator->next(); + } } + } + } + } /** @@ -364,25 +394,28 @@ class FreeBusyGenerator * times on fbData. * * @param FreeBusyData $fbData - * @param VCalendar[] $objects + * @param VCalendar[] $objects */ - protected function calculateBusy(FreeBusyData $fbData, array $objects) - { + protected function calculateBusy(FreeBusyData $fbData, array $objects) { + foreach ($objects as $key => $object) { + foreach ($object->getBaseComponents() as $component) { + switch ($component->name) { - case 'VEVENT': + + case 'VEVENT' : $FBTYPE = 'BUSY'; - if (isset($component->TRANSP) && ('TRANSPARENT' === strtoupper($component->TRANSP))) { + if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { break; } if (isset($component->STATUS)) { $status = strtoupper($component->STATUS); - if ('CANCELLED' === $status) { + if ($status === 'CANCELLED') { break; } - if ('TENTATIVE' === $status) { + if ($status === 'TENTATIVE') { $FBTYPE = 'BUSY-TENTATIVE'; } } @@ -391,13 +424,13 @@ class FreeBusyGenerator if ($component->RRULE) { try { - $iterator = new EventIterator($object, (string) $component->UID, $this->timeZone); + $iterator = new EventIterator($object, (string)$component->UID, $this->timeZone); } catch (NoInstancesException $e) { // This event is recurring, but it doesn't have a single // instance. We are skipping this event from the output // entirely. unset($this->objects[$key]); - break; + continue; } if ($this->start) { @@ -407,6 +440,7 @@ class FreeBusyGenerator $maxRecurrences = Settings::$maxRecurrences; while ($iterator->valid() && --$maxRecurrences) { + $startTime = $iterator->getDTStart(); if ($this->end && $startTime > $this->end) { break; @@ -417,8 +451,11 @@ class FreeBusyGenerator ]; $iterator->next(); + } + } else { + $startTime = $component->DTSTART->getDateTime($this->timeZone); if ($this->end && $startTime > $this->end) { break; @@ -427,7 +464,7 @@ class FreeBusyGenerator if (isset($component->DTEND)) { $endTime = $component->DTEND->getDateTime($this->timeZone); } elseif (isset($component->DURATION)) { - $duration = DateTimeParser::parseDuration((string) $component->DURATION); + $duration = DateTimeParser::parseDuration((string)$component->DURATION); $endTime = clone $startTime; $endTime = $endTime->add($duration); } elseif (!$component->DTSTART->hasTime()) { @@ -439,15 +476,13 @@ class FreeBusyGenerator } $times[] = [$startTime, $endTime]; + } foreach ($times as $time) { - if ($this->end && $time[0] > $this->end) { - break; - } - if ($this->start && $time[1] < $this->start) { - break; - } + + if ($this->end && $time[0] > $this->end) break; + if ($this->start && $time[1] < $this->start) break; $fbData->add( $time[0]->getTimeStamp(), @@ -457,21 +492,21 @@ class FreeBusyGenerator } break; - case 'VFREEBUSY': + case 'VFREEBUSY' : foreach ($component->FREEBUSY as $freebusy) { + $fbType = isset($freebusy['FBTYPE']) ? strtoupper($freebusy['FBTYPE']) : 'BUSY'; // Skipping intervals marked as 'free' - if ('FREE' === $fbType) { + if ($fbType === 'FREE') continue; - } $values = explode(',', $freebusy); foreach ($values as $value) { list($startTime, $endTime) = explode('/', $value); $startTime = DateTimeParser::parseDateTime($startTime); - if ('P' === substr($endTime, 0, 1) || '-P' === substr($endTime, 0, 2)) { + if (substr($endTime, 0, 1) === 'P' || substr($endTime, 0, 2) === '-P') { $duration = DateTimeParser::parseDuration($endTime); $endTime = clone $startTime; $endTime = $endTime->add($duration); @@ -479,23 +514,27 @@ class FreeBusyGenerator $endTime = DateTimeParser::parseDateTime($endTime); } - if ($this->start && $this->start > $endTime) { - continue; - } - if ($this->end && $this->end < $startTime) { - continue; - } + if ($this->start && $this->start > $endTime) continue; + if ($this->end && $this->end < $startTime) continue; $fbData->add( $startTime->getTimeStamp(), $endTime->getTimeStamp(), $fbType ); + } + + } break; + } + + } + } + } /** @@ -504,8 +543,8 @@ class FreeBusyGenerator * * @return VCalendar */ - protected function generateFreeBusyCalendar(FreeBusyData $fbData) - { + protected function generateFreeBusyCalendar(FreeBusyData $fbData) { + if ($this->baseObject) { $calendar = $this->baseObject; } else { @@ -532,29 +571,34 @@ class FreeBusyGenerator $vfreebusy->add($dtstamp); foreach ($fbData->getData() as $busyTime) { + $busyType = strtoupper($busyTime['type']); // Ignoring all the FREE parts, because those are already assumed. - if ('FREE' === $busyType) { + if ($busyType === 'FREE') { continue; } - $busyTime[0] = new \DateTimeImmutable('@'.$busyTime['start'], $tz); - $busyTime[1] = new \DateTimeImmutable('@'.$busyTime['end'], $tz); + $busyTime[0] = new \DateTimeImmutable('@' . $busyTime['start'], $tz); + $busyTime[1] = new \DateTimeImmutable('@' . $busyTime['end'], $tz); $prop = $calendar->createProperty( 'FREEBUSY', - $busyTime[0]->format('Ymd\\THis\\Z').'/'.$busyTime[1]->format('Ymd\\THis\\Z') + $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') ); // Only setting FBTYPE if it's not BUSY, because BUSY is the // default anyway. - if ('BUSY' !== $busyType) { + if ($busyType !== 'BUSY') { $prop['FBTYPE'] = $busyType; } $vfreebusy->add($prop); + } return $calendar; + + } + } diff --git a/vendor/sabre/vobject/lib/ITip/Broker.php b/vendor/sabre/vobject/lib/ITip/Broker.php index b1cfee367..b954cdc8d 100644 --- a/vendor/sabre/vobject/lib/ITip/Broker.php +++ b/vendor/sabre/vobject/lib/ITip/Broker.php @@ -35,8 +35,8 @@ use Sabre\VObject\Recur\EventIterator; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Broker -{ +class Broker { + /** * This setting determines whether the rules for the SCHEDULE-AGENT * parameter should be followed. @@ -104,34 +104,37 @@ class Broker * * If the iTip message was not supported, we will always return false. * - * @param Message $itipMessage + * @param Message $itipMessage * @param VCalendar $existingObject * * @return VCalendar|null */ - public function processMessage(Message $itipMessage, VCalendar $existingObject = null) - { + function processMessage(Message $itipMessage, VCalendar $existingObject = null) { + // We only support events at the moment. - if ('VEVENT' !== $itipMessage->component) { + if ($itipMessage->component !== 'VEVENT') { return false; } switch ($itipMessage->method) { - case 'REQUEST': + + case 'REQUEST' : return $this->processMessageRequest($itipMessage, $existingObject); - case 'CANCEL': + case 'CANCEL' : return $this->processMessageCancel($itipMessage, $existingObject); - case 'REPLY': + case 'REPLY' : return $this->processMessageReply($itipMessage, $existingObject); - default: + default : // Unsupported iTip message return; + } return $existingObject; + } /** @@ -158,13 +161,13 @@ class Broker * organizer gets the 'declined' message. * * @param VCalendar|string $calendar - * @param string|array $userHref + * @param string|array $userHref * @param VCalendar|string $oldCalendar * * @return array */ - public function parseEvent($calendar = null, $userHref, $oldCalendar = null) - { + function parseEvent($calendar = null, $userHref, $oldCalendar = null) { + if ($oldCalendar) { if (is_string($oldCalendar)) { $oldCalendar = Reader::read($oldCalendar); @@ -177,15 +180,16 @@ class Broker $oldEventInfo = $this->parseEventInfo($oldCalendar); } else { $oldEventInfo = [ - 'organizer' => null, + 'organizer' => null, 'significantChangeHash' => '', - 'attendees' => [], + 'attendees' => [], ]; } - $userHref = (array) $userHref; + $userHref = (array)$userHref; if (!is_null($calendar)) { + if (is_string($calendar)) { $calendar = Reader::read($calendar); } @@ -213,6 +217,7 @@ class Broker $eventInfo['organizer'] = $oldEventInfo['organizer']; $eventInfo['organizerName'] = $oldEventInfo['organizerName']; } + } else { // The calendar object got deleted, we need to process this as a // cancellation / decline. @@ -228,17 +233,19 @@ class Broker $eventInfo['attendees'] = []; // Increasing the sequence, but only if the organizer deleted // the event. - ++$eventInfo['sequence']; + $eventInfo['sequence']++; } else { // This is an attendee deleting the event. foreach ($eventInfo['attendees'] as $key => $attendee) { if (in_array($attendee['href'], $userHref)) { - $eventInfo['attendees'][$key]['instances'] = ['master' => ['id' => 'master', 'partstat' => 'DECLINED'], + $eventInfo['attendees'][$key]['instances'] = ['master' => + ['id' => 'master', 'partstat' => 'DECLINED'] ]; } } } $baseCalendar = $oldCalendar; + } if (in_array($eventInfo['organizer'], $userHref)) { @@ -253,8 +260,8 @@ class Broker } } } - return []; + } /** @@ -264,13 +271,13 @@ class Broker * invite, or an update to an existing one. * * - * @param Message $itipMessage + * @param Message $itipMessage * @param VCalendar $existingObject * * @return VCalendar|null */ - protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null) - { + protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null) { + if (!$existingObject) { // This is a new invite, and we're just going to copy over // all the components from the invite. @@ -289,8 +296,8 @@ class Broker $existingObject->add(clone $component); } } - return $existingObject; + } /** @@ -300,13 +307,13 @@ class Broker * attendee got removed from an event, or an event got cancelled * altogether. * - * @param Message $itipMessage + * @param Message $itipMessage * @param VCalendar $existingObject * * @return VCalendar|null */ - protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null) - { + protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null) { + if (!$existingObject) { // The event didn't exist in the first place, so we're just // ignoring this message. @@ -316,8 +323,8 @@ class Broker $vevent->SEQUENCE = $itipMessage->sequence; } } - return $existingObject; + } /** @@ -326,13 +333,13 @@ class Broker * The message is a reply. This is for example an attendee telling * an organizer he accepted the invite, or declined it. * - * @param Message $itipMessage + * @param Message $itipMessage * @param VCalendar $existingObject * * @return VCalendar|null */ - protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null) - { + protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null) { + // A reply can only be processed based on an existing object. // If the object is not available, the reply is ignored. if (!$existingObject) { @@ -357,7 +364,7 @@ class Broker $masterObject = null; foreach ($existingObject->VEVENT as $vevent) { $recurId = isset($vevent->{'RECURRENCE-ID'}) ? $vevent->{'RECURRENCE-ID'}->getValue() : 'master'; - if ('master' === $recurId) { + if ($recurId === 'master') { $masterObject = $vevent; } if (isset($instances[$recurId])) { @@ -379,11 +386,9 @@ class Broker // Adding a new attendee. The iTip documentation calls this // a party crasher. $attendee = $vevent->add('ATTENDEE', $itipMessage->sender, [ - 'PARTSTAT' => $instances[$recurId], + 'PARTSTAT' => $instances[$recurId] ]); - if ($itipMessage->senderName) { - $attendee['CN'] = $itipMessage->senderName; - } + if ($itipMessage->senderName) $attendee['CN'] = $itipMessage->senderName; } unset($instances[$recurId]); } @@ -396,23 +401,24 @@ class Broker // If we got replies to instances that did not exist in the // original list, it means that new exceptions must be created. foreach ($instances as $recurId => $partstat) { + $recurrenceIterator = new EventIterator($existingObject, $itipMessage->uid); $found = false; $iterations = 1000; do { + $newObject = $recurrenceIterator->getEventObject(); $recurrenceIterator->next(); if (isset($newObject->{'RECURRENCE-ID'}) && $newObject->{'RECURRENCE-ID'}->getValue() === $recurId) { $found = true; } - --$iterations; + $iterations--; + } while ($recurrenceIterator->valid() && !$found && $iterations); // Invalid recurrence id. Skipping this object. - if (!$found) { - continue; - } + if (!$found) continue; unset( $newObject->RRULE, @@ -432,16 +438,17 @@ class Broker if (!$attendeeFound) { // Adding a new attendee $attendee = $newObject->add('ATTENDEE', $itipMessage->sender, [ - 'PARTSTAT' => $partstat, + 'PARTSTAT' => $partstat ]); if ($itipMessage->senderName) { $attendee['CN'] = $itipMessage->senderName; } } $existingObject->add($newObject); - } + } return $existingObject; + } /** @@ -453,22 +460,22 @@ class Broker * specific messages for these situations. * * @param VCalendar $calendar - * @param array $eventInfo - * @param array $oldEventInfo + * @param array $eventInfo + * @param array $oldEventInfo * * @return array */ - protected function parseEventForOrganizer(VCalendar $calendar, array $eventInfo, array $oldEventInfo) - { + protected function parseEventForOrganizer(VCalendar $calendar, array $eventInfo, array $oldEventInfo) { + // Merging attendee lists. $attendees = []; foreach ($oldEventInfo['attendees'] as $attendee) { $attendees[$attendee['href']] = [ - 'href' => $attendee['href'], + 'href' => $attendee['href'], 'oldInstances' => $attendee['instances'], 'newInstances' => [], - 'name' => $attendee['name'], - 'forceSend' => null, + 'name' => $attendee['name'], + 'forceSend' => null, ]; } foreach ($eventInfo['attendees'] as $attendee) { @@ -478,11 +485,11 @@ class Broker $attendees[$attendee['href']]['forceSend'] = $attendee['forceSend']; } else { $attendees[$attendee['href']] = [ - 'href' => $attendee['href'], + 'href' => $attendee['href'], 'oldInstances' => [], 'newInstances' => $attendee['instances'], - 'name' => $attendee['name'], - 'forceSend' => $attendee['forceSend'], + 'name' => $attendee['name'], + 'forceSend' => $attendee['forceSend'], ]; } } @@ -490,6 +497,7 @@ class Broker $messages = []; foreach ($attendees as $attendee) { + // An organizer can also be an attendee. We should not generate any // messages for those. if ($attendee['href'] === $eventInfo['organizer']) { @@ -506,6 +514,7 @@ class Broker $message->recipientName = $attendee['name']; if (!$attendee['newInstances']) { + // If there are no instances the attendee is a part of, it // means the attendee was removed and we need to send him a // CANCEL. @@ -514,13 +523,8 @@ class Broker // Creating the new iCalendar body. $icalMsg = new VCalendar(); $icalMsg->METHOD = $message->method; - - foreach ($calendar->select('VTIMEZONE') as $timezone) { - $icalMsg->add(clone $timezone); - } - $event = $icalMsg->add('VEVENT', [ - 'UID' => $message->uid, + 'UID' => $message->uid, 'SEQUENCE' => $message->sequence, ]); if (isset($calendar->VEVENT->SUMMARY)) { @@ -533,14 +537,14 @@ class Broker $event->add(clone $calendar->VEVENT->DURATION); } $org = $event->add('ORGANIZER', $eventInfo['organizer']); - if ($eventInfo['organizerName']) { - $org['CN'] = $eventInfo['organizerName']; - } + if ($eventInfo['organizerName']) $org['CN'] = $eventInfo['organizerName']; $event->add('ATTENDEE', $attendee['href'], [ 'CN' => $attendee['name'], ]); $message->significantChange = true; + } else { + // The attendee gets the updated event body $message->method = 'REQUEST'; @@ -561,13 +565,15 @@ class Broker // difference in instances that the attendee is invited to. $message->significantChange = - 'REQUEST' === $attendee['forceSend'] || + $attendee['forceSend'] === 'REQUEST' || array_keys($attendee['oldInstances']) != array_keys($attendee['newInstances']) || $oldEventInfo['significantChangeHash'] !== $eventInfo['significantChangeHash']; foreach ($attendee['newInstances'] as $instanceId => $instanceInfo) { + $currentEvent = clone $eventInfo['instances'][$instanceId]; - if ('master' === $instanceId) { + if ($instanceId === 'master') { + // We need to find a list of events that the attendee // is not a part of to add to the list of exceptions. $exceptions = []; @@ -604,18 +610,24 @@ class Broker if (!isset($attendee['PARTSTAT'])) { $attendee['PARTSTAT'] = 'NEEDS-ACTION'; } + } + } $icalMsg->add($currentEvent); + } + } $message->message = $icalMsg; $messages[] = $message; + } return $messages; + } /** @@ -624,21 +636,21 @@ class Broker * This function figures out if we need to send a reply to an organizer. * * @param VCalendar $calendar - * @param array $eventInfo - * @param array $oldEventInfo - * @param string $attendee + * @param array $eventInfo + * @param array $oldEventInfo + * @param string $attendee * * @return Message[] */ - protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, array $oldEventInfo, $attendee) - { - if ($this->scheduleAgentServerRules && 'CLIENT' === $eventInfo['organizerScheduleAgent']) { + protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, array $oldEventInfo, $attendee) { + + if ($this->scheduleAgentServerRules && $eventInfo['organizerScheduleAgent'] === 'CLIENT') { return []; } // Don't bother generating messages for events that have already been // cancelled. - if ('CANCELLED' === $eventInfo['status']) { + if ($eventInfo['status'] === 'CANCELLED') { return []; } @@ -648,22 +660,26 @@ class Broker $instances = []; foreach ($oldInstances as $instance) { + $instances[$instance['id']] = [ - 'id' => $instance['id'], + 'id' => $instance['id'], 'oldstatus' => $instance['partstat'], 'newstatus' => null, ]; + } foreach ($eventInfo['attendees'][$attendee]['instances'] as $instance) { + if (isset($instances[$instance['id']])) { $instances[$instance['id']]['newstatus'] = $instance['partstat']; } else { $instances[$instance['id']] = [ - 'id' => $instance['id'], + 'id' => $instance['id'], 'oldstatus' => null, 'newstatus' => $instance['partstat'], ]; } + } // We need to also look for differences in EXDATE. If there are new @@ -671,29 +687,33 @@ class Broker // event, which means we need to send DECLINED specifically for those // instances. // We only need to do that though, if the master event is not declined. - if (isset($instances['master']) && 'DECLINED' !== $instances['master']['newstatus']) { + if (isset($instances['master']) && $instances['master']['newstatus'] !== 'DECLINED') { foreach ($eventInfo['exdate'] as $exDate) { + if (!in_array($exDate, $oldEventInfo['exdate'])) { if (isset($instances[$exDate])) { $instances[$exDate]['newstatus'] = 'DECLINED'; } else { $instances[$exDate] = [ - 'id' => $exDate, + 'id' => $exDate, 'oldstatus' => null, 'newstatus' => 'DECLINED', ]; } } + } } // Gathering a few extra properties for each instance. foreach ($instances as $recurId => $instanceInfo) { + if (isset($eventInfo['instances'][$recurId])) { $instances[$recurId]['dtstart'] = clone $eventInfo['instances'][$recurId]->DTSTART; } else { $instances[$recurId]['dtstart'] = $recurId; } + } $message = new Message(); @@ -712,13 +732,14 @@ class Broker $hasReply = false; foreach ($instances as $instance) { - if ($instance['oldstatus'] == $instance['newstatus'] && 'REPLY' !== $eventInfo['organizerForceSend']) { + + if ($instance['oldstatus'] == $instance['newstatus'] && $eventInfo['organizerForceSend'] !== 'REPLY') { // Skip continue; } $event = $icalMsg->add('VEVENT', [ - 'UID' => $message->uid, + 'UID' => $message->uid, 'SEQUENCE' => $message->sequence, ]); $summary = isset($calendar->VEVENT->SUMMARY) ? $calendar->VEVENT->SUMMARY->getValue() : ''; @@ -752,7 +773,7 @@ class Broker $event->add('SUMMARY', $summary); } } - if ('master' !== $instance['id']) { + if ($instance['id'] !== 'master') { $dt = DateTimeParser::parse($instance['id'], $eventInfo['timezone']); // Treat is as a DATE field if (strlen($instance['id']) <= 8) { @@ -766,21 +787,22 @@ class Broker $organizer['CN'] = $message->recipientName; } $attendee = $event->add('ATTENDEE', $message->sender, [ - 'PARTSTAT' => $instance['newstatus'], + 'PARTSTAT' => $instance['newstatus'] ]); if ($message->senderName) { $attendee['CN'] = $message->senderName; } $hasReply = true; + } if ($hasReply) { $message->message = $icalMsg; - return [$message]; } else { return []; } + } /** @@ -802,13 +824,12 @@ class Broker * based on. * 11. significantChangeHash * 12. status - * * @param VCalendar $calendar * * @return array */ - protected function parseEventInfo(VCalendar $calendar = null) - { + protected function parseEventInfo(VCalendar $calendar = null) { + $uid = null; $organizer = null; $organizerName = null; @@ -847,7 +868,7 @@ class Broker $organizer = $vevent->ORGANIZER->getNormalizedValue(); $organizerName = isset($vevent->ORGANIZER['CN']) ? $vevent->ORGANIZER['CN'] : null; } else { - if (strtoupper($organizer) !== strtoupper($vevent->ORGANIZER->getNormalizedValue())) { + if ($organizer !== $vevent->ORGANIZER->getNormalizedValue()) { throw new SameOrganizerForAllComponentsException('Every instance of the event must have the same organizer.'); } } @@ -857,7 +878,7 @@ class Broker null; $organizerScheduleAgent = isset($vevent->ORGANIZER['SCHEDULE-AGENT']) ? - strtoupper((string) $vevent->ORGANIZER['SCHEDULE-AGENT']) : + strtoupper((string)$vevent->ORGANIZER['SCHEDULE-AGENT']) : 'SERVER'; } if (is_null($sequence) && isset($vevent->SEQUENCE)) { @@ -873,7 +894,7 @@ class Broker foreach ($vevent->select('RRULE') as $rr) { foreach ($rr->getParts() as $key => $val) { // ignore default values (https://github.com/sabre-io/vobject/issues/126) - if ('INTERVAL' === $key && 1 == $val) { + if ($key === 'INTERVAL' && $val == 1) { continue; } if (is_array($val)) { @@ -890,7 +911,7 @@ class Broker $recurId = isset($vevent->{'RECURRENCE-ID'}) ? $vevent->{'RECURRENCE-ID'}->getValue() : 'master'; if (is_null($timezone)) { - if ('master' === $recurId) { + if ($recurId === 'master') { $timezone = $vevent->DTSTART->getDateTime()->getTimeZone(); } else { $timezone = $vevent->{'RECURRENCE-ID'}->getDateTime()->getTimeZone(); @@ -898,9 +919,10 @@ class Broker } if (isset($vevent->ATTENDEE)) { foreach ($vevent->ATTENDEE as $attendee) { + if ($this->scheduleAgentServerRules && isset($attendee['SCHEDULE-AGENT']) && - 'CLIENT' === strtoupper($attendee['SCHEDULE-AGENT']->getValue()) + strtoupper($attendee['SCHEDULE-AGENT']->getValue()) === 'CLIENT' ) { continue; } @@ -914,42 +936,45 @@ class Broker strtoupper($attendee['SCHEDULE-FORCE-SEND']) : null; + if (isset($attendees[$attendee->getNormalizedValue()])) { $attendees[$attendee->getNormalizedValue()]['instances'][$recurId] = [ - 'id' => $recurId, - 'partstat' => $partStat, + 'id' => $recurId, + 'partstat' => $partStat, 'forceSend' => $forceSend, ]; } else { $attendees[$attendee->getNormalizedValue()] = [ - 'href' => $attendee->getNormalizedValue(), + 'href' => $attendee->getNormalizedValue(), 'instances' => [ $recurId => [ - 'id' => $recurId, + 'id' => $recurId, 'partstat' => $partStat, ], ], - 'name' => isset($attendee['CN']) ? (string) $attendee['CN'] : null, + 'name' => isset($attendee['CN']) ? (string)$attendee['CN'] : null, 'forceSend' => $forceSend, ]; } + } $instances[$recurId] = $vevent; + } foreach ($this->significantChangeProperties as $prop) { if (isset($vevent->$prop)) { $propertyValues = $vevent->select($prop); - $significantChangeHash .= $prop.':'; + $significantChangeHash .= $prop . ':'; - if ('EXDATE' === $prop) { - $significantChangeHash .= implode(',', $exdate).';'; - } elseif ('RRULE' === $prop) { - $significantChangeHash .= implode(',', $rrule).';'; + if ($prop === 'EXDATE') { + $significantChangeHash .= implode(',', $exdate) . ';'; + } elseif ($prop === 'RRULE') { + $significantChangeHash .= implode(',', $rrule) . ';'; } else { foreach ($propertyValues as $val) { - $significantChangeHash .= $val->getValue().';'; + $significantChangeHash .= $val->getValue() . ';'; } } } @@ -971,5 +996,7 @@ class Broker 'significantChangeHash', 'status' ); + } + } diff --git a/vendor/sabre/vobject/lib/ITip/ITipException.php b/vendor/sabre/vobject/lib/ITip/ITipException.php index 949563614..ad5e53ab4 100644 --- a/vendor/sabre/vobject/lib/ITip/ITipException.php +++ b/vendor/sabre/vobject/lib/ITip/ITipException.php @@ -11,6 +11,5 @@ use Exception; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class ITipException extends Exception -{ +class ITipException extends Exception { } diff --git a/vendor/sabre/vobject/lib/ITip/Message.php b/vendor/sabre/vobject/lib/ITip/Message.php index 43536f172..bebe2e4fc 100644 --- a/vendor/sabre/vobject/lib/ITip/Message.php +++ b/vendor/sabre/vobject/lib/ITip/Message.php @@ -14,8 +14,8 @@ namespace Sabre\VObject\ITip; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Message -{ +class Message { + /** * The object's UID. * @@ -123,14 +123,19 @@ class Message * * @return mixed bool|string */ - public function getScheduleStatus() - { + function getScheduleStatus() { + if (!$this->scheduleStatus) { + return false; + } else { - list($scheduleStatus) = explode(';', $this->scheduleStatus); + list($scheduleStatus) = explode(';', $this->scheduleStatus); return $scheduleStatus; + } + } + } diff --git a/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php b/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php index 4c48625be..423b39831 100644 --- a/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php +++ b/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php @@ -13,6 +13,6 @@ namespace Sabre\VObject\ITip; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class SameOrganizerForAllComponentsException extends ITipException -{ +class SameOrganizerForAllComponentsException extends ITipException { + } diff --git a/vendor/sabre/vobject/lib/InvalidDataException.php b/vendor/sabre/vobject/lib/InvalidDataException.php index 1d8b67583..50ebc0f49 100644 --- a/vendor/sabre/vobject/lib/InvalidDataException.php +++ b/vendor/sabre/vobject/lib/InvalidDataException.php @@ -10,6 +10,5 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class InvalidDataException extends \Exception -{ +class InvalidDataException extends \Exception { } diff --git a/vendor/sabre/vobject/lib/Node.php b/vendor/sabre/vobject/lib/Node.php index 154a7fac5..e2845da75 100644 --- a/vendor/sabre/vobject/lib/Node.php +++ b/vendor/sabre/vobject/lib/Node.php @@ -11,8 +11,13 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \JsonSerializable, Xml\XmlSerializable -{ +abstract class Node + implements \IteratorAggregate, + \ArrayAccess, + \Countable, + \JsonSerializable, + Xml\XmlSerializable { + /** * The following constants are used by the validate() method. * @@ -65,7 +70,7 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return string */ - abstract public function serialize(); + abstract function serialize(); /** * This method returns an array, with the representation as it should be @@ -73,26 +78,31 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return array */ - abstract public function jsonSerialize(); + abstract function jsonSerialize(); /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - abstract public function xmlSerialize(Xml\Writer $writer); + abstract function xmlSerialize(Xml\Writer $writer); /** * Call this method on a document if you're done using it. * * It's intended to remove all circular references, so PHP can easily clean * it up. + * + * @return void */ - public function destroy() - { + function destroy() { + $this->parent = null; $this->root = null; + } /* {{{ IteratorAggregator interface */ @@ -102,13 +112,14 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return ElementList */ - public function getIterator() - { + function getIterator() { + if (!is_null($this->iterator)) { return $this->iterator; } return new ElementList([$this]); + } /** @@ -117,10 +128,13 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * Note that this is not actually part of the iterator interface * * @param ElementList $iterator + * + * @return void */ - public function setIterator(ElementList $iterator) - { + function setIterator(ElementList $iterator) { + $this->iterator = $iterator; + } /** @@ -145,9 +159,10 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + return []; + } /* }}} */ @@ -159,17 +174,18 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return int */ - public function count() - { - $it = $this->getIterator(); + function count() { + $it = $this->getIterator(); return $it->count(); + } /* }}} */ /* {{{ ArrayAccess Interface */ + /** * Checks if an item exists through ArrayAccess. * @@ -179,11 +195,11 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return bool */ - public function offsetExists($offset) - { - $iterator = $this->getIterator(); + function offsetExists($offset) { + $iterator = $this->getIterator(); return $iterator->offsetExists($offset); + } /** @@ -195,11 +211,11 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * @return mixed */ - public function offsetGet($offset) - { - $iterator = $this->getIterator(); + function offsetGet($offset) { + $iterator = $this->getIterator(); return $iterator->offsetGet($offset); + } /** @@ -207,20 +223,21 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * * This method just forwards the request to the inner iterator * - * @param int $offset + * @param int $offset * @param mixed $value + * + * @return void */ - public function offsetSet($offset, $value) - { + function offsetSet($offset, $value) { + $iterator = $this->getIterator(); $iterator->offsetSet($offset, $value); - // @codeCoverageIgnoreStart + // @codeCoverageIgnoreStart // // This method always throws an exception, so we ignore the closing // brace } - // @codeCoverageIgnoreEnd /** @@ -229,18 +246,19 @@ abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \Js * This method just forwards the request to the inner iterator * * @param int $offset + * + * @return void */ - public function offsetUnset($offset) - { + function offsetUnset($offset) { + $iterator = $this->getIterator(); $iterator->offsetUnset($offset); - // @codeCoverageIgnoreStart + // @codeCoverageIgnoreStart // // This method always throws an exception, so we ignore the closing // brace } - // @codeCoverageIgnoreEnd /* }}} */ diff --git a/vendor/sabre/vobject/lib/PHPUnitAssertions.php b/vendor/sabre/vobject/lib/PHPUnitAssertions.php index d77e4b1ed..87ec75e8f 100644 --- a/vendor/sabre/vobject/lib/PHPUnitAssertions.php +++ b/vendor/sabre/vobject/lib/PHPUnitAssertions.php @@ -3,7 +3,7 @@ namespace Sabre\VObject; /** - * PHPUnit Assertions. + * PHPUnit Assertions * * This trait can be added to your unittest to make it easier to test iCalendar * and/or vCards. @@ -12,8 +12,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -trait PHPUnitAssertions -{ +trait PHPUnitAssertions { + /** * This method tests wether two vcards or icalendar objects are * semantically identical. @@ -30,12 +30,13 @@ trait PHPUnitAssertions * * @param resource|string|Component $expected * @param resource|string|Component $actual - * @param string $message + * @param string $message */ - public function assertVObjectEqualsVObject($expected, $actual, $message = '') - { + function assertVObjectEqualsVObject($expected, $actual, $message = '') { + $self = $this; - $getObj = function ($input) use ($self) { + $getObj = function($input) use ($self) { + if (is_resource($input)) { $input = stream_get_contents($input); } @@ -46,11 +47,11 @@ trait PHPUnitAssertions $this->fail('Input must be a string, stream or VObject component'); } unset($input->PRODID); - if ($input instanceof Component\VCalendar && 'GREGORIAN' === (string) $input->CALSCALE) { + if ($input instanceof Component\VCalendar && (string)$input->CALSCALE === 'GREGORIAN') { unset($input->CALSCALE); } - return $input; + }; $expected = $getObj($expected)->serialize(); @@ -60,11 +61,13 @@ trait PHPUnitAssertions preg_match_all('|^([A-Z]+):\\*\\*ANY\\*\\*\r$|m', $expected, $matches, PREG_SET_ORDER); foreach ($matches as $match) { + $actual = preg_replace( - '|^'.preg_quote($match[1], '|').':(.*)\r$|m', - $match[1].':**ANY**'."\r", + '|^' . preg_quote($match[1], '|') . ':(.*)\r$|m', + $match[1] . ':**ANY**' . "\r", $actual ); + } $this->assertEquals( @@ -72,5 +75,8 @@ trait PHPUnitAssertions $actual, $message ); + } + + } diff --git a/vendor/sabre/vobject/lib/Parameter.php b/vendor/sabre/vobject/lib/Parameter.php index 2c9a8e7fd..a99a33eec 100644 --- a/vendor/sabre/vobject/lib/Parameter.php +++ b/vendor/sabre/vobject/lib/Parameter.php @@ -17,8 +17,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Parameter extends Node -{ +class Parameter extends Node { + /** * Parameter name. * @@ -29,7 +29,7 @@ class Parameter extends Node /** * vCard 2.1 allows parameters to be encoded without a name. * - * We can deduce the parameter name based on its value. + * We can deduce the parameter name based on it's value. * * @var bool */ @@ -50,8 +50,8 @@ class Parameter extends Node * @param string $name * @param string $value */ - public function __construct(Document $root, $name, $value = null) - { + function __construct(Document $root, $name, $value = null) { + $this->name = strtoupper($name); $this->root = $root; if (is_null($name)) { @@ -62,12 +62,13 @@ class Parameter extends Node // If guessParameterNameByValue() returns an empty string // above, we're actually dealing with a parameter that has no value. // In that case we have to move the value to the name. - if ('' === $this->name) { + if ($this->name === '') { $this->noName = false; $this->name = strtoupper($value); } else { $this->setValue($value); } + } /** @@ -81,85 +82,85 @@ class Parameter extends Node * * @return string */ - public static function guessParameterNameByValue($value) - { + static function guessParameterNameByValue($value) { switch (strtoupper($value)) { + // Encodings - case '7-BIT': - case 'QUOTED-PRINTABLE': - case 'BASE64': + case '7-BIT' : + case 'QUOTED-PRINTABLE' : + case 'BASE64' : $name = 'ENCODING'; break; // Common types - case 'WORK': - case 'HOME': - case 'PREF': + case 'WORK' : + case 'HOME' : + case 'PREF' : // Delivery Label Type - case 'DOM': - case 'INTL': - case 'POSTAL': - case 'PARCEL': + case 'DOM' : + case 'INTL' : + case 'POSTAL' : + case 'PARCEL' : // Telephone types - case 'VOICE': - case 'FAX': - case 'MSG': - case 'CELL': - case 'PAGER': - case 'BBS': - case 'MODEM': - case 'CAR': - case 'ISDN': - case 'VIDEO': + case 'VOICE' : + case 'FAX' : + case 'MSG' : + case 'CELL' : + case 'PAGER' : + case 'BBS' : + case 'MODEM' : + case 'CAR' : + case 'ISDN' : + case 'VIDEO' : // EMAIL types (lol) - case 'AOL': - case 'APPLELINK': - case 'ATTMAIL': - case 'CIS': - case 'EWORLD': - case 'INTERNET': - case 'IBMMAIL': - case 'MCIMAIL': - case 'POWERSHARE': - case 'PRODIGY': - case 'TLX': - case 'X400': + case 'AOL' : + case 'APPLELINK' : + case 'ATTMAIL' : + case 'CIS' : + case 'EWORLD' : + case 'INTERNET' : + case 'IBMMAIL' : + case 'MCIMAIL' : + case 'POWERSHARE' : + case 'PRODIGY' : + case 'TLX' : + case 'X400' : // Photo / Logo format types - case 'GIF': - case 'CGM': - case 'WMF': - case 'BMP': - case 'DIB': - case 'PICT': - case 'TIFF': - case 'PDF': - case 'PS': - case 'JPEG': - case 'MPEG': - case 'MPEG2': - case 'AVI': - case 'QTIME': + case 'GIF' : + case 'CGM' : + case 'WMF' : + case 'BMP' : + case 'DIB' : + case 'PICT' : + case 'TIFF' : + case 'PDF' : + case 'PS' : + case 'JPEG' : + case 'MPEG' : + case 'MPEG2' : + case 'AVI' : + case 'QTIME' : // Sound Digital Audio Type - case 'WAVE': - case 'PCM': - case 'AIFF': + case 'WAVE' : + case 'PCM' : + case 'AIFF' : // Key types - case 'X509': - case 'PGP': + case 'X509' : + case 'PGP' : $name = 'TYPE'; break; // Value types - case 'INLINE': - case 'URL': - case 'CONTENT-ID': - case 'CID': + case 'INLINE' : + case 'URL' : + case 'CONTENT-ID' : + case 'CID' : $name = 'VALUE'; break; @@ -176,10 +177,13 @@ class Parameter extends Node * This may be either a single, or multiple strings in an array. * * @param string|array $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + $this->value = $value; + } /** @@ -190,23 +194,27 @@ class Parameter extends Node * * @return string|null */ - public function getValue() - { + function getValue() { + if (is_array($this->value)) { return implode(',', $this->value); } else { return $this->value; } + } /** * Sets multiple values for this parameter. * * @param array $value + * + * @return void */ - public function setParts(array $value) - { + function setParts(array $value) { + $this->value = $value; + } /** @@ -216,8 +224,8 @@ class Parameter extends Node * * @return array */ - public function getParts() - { + function getParts() { + if (is_array($this->value)) { return $this->value; } elseif (is_null($this->value)) { @@ -225,6 +233,7 @@ class Parameter extends Node } else { return [$this->value]; } + } /** @@ -234,14 +243,17 @@ class Parameter extends Node * parameter value list. * * @param string|array $part + * + * @return void */ - public function addValue($part) - { + function addValue($part) { + if (is_null($this->value)) { $this->value = $part; } else { - $this->value = array_merge((array) $this->value, (array) $part); + $this->value = array_merge((array)$this->value, (array)$part); } + } /** @@ -255,12 +267,13 @@ class Parameter extends Node * * @return bool */ - public function has($value) - { + function has($value) { + return in_array( strtolower($value), - array_map('strtolower', (array) $this->value) + array_map('strtolower', (array)$this->value) ); + } /** @@ -268,24 +281,25 @@ class Parameter extends Node * * @return string */ - public function serialize() - { + function serialize() { + $value = $this->getParts(); - if (0 === count($value)) { - return $this->name.'='; + if (count($value) === 0) { + return $this->name . '='; } - if (Document::VCARD21 === $this->root->getDocumentType() && $this->noName) { + if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { + return implode(';', $value); + } - return $this->name.'='.array_reduce( + return $this->name . '=' . array_reduce( $value, - function ($out, $item) { - if (!is_null($out)) { - $out .= ','; - } + function($out, $item) { + + if (!is_null($out)) $out .= ','; // If there's no special characters in the string, we'll use the simple // format. @@ -304,23 +318,24 @@ class Parameter extends Node // severaly trips on + characters not being quoted, so we // added + as well. if (!preg_match('#(?: [\n":;\^,\+] )#x', $item)) { - return $out.$item; + return $out . $item; } else { // Enclosing in double-quotes, and using RFC6868 for encoding any // special characters - $out .= '"'.strtr( + $out .= '"' . strtr( $item, [ - '^' => '^^', + '^' => '^^', "\n" => '^n', - '"' => '^\'', + '"' => '^\'', ] - ).'"'; - + ) . '"'; return $out; } + } ); + } /** @@ -329,22 +344,26 @@ class Parameter extends Node * * @return array */ - public function jsonSerialize() - { + function jsonSerialize() { + return $this->value; + } /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - public function xmlSerialize(Xml\Writer $writer) - { + function xmlSerialize(Xml\Writer $writer) { + foreach (explode(',', $this->value) as $value) { $writer->writeElement('text', $value); } + } /** @@ -352,9 +371,10 @@ class Parameter extends Node * * @return string */ - public function __toString() - { - return (string) $this->getValue(); + function __toString() { + + return (string)$this->getValue(); + } /** @@ -362,12 +382,13 @@ class Parameter extends Node * * @return ElementList */ - public function getIterator() - { - if (!is_null($this->iterator)) { + function getIterator() { + + if (!is_null($this->iterator)) return $this->iterator; - } - return $this->iterator = new ArrayIterator((array) $this->value); + return $this->iterator = new ArrayIterator((array)$this->value); + } + } diff --git a/vendor/sabre/vobject/lib/ParseException.php b/vendor/sabre/vobject/lib/ParseException.php index a8f497b24..d96d20720 100644 --- a/vendor/sabre/vobject/lib/ParseException.php +++ b/vendor/sabre/vobject/lib/ParseException.php @@ -9,6 +9,5 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class ParseException extends \Exception -{ +class ParseException extends \Exception { } diff --git a/vendor/sabre/vobject/lib/Parser/Json.php b/vendor/sabre/vobject/lib/Parser/Json.php index 3fd307e97..a77258a2e 100644 --- a/vendor/sabre/vobject/lib/Parser/Json.php +++ b/vendor/sabre/vobject/lib/Parser/Json.php @@ -4,7 +4,6 @@ namespace Sabre\VObject\Parser; use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VCard; -use Sabre\VObject\Document; use Sabre\VObject\EofException; use Sabre\VObject\ParseException; @@ -17,8 +16,8 @@ use Sabre\VObject\ParseException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Json extends Parser -{ +class Json extends Parser { + /** * The input data. * @@ -42,12 +41,12 @@ class Json extends Parser * If either input or options are not supplied, the defaults will be used. * * @param resource|string|array|null $input - * @param int $options + * @param int $options * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -60,28 +59,28 @@ class Json extends Parser } switch ($this->input[0]) { - case 'vcalendar': + case 'vcalendar' : $this->root = new VCalendar([], false); break; - case 'vcard': + case 'vcard' : $this->root = new VCard([], false); break; - default: + default : throw new ParseException('The root component must either be a vcalendar, or a vcard'); + } foreach ($this->input[1] as $prop) { $this->root->add($this->parseProperty($prop)); } - if (isset($this->input[2])) { - foreach ($this->input[2] as $comp) { - $this->root->add($this->parseComponent($comp)); - } + if (isset($this->input[2])) foreach ($this->input[2] as $comp) { + $this->root->add($this->parseComponent($comp)); } // Resetting the input so we can throw an feof exception the next time. $this->input = null; return $this->root; + } /** @@ -91,34 +90,35 @@ class Json extends Parser * * @return \Sabre\VObject\Component */ - public function parseComponent(array $jComp) - { + function parseComponent(array $jComp) { + // We can remove $self from PHP 5.4 onward. $self = $this; $properties = array_map( - function ($jProp) use ($self) { + function($jProp) use ($self) { return $self->parseProperty($jProp); }, $jComp[1] ); if (isset($jComp[2])) { + $components = array_map( - function ($jComp) use ($self) { + function($jComp) use ($self) { return $self->parseComponent($jComp); }, $jComp[2] ); - } else { - $components = []; - } + + } else $components = []; return $this->root->createComponent( $jComp[0], array_merge($properties, $components), $defaults = false ); + } /** @@ -128,8 +128,8 @@ class Json extends Parser * * @return \Sabre\VObject\Property */ - public function parseProperty(array $jProp) - { + function parseProperty(array $jProp) { + list( $propertyName, $parameters, @@ -142,14 +142,14 @@ class Json extends Parser // value type. We're using this value later in this function. $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); - $parameters = (array) $parameters; + $parameters = (array)$parameters; $value = array_slice($jProp, 3); $valueType = strtoupper($valueType); if (isset($parameters['group'])) { - $propertyName = $parameters['group'].'.'.$propertyName; + $propertyName = $parameters['group'] . '.' . $propertyName; unset($parameters['group']); } @@ -160,7 +160,7 @@ class Json extends Parser // represents TEXT values. We have to normalize these here. In the // future we can get rid of FlatText once we're allowed to break BC // again. - if ('Sabre\VObject\Property\FlatText' === $defaultPropertyClass) { + if ($defaultPropertyClass === 'Sabre\VObject\Property\FlatText') { $defaultPropertyClass = 'Sabre\VObject\Property\Text'; } @@ -168,19 +168,22 @@ class Json extends Parser // type for the given property (e.g.: BDAY), we need to add a VALUE= // parameter. if ($defaultPropertyClass !== get_class($prop)) { - $prop['VALUE'] = $valueType; + $prop["VALUE"] = $valueType; } return $prop; + } /** * Sets the input data. * * @param resource|string|array $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + if (is_resource($input)) { $input = stream_get_contents($input); } @@ -188,5 +191,7 @@ class Json extends Parser $input = json_decode($input); } $this->input = $input; + } + } diff --git a/vendor/sabre/vobject/lib/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Parser/MimeDir.php index 10dcec89c..742641236 100644 --- a/vendor/sabre/vobject/lib/Parser/MimeDir.php +++ b/vendor/sabre/vobject/lib/Parser/MimeDir.php @@ -7,7 +7,6 @@ use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VCard; use Sabre\VObject\Document; use Sabre\VObject\EofException; -use Sabre\VObject\Node; use Sabre\VObject\ParseException; /** @@ -23,8 +22,8 @@ use Sabre\VObject\ParseException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class MimeDir extends Parser -{ +class MimeDir extends Parser { + /** * The input stream. * @@ -71,12 +70,12 @@ class MimeDir extends Parser * used. * * @param string|resource|null $input - * @param int $options + * @param int $options * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + $this->root = null; if (!is_null($input)) { @@ -90,6 +89,7 @@ class MimeDir extends Parser $this->parseDocument(); return $this->root; + } /** @@ -104,21 +104,24 @@ class MimeDir extends Parser * * @param string $charset */ - public function setCharset($charset) - { + function setCharset($charset) { + if (!in_array($charset, self::$SUPPORTED_CHARSETS)) { - throw new \InvalidArgumentException('Unsupported encoding. (Supported encodings: '.implode(', ', self::$SUPPORTED_CHARSETS).')'); + throw new \InvalidArgumentException('Unsupported encoding. (Supported encodings: ' . implode(', ', self::$SUPPORTED_CHARSETS) . ')'); } $this->charset = $charset; + } /** * Sets the input buffer. Must be a string or stream. * * @param resource|string $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + // Resetting the parser $this->lineIndex = 0; $this->startLine = 0; @@ -134,53 +137,59 @@ class MimeDir extends Parser } else { throw new \InvalidArgumentException('This parser can only read from strings or streams.'); } + } /** * Parses an entire document. + * + * @return void */ - protected function parseDocument() - { + protected function parseDocument() { + $line = $this->readLine(); // BOM is ZERO WIDTH NO-BREAK SPACE (U+FEFF). // It's 0xEF 0xBB 0xBF in UTF-8 hex. if (3 <= strlen($line) - && 0xef === ord($line[0]) - && 0xbb === ord($line[1]) - && 0xbf === ord($line[2])) { + && ord($line[0]) === 0xef + && ord($line[1]) === 0xbb + && ord($line[2]) === 0xbf) { $line = substr($line, 3); } switch (strtoupper($line)) { - case 'BEGIN:VCALENDAR': + case 'BEGIN:VCALENDAR' : $class = VCalendar::$componentMap['VCALENDAR']; break; - case 'BEGIN:VCARD': + case 'BEGIN:VCARD' : $class = VCard::$componentMap['VCARD']; break; - default: + default : throw new ParseException('This parser only supports VCARD and VCALENDAR files'); } $this->root = new $class([], false); while (true) { + // Reading until we hit END: $line = $this->readLine(); - if ('END:' === strtoupper(substr($line, 0, 4))) { + if (strtoupper(substr($line, 0, 4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $this->root->add($result); } + } $name = strtoupper(substr($line, 4)); if ($name !== $this->root->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:'.$this->root->name.'" got: "END:'.$name.'"'); + throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); } + } /** @@ -191,40 +200,46 @@ class MimeDir extends Parser * * @return Node */ - protected function parseLine($line) - { + protected function parseLine($line) { + // Start of a new component - if ('BEGIN:' === strtoupper(substr($line, 0, 6))) { + if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { + $component = $this->root->createComponent(substr($line, 6), [], false); while (true) { + // Reading until we hit END: $line = $this->readLine(); - if ('END:' === strtoupper(substr($line, 0, 4))) { + if (strtoupper(substr($line, 0, 4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $component->add($result); } + } $name = strtoupper(substr($line, 4)); if ($name !== $component->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:'.$component->name.'" got: "END:'.$name.'"'); + throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); } return $component; + } else { + // Property reader $property = $this->readProperty($line); if (!$property) { // Ignored line return false; } - return $property; + } + } /** @@ -233,7 +248,7 @@ class MimeDir extends Parser * * If that was not the case, we store it here. * - * @var string|null + * @var null|string */ protected $lineBuffer; @@ -266,8 +281,8 @@ class MimeDir extends Parser * * @return string */ - protected function readLine() - { + protected function readLine() { + if (!\is_null($this->lineBuffer)) { $rawLine = $this->lineBuffer; $this->lineBuffer = null; @@ -277,15 +292,15 @@ class MimeDir extends Parser $rawLine = \fgets($this->input); - if ($eof || (\feof($this->input) && false === $rawLine)) { + if ($eof || (\feof($this->input) && $rawLine === false)) { throw new EofException('End of document reached prematurely'); } - if (false === $rawLine) { + if ($rawLine === false) { throw new ParseException('Error reading from input stream'); } $rawLine = \rtrim($rawLine, "\r\n"); - } while ('' === $rawLine); // Skipping empty lines - ++$this->lineIndex; + } while ($rawLine === ''); // Skipping empty lines + $this->lineIndex++; } $line = $rawLine; @@ -293,30 +308,34 @@ class MimeDir extends Parser // Looking ahead for folded lines. while (true) { + $nextLine = \rtrim(\fgets($this->input), "\r\n"); - ++$this->lineIndex; + $this->lineIndex++; if (!$nextLine) { break; } - if ("\t" === $nextLine[0] || ' ' === $nextLine[0]) { + if ($nextLine[0] === "\t" || $nextLine[0] === " ") { $curLine = \substr($nextLine, 1); $line .= $curLine; - $rawLine .= "\n ".$curLine; + $rawLine .= "\n " . $curLine; } else { $this->lineBuffer = $nextLine; break; } + } $this->rawLine = $rawLine; - return $line; + } /** * Reads a property or component from a line. + * + * @return void */ - protected function readProperty($line) - { + protected function readProperty($line) { + if ($this->options & self::OPTION_FORGIVING) { $propNameToken = 'A-Z0-9\-\._\\/'; } else { @@ -341,17 +360,17 @@ class MimeDir extends Parser /xi"; //echo $regex, "\n"; die(); - preg_match_all($regex, $line, $matches, PREG_SET_ORDER); + preg_match_all($regex, $line, $matches, PREG_SET_ORDER); $property = [ - 'name' => null, + 'name' => null, 'parameters' => [], - 'value' => null, + 'value' => null ]; $lastParam = null; - /* + /** * Looping through all the tokens. * * Note that we are looping through them in reverse order, because if a @@ -359,8 +378,9 @@ class MimeDir extends Parser * in the result. */ foreach ($matches as $match) { + if (isset($match['paramValue'])) { - if ($match['paramValue'] && '"' === $match['paramValue'][0]) { + if ($match['paramValue'] && $match['paramValue'][0] === '"') { $value = substr($match['paramValue'], 1, -1); } else { $value = $match['paramValue']; @@ -369,7 +389,7 @@ class MimeDir extends Parser $value = $this->unescapeParam($value); if (is_null($lastParam)) { - throw new ParseException('Invalid Mimedir file. Line starting at '.$this->startLine.' did not follow iCalendar/vCard conventions'); + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); } if (is_null($property['parameters'][$lastParam])) { $property['parameters'][$lastParam] = $value; @@ -378,7 +398,7 @@ class MimeDir extends Parser } else { $property['parameters'][$lastParam] = [ $property['parameters'][$lastParam], - $value, + $value ]; } continue; @@ -402,6 +422,7 @@ class MimeDir extends Parser // @codeCoverageIgnoreStart throw new \LogicException('This code should not be reachable'); // @codeCoverageIgnoreEnd + } if (is_null($property['value'])) { @@ -411,11 +432,11 @@ class MimeDir extends Parser if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { return false; } - throw new ParseException('Invalid Mimedir file. Line starting at '.$this->startLine.' did not follow iCalendar/vCard conventions'); + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); } // vCard 2.1 states that parameters may appear without a name, and only - // a value. We can deduce the value based on its name. + // a value. We can deduce the value based on it's name. // // Our parser will get those as parameters without a value instead, so // we're filtering these parameters out first. @@ -436,30 +457,31 @@ class MimeDir extends Parser $propObj->add(null, $namelessParameter); } - if ('QUOTED-PRINTABLE' === strtoupper($propObj['ENCODING'])) { + if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); } else { $charset = $this->charset; - if (Document::VCARD21 === $this->root->getDocumentType() && isset($propObj['CHARSET'])) { + if ($this->root->getDocumentType() === Document::VCARD21 && isset($propObj['CHARSET'])) { // vCard 2.1 allows the character set to be specified per property. - $charset = (string) $propObj['CHARSET']; + $charset = (string)$propObj['CHARSET']; } switch (strtolower($charset)) { - case 'utf-8': + case 'utf-8' : break; - case 'iso-8859-1': + case 'iso-8859-1' : $property['value'] = utf8_encode($property['value']); break; - case 'windows-1252': + case 'windows-1252' : $property['value'] = mb_convert_encoding($property['value'], 'UTF-8', $charset); break; - default: - throw new ParseException('Unsupported CHARSET: '.$propObj['CHARSET']); + default : + throw new ParseException('Unsupported CHARSET: ' . $propObj['CHARSET']); } $propObj->setRawMimeDirValue($property['value']); } return $propObj; + } /** @@ -524,11 +546,11 @@ class MimeDir extends Parser * * @return string|string[] */ - public static function unescapeValue($input, $delimiter = ';') - { + static function unescapeValue($input, $delimiter = ';') { + $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; if ($delimiter) { - $regex .= ' | ('.$delimiter.')'; + $regex .= ' | (' . $delimiter . ')'; } $regex .= ') #x'; @@ -538,33 +560,36 @@ class MimeDir extends Parser $result = ''; foreach ($matches as $match) { + switch ($match) { - case '\\\\': + case '\\\\' : $result .= '\\'; break; - case '\N': - case '\n': + case '\N' : + case '\n' : $result .= "\n"; break; - case '\;': + case '\;' : $result .= ';'; break; - case '\,': + case '\,' : $result .= ','; break; - case $delimiter: + case $delimiter : $resultArray[] = $result; $result = ''; break; - default: + default : $result .= $match; break; + } + } $resultArray[] = $result; - return $delimiter ? $resultArray : $result; + } /** @@ -598,19 +623,21 @@ class MimeDir extends Parser * * " is encoded as ^' * * @param string $input + * + * @return void */ - private function unescapeParam($input) - { + private function unescapeParam($input) { + return preg_replace_callback( '#(\^(\^|n|\'))#', - function ($matches) { + function($matches) { switch ($matches[2]) { - case 'n': + case 'n' : return "\n"; - case '^': + case '^' : return '^'; - case '\'': + case '\'' : return '"'; // @codeCoverageIgnoreStart @@ -631,8 +658,8 @@ class MimeDir extends Parser * * @return string */ - private function extractQuotedPrintableValue() - { + private function extractQuotedPrintableValue() { + // We need to parse the raw line again to get the start of the value. // // We are basically looking for the first colon (:), but we need to @@ -655,14 +682,16 @@ class MimeDir extends Parser // missing a whitespace. So if 'forgiving' is turned on, we will take // those as well. if ($this->options & self::OPTION_FORGIVING) { - while ('=' === substr($value, -1)) { + while (substr($value, -1) === '=') { // Reading the line $this->readLine(); // Grabbing the raw form - $value .= "\n".$this->rawLine; + $value .= "\n" . $this->rawLine; } } return $value; + } + } diff --git a/vendor/sabre/vobject/lib/Parser/Parser.php b/vendor/sabre/vobject/lib/Parser/Parser.php index b7b611430..ca8bc0add 100644 --- a/vendor/sabre/vobject/lib/Parser/Parser.php +++ b/vendor/sabre/vobject/lib/Parser/Parser.php @@ -11,8 +11,8 @@ namespace Sabre\VObject\Parser; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -abstract class Parser -{ +abstract class Parser { + /** * Turning on this option makes the parser more forgiving. * @@ -41,10 +41,12 @@ abstract class Parser * Optionally, it's possible to parse the input stream here. * * @param mixed $input - * @param int $options any parser options (OPTION constants) + * @param int $options Any parser options (OPTION constants). + * + * @return void */ - public function __construct($input = null, $options = 0) - { + function __construct($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -60,16 +62,19 @@ abstract class Parser * If either input or options are not supplied, the defaults will be used. * * @param mixed $input - * @param int $options + * @param int $options * * @return array */ - abstract public function parse($input = null, $options = 0); + abstract function parse($input = null, $options = 0); /** * Sets the input data. * * @param mixed $input + * + * @return void */ - abstract public function setInput($input); + abstract function setInput($input); + } diff --git a/vendor/sabre/vobject/lib/Parser/XML.php b/vendor/sabre/vobject/lib/Parser/XML.php index 90f262d9e..5ac423984 100644 --- a/vendor/sabre/vobject/lib/Parser/XML.php +++ b/vendor/sabre/vobject/lib/Parser/XML.php @@ -18,8 +18,8 @@ use Sabre\Xml as SabreXml; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class XML extends Parser -{ +class XML extends Parser { + const XCAL_NAMESPACE = 'urn:ietf:params:xml:ns:icalendar-2.0'; const XCARD_NAMESPACE = 'urn:ietf:params:xml:ns:vcard-4.0'; @@ -40,7 +40,7 @@ class XML extends Parser /** * Document, root component. * - * @var \Sabre\VObject\Document + * @var Sabre\VObject\Document */ protected $root; @@ -50,29 +50,32 @@ class XML extends Parser * Optionally, it's possible to parse the input stream here. * * @param mixed $input - * @param int $options any parser options (OPTION constants) + * @param int $options Any parser options (OPTION constants). + * + * @return void */ - public function __construct($input = null, $options = 0) - { + function __construct($input = null, $options = 0) { + if (0 === $options) { $options = parent::OPTION_FORGIVING; } parent::__construct($input, $options); + } /** * Parse xCal or xCard. * * @param resource|string $input - * @param int $options + * @param int $options * * @throws \Exception * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -86,25 +89,29 @@ class XML extends Parser } switch ($this->input['name']) { - case '{'.self::XCAL_NAMESPACE.'}icalendar': + + case '{' . self::XCAL_NAMESPACE . '}icalendar': $this->root = new VCalendar([], false); $this->pointer = &$this->input['value'][0]; $this->parseVCalendarComponents($this->root); break; - case '{'.self::XCARD_NAMESPACE.'}vcards': + case '{' . self::XCARD_NAMESPACE . '}vcards': foreach ($this->input['value'] as &$vCard) { + $this->root = new VCard(['version' => '4.0'], false); $this->pointer = &$vCard; $this->parseVCardComponents($this->root); // We just parse the first <vcard /> element. break; + } break; default: throw new ParseException('Unsupported XML standard'); + } return $this->root; @@ -114,11 +121,15 @@ class XML extends Parser * Parse a xCalendar component. * * @param Component $parentComponent + * + * @return void */ - protected function parseVCalendarComponents(Component $parentComponent) - { + protected function parseVCalendarComponents(Component $parentComponent) { + foreach ($this->pointer['value'] ?: [] as $children) { + switch (static::getTagName($children['name'])) { + case 'properties': $this->pointer = &$children['value']; $this->parseProperties($parentComponent); @@ -130,28 +141,35 @@ class XML extends Parser break; } } + } /** * Parse a xCard component. * * @param Component $parentComponent + * + * @return void */ - protected function parseVCardComponents(Component $parentComponent) - { + protected function parseVCardComponents(Component $parentComponent) { + $this->pointer = &$this->pointer['value']; $this->parseProperties($parentComponent); + } /** * Parse xCalendar and xCard properties. * * @param Component $parentComponent - * @param string $propertyNamePrefix + * @param string $propertyNamePrefix + * + * @return void */ - protected function parseProperties(Component $parentComponent, $propertyNamePrefix = '') - { + protected function parseProperties(Component $parentComponent, $propertyNamePrefix = '') { + foreach ($this->pointer ?: [] as $xmlProperty) { + list($namespace, $tagName) = SabreXml\Service::parseClarkNotation($xmlProperty['name']); $propertyName = $tagName; @@ -160,16 +178,17 @@ class XML extends Parser $propertyType = 'text'; // A property which is not part of the standard. - if (self::XCAL_NAMESPACE !== $namespace - && self::XCARD_NAMESPACE !== $namespace) { + if ($namespace !== self::XCAL_NAMESPACE + && $namespace !== self::XCARD_NAMESPACE) { + $propertyName = 'xml'; - $value = '<'.$tagName.' xmlns="'.$namespace.'"'; + $value = '<' . $tagName . ' xmlns="' . $namespace . '"'; foreach ($xmlProperty['attributes'] as $attributeName => $attributeValue) { - $value .= ' '.$attributeName.'="'.str_replace('"', '\"', $attributeValue).'"'; + $value .= ' ' . $attributeName . '="' . str_replace('"', '\"', $attributeValue) . '"'; } - $value .= '>'.$xmlProperty['value'].'</'.$tagName.'>'; + $value .= '>' . $xmlProperty['value'] . '</' . $tagName . '>'; $propertyValue = [$value]; @@ -185,7 +204,8 @@ class XML extends Parser } // xCard group. - if ('group' === $propertyName) { + if ($propertyName === 'group') { + if (!isset($xmlProperty['attributes']['name'])) { continue; } @@ -193,22 +213,24 @@ class XML extends Parser $this->pointer = &$xmlProperty['value']; $this->parseProperties( $parentComponent, - strtoupper($xmlProperty['attributes']['name']).'.' + strtoupper($xmlProperty['attributes']['name']) . '.' ); continue; + } // Collect parameters. foreach ($xmlProperty['value'] as $i => $xmlPropertyChild) { + if (!is_array($xmlPropertyChild) - || 'parameters' !== static::getTagName($xmlPropertyChild['name'])) { + || 'parameters' !== static::getTagName($xmlPropertyChild['name'])) continue; - } $xmlParameters = $xmlPropertyChild['value']; foreach ($xmlParameters as $xmlParameter) { + $propertyParameterValues = []; foreach ($xmlParameter['value'] as $xmlParameterValues) { @@ -217,16 +239,19 @@ class XML extends Parser $propertyParameters[static::getTagName($xmlParameter['name'])] = implode(',', $propertyParameterValues); + } array_splice($xmlProperty['value'], $i, 1); + } $propertyNameExtended = ($this->root instanceof VCalendar ? 'xcal' - : 'xcard').':'.$propertyName; + : 'xcard') . ':' . $propertyName; switch ($propertyNameExtended) { + case 'xcal:geo': $propertyType = 'float'; $propertyValue['latitude'] = 0; @@ -252,7 +277,6 @@ class XML extends Parser // We don't break because we only want to set // another property type. - // no break case 'xcal:categories': case 'xcal:resources': case 'xcal:exdate': @@ -266,12 +290,16 @@ class XML extends Parser $propertyType = 'date-time'; foreach ($xmlProperty['value'] as $specialChild) { + $tagName = static::getTagName($specialChild['name']); if ('period' === $tagName) { + $propertyParameters['value'] = 'PERIOD'; $propertyValue[] = implode('/', $specialChild['value']); - } else { + + } + else { $propertyValue[] = $specialChild['value']; } } @@ -292,24 +320,29 @@ class XML extends Parser $this->createProperty( $parentComponent, - $propertyNamePrefix.$propertyName, + $propertyNamePrefix . $propertyName, $propertyParameters, $propertyType, $propertyValue ); + } + } /** * Parse a component. * * @param Component $parentComponent + * + * @return void */ - protected function parseComponent(Component $parentComponent) - { + protected function parseComponent(Component $parentComponent) { + $components = $this->pointer['value'] ?: []; foreach ($components as $component) { + $componentName = static::getTagName($component['name']); $currentComponent = $this->root->createComponent( $componentName, @@ -321,20 +354,24 @@ class XML extends Parser $this->parseVCalendarComponents($currentComponent); $parentComponent->add($currentComponent); + } + } /** * Create a property. * * @param Component $parentComponent - * @param string $name - * @param array $parameters - * @param string $type - * @param mixed $value + * @param string $name + * @param array $parameters + * @param string $type + * @param mixed $value + * + * @return void */ - protected function createProperty(Component $parentComponent, $name, $parameters, $type, $value) - { + protected function createProperty(Component $parentComponent, $name, $parameters, $type, $value) { + $property = $this->root->createProperty( $name, null, @@ -343,30 +380,36 @@ class XML extends Parser ); $parentComponent->add($property); $property->setXmlValue($value); + } /** * Sets the input data. * * @param resource|string $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + if (is_resource($input)) { $input = stream_get_contents($input); } if (is_string($input)) { + $reader = new SabreXml\Reader(); - $reader->elementMap['{'.self::XCAL_NAMESPACE.'}period'] + $reader->elementMap['{' . self::XCAL_NAMESPACE . '}period'] = 'Sabre\VObject\Parser\XML\Element\KeyValue'; - $reader->elementMap['{'.self::XCAL_NAMESPACE.'}recur'] + $reader->elementMap['{' . self::XCAL_NAMESPACE . '}recur'] = 'Sabre\VObject\Parser\XML\Element\KeyValue'; $reader->xml($input); $input = $reader->parse(); + } $this->input = $input; + } /** @@ -376,10 +419,10 @@ class XML extends Parser * * @return string */ - protected static function getTagName($clarkedTagName) - { - list(, $tagName) = SabreXml\Service::parseClarkNotation($clarkedTagName); + protected static function getTagName($clarkedTagName) { + list(, $tagName) = SabreXml\Service::parseClarkNotation($clarkedTagName); return $tagName; + } } diff --git a/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php b/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php index e26540036..14d798433 100644 --- a/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php +++ b/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php @@ -13,8 +13,8 @@ use Sabre\Xml as SabreXml; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class KeyValue extends SabreXml\Element\KeyValue -{ +class KeyValue extends SabreXml\Element\KeyValue { + /** * The deserialize method is called during xml parsing. * @@ -37,12 +37,11 @@ class KeyValue extends SabreXml\Element\KeyValue * * @return mixed */ - public static function xmlDeserialize(SabreXml\Reader $reader) - { + static function xmlDeserialize(SabreXml\Reader $reader) { + // If there's no children, we don't do anything. if ($reader->isEmptyElement) { $reader->next(); - return []; } @@ -50,16 +49,22 @@ class KeyValue extends SabreXml\Element\KeyValue $reader->read(); do { - if (SabreXml\Reader::ELEMENT === $reader->nodeType) { + + if ($reader->nodeType === SabreXml\Reader::ELEMENT) { + $name = $reader->localName; $values[$name] = $reader->parseCurrentElement()['value']; + } else { $reader->read(); } - } while (SabreXml\Reader::END_ELEMENT !== $reader->nodeType); + + } while ($reader->nodeType !== SabreXml\Reader::END_ELEMENT); $reader->read(); return $values; + } + } diff --git a/vendor/sabre/vobject/lib/Property.php b/vendor/sabre/vobject/lib/Property.php index 6105cb0f0..3d1775fa2 100644 --- a/vendor/sabre/vobject/lib/Property.php +++ b/vendor/sabre/vobject/lib/Property.php @@ -14,8 +14,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -abstract class Property extends Node -{ +abstract class Property extends Node { + /** * Property name. * @@ -61,14 +61,16 @@ abstract class Property extends Node * * Parameters must be specified in key=>value syntax. * - * @param Component $root The root document - * @param string $name + * @param Component $root The root document + * @param string $name * @param string|array|null $value - * @param array $parameters List of parameters - * @param string $group The vcard property group + * @param array $parameters List of parameters + * @param string $group The vcard property group + * + * @return void */ - public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) - { + function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) { + $this->name = $name; $this->group = $group; @@ -81,6 +83,7 @@ abstract class Property extends Node if (!is_null($value)) { $this->setValue($value); } + } /** @@ -89,10 +92,13 @@ abstract class Property extends Node * This may be either a single, or multiple strings in an array. * * @param string|array $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + $this->value = $value; + } /** @@ -106,12 +112,12 @@ abstract class Property extends Node * * @return string */ - public function getValue() - { + function getValue() { + if (is_array($this->value)) { - if (0 == count($this->value)) { + if (count($this->value) == 0) { return; - } elseif (1 === count($this->value)) { + } elseif (count($this->value) === 1) { return $this->value[0]; } else { return $this->getRawMimeDirValue(); @@ -119,16 +125,20 @@ abstract class Property extends Node } else { return $this->value; } + } /** * Sets a multi-valued property. * * @param array $parts + * + * @return void */ - public function setParts(array $parts) - { + function setParts(array $parts) { + $this->value = $parts; + } /** @@ -139,8 +149,8 @@ abstract class Property extends Node * * @return array */ - public function getParts() - { + function getParts() { + if (is_null($this->value)) { return []; } elseif (is_array($this->value)) { @@ -148,6 +158,7 @@ abstract class Property extends Node } else { return [$this->value]; } + } /** @@ -155,22 +166,22 @@ abstract class Property extends Node * * If a parameter with same name already existed, the values will be * combined. - * If nameless parameter is added, we try to guess its name. + * If nameless parameter is added, we try to guess it's name. * - * @param string $name - * @param string|array|null $value + * @param string $name + * @param string|null|array $value */ - public function add($name, $value = null) - { + function add($name, $value = null) { $noName = false; - if (null === $name) { + if ($name === null) { $name = Parameter::guessParameterNameByValue($value); $noName = true; } if (isset($this->parameters[strtoupper($name)])) { $this->parameters[strtoupper($name)]->addValue($value); - } else { + } + else { $param = new Parameter($this->root, $name, $value); $param->noName = $noName; $this->parameters[$param->name] = $param; @@ -182,9 +193,10 @@ abstract class Property extends Node * * @return array */ - public function parameters() - { + function parameters() { + return $this->parameters; + } /** @@ -195,7 +207,7 @@ abstract class Property extends Node * * @return string */ - abstract public function getValueType(); + abstract function getValueType(); /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. @@ -204,33 +216,35 @@ abstract class Property extends Node * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - abstract public function setRawMimeDirValue($val); + abstract function setRawMimeDirValue($val); /** * Returns a raw mime-dir representation of the value. * * @return string */ - abstract public function getRawMimeDirValue(); + abstract function getRawMimeDirValue(); /** * Turns the object back into a serialized blob. * * @return string */ - public function serialize() - { + function serialize() { + $str = $this->name; - if ($this->group) { - $str = $this->group.'.'.$this->name; - } + if ($this->group) $str = $this->group . '.' . $this->name; foreach ($this->parameters() as $param) { - $str .= ';'.$param->serialize(); + + $str .= ';' . $param->serialize(); + } - $str .= ':'.$this->getRawMimeDirValue(); + $str .= ':' . $this->getRawMimeDirValue(); $str = \preg_replace( '/( @@ -244,6 +258,7 @@ abstract class Property extends Node // remove single space after last CRLF return \substr($str, 0, -1); + } /** @@ -253,9 +268,10 @@ abstract class Property extends Node * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + return $this->getParts(); + } /** @@ -264,14 +280,17 @@ abstract class Property extends Node * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { - if (1 === count($value)) { + function setJsonValue(array $value) { + + if (count($value) === 1) { $this->setValue(reset($value)); } else { $this->setValue($value); } + } /** @@ -280,12 +299,12 @@ abstract class Property extends Node * * @return array */ - public function jsonSerialize() - { + function jsonSerialize() { + $parameters = []; foreach ($this->parameters as $parameter) { - if ('VALUE' === $parameter->name) { + if ($parameter->name === 'VALUE') { continue; } $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize(); @@ -299,7 +318,7 @@ abstract class Property extends Node return array_merge( [ strtolower($this->name), - (object) $parameters, + (object)$parameters, strtolower($this->getValueType()), ], $this->getJsonValue() @@ -311,63 +330,78 @@ abstract class Property extends Node * object. * * @param array $value + * + * @return void */ - public function setXmlValue(array $value) - { + function setXmlValue(array $value) { + $this->setJsonValue($value); + } /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - public function xmlSerialize(Xml\Writer $writer) - { + function xmlSerialize(Xml\Writer $writer) { + $parameters = []; foreach ($this->parameters as $parameter) { - if ('VALUE' === $parameter->name) { + + if ($parameter->name === 'VALUE') { continue; } $parameters[] = $parameter; + } $writer->startElement(strtolower($this->name)); if (!empty($parameters)) { + $writer->startElement('parameters'); foreach ($parameters as $parameter) { + $writer->startElement(strtolower($parameter->name)); $writer->write($parameter); $writer->endElement(); + } $writer->endElement(); + } $this->xmlSerializeValue($writer); $writer->endElement(); + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + $valueType = strtolower($this->getValueType()); foreach ($this->getJsonValue() as $values) { - foreach ((array) $values as $value) { + foreach ((array)$values as $value) { $writer->writeElement($valueType, $value); } } + } /** @@ -379,9 +413,10 @@ abstract class Property extends Node * * @return string */ - public function __toString() - { - return (string) $this->getValue(); + function __toString() { + + return (string)$this->getValue(); + } /* ArrayAccess interface {{{ */ @@ -393,21 +428,17 @@ abstract class Property extends Node * * @return bool */ - public function offsetExists($name) - { - if (is_int($name)) { - return parent::offsetExists($name); - } + function offsetExists($name) { + + if (is_int($name)) return parent::offsetExists($name); $name = strtoupper($name); foreach ($this->parameters as $parameter) { - if ($parameter->name == $name) { - return true; - } + if ($parameter->name == $name) return true; } - return false; + } /** @@ -419,11 +450,9 @@ abstract class Property extends Node * * @return Node */ - public function offsetGet($name) - { - if (is_int($name)) { - return parent::offsetGet($name); - } + function offsetGet($name) { + + if (is_int($name)) return parent::offsetGet($name); $name = strtoupper($name); if (!isset($this->parameters[$name])) { @@ -431,16 +460,19 @@ abstract class Property extends Node } return $this->parameters[$name]; + } /** * Creates a new parameter. * * @param string $name - * @param mixed $value + * @param mixed $value + * + * @return void */ - public function offsetSet($name, $value) - { + function offsetSet($name, $value) { + if (is_int($name)) { parent::offsetSet($name, $value); // @codeCoverageIgnoreStart @@ -452,15 +484,18 @@ abstract class Property extends Node $param = new Parameter($this->root, $name, $value); $this->parameters[$param->name] = $param; + } /** * Removes one or more parameters with the specified name. * * @param string $name + * + * @return void */ - public function offsetUnset($name) - { + function offsetUnset($name) { + if (is_int($name)) { parent::offsetUnset($name); // @codeCoverageIgnoreStart @@ -471,20 +506,23 @@ abstract class Property extends Node } unset($this->parameters[strtoupper($name)]); - } + } /* }}} */ /** * This method is automatically called when the object is cloned. * Specifically, this will ensure all child elements are also cloned. + * + * @return void */ - public function __clone() - { + function __clone() { + foreach ($this->parameters as $key => $child) { $this->parameters[$key] = clone $child; $this->parameters[$key]->parent = $this; } + } /** @@ -505,12 +543,13 @@ abstract class Property extends Node * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $warnings = []; // Checking if our value is UTF-8 if (!StringUtil::isUTF8($this->getRawMimeDirValue())) { + $oldValue = $this->getRawMimeDirValue(); $level = 3; if ($options & self::REPAIR) { @@ -519,27 +558,29 @@ abstract class Property extends Node $this->setRawMimeDirValue($newValue); $level = 1; } + } + if (preg_match('%([\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', $oldValue, $matches)) { - $message = 'Property contained a control character (0x'.bin2hex($matches[1]).')'; + $message = 'Property contained a control character (0x' . bin2hex($matches[1]) . ')'; } else { - $message = 'Property is not valid UTF-8! '.$oldValue; + $message = 'Property is not valid UTF-8! ' . $oldValue; } $warnings[] = [ - 'level' => $level, + 'level' => $level, 'message' => $message, - 'node' => $this, + 'node' => $this, ]; } // Checking if the propertyname does not contain any invalid bytes. if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { $warnings[] = [ - 'level' => $options & self::REPAIR ? 1 : 3, - 'message' => 'The propertyname: '.$this->name.' contains invalid characters. Only A-Z, 0-9 and - are allowed', - 'node' => $this, + 'level' => $options & self::REPAIR ? 1 : 3, + 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', + 'node' => $this, ]; if ($options & self::REPAIR) { // Uppercasing and converting underscores to dashes. @@ -548,52 +589,46 @@ abstract class Property extends Node ); // Removing every other invalid character $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); + } + } if ($encoding = $this->offsetGet('ENCODING')) { - if (Document::VCARD40 === $this->root->getDocumentType()) { + + if ($this->root->getDocumentType() === Document::VCARD40) { $warnings[] = [ - 'level' => 3, + 'level' => 3, 'message' => 'ENCODING parameter is not valid in vCard 4.', - 'node' => $this, + 'node' => $this ]; } else { - $encoding = (string) $encoding; + + $encoding = (string)$encoding; $allowedEncoding = []; switch ($this->root->getDocumentType()) { - case Document::ICALENDAR20: + case Document::ICALENDAR20 : $allowedEncoding = ['8BIT', 'BASE64']; break; - case Document::VCARD21: + case Document::VCARD21 : $allowedEncoding = ['QUOTED-PRINTABLE', 'BASE64', '8BIT']; break; - case Document::VCARD30: + case Document::VCARD30 : $allowedEncoding = ['B']; - //Repair vCard30 that use BASE64 encoding - if ($options & self::REPAIR) { - if ('BASE64' === strtoupper($encoding)) { - $encoding = 'B'; - $this['ENCODING'] = $encoding; - $warnings[] = [ - 'level' => 1, - 'message' => 'ENCODING=BASE64 has been transformed to ENCODING=B.', - 'node' => $this, - ]; - } - } break; + } if ($allowedEncoding && !in_array(strtoupper($encoding), $allowedEncoding)) { $warnings[] = [ - 'level' => 3, - 'message' => 'ENCODING='.strtoupper($encoding).' is not valid for this document type.', - 'node' => $this, + 'level' => 3, + 'message' => 'ENCODING=' . strtoupper($encoding) . ' is not valid for this document type.', + 'node' => $this ]; } } + } // Validating inner parameters @@ -602,6 +637,7 @@ abstract class Property extends Node } return $warnings; + } /** @@ -609,13 +645,17 @@ abstract class Property extends Node * * It's intended to remove all circular references, so PHP can easily clean * it up. + * + * @return void */ - public function destroy() - { + function destroy() { + parent::destroy(); foreach ($this->parameters as $param) { $param->destroy(); } $this->parameters = []; + } + } diff --git a/vendor/sabre/vobject/lib/Property/Binary.php b/vendor/sabre/vobject/lib/Property/Binary.php index 830dd9028..d54cae25d 100644 --- a/vendor/sabre/vobject/lib/Property/Binary.php +++ b/vendor/sabre/vobject/lib/Property/Binary.php @@ -18,8 +18,8 @@ use Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Binary extends Property -{ +class Binary extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -34,18 +34,25 @@ class Binary extends Property * This may be either a single, or multiple strings in an array. * * @param string|array $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + if (is_array($value)) { - if (1 === count($value)) { + + if (count($value) === 1) { $this->value = $value[0]; } else { throw new \InvalidArgumentException('The argument must either be a string or an array with only one child'); } + } else { + $this->value = $value; + } + } /** @@ -55,10 +62,13 @@ class Binary extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->value = base64_decode($val); + } /** @@ -66,9 +76,10 @@ class Binary extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return base64_encode($this->value); + } /** @@ -79,9 +90,10 @@ class Binary extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'BINARY'; + } /** @@ -91,9 +103,10 @@ class Binary extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + return [base64_encode($this->getValue())]; + } /** @@ -102,10 +115,14 @@ class Binary extends Property * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { + function setJsonValue(array $value) { + $value = array_map('base64_decode', $value); parent::setJsonValue($value); + } + } diff --git a/vendor/sabre/vobject/lib/Property/Boolean.php b/vendor/sabre/vobject/lib/Property/Boolean.php index 1b219bb8c..6f5887e25 100644 --- a/vendor/sabre/vobject/lib/Property/Boolean.php +++ b/vendor/sabre/vobject/lib/Property/Boolean.php @@ -17,8 +17,8 @@ use * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Boolean extends Property -{ +class Boolean extends Property { + /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * @@ -26,11 +26,14 @@ class Boolean extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { - $val = 'TRUE' === strtoupper($val) ? true : false; + function setRawMimeDirValue($val) { + + $val = strtoupper($val) === 'TRUE' ? true : false; $this->setValue($val); + } /** @@ -38,9 +41,10 @@ class Boolean extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return $this->value ? 'TRUE' : 'FALSE'; + } /** @@ -51,9 +55,10 @@ class Boolean extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'BOOLEAN'; + } /** @@ -61,15 +66,19 @@ class Boolean extends Property * object. * * @param array $value + * + * @return void */ - public function setXmlValue(array $value) - { + function setXmlValue(array $value) { + $value = array_map( - function ($value) { + function($value) { return 'true' === $value; }, $value ); parent::setXmlValue($value); + } + } diff --git a/vendor/sabre/vobject/lib/Property/FlatText.php b/vendor/sabre/vobject/lib/Property/FlatText.php index d15cfe051..2c7b43c29 100644 --- a/vendor/sabre/vobject/lib/Property/FlatText.php +++ b/vendor/sabre/vobject/lib/Property/FlatText.php @@ -22,8 +22,8 @@ namespace Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class FlatText extends Text -{ +class FlatText extends Text { + /** * Field separator. * @@ -37,10 +37,14 @@ class FlatText extends Text * Overriding this so we're not splitting on a ; delimiter. * * @param string $val + * + * @return void */ - public function setQuotedPrintableValue($val) - { + function setQuotedPrintableValue($val) { + $val = quoted_printable_decode($val); $this->setValue($val); + } + } diff --git a/vendor/sabre/vobject/lib/Property/FloatValue.php b/vendor/sabre/vobject/lib/Property/FloatValue.php index 208d74516..15b119549 100644 --- a/vendor/sabre/vobject/lib/Property/FloatValue.php +++ b/vendor/sabre/vobject/lib/Property/FloatValue.php @@ -15,8 +15,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class FloatValue extends Property -{ +class FloatValue extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -32,14 +32,17 @@ class FloatValue extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $val = explode($this->delimiter, $val); foreach ($val as &$item) { - $item = (float) $item; + $item = (float)$item; } $this->setParts($val); + } /** @@ -47,12 +50,13 @@ class FloatValue extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return implode( $this->delimiter, $this->getParts() ); + } /** @@ -63,9 +67,10 @@ class FloatValue extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'FLOAT'; + } /** @@ -75,19 +80,20 @@ class FloatValue extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $val = array_map('floatval', $this->getParts()); // Special-casing the GEO property. // // See: // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2 - if ('GEO' === $this->name) { + if ($this->name === 'GEO') { return [$val]; } return $val; + } /** @@ -95,32 +101,42 @@ class FloatValue extends Property * object. * * @param array $value + * + * @return void */ - public function setXmlValue(array $value) - { + function setXmlValue(array $value) { + $value = array_map('floatval', $value); parent::setXmlValue($value); + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + // Special-casing the GEO property. // // See: // http://tools.ietf.org/html/rfc6321#section-3.4.1.2 - if ('GEO' === $this->name) { + if ($this->name === 'GEO') { + $value = array_map('floatval', $this->getParts()); $writer->writeElement('latitude', $value[0]); $writer->writeElement('longitude', $value[1]); - } else { + + } + else { parent::xmlSerializeValue($writer); } + } + } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php b/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php index e89bb31f9..a0c4a9b9a 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php @@ -14,8 +14,8 @@ use * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class CalAddress extends Text -{ +class CalAddress extends Text { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -32,9 +32,10 @@ class CalAddress extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'CAL-ADDRESS'; + } /** @@ -47,14 +48,14 @@ class CalAddress extends Text * * @return string */ - public function getNormalizedValue() - { + function getNormalizedValue() { + $input = $this->getValue(); if (!strpos($input, ':')) { return $input; } list($schema, $everythingElse) = explode(':', $input, 2); + return strtolower($schema) . ':' . $everythingElse; - return strtolower($schema).':'.$everythingElse; } } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Date.php b/vendor/sabre/vobject/lib/Property/ICalendar/Date.php index d8e86d13e..378a0d60a 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/Date.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/Date.php @@ -13,6 +13,6 @@ namespace Sabre\VObject\Property\ICalendar; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Date extends DateTime -{ +class Date extends DateTime { + } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php b/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php index 7eb3e0bb7..d580d4f68 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php @@ -24,8 +24,8 @@ use Sabre\VObject\TimeZoneUtil; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class DateTime extends Property -{ +class DateTime extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -40,14 +40,17 @@ class DateTime extends Property * You may also specify DateTime objects here. * * @param array $parts + * + * @return void */ - public function setParts(array $parts) - { + function setParts(array $parts) { + if (isset($parts[0]) && $parts[0] instanceof DateTimeInterface) { $this->setDateTimes($parts); } else { parent::setParts($parts); } + } /** @@ -58,9 +61,11 @@ class DateTime extends Property * Instead of strings, you may also use DateTime here. * * @param string|array|DateTimeInterface $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + if (is_array($value) && isset($value[0]) && $value[0] instanceof DateTimeInterface) { $this->setDateTimes($value); } elseif ($value instanceof DateTimeInterface) { @@ -68,6 +73,7 @@ class DateTime extends Property } else { parent::setValue($value); } + } /** @@ -77,10 +83,13 @@ class DateTime extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue(explode($this->delimiter, $val)); + } /** @@ -88,9 +97,10 @@ class DateTime extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return implode($this->delimiter, $this->getParts()); + } /** @@ -98,9 +108,10 @@ class DateTime extends Property * * @return bool */ - public function hasTime() - { - return 'DATE' !== strtoupper((string) $this['VALUE']); + function hasTime() { + + return strtoupper((string)$this['VALUE']) !== 'DATE'; + } /** @@ -108,14 +119,15 @@ class DateTime extends Property * * Note that DATE is always floating. */ - public function isFloating() - { + function isFloating() { + return !$this->hasTime() || ( !isset($this['TZID']) && - false === strpos($this->getValue(), 'Z') + strpos($this->getValue(), 'Z') === false ); + } /** @@ -131,16 +143,15 @@ class DateTime extends Property * * @param DateTimeZone $timeZone * - * @return \DateTimeImmutable + * @return DateTimeImmutable */ - public function getDateTime(DateTimeZone $timeZone = null) - { + function getDateTime(DateTimeZone $timeZone = null) { + $dt = $this->getDateTimes($timeZone); - if (!$dt) { - return; - } + if (!$dt) return; return $dt[0]; + } /** @@ -152,35 +163,38 @@ class DateTime extends Property * * @param DateTimeZone $timeZone * - * @return \DateTimeImmutable[] + * @return DateTimeImmutable[] * @return \DateTime[] */ - public function getDateTimes(DateTimeZone $timeZone = null) - { + function getDateTimes(DateTimeZone $timeZone = null) { + // Does the property have a TZID? $tzid = $this['TZID']; if ($tzid) { - $timeZone = TimeZoneUtil::getTimeZone((string) $tzid, $this->root); + $timeZone = TimeZoneUtil::getTimeZone((string)$tzid, $this->root); } $dts = []; foreach ($this->getParts() as $part) { $dts[] = DateTimeParser::parse($part, $timeZone); } - return $dts; + } /** * Sets the property as a DateTime object. * * @param DateTimeInterface $dt - * @param bool isFloating If set to true, timezones will be ignored + * @param bool isFloating If set to true, timezones will be ignored. + * + * @return void */ - public function setDateTime(DateTimeInterface $dt, $isFloating = false) - { + function setDateTime(DateTimeInterface $dt, $isFloating = false) { + $this->setDateTimes([$dt], $isFloating); + } /** @@ -190,17 +204,21 @@ class DateTime extends Property * the otehr values will be adjusted for that timezone * * @param DateTimeInterface[] $dt - * @param bool isFloating If set to true, timezones will be ignored + * @param bool isFloating If set to true, timezones will be ignored. + * + * @return void */ - public function setDateTimes(array $dt, $isFloating = false) - { + function setDateTimes(array $dt, $isFloating = false) { + $values = []; if ($this->hasTime()) { + $tz = null; $isUtc = false; foreach ($dt as $d) { + if ($isFloating) { $values[] = $d->format('Ymd\\THis'); continue; @@ -220,18 +238,25 @@ class DateTime extends Property } else { $values[] = $d->format('Ymd\\THis'); } + } if ($isUtc || $isFloating) { $this->offsetUnset('TZID'); } + } else { + foreach ($dt as $d) { + $values[] = $d->format('Ymd'); + } $this->offsetUnset('TZID'); + } $this->value = $values; + } /** @@ -242,9 +267,10 @@ class DateTime extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return $this->hasTime() ? 'DATE-TIME' : 'DATE'; + } /** @@ -254,8 +280,8 @@ class DateTime extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $dts = $this->getDateTimes(); $hasTime = $this->hasTime(); $isFloating = $this->isFloating(); @@ -264,15 +290,18 @@ class DateTime extends Property $isUtc = $isFloating ? false : in_array($tz->getName(), ['UTC', 'GMT', 'Z']); return array_map( - function (DateTimeInterface $dt) use ($hasTime, $isUtc) { + function(DateTimeInterface $dt) use ($hasTime, $isUtc) { + if ($hasTime) { - return $dt->format('Y-m-d\\TH:i:s').($isUtc ? 'Z' : ''); + return $dt->format('Y-m-d\\TH:i:s') . ($isUtc ? 'Z' : ''); } else { return $dt->format('Y-m-d'); } + }, $dts ); + } /** @@ -281,21 +310,26 @@ class DateTime extends Property * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { + function setJsonValue(array $value) { + // dates and times in jCal have one difference to dates and times in // iCalendar. In jCal date-parts are separated by dashes, and // time-parts are separated by colons. It makes sense to just remove // those. $this->setValue( array_map( - function ($item) { + function($item) { + return strtr($item, [':' => '', '-' => '']); + }, $value ) ); + } /** @@ -303,17 +337,20 @@ class DateTime extends Property * VALUE from DATE-TIME to DATE or vice-versa. * * @param string $name - * @param mixed $value + * @param mixed $value + * + * @return void */ - public function offsetSet($name, $value) - { + function offsetSet($name, $value) { + parent::offsetSet($name, $value); - if ('VALUE' !== strtoupper($name)) { + if (strtoupper($name) !== 'VALUE') { return; } // This will ensure that dates are correctly encoded. $this->setDateTimes($this->getDateTimes()); + } /** @@ -338,30 +375,30 @@ class DateTime extends Property * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $messages = parent::validate($options); $valueType = $this->getValueType(); $values = $this->getParts(); try { foreach ($values as $value) { switch ($valueType) { - case 'DATE': + case 'DATE' : DateTimeParser::parseDate($value); break; - case 'DATE-TIME': + case 'DATE-TIME' : DateTimeParser::parseDateTime($value); break; } } } catch (InvalidDataException $e) { $messages[] = [ - 'level' => 3, - 'message' => 'The supplied value ('.$value.') is not a correct '.$valueType, - 'node' => $this, + 'level' => 3, + 'message' => 'The supplied value (' . $value . ') is not a correct ' . $valueType, + 'node' => $this, ]; } - return $messages; + } } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php index 87f008160..7b7e1ce8e 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php @@ -16,8 +16,8 @@ use Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Duration extends Property -{ +class Duration extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -33,10 +33,13 @@ class Duration extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue(explode($this->delimiter, $val)); + } /** @@ -44,9 +47,10 @@ class Duration extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return implode($this->delimiter, $this->getParts()); + } /** @@ -57,9 +61,10 @@ class Duration extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'DURATION'; + } /** @@ -69,11 +74,12 @@ class Duration extends Property * * @return \DateInterval */ - public function getDateInterval() - { + function getDateInterval() { + $parts = $this->getParts(); $value = $parts[0]; - return DateTimeParser::parseDuration($value); + } + } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Period.php b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php index 17bfa5c5c..d35b425aa 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/Period.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php @@ -17,8 +17,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Period extends Property -{ +class Period extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -34,10 +34,13 @@ class Period extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue(explode($this->delimiter, $val)); + } /** @@ -45,9 +48,10 @@ class Period extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return implode($this->delimiter, $this->getParts()); + } /** @@ -58,9 +62,10 @@ class Period extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'PERIOD'; + } /** @@ -69,16 +74,21 @@ class Period extends Property * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { + function setJsonValue(array $value) { + $value = array_map( - function ($item) { + function($item) { + return strtr(implode('/', $item), [':' => '', '-' => '']); + }, $value ); parent::setJsonValue($value); + } /** @@ -88,19 +98,20 @@ class Period extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $return = []; foreach ($this->getParts() as $item) { + list($start, $end) = explode('/', $item, 2); $start = DateTimeParser::parseDateTime($start); // This is a duration value. - if ('P' === $end[0]) { + if ($end[0] === 'P') { $return[] = [ $start->format('Y-m-d\\TH:i:s'), - $end, + $end ]; } else { $end = DateTimeParser::parseDateTime($end); @@ -109,29 +120,36 @@ class Period extends Property $end->format('Y-m-d\\TH:i:s'), ]; } + } return $return; + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + $writer->startElement(strtolower($this->getValueType())); $value = $this->getJsonValue(); $writer->writeElement('start', $value[0][0]); - if ('P' === $value[0][1][0]) { + if ($value[0][1][0] === 'P') { $writer->writeElement('duration', $value[0][1]); - } else { + } + else { $writer->writeElement('end', $value[0][1]); } $writer->endElement(); + } + } diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php index baeda781e..434b77088 100644 --- a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php +++ b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php @@ -22,33 +22,36 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Recur extends Property -{ +class Recur extends Property { + /** * Updates the current value. * * This may be either a single, or multiple strings in an array. * * @param string|array $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + // If we're getting the data from json, we'll be receiving an object if ($value instanceof \StdClass) { - $value = (array) $value; + $value = (array)$value; } if (is_array($value)) { $newVal = []; foreach ($value as $k => $v) { + if (is_string($v)) { $v = strtoupper($v); // The value had multiple sub-values - if (false !== strpos($v, ',')) { + if (strpos($v, ',') !== false) { $v = explode(',', $v); } - if (0 === strcmp($k, 'until')) { + if (strcmp($k, 'until') === 0) { $v = strtr($v, [':' => '', '-' => '']); } } elseif (is_array($v)) { @@ -63,6 +66,7 @@ class Recur extends Property } else { throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); } + } /** @@ -76,24 +80,26 @@ class Recur extends Property * * @return string */ - public function getValue() - { + function getValue() { + $out = []; foreach ($this->value as $key => $value) { - $out[] = $key.'='.(is_array($value) ? implode(',', $value) : $value); + $out[] = $key . '=' . (is_array($value) ? implode(',', $value) : $value); } - return strtoupper(implode(';', $out)); + } /** * Sets a multi-valued property. * * @param array $parts + * @return void */ - public function setParts(array $parts) - { + function setParts(array $parts) { + $this->setValue($parts); + } /** @@ -104,9 +110,10 @@ class Recur extends Property * * @return array */ - public function getParts() - { + function getParts() { + return $this->value; + } /** @@ -116,10 +123,13 @@ class Recur extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue($val); + } /** @@ -127,9 +137,10 @@ class Recur extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return $this->getValue(); + } /** @@ -140,9 +151,10 @@ class Recur extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'RECUR'; + } /** @@ -152,36 +164,39 @@ class Recur extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $values = []; foreach ($this->getParts() as $k => $v) { - if (0 === strcmp($k, 'UNTIL')) { + if (strcmp($k, 'UNTIL') === 0) { $date = new DateTime($this->root, null, $v); $values[strtolower($k)] = $date->getJsonValue()[0]; - } elseif (0 === strcmp($k, 'COUNT')) { + } elseif (strcmp($k, 'COUNT') === 0) { $values[strtolower($k)] = intval($v); } else { $values[strtolower($k)] = $v; } } - return [$values]; + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + $valueType = strtolower($this->getValueType()); foreach ($this->getJsonValue() as $value) { $writer->writeElement($valueType, $value); } + } /** @@ -191,11 +206,12 @@ class Recur extends Property * * @return array */ - public static function stringToArray($value) - { + static function stringToArray($value) { + $value = strtoupper($value); $newValue = []; foreach (explode(';', $value) as $part) { + // Skipping empty parts. if (empty($part)) { continue; @@ -203,10 +219,11 @@ class Recur extends Property list($partName, $partValue) = explode('=', $part); // The value itself had multiple values.. - if (false !== strpos($partValue, ',')) { + if (strpos($partValue, ',') !== false) { $partValue = explode(',', $partValue); } $newValue[$partName] = $partValue; + } return $newValue; @@ -234,31 +251,32 @@ class Recur extends Property * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $repair = ($options & self::REPAIR); $warnings = parent::validate($options); $values = $this->getParts(); foreach ($values as $key => $value) { - if ('' === $value) { + + if ($value === '') { $warnings[] = [ - 'level' => $repair ? 1 : 3, - 'message' => 'Invalid value for '.$key.' in '.$this->name, - 'node' => $this, + 'level' => $repair ? 1 : 3, + 'message' => 'Invalid value for ' . $key . ' in ' . $this->name, + 'node' => $this ]; if ($repair) { unset($values[$key]); } - } elseif ('BYMONTH' == $key) { - $byMonth = (array) $value; + } elseif ($key == 'BYMONTH') { + $byMonth = (array)$value; foreach ($byMonth as $i => $v) { - if (!is_numeric($v) || (int) $v < 1 || (int) $v > 12) { + if (!is_numeric($v) || (int)$v < 1 || (int)$v > 12) { $warnings[] = [ - 'level' => $repair ? 1 : 3, + 'level' => $repair ? 1 : 3, 'message' => 'BYMONTH in RRULE must have value(s) between 1 and 12!', - 'node' => $this, + 'node' => $this ]; if ($repair) { if (is_array($value)) { @@ -273,14 +291,14 @@ class Recur extends Property if (is_array($value) && empty($values[$key])) { unset($values[$key]); } - } elseif ('BYWEEKNO' == $key) { - $byWeekNo = (array) $value; + } elseif ($key == 'BYWEEKNO') { + $byWeekNo = (array)$value; foreach ($byWeekNo as $i => $v) { - if (!is_numeric($v) || (int) $v < -53 || 0 == (int) $v || (int) $v > 53) { + if (!is_numeric($v) || (int)$v < -53 || (int)$v == 0 || (int)$v > 53) { $warnings[] = [ - 'level' => $repair ? 1 : 3, + 'level' => $repair ? 1 : 3, 'message' => 'BYWEEKNO in RRULE must have value(s) from -53 to -1, or 1 to 53!', - 'node' => $this, + 'node' => $this ]; if ($repair) { if (is_array($value)) { @@ -295,14 +313,14 @@ class Recur extends Property if (is_array($value) && empty($values[$key])) { unset($values[$key]); } - } elseif ('BYYEARDAY' == $key) { - $byYearDay = (array) $value; + } elseif ($key == 'BYYEARDAY') { + $byYearDay = (array)$value; foreach ($byYearDay as $i => $v) { - if (!is_numeric($v) || (int) $v < -366 || 0 == (int) $v || (int) $v > 366) { + if (!is_numeric($v) || (int)$v < -366 || (int)$v == 0 || (int)$v > 366) { $warnings[] = [ - 'level' => $repair ? 1 : 3, + 'level' => $repair ? 1 : 3, 'message' => 'BYYEARDAY in RRULE must have value(s) from -366 to -1, or 1 to 366!', - 'node' => $this, + 'node' => $this ]; if ($repair) { if (is_array($value)) { @@ -318,12 +336,13 @@ class Recur extends Property unset($values[$key]); } } + } if (!isset($values['FREQ'])) { $warnings[] = [ - 'level' => $repair ? 1 : 3, - 'message' => 'FREQ is required in '.$this->name, - 'node' => $this, + 'level' => $repair ? 1 : 3, + 'message' => 'FREQ is required in ' . $this->name, + 'node' => $this ]; if ($repair) { $this->parent->remove($this); @@ -334,5 +353,7 @@ class Recur extends Property } return $warnings; + } + } diff --git a/vendor/sabre/vobject/lib/Property/IntegerValue.php b/vendor/sabre/vobject/lib/Property/IntegerValue.php index ddd71d731..5bd1887fa 100644 --- a/vendor/sabre/vobject/lib/Property/IntegerValue.php +++ b/vendor/sabre/vobject/lib/Property/IntegerValue.php @@ -15,8 +15,8 @@ use * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class IntegerValue extends Property -{ +class IntegerValue extends Property { + /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * @@ -24,10 +24,13 @@ class IntegerValue extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { - $this->setValue((int) $val); + function setRawMimeDirValue($val) { + + $this->setValue((int)$val); + } /** @@ -35,9 +38,10 @@ class IntegerValue extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return $this->value; + } /** @@ -48,9 +52,10 @@ class IntegerValue extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'INTEGER'; + } /** @@ -60,9 +65,10 @@ class IntegerValue extends Property * * @return array */ - public function getJsonValue() - { - return [(int) $this->getValue()]; + function getJsonValue() { + + return [(int)$this->getValue()]; + } /** @@ -70,10 +76,13 @@ class IntegerValue extends Property * object. * * @param array $value + * + * @return void */ - public function setXmlValue(array $value) - { + function setXmlValue(array $value) { + $value = array_map('intval', $value); parent::setXmlValue($value); + } } diff --git a/vendor/sabre/vobject/lib/Property/Text.php b/vendor/sabre/vobject/lib/Property/Text.php index 23c945551..47a86ccc9 100644 --- a/vendor/sabre/vobject/lib/Property/Text.php +++ b/vendor/sabre/vobject/lib/Property/Text.php @@ -17,8 +17,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Text extends Property -{ +class Text extends Property { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -53,7 +53,7 @@ class Text extends Property * @var array */ protected $minimumPropertyValues = [ - 'N' => 5, + 'N' => 5, 'ADR' => 7, ]; @@ -64,14 +64,16 @@ class Text extends Property * parameters will automatically be created, or you can just pass a list of * Parameter objects. * - * @param Component $root The root document - * @param string $name + * @param Component $root The root document + * @param string $name * @param string|array|null $value - * @param array $parameters List of parameters - * @param string $group The vcard property group + * @param array $parameters List of parameters + * @param string $group The vcard property group + * + * @return void */ - public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) - { + function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) { + // There's two types of multi-valued text properties: // 1. multivalue properties. // 2. structured value properties @@ -82,6 +84,7 @@ class Text extends Property } parent::__construct($root, $name, $value, $parameters, $group); + } /** @@ -91,19 +94,24 @@ class Text extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue(MimeDir::unescapeValue($val, $this->delimiter)); + } /** * Sets the value as a quoted-printable encoded string. * * @param string $val + * + * @return void */ - public function setQuotedPrintableValue($val) - { + function setQuotedPrintableValue($val) { + $val = quoted_printable_decode($val); // Quoted printable only appears in vCard 2.1, and the only character @@ -115,6 +123,7 @@ class Text extends Property $regex = '# (?<!\\\\) ; #x'; $matches = preg_split($regex, $val); $this->setValue($matches); + } /** @@ -122,8 +131,8 @@ class Text extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + $val = $this->getParts(); if (isset($this->minimumPropertyValues[$this->name])) { @@ -131,6 +140,7 @@ class Text extends Property } foreach ($val as &$item) { + if (!is_array($item)) { $item = [$item]; } @@ -140,17 +150,19 @@ class Text extends Property $subItem, [ '\\' => '\\\\', - ';' => '\;', - ',' => '\,', + ';' => '\;', + ',' => '\,', "\n" => '\n', - "\r" => '', + "\r" => "", ] ); } $item = implode(',', $item); + } return implode($this->delimiter, $val); + } /** @@ -160,16 +172,16 @@ class Text extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + // Structured text values should always be returned as a single // array-item. Multi-value text should be returned as multiple items in // the top-array. if (in_array($this->name, $this->structuredValues)) { return [$this->getParts()]; } - return $this->getParts(); + } /** @@ -180,9 +192,10 @@ class Text extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'TEXT'; + } /** @@ -190,10 +203,10 @@ class Text extends Property * * @return string */ - public function serialize() - { + function serialize() { + // We need to kick in a special type of encoding, if it's a 2.1 vcard. - if (Document::VCARD21 !== $this->root->getDocumentType()) { + if ($this->root->getDocumentType() !== Document::VCARD21) { return parent::serialize(); } @@ -215,19 +228,22 @@ class Text extends Property } $str = $this->name; - if ($this->group) { - $str = $this->group.'.'.$this->name; - } + if ($this->group) $str = $this->group . '.' . $this->name; foreach ($this->parameters as $param) { - if ('QUOTED-PRINTABLE' === $param->getValue()) { + + if ($param->getValue() === 'QUOTED-PRINTABLE') { continue; } - $str .= ';'.$param->serialize(); + $str .= ';' . $param->serialize(); + } + + // If the resulting value contains a \n, we must encode it as // quoted-printable. - if (false !== \strpos($val, "\n")) { + if (\strpos($val, "\n") !== false) { + $str .= ';ENCODING=QUOTED-PRINTABLE:'; $lastLine = $str; $out = null; @@ -236,27 +252,26 @@ class Text extends Property // encode newlines for us. Specifically, the \r\n sequence must in // vcards be encoded as =0D=OA and we must insert soft-newlines // every 75 bytes. - for ($ii = 0; $ii < \strlen($val); ++$ii) { + for ($ii = 0;$ii < \strlen($val);$ii++) { $ord = \ord($val[$ii]); // These characters are encoded as themselves. if ($ord >= 32 && $ord <= 126) { $lastLine .= $val[$ii]; } else { - $lastLine .= '='.\strtoupper(\bin2hex($val[$ii])); + $lastLine .= '=' . \strtoupper(\bin2hex($val[$ii])); } if (\strlen($lastLine) >= 75) { // Soft line break - $out .= $lastLine."=\r\n "; + $out .= $lastLine . "=\r\n "; $lastLine = null; } - } - if (!\is_null($lastLine)) { - $out .= $lastLine."\r\n"; - } + } + if (!\is_null($lastLine)) $out .= $lastLine . "\r\n"; return $out; + } else { - $str .= ':'.$val; + $str .= ':' . $val; $str = \preg_replace( '/( @@ -270,20 +285,24 @@ class Text extends Property // remove single space after last CRLF return \substr($str, 0, -1); + } + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + $values = $this->getParts(); - $map = function ($items) use ($values, $writer) { + $map = function($items) use ($values, $writer) { foreach ($items as $i => $item) { $writer->writeElement( $item, @@ -293,6 +312,7 @@ class Text extends Property }; switch ($this->name) { + // Special-casing the REQUEST-STATUS property. // // See: @@ -312,14 +332,14 @@ class Text extends Property 'given', 'additional', 'prefix', - 'suffix', + 'suffix' ]); break; case 'GENDER': $map([ 'sex', - 'text', + 'text' ]); break; @@ -331,20 +351,21 @@ class Text extends Property 'locality', 'region', 'code', - 'country', + 'country' ]); break; case 'CLIENTPIDMAP': $map([ 'sourceid', - 'uri', + 'uri' ]); break; default: parent::xmlSerializeValue($writer); } + } /** @@ -365,26 +386,28 @@ class Text extends Property * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $warnings = parent::validate($options); if (isset($this->minimumPropertyValues[$this->name])) { + $minimum = $this->minimumPropertyValues[$this->name]; $parts = $this->getParts(); if (count($parts) < $minimum) { $warnings[] = [ - 'level' => $options & self::REPAIR ? 1 : 3, - 'message' => 'The '.$this->name.' property must have at least '.$minimum.' values. It only has '.count($parts), - 'node' => $this, + 'level' => $options & self::REPAIR ? 1 : 3, + 'message' => 'The ' . $this->name . ' property must have at least ' . $minimum . ' values. It only has ' . count($parts), + 'node' => $this, ]; if ($options & self::REPAIR) { $parts = array_pad($parts, $minimum, ''); $this->setParts($parts); } } - } + } return $warnings; + } } diff --git a/vendor/sabre/vobject/lib/Property/Time.php b/vendor/sabre/vobject/lib/Property/Time.php index 7aeafc8d0..dbafc3b85 100644 --- a/vendor/sabre/vobject/lib/Property/Time.php +++ b/vendor/sabre/vobject/lib/Property/Time.php @@ -13,8 +13,8 @@ use Sabre\VObject\DateTimeParser; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Time extends Text -{ +class Time extends Text { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -31,9 +31,10 @@ class Time extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'TIME'; + } /** @@ -42,9 +43,11 @@ class Time extends Text * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { + function setJsonValue(array $value) { + // Removing colons from value. $value = str_replace( ':', @@ -52,11 +55,12 @@ class Time extends Text $value ); - if (1 === count($value)) { + if (count($value) === 1) { $this->setValue(reset($value)); } else { $this->setValue($value); } + } /** @@ -66,8 +70,8 @@ class Time extends Text * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $parts = DateTimeParser::parseVCardTime($this->getValue()); $timeStr = ''; @@ -105,7 +109,7 @@ class Time extends Text // Timezone if (!is_null($parts['timezone'])) { - if ('Z' === $parts['timezone']) { + if ($parts['timezone'] === 'Z') { $timeStr .= 'Z'; } else { $timeStr .= @@ -114,6 +118,7 @@ class Time extends Text } return [$timeStr]; + } /** @@ -121,15 +126,19 @@ class Time extends Text * object. * * @param array $value + * + * @return void */ - public function setXmlValue(array $value) - { + function setXmlValue(array $value) { + $value = array_map( - function ($value) { + function($value) { return str_replace(':', '', $value); }, $value ); parent::setXmlValue($value); + } + } diff --git a/vendor/sabre/vobject/lib/Property/Unknown.php b/vendor/sabre/vobject/lib/Property/Unknown.php index 6f404c286..7a3373868 100644 --- a/vendor/sabre/vobject/lib/Property/Unknown.php +++ b/vendor/sabre/vobject/lib/Property/Unknown.php @@ -12,8 +12,8 @@ namespace Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Unknown extends Text -{ +class Unknown extends Text { + /** * Returns the value, in the format it should be encoded for json. * @@ -21,9 +21,10 @@ class Unknown extends Text * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + return [$this->getRawMimeDirValue()]; + } /** @@ -34,8 +35,10 @@ class Unknown extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'UNKNOWN'; + } + } diff --git a/vendor/sabre/vobject/lib/Property/Uri.php b/vendor/sabre/vobject/lib/Property/Uri.php index 3449ba1f2..88fcfaab8 100644 --- a/vendor/sabre/vobject/lib/Property/Uri.php +++ b/vendor/sabre/vobject/lib/Property/Uri.php @@ -14,8 +14,8 @@ use Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Uri extends Text -{ +class Uri extends Text { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -32,9 +32,10 @@ class Uri extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'URI'; + } /** @@ -42,8 +43,8 @@ class Uri extends Text * * @return array */ - public function parameters() - { + function parameters() { + $parameters = parent::parameters(); if (!isset($parameters['VALUE']) && in_array($this->name, ['URL', 'PHOTO'])) { // If we are encoding a URI value, and this URI value has no @@ -56,8 +57,8 @@ class Uri extends Text // See Issue #227 and #235 $parameters['VALUE'] = new Parameter($this->root, 'VALUE', 'URI'); } - return $parameters; + } /** @@ -67,9 +68,11 @@ class Uri extends Text * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + // Normally we don't need to do any type of unescaping for these // properties, however.. we've noticed that Google Contacts // specifically escapes the colon (:) with a blackslash. While I have @@ -78,16 +81,16 @@ class Uri extends Text // // Good thing backslashes are not allowed in urls. Makes it easy to // assume that a backslash is always intended as an escape character. - if ('URL' === $this->name) { + if ($this->name === 'URL') { $regex = '# (?: (\\\\ (?: \\\\ | : ) ) ) #x'; $matches = preg_split($regex, $val, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $newVal = ''; foreach ($matches as $match) { switch ($match) { - case '\:': + case '\:' : $newVal .= ':'; break; - default: + default : $newVal .= $match; break; } @@ -96,6 +99,7 @@ class Uri extends Text } else { $this->value = strtr($val, ['\,' => ',']); } + } /** @@ -103,8 +107,8 @@ class Uri extends Text * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + if (is_array($this->value)) { $value = $this->value[0]; } else { @@ -112,5 +116,7 @@ class Uri extends Text } return strtr($value, [',' => '\,']); + } + } diff --git a/vendor/sabre/vobject/lib/Property/UtcOffset.php b/vendor/sabre/vobject/lib/Property/UtcOffset.php index 732239e23..61895c48e 100644 --- a/vendor/sabre/vobject/lib/Property/UtcOffset.php +++ b/vendor/sabre/vobject/lib/Property/UtcOffset.php @@ -11,8 +11,8 @@ namespace Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class UtcOffset extends Text -{ +class UtcOffset extends Text { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -29,9 +29,10 @@ class UtcOffset extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'UTC-OFFSET'; + } /** @@ -40,16 +41,19 @@ class UtcOffset extends Text * The value must always be an array. * * @param array $value + * + * @return void */ - public function setJsonValue(array $value) - { + function setJsonValue(array $value) { + $value = array_map( - function ($value) { + function($value) { return str_replace(':', '', $value); }, $value ); parent::setJsonValue($value); + } /** @@ -59,14 +63,15 @@ class UtcOffset extends Text * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + return array_map( - function ($value) { - return substr($value, 0, -2).':'. + function($value) { + return substr($value, 0, -2) . ':' . substr($value, -2); }, parent::getJsonValue() ); + } } diff --git a/vendor/sabre/vobject/lib/Property/VCard/Date.php b/vendor/sabre/vobject/lib/Property/VCard/Date.php index a018ccbb8..1ef6dff34 100644 --- a/vendor/sabre/vobject/lib/Property/VCard/Date.php +++ b/vendor/sabre/vobject/lib/Property/VCard/Date.php @@ -11,8 +11,8 @@ namespace Sabre\VObject\Property\VCard; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Date extends DateAndOrTime -{ +class Date extends DateAndOrTime { + /** * Returns the type of value. * @@ -21,18 +21,23 @@ class Date extends DateAndOrTime * * @return string */ - public function getValueType() - { + function getValueType() { + return 'DATE'; + } /** * Sets the property as a DateTime object. * * @param \DateTimeInterface $dt + * + * @return void */ - public function setDateTime(\DateTimeInterface $dt) - { + function setDateTime(\DateTimeInterface $dt) { + $this->value = $dt->format('Ymd'); + } + } diff --git a/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php index b7e17492a..3b4ae3bb5 100644 --- a/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php +++ b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php @@ -19,12 +19,12 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class DateAndOrTime extends Property -{ +class DateAndOrTime extends Property { + /** * Field separator. * - * @var string|null + * @var null|string */ public $delimiter = null; @@ -36,9 +36,10 @@ class DateAndOrTime extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'DATE-AND-OR-TIME'; + } /** @@ -47,9 +48,11 @@ class DateAndOrTime extends Property * You may also specify DateTimeInterface objects here. * * @param array $parts + * + * @return void */ - public function setParts(array $parts) - { + function setParts(array $parts) { + if (count($parts) > 1) { throw new \InvalidArgumentException('Only one value allowed'); } @@ -58,6 +61,7 @@ class DateAndOrTime extends Property } else { parent::setParts($parts); } + } /** @@ -68,23 +72,28 @@ class DateAndOrTime extends Property * Instead of strings, you may also use DateTimeInterface here. * * @param string|array|DateTimeInterface $value + * + * @return void */ - public function setValue($value) - { + function setValue($value) { + if ($value instanceof DateTimeInterface) { $this->setDateTime($value); } else { parent::setValue($value); } + } /** * Sets the property as a DateTime object. * * @param DateTimeInterface $dt + * + * @return void */ - public function setDateTime(DateTimeInterface $dt) - { + function setDateTime(DateTimeInterface $dt) { + $tz = $dt->getTimeZone(); $isUtc = in_array($tz->getName(), ['UTC', 'GMT', 'Z']); @@ -96,6 +105,7 @@ class DateAndOrTime extends Property } $this->value = $value; + } /** @@ -114,12 +124,12 @@ class DateAndOrTime extends Property * * @return DateTimeImmutable */ - public function getDateTime() - { + function getDateTime() { + $now = new DateTime(); - $tzFormat = 0 === $now->getTimezone()->getOffset($now) ? '\\Z' : 'O'; - $nowParts = DateTimeParser::parseVCardDateTime($now->format('Ymd\\This'.$tzFormat)); + $tzFormat = $now->getTimezone()->getOffset($now) === 0 ? '\\Z' : 'O'; + $nowParts = DateTimeParser::parseVCardDateTime($now->format('Ymd\\This' . $tzFormat)); $dateParts = DateTimeParser::parseVCardDateTime($this->getValue()); @@ -131,8 +141,8 @@ class DateAndOrTime extends Property $dateParts[$k] = $nowParts[$k]; } } - return new DateTimeImmutable("$dateParts[year]-$dateParts[month]-$dateParts[date] $dateParts[hour]:$dateParts[minute]:$dateParts[second] $dateParts[timezone]"); + } /** @@ -142,14 +152,15 @@ class DateAndOrTime extends Property * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $parts = DateTimeParser::parseVCardDateTime($this->getValue()); $dateStr = ''; // Year if (!is_null($parts['year'])) { + $dateStr .= $parts['year']; if (!is_null($parts['month'])) { @@ -157,21 +168,26 @@ class DateAndOrTime extends Property // dash. $dateStr .= '-'; } + } else { + if (!is_null($parts['month']) || !is_null($parts['date'])) { // Inserting two dashes $dateStr .= '--'; } + } // Month if (!is_null($parts['month'])) { + $dateStr .= $parts['month']; if (isset($parts['date'])) { // If month and date are set, we need the separator dash. $dateStr .= '-'; } + } elseif (isset($parts['date'])) { // If the month is empty, and a date is set, we need a 'empty // dash' @@ -183,6 +199,7 @@ class DateAndOrTime extends Property $dateStr .= $parts['date']; } + // Early exit if we don't have a time string. if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) { return [$dateStr]; @@ -192,11 +209,13 @@ class DateAndOrTime extends Property // Hour if (!is_null($parts['hour'])) { + $dateStr .= $parts['hour']; if (!is_null($parts['minute'])) { $dateStr .= ':'; } + } else { // We know either minute or second _must_ be set, so we insert a // dash for an empty value. @@ -205,11 +224,13 @@ class DateAndOrTime extends Property // Minute if (!is_null($parts['minute'])) { + $dateStr .= $parts['minute']; if (!is_null($parts['second'])) { $dateStr .= ':'; } + } elseif (isset($parts['second'])) { // Dash for empty minute $dateStr .= '-'; @@ -226,27 +247,30 @@ class DateAndOrTime extends Property } return [$dateStr]; + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + $valueType = strtolower($this->getValueType()); $parts = DateTimeParser::parseVCardDateAndOrTime($this->getValue()); $value = ''; // $d = defined - $d = function ($part) use ($parts) { + $d = function($part) use ($parts) { return !is_null($parts[$part]); }; // $r = read - $r = function ($part) use ($parts) { + $r = function($part) use ($parts) { return $parts[$part]; }; @@ -258,29 +282,31 @@ class DateAndOrTime extends Property // } if (($d('year') || $d('month') || $d('date')) && (!$d('hour') && !$d('minute') && !$d('second') && !$d('timezone'))) { + if ($d('year') && $d('month') && $d('date')) { - $value .= $r('year').$r('month').$r('date'); + $value .= $r('year') . $r('month') . $r('date'); } elseif ($d('year') && $d('month') && !$d('date')) { - $value .= $r('year').'-'.$r('month'); + $value .= $r('year') . '-' . $r('month'); } elseif (!$d('year') && $d('month')) { - $value .= '--'.$r('month').$r('date'); + $value .= '--' . $r('month') . $r('date'); } elseif (!$d('year') && !$d('month') && $d('date')) { - $value .= '---'.$r('date'); + $value .= '---' . $r('date'); } - // # 4.3.2 + // # 4.3.2 // value-time = element time { // xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)" // ~ "(Z|[+\-]\d\d(\d\d)?)?" } // } } elseif ((!$d('year') && !$d('month') && !$d('date')) && ($d('hour') || $d('minute') || $d('second'))) { + if ($d('hour')) { - $value .= $r('hour').$r('minute').$r('second'); + $value .= $r('hour') . $r('minute') . $r('second'); } elseif ($d('minute')) { - $value .= '-'.$r('minute').$r('second'); + $value .= '-' . $r('minute') . $r('second'); } elseif ($d('second')) { - $value .= '--'.$r('second'); + $value .= '--' . $r('second'); } $value .= $r('timezone'); @@ -291,19 +317,22 @@ class DateAndOrTime extends Property // ~ "(Z|[+\-]\d\d(\d\d)?)?" } // } } elseif ($d('date') && $d('hour')) { + if ($d('year') && $d('month') && $d('date')) { - $value .= $r('year').$r('month').$r('date'); + $value .= $r('year') . $r('month') . $r('date'); } elseif (!$d('year') && $d('month') && $d('date')) { - $value .= '--'.$r('month').$r('date'); + $value .= '--' . $r('month') . $r('date'); } elseif (!$d('year') && !$d('month') && $d('date')) { - $value .= '---'.$r('date'); + $value .= '---' . $r('date'); } - $value .= 'T'.$r('hour').$r('minute').$r('second'). + $value .= 'T' . $r('hour') . $r('minute') . $r('second') . $r('timezone'); + } $writer->writeElement($valueType, $value); + } /** @@ -313,10 +342,13 @@ class DateAndOrTime extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue($val); + } /** @@ -324,9 +356,10 @@ class DateAndOrTime extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return implode($this->delimiter, $this->getParts()); + } /** @@ -351,8 +384,8 @@ class DateAndOrTime extends Property * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $messages = parent::validate($options); $value = $this->getValue(); @@ -360,12 +393,13 @@ class DateAndOrTime extends Property DateTimeParser::parseVCardDateTime($value); } catch (InvalidDataException $e) { $messages[] = [ - 'level' => 3, - 'message' => 'The supplied value ('.$value.') is not a correct DATE-AND-OR-TIME property', - 'node' => $this, + 'level' => 3, + 'message' => 'The supplied value (' . $value . ') is not a correct DATE-AND-OR-TIME property', + 'node' => $this, ]; } return $messages; + } } diff --git a/vendor/sabre/vobject/lib/Property/VCard/DateTime.php b/vendor/sabre/vobject/lib/Property/VCard/DateTime.php index 49c1f3555..e7c804ca7 100644 --- a/vendor/sabre/vobject/lib/Property/VCard/DateTime.php +++ b/vendor/sabre/vobject/lib/Property/VCard/DateTime.php @@ -11,8 +11,8 @@ namespace Sabre\VObject\Property\VCard; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class DateTime extends DateAndOrTime -{ +class DateTime extends DateAndOrTime { + /** * Returns the type of value. * @@ -21,8 +21,10 @@ class DateTime extends DateAndOrTime * * @return string */ - public function getValueType() - { + function getValueType() { + return 'DATE-TIME'; + } + } diff --git a/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php b/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php index 697273989..aa7e9178d 100644 --- a/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php +++ b/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php @@ -14,8 +14,8 @@ use * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class LanguageTag extends Property -{ +class LanguageTag extends Property { + /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * @@ -23,10 +23,13 @@ class LanguageTag extends Property * not yet done, but parameters are not included. * * @param string $val + * + * @return void */ - public function setRawMimeDirValue($val) - { + function setRawMimeDirValue($val) { + $this->setValue($val); + } /** @@ -34,9 +37,10 @@ class LanguageTag extends Property * * @return string */ - public function getRawMimeDirValue() - { + function getRawMimeDirValue() { + return $this->getValue(); + } /** @@ -47,8 +51,10 @@ class LanguageTag extends Property * * @return string */ - public function getValueType() - { + function getValueType() { + return 'LANGUAGE-TAG'; + } + } diff --git a/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php b/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php index fccf2d600..9d311f99d 100644 --- a/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php +++ b/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php @@ -15,8 +15,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class TimeStamp extends Text -{ +class TimeStamp extends Text { + /** * In case this is a multi-value property. This string will be used as a * delimiter. @@ -33,9 +33,10 @@ class TimeStamp extends Text * * @return string */ - public function getValueType() - { + function getValueType() { + return 'TIMESTAMP'; + } /** @@ -45,16 +46,16 @@ class TimeStamp extends Text * * @return array */ - public function getJsonValue() - { + function getJsonValue() { + $parts = DateTimeParser::parseVCardDateTime($this->getValue()); $dateStr = - $parts['year'].'-'. - $parts['month'].'-'. - $parts['date'].'T'. - $parts['hour'].':'. - $parts['minute'].':'. + $parts['year'] . '-' . + $parts['month'] . '-' . + $parts['date'] . 'T' . + $parts['hour'] . ':' . + $parts['minute'] . ':' . $parts['second']; // Timezone @@ -63,19 +64,23 @@ class TimeStamp extends Text } return [$dateStr]; + } /** * This method serializes only the value of a property. This is used to * create xCard or xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - protected function xmlSerializeValue(Xml\Writer $writer) - { + protected function xmlSerializeValue(Xml\Writer $writer) { + // xCard is the only XML and JSON format that has the same date and time // format than vCard. $valueType = strtolower($this->getValueType()); $writer->writeElement($valueType, $this->getValue()); + } } diff --git a/vendor/sabre/vobject/lib/Reader.php b/vendor/sabre/vobject/lib/Reader.php index 055d546a5..709929337 100644 --- a/vendor/sabre/vobject/lib/Reader.php +++ b/vendor/sabre/vobject/lib/Reader.php @@ -12,8 +12,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Reader -{ +class Reader { + /** * If this option is passed to the reader, it will be less strict about the * validity of the lines. @@ -35,18 +35,18 @@ class Reader * You can either supply a string, or a readable stream for input. * * @param string|resource $data - * @param int $options - * @param string $charset - * + * @param int $options + * @param string $charset * @return Document */ - public static function read($data, $options = 0, $charset = 'UTF-8') - { + static function read($data, $options = 0, $charset = 'UTF-8') { + $parser = new Parser\MimeDir(); $parser->setCharset($charset); $result = $parser->parse($data, $options); return $result; + } /** @@ -55,21 +55,22 @@ class Reader * The options argument is a bitfield. Pass any of the OPTIONS constant to * alter the parsers' behaviour. * - * You can either a string, a readable stream, or an array for its input. + * You can either a string, a readable stream, or an array for it's input. * Specifying the array is useful if json_decode was already called on the * input. * * @param string|resource|array $data - * @param int $options + * @param int $options * * @return Document */ - public static function readJson($data, $options = 0) - { + static function readJson($data, $options = 0) { + $parser = new Parser\Json(); $result = $parser->parse($data, $options); return $result; + } /** @@ -81,15 +82,17 @@ class Reader * You can either supply a string, or a readable stream for input. * * @param string|resource $data - * @param int $options + * @param int $options * * @return Document */ - public static function readXML($data, $options = 0) - { + static function readXML($data, $options = 0) { + $parser = new Parser\XML(); $result = $parser->parse($data, $options); return $result; + } + } diff --git a/vendor/sabre/vobject/lib/Recur/EventIterator.php b/vendor/sabre/vobject/lib/Recur/EventIterator.php index 135ecf00e..d313305a0 100644 --- a/vendor/sabre/vobject/lib/Recur/EventIterator.php +++ b/vendor/sabre/vobject/lib/Recur/EventIterator.php @@ -58,8 +58,8 @@ use Sabre\VObject\Settings; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class EventIterator implements \Iterator -{ +class EventIterator implements \Iterator { + /** * Reference timeZone for floating dates and times. * @@ -89,12 +89,12 @@ class EventIterator implements \Iterator * The $uid parameter is only required for the first method. * * @param Component|array $input - * @param string|null $uid - * @param DateTimeZone $timeZone reference timezone for floating dates and - * times + * @param string|null $uid + * @param DateTimeZone $timeZone Reference timezone for floating dates and + * times. */ - public function __construct($input, $uid = null, DateTimeZone $timeZone = null) - { + function __construct($input, $uid = null, DateTimeZone $timeZone = null) { + if (is_null($timeZone)) { $timeZone = new DateTimeZone('UTC'); } @@ -107,7 +107,7 @@ class EventIterator implements \Iterator $events = [$input]; } else { // Calendar + UID mode. - $uid = (string) $uid; + $uid = (string)$uid; if (!$uid) { throw new InvalidArgumentException('The UID argument is required when a VCALENDAR is passed to this constructor'); } @@ -115,17 +115,24 @@ class EventIterator implements \Iterator throw new InvalidArgumentException('No events found in this calendar'); } $events = $input->getByUID($uid); + } foreach ($events as $vevent) { + if (!isset($vevent->{'RECURRENCE-ID'})) { + $this->masterEvent = $vevent; + } else { + $this->exceptions[ $vevent->{'RECURRENCE-ID'}->getDateTime($this->timeZone)->getTimeStamp() ] = true; $this->overriddenEvents[] = $vevent; + } + } if (!$this->masterEvent) { @@ -136,7 +143,7 @@ class EventIterator implements \Iterator // event and use that instead. This may not always give the // desired result. if (!count($this->overriddenEvents)) { - throw new InvalidArgumentException('This VCALENDAR did not have an event with UID: '.$uid); + throw new InvalidArgumentException('This VCALENDAR did not have an event with UID: ' . $uid); } $this->masterEvent = array_shift($this->overriddenEvents); } @@ -145,11 +152,15 @@ class EventIterator implements \Iterator $this->allDay = !$this->masterEvent->DTSTART->hasTime(); if (isset($this->masterEvent->EXDATE)) { + foreach ($this->masterEvent->EXDATE as $exDate) { + foreach ($exDate->getDateTimes($this->timeZone) as $dt) { $this->exceptions[$dt->getTimeStamp()] = true; } + } + } if (isset($this->masterEvent->DTEND)) { @@ -180,7 +191,7 @@ class EventIterator implements \Iterator } else { $this->recurIterator = new RRuleIterator( [ - 'FREQ' => 'DAILY', + 'FREQ' => 'DAILY', 'COUNT' => 1, ], $this->startDate @@ -191,6 +202,7 @@ class EventIterator implements \Iterator if (!$this->valid()) { throw new NoInstancesException('This recurrence rule does not generate any valid instances'); } + } /** @@ -198,11 +210,12 @@ class EventIterator implements \Iterator * * @return DateTimeImmutable */ - public function current() - { + function current() { + if ($this->currentDate) { return clone $this->currentDate; } + } /** @@ -211,11 +224,12 @@ class EventIterator implements \Iterator * * @return DateTimeImmutable */ - public function getDtStart() - { + function getDtStart() { + if ($this->currentDate) { return clone $this->currentDate; } + } /** @@ -224,26 +238,26 @@ class EventIterator implements \Iterator * * @return DateTimeImmutable */ - public function getDtEnd() - { + function getDtEnd() { + if (!$this->valid()) { return; } $end = clone $this->currentDate; + return $end->modify('+' . $this->eventDuration . ' seconds'); - return $end->modify('+'.$this->eventDuration.' seconds'); } /** * Returns a VEVENT for the current iterations of the event. * - * This VEVENT will have a recurrence id, and its DTSTART and DTEND + * This VEVENT will have a recurrence id, and it's DTSTART and DTEND * altered. * * @return VEvent */ - public function getEventObject() - { + function getEventObject() { + if ($this->currentOverriddenEvent) { return $this->currentOverriddenEvent; } @@ -270,8 +284,8 @@ class EventIterator implements \Iterator $recurid = clone $event->DTSTART; $recurid->name = 'RECURRENCE-ID'; $event->add($recurid); - return $event; + } /** @@ -281,10 +295,11 @@ class EventIterator implements \Iterator * * @return int */ - public function key() - { + function key() { + // The counter is always 1 ahead. return $this->counter - 1; + } /** @@ -293,20 +308,20 @@ class EventIterator implements \Iterator * * @return bool */ - public function valid() - { - if ($this->counter > Settings::$maxRecurrences && -1 !== Settings::$maxRecurrences) { - throw new MaxInstancesExceededException('Recurring events are only allowed to generate '.Settings::$maxRecurrences); + function valid() { + + if ($this->counter > Settings::$maxRecurrences && Settings::$maxRecurrences !== -1) { + throw new MaxInstancesExceededException('Recurring events are only allowed to generate ' . Settings::$maxRecurrences); } + return !!$this->currentDate; - return (bool) $this->currentDate; } /** * Sets the iterator back to the starting point. */ - public function rewind() - { + function rewind() { + $this->recurIterator->rewind(); // re-creating overridden event index. $index = []; @@ -323,15 +338,18 @@ class EventIterator implements \Iterator $this->currentDate = clone $this->startDate; $this->next(); + } /** * Advances the iterator with one step. + * + * @return void */ - public function next() - { + function next() { + $this->currentOverriddenEvent = null; - ++$this->counter; + $this->counter++; if ($this->nextDate) { // We had a stored value. $nextDate = $this->nextDate; @@ -348,11 +366,14 @@ class EventIterator implements \Iterator $nextDate = $this->recurIterator->current(); $this->recurIterator->next(); } while (isset($this->exceptions[$nextDate->getTimeStamp()])); + } + // $nextDate now contains what rrule thinks is the next one, but an // overridden event may cut ahead. if ($this->overriddenEventsIndex) { + $offsets = end($this->overriddenEventsIndex); $timestamp = key($this->overriddenEventsIndex); $offset = end($offsets); @@ -372,10 +393,13 @@ class EventIterator implements \Iterator // Exit point! return; + } + } $this->currentDate = $nextDate; + } /** @@ -383,11 +407,12 @@ class EventIterator implements \Iterator * * @param DateTimeInterface $dateTime */ - public function fastForward(DateTimeInterface $dateTime) - { + function fastForward(DateTimeInterface $dateTime) { + while ($this->valid() && $this->getDtEnd() <= $dateTime) { $this->next(); } + } /** @@ -395,9 +420,10 @@ class EventIterator implements \Iterator * * @return bool */ - public function isInfinite() - { + function isInfinite() { + return $this->recurIterator->isInfinite(); + } /** @@ -478,9 +504,10 @@ class EventIterator implements \Iterator protected $nextDate; /** - * The event that overwrites the current iteration. + * The event that overwrites the current iteration * * @var VEVENT */ protected $currentOverriddenEvent; + } diff --git a/vendor/sabre/vobject/lib/Recur/MaxInstancesExceededException.php b/vendor/sabre/vobject/lib/Recur/MaxInstancesExceededException.php index cb0835813..264df7d2b 100644 --- a/vendor/sabre/vobject/lib/Recur/MaxInstancesExceededException.php +++ b/vendor/sabre/vobject/lib/Recur/MaxInstancesExceededException.php @@ -12,6 +12,5 @@ use Exception; * @author Evert Pot (http://evertpot.com/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -class MaxInstancesExceededException extends Exception -{ +class MaxInstancesExceededException extends Exception { } diff --git a/vendor/sabre/vobject/lib/Recur/NoInstancesException.php b/vendor/sabre/vobject/lib/Recur/NoInstancesException.php index b55af567d..8f8bb472b 100644 --- a/vendor/sabre/vobject/lib/Recur/NoInstancesException.php +++ b/vendor/sabre/vobject/lib/Recur/NoInstancesException.php @@ -13,6 +13,6 @@ use Exception; * @author Evert Pot (http://evertpot.com/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -class NoInstancesException extends Exception -{ +class NoInstancesException extends Exception { + } diff --git a/vendor/sabre/vobject/lib/Recur/RDateIterator.php b/vendor/sabre/vobject/lib/Recur/RDateIterator.php index 013694b95..f44960e12 100644 --- a/vendor/sabre/vobject/lib/Recur/RDateIterator.php +++ b/vendor/sabre/vobject/lib/Recur/RDateIterator.php @@ -19,30 +19,29 @@ use Sabre\VObject\DateTimeParser; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class RDateIterator implements Iterator -{ +class RDateIterator implements Iterator { + /** * Creates the Iterator. * - * @param string|array $rrule + * @param string|array $rrule * @param DateTimeInterface $start */ - public function __construct($rrule, DateTimeInterface $start) - { + function __construct($rrule, DateTimeInterface $start) { + $this->startDate = $start; $this->parseRDate($rrule); $this->currentDate = clone $this->startDate; + } /* Implementation of the Iterator interface {{{ */ - public function current() - { - if (!$this->valid()) { - return; - } + function current() { + if (!$this->valid()) return; return clone $this->currentDate; + } /** @@ -50,9 +49,10 @@ class RDateIterator implements Iterator * * @return int */ - public function key() - { + function key() { + return $this->counter; + } /** @@ -61,35 +61,40 @@ class RDateIterator implements Iterator * * @return bool */ - public function valid() - { - return $this->counter <= count($this->dates); + function valid() { + + return ($this->counter <= count($this->dates)); + } /** * Resets the iterator. + * + * @return void */ - public function rewind() - { + function rewind() { + $this->currentDate = clone $this->startDate; $this->counter = 0; + } /** * Goes on to the next iteration. + * + * @return void */ - public function next() - { - ++$this->counter; - if (!$this->valid()) { - return; - } + function next() { + + $this->counter++; + if (!$this->valid()) return; $this->currentDate = DateTimeParser::parse( $this->dates[$this->counter - 1], $this->startDate->getTimezone() ); + } /* End of Iterator implementation }}} */ @@ -99,9 +104,10 @@ class RDateIterator implements Iterator * * @return bool */ - public function isInfinite() - { + function isInfinite() { + return false; + } /** @@ -109,12 +115,15 @@ class RDateIterator implements Iterator * specified date. * * @param DateTimeInterface $dt + * + * @return void */ - public function fastForward(DateTimeInterface $dt) - { + function fastForward(DateTimeInterface $dt) { + while ($this->valid() && $this->currentDate < $dt) { $this->next(); } + } /** @@ -150,20 +159,24 @@ class RDateIterator implements Iterator * class with all the values. * * @param string|array $rrule + * + * @return void */ - protected function parseRDate($rdate) - { + protected function parseRDate($rdate) { + if (is_string($rdate)) { $rdate = explode(',', $rdate); } $this->dates = $rdate; + } /** - * Array with the RRULE dates. + * Array with the RRULE dates * * @var array */ protected $dates = []; + } diff --git a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php index 554507f19..dbea1155d 100644 --- a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php +++ b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php @@ -22,30 +22,29 @@ use Sabre\VObject\Property; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class RRuleIterator implements Iterator -{ +class RRuleIterator implements Iterator { + /** * Creates the Iterator. * - * @param string|array $rrule + * @param string|array $rrule * @param DateTimeInterface $start */ - public function __construct($rrule, DateTimeInterface $start) - { + function __construct($rrule, DateTimeInterface $start) { + $this->startDate = $start; $this->parseRRule($rrule); $this->currentDate = clone $this->startDate; + } /* Implementation of the Iterator interface {{{ */ - public function current() - { - if (!$this->valid()) { - return; - } + function current() { + if (!$this->valid()) return; return clone $this->currentDate; + } /** @@ -53,9 +52,10 @@ class RRuleIterator implements Iterator * * @return int */ - public function key() - { + function key() { + return $this->counter; + } /** @@ -65,53 +65,61 @@ class RRuleIterator implements Iterator * * @return bool */ - public function valid() - { + function valid() { + if (!is_null($this->count)) { return $this->counter < $this->count; } - return is_null($this->until) || $this->currentDate <= $this->until; + } /** * Resets the iterator. + * + * @return void */ - public function rewind() - { + function rewind() { + $this->currentDate = clone $this->startDate; $this->counter = 0; + } /** * Goes on to the next iteration. + * + * @return void */ - public function next() - { + function next() { + // Otherwise, we find the next event in the normal RRULE // sequence. switch ($this->frequency) { - case 'hourly': + + case 'hourly' : $this->nextHourly(); break; - case 'daily': + case 'daily' : $this->nextDaily(); break; - case 'weekly': + case 'weekly' : $this->nextWeekly(); break; - case 'monthly': + case 'monthly' : $this->nextMonthly(); break; - case 'yearly': + case 'yearly' : $this->nextYearly(); break; + } - ++$this->counter; + $this->counter++; + } /* End of Iterator implementation }}} */ @@ -121,9 +129,10 @@ class RRuleIterator implements Iterator * * @return bool */ - public function isInfinite() - { + function isInfinite() { + return !$this->count && !$this->until; + } /** @@ -131,12 +140,15 @@ class RRuleIterator implements Iterator * specified date. * * @param DateTimeInterface $dt + * + * @return void */ - public function fastForward(DateTimeInterface $dt) - { + function fastForward(DateTimeInterface $dt) { + while ($this->valid() && $this->currentDate < $dt) { $this->next(); } + } /** @@ -305,20 +317,24 @@ class RRuleIterator implements Iterator /** * Does the processing for advancing the iterator for hourly frequency. + * + * @return void */ - protected function nextHourly() - { - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' hours'); + protected function nextHourly() { + + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' hours'); + } /** * Does the processing for advancing the iterator for daily frequency. + * + * @return void */ - protected function nextDaily() - { - if (!$this->byHour && !$this->byDay) { - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' days'); + protected function nextDaily() { + if (!$this->byHour && !$this->byDay) { + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' days'); return; } @@ -336,14 +352,16 @@ class RRuleIterator implements Iterator do { if ($this->byHour) { - if ('23' == $this->currentDate->format('G')) { + if ($this->currentDate->format('G') == '23') { // to obey the interval rule - $this->currentDate = $this->currentDate->modify('+'.$this->interval - 1 .' days'); + $this->currentDate = $this->currentDate->modify('+' . $this->interval - 1 . ' days'); } $this->currentDate = $this->currentDate->modify('+1 hours'); + } else { - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' days'); + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' days'); + } // Current month of the year @@ -354,21 +372,24 @@ class RRuleIterator implements Iterator // Current hour of the day $currentHour = $this->currentDate->format('G'); + } while ( ($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)) || ($this->byMonth && !in_array($currentMonth, $recurrenceMonths)) ); + } /** * Does the processing for advancing the iterator for weekly frequency. + * + * @return void */ - protected function nextWeekly() - { - if (!$this->byHour && !$this->byDay) { - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' weeks'); + protected function nextWeekly() { + if (!$this->byHour && !$this->byDay) { + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' weeks'); return; } @@ -384,6 +405,7 @@ class RRuleIterator implements Iterator $firstDay = $this->dayMap[$this->weekStart]; do { + if ($this->byHour) { $this->currentDate = $this->currentDate->modify('+1 hours'); } else { @@ -391,19 +413,19 @@ class RRuleIterator implements Iterator } // Current day of the week - $currentDay = (int) $this->currentDate->format('w'); + $currentDay = (int)$this->currentDate->format('w'); // Current hour of the day - $currentHour = (int) $this->currentDate->format('G'); + $currentHour = (int)$this->currentDate->format('G'); // We need to roll over to the next week - if ($currentDay === $firstDay && (!$this->byHour || '0' == $currentHour)) { - $this->currentDate = $this->currentDate->modify('+'.$this->interval - 1 .' weeks'); + if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) { + $this->currentDate = $this->currentDate->modify('+' . $this->interval - 1 . ' weeks'); // We need to go to the first day of this week, but only if we // are not already on this first day of this week. if ($this->currentDate->format('w') != $firstDay) { - $this->currentDate = $this->currentDate->modify('last '.$this->dayNames[$this->dayMap[$this->weekStart]]); + $this->currentDate = $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); } } @@ -413,38 +435,43 @@ class RRuleIterator implements Iterator /** * Does the processing for advancing the iterator for monthly frequency. + * + * @return void */ - protected function nextMonthly() - { + protected function nextMonthly() { + $currentDayOfMonth = $this->currentDate->format('j'); if (!$this->byMonthDay && !$this->byDay) { + // If the current day is higher than the 28th, rollover can // occur to the next month. We Must skip these invalid // entries. if ($currentDayOfMonth < 29) { - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' months'); + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' months'); } else { $increase = 0; do { - ++$increase; + $increase++; $tempDate = clone $this->currentDate; - $tempDate = $tempDate->modify('+ '.($this->interval * $increase).' months'); + $tempDate = $tempDate->modify('+ ' . ($this->interval * $increase) . ' months'); } while ($tempDate->format('j') != $currentDayOfMonth); $this->currentDate = $tempDate; } - return; } while (true) { + $occurrences = $this->getMonthlyOccurrences(); foreach ($occurrences as $occurrence) { + // The first occurrence thats higher than the current // day of the month wins. if ($occurrence > $currentDayOfMonth) { break 2; } + } // If we made it all the way here, it means there were no @@ -456,36 +483,42 @@ class RRuleIterator implements Iterator // $this->currentDate->modify('first day of this month'); $this->currentDate = new DateTimeImmutable($this->currentDate->format('Y-m-1 H:i:s'), $this->currentDate->getTimezone()); // end of workaround - $this->currentDate = $this->currentDate->modify('+ '.$this->interval.' months'); + $this->currentDate = $this->currentDate->modify('+ ' . $this->interval . ' months'); // This goes to 0 because we need to start counting at the // beginning. $currentDayOfMonth = 0; + } $this->currentDate = $this->currentDate->setDate( - (int) $this->currentDate->format('Y'), - (int) $this->currentDate->format('n'), - (int) $occurrence + (int)$this->currentDate->format('Y'), + (int)$this->currentDate->format('n'), + (int)$occurrence ); + } /** * Does the processing for advancing the iterator for yearly frequency. + * + * @return void */ - protected function nextYearly() - { + protected function nextYearly() { + $currentMonth = $this->currentDate->format('n'); $currentYear = $this->currentDate->format('Y'); $currentDayOfMonth = $this->currentDate->format('j'); // No sub-rules, so we just advance by year if (empty($this->byMonth)) { + // Unless it was a leap day! - if (2 == $currentMonth && 29 == $currentDayOfMonth) { + if ($currentMonth == 2 && $currentDayOfMonth == 29) { + $counter = 0; do { - ++$counter; + $counter++; // Here we increase the year count by the interval, until // we hit a date that's also in a leap year. // @@ -495,15 +528,16 @@ class RRuleIterator implements Iterator // 400. (1800, 1900, 2100). So we just rely on the datetime // functions instead. $nextDate = clone $this->currentDate; - $nextDate = $nextDate->modify('+ '.($this->interval * $counter).' years'); - } while (2 != $nextDate->format('n')); + $nextDate = $nextDate->modify('+ ' . ($this->interval * $counter) . ' years'); + } while ($nextDate->format('n') != 2); $this->currentDate = $nextDate; return; + } - if (null !== $this->byWeekNo) { // byWeekNo is an array with values from -53 to -1, or 1 to 53 + if ($this->byWeekNo !== null) { // byWeekNo is an array with values from -53 to -1, or 1 to 53 $dayOffsets = []; if ($this->byDay) { foreach ($this->byDay as $byDay) { @@ -532,7 +566,6 @@ class RRuleIterator implements Iterator if (count($checkDates) > 0) { $this->currentDate = min($checkDates); - return; } @@ -541,14 +574,14 @@ class RRuleIterator implements Iterator } } - if (null !== $this->byYearDay) { // byYearDay is an array with values from -366 to -1, or 1 to 366 + if ($this->byYearDay !== null) { // byYearDay is an array with values from -366 to -1, or 1 to 366 $dayOffsets = []; if ($this->byDay) { foreach ($this->byDay as $byDay) { $dayOffsets[] = $this->dayMap[$byDay]; } } else { // default is Monday-Sunday - $dayOffsets = [1, 2, 3, 4, 5, 6, 7]; + $dayOffsets = [1,2,3,4,5,6,7]; } $currentYear = $this->currentDate->format('Y'); @@ -561,9 +594,9 @@ class RRuleIterator implements Iterator $date = clone $this->currentDate; $date = $date->setDate($currentYear, 1, 1); if ($byYearDay > 0) { - $date = $date->add(new \DateInterval('P'.$byYearDay.'D')); + $date = $date->add(new \DateInterval('P' . $byYearDay . 'D')); } else { - $date = $date->sub(new \DateInterval('P'.abs($byYearDay).'D')); + $date = $date->sub(new \DateInterval('P' . abs($byYearDay) . 'D')); } if ($date > $this->currentDate && in_array($date->format('N'), $dayOffsets)) { @@ -573,7 +606,6 @@ class RRuleIterator implements Iterator if (count($checkDates) > 0) { $this->currentDate = min($checkDates); - return; } @@ -583,9 +615,9 @@ class RRuleIterator implements Iterator } // The easiest form - $this->currentDate = $this->currentDate->modify('+'.$this->interval.' years'); - + $this->currentDate = $this->currentDate->modify('+' . $this->interval . ' years'); return; + } $currentMonth = $this->currentDate->format('n'); @@ -597,10 +629,13 @@ class RRuleIterator implements Iterator // If we got a byDay or getMonthDay filter, we must first expand // further. if ($this->byDay || $this->byMonthDay) { + while (true) { + $occurrences = $this->getMonthlyOccurrences(); foreach ($occurrences as $occurrence) { + // The first occurrence that's higher than the current // day of the month wins. // If we advanced to the next month or year, the first @@ -608,6 +643,7 @@ class RRuleIterator implements Iterator if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { break 2; } + } // If we made it here, it means we need to advance to @@ -615,7 +651,8 @@ class RRuleIterator implements Iterator $currentDayOfMonth = 1; $advancedToNewMonth = true; do { - ++$currentMonth; + + $currentMonth++; if ($currentMonth > 12) { $currentYear += $this->interval; $currentMonth = 1; @@ -623,38 +660,43 @@ class RRuleIterator implements Iterator } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate = $this->currentDate->setDate( - (int) $currentYear, - (int) $currentMonth, - (int) $currentDayOfMonth + (int)$currentYear, + (int)$currentMonth, + (int)$currentDayOfMonth ); + } // If we made it here, it means we got a valid occurrence $this->currentDate = $this->currentDate->setDate( - (int) $currentYear, - (int) $currentMonth, - (int) $occurrence + (int)$currentYear, + (int)$currentMonth, + (int)$occurrence ); - return; + } else { + // These are the 'byMonth' rules, if there are no byDay or // byMonthDay sub-rules. do { - ++$currentMonth; + + $currentMonth++; if ($currentMonth > 12) { $currentYear += $this->interval; $currentMonth = 1; } } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate = $this->currentDate->setDate( - (int) $currentYear, - (int) $currentMonth, - (int) $currentDayOfMonth + (int)$currentYear, + (int)$currentMonth, + (int)$currentDayOfMonth ); return; + } + } /* }}} */ @@ -664,28 +706,32 @@ class RRuleIterator implements Iterator * class with all the values. * * @param string|array $rrule + * + * @return void */ - protected function parseRRule($rrule) - { + protected function parseRRule($rrule) { + if (is_string($rrule)) { $rrule = Property\ICalendar\Recur::stringToArray($rrule); } foreach ($rrule as $key => $value) { + $key = strtoupper($key); switch ($key) { - case 'FREQ': + + case 'FREQ' : $value = strtolower($value); if (!in_array( $value, ['secondly', 'minutely', 'hourly', 'daily', 'weekly', 'monthly', 'yearly'] )) { - throw new InvalidDataException('Unknown value for FREQ='.strtoupper($value)); + throw new InvalidDataException('Unknown value for FREQ=' . strtoupper($value)); } $this->frequency = $value; break; - case 'UNTIL': + case 'UNTIL' : $this->until = DateTimeParser::parse($value, $this->startDate->getTimezone()); // In some cases events are generated with an UNTIL= @@ -701,82 +747,86 @@ class RRuleIterator implements Iterator } break; - case 'INTERVAL': + case 'INTERVAL' : + // No break - case 'COUNT': - $val = (int) $value; + case 'COUNT' : + $val = (int)$value; if ($val < 1) { - throw new InvalidDataException(strtoupper($key).' in RRULE must be a positive integer!'); + throw new InvalidDataException(strtoupper($key) . ' in RRULE must be a positive integer!'); } $key = strtolower($key); $this->$key = $val; break; - case 'BYSECOND': - $this->bySecond = (array) $value; + case 'BYSECOND' : + $this->bySecond = (array)$value; break; - case 'BYMINUTE': - $this->byMinute = (array) $value; + case 'BYMINUTE' : + $this->byMinute = (array)$value; break; - case 'BYHOUR': - $this->byHour = (array) $value; + case 'BYHOUR' : + $this->byHour = (array)$value; break; - case 'BYDAY': - $value = (array) $value; + case 'BYDAY' : + $value = (array)$value; foreach ($value as $part) { if (!preg_match('#^ (-|\+)? ([1-5])? (MO|TU|WE|TH|FR|SA|SU) $# xi', $part)) { - throw new InvalidDataException('Invalid part in BYDAY clause: '.$part); + throw new InvalidDataException('Invalid part in BYDAY clause: ' . $part); } } $this->byDay = $value; break; - case 'BYMONTHDAY': - $this->byMonthDay = (array) $value; + case 'BYMONTHDAY' : + $this->byMonthDay = (array)$value; break; - case 'BYYEARDAY': - $this->byYearDay = (array) $value; + case 'BYYEARDAY' : + $this->byYearDay = (array)$value; foreach ($this->byYearDay as $byYearDay) { - if (!is_numeric($byYearDay) || (int) $byYearDay < -366 || 0 == (int) $byYearDay || (int) $byYearDay > 366) { + if (!is_numeric($byYearDay) || (int)$byYearDay < -366 || (int)$byYearDay == 0 || (int)$byYearDay > 366) { throw new InvalidDataException('BYYEARDAY in RRULE must have value(s) from 1 to 366, or -366 to -1!'); } } break; - case 'BYWEEKNO': - $this->byWeekNo = (array) $value; + case 'BYWEEKNO' : + $this->byWeekNo = (array)$value; foreach ($this->byWeekNo as $byWeekNo) { - if (!is_numeric($byWeekNo) || (int) $byWeekNo < -53 || 0 == (int) $byWeekNo || (int) $byWeekNo > 53) { + if (!is_numeric($byWeekNo) || (int)$byWeekNo < -53 || (int)$byWeekNo == 0 || (int)$byWeekNo > 53) { throw new InvalidDataException('BYWEEKNO in RRULE must have value(s) from 1 to 53, or -53 to -1!'); } } break; - case 'BYMONTH': - $this->byMonth = (array) $value; + case 'BYMONTH' : + $this->byMonth = (array)$value; foreach ($this->byMonth as $byMonth) { - if (!is_numeric($byMonth) || (int) $byMonth < 1 || (int) $byMonth > 12) { + if (!is_numeric($byMonth) || (int)$byMonth < 1 || (int)$byMonth > 12) { throw new InvalidDataException('BYMONTH in RRULE must have value(s) betweeen 1 and 12!'); } } break; - case 'BYSETPOS': - $this->bySetPos = (array) $value; + case 'BYSETPOS' : + $this->bySetPos = (array)$value; break; - case 'WKST': + case 'WKST' : $this->weekStart = strtoupper($value); break; default: - throw new InvalidDataException('Not supported: '.strtoupper($key)); + throw new InvalidDataException('Not supported: ' . strtoupper($key)); + } + } + } /** @@ -802,75 +852,77 @@ class RRuleIterator implements Iterator * * @return array */ - protected function getMonthlyOccurrences() - { + protected function getMonthlyOccurrences() { + $startDate = clone $this->currentDate; $byDayResults = []; // Our strategy is to simply go through the byDays, advance the date to // that point and add it to the results. - if ($this->byDay) { - foreach ($this->byDay as $day) { - $dayName = $this->dayNames[$this->dayMap[substr($day, -2)]]; - - // Dayname will be something like 'wednesday'. Now we need to find - // all wednesdays in this month. - $dayHits = []; - - // workaround for missing 'first day of the month' support in hhvm - $checkDate = new \DateTime($startDate->format('Y-m-1')); - // workaround modify always advancing the date even if the current day is a $dayName in hhvm - if ($checkDate->format('l') !== $dayName) { - $checkDate = $checkDate->modify($dayName); - } + if ($this->byDay) foreach ($this->byDay as $day) { - do { - $dayHits[] = $checkDate->format('j'); - $checkDate = $checkDate->modify('next '.$dayName); - } while ($checkDate->format('n') === $startDate->format('n')); - - // So now we have 'all wednesdays' for month. It is however - // possible that the user only really wanted the 1st, 2nd or last - // wednesday. - if (strlen($day) > 2) { - $offset = (int) substr($day, 0, -2); - - if ($offset > 0) { - // It is possible that the day does not exist, such as a - // 5th or 6th wednesday of the month. - if (isset($dayHits[$offset - 1])) { - $byDayResults[] = $dayHits[$offset - 1]; - } - } else { - // if it was negative we count from the end of the array - // might not exist, fx. -5th tuesday - if (isset($dayHits[count($dayHits) + $offset])) { - $byDayResults[] = $dayHits[count($dayHits) + $offset]; - } + $dayName = $this->dayNames[$this->dayMap[substr($day, -2)]]; + + + // Dayname will be something like 'wednesday'. Now we need to find + // all wednesdays in this month. + $dayHits = []; + + // workaround for missing 'first day of the month' support in hhvm + $checkDate = new \DateTime($startDate->format('Y-m-1')); + // workaround modify always advancing the date even if the current day is a $dayName in hhvm + if ($checkDate->format('l') !== $dayName) { + $checkDate = $checkDate->modify($dayName); + } + + do { + $dayHits[] = $checkDate->format('j'); + $checkDate = $checkDate->modify('next ' . $dayName); + } while ($checkDate->format('n') === $startDate->format('n')); + + // So now we have 'all wednesdays' for month. It is however + // possible that the user only really wanted the 1st, 2nd or last + // wednesday. + if (strlen($day) > 2) { + $offset = (int)substr($day, 0, -2); + + if ($offset > 0) { + // It is possible that the day does not exist, such as a + // 5th or 6th wednesday of the month. + if (isset($dayHits[$offset - 1])) { + $byDayResults[] = $dayHits[$offset - 1]; } } else { - // There was no counter (first, second, last wednesdays), so we - // just need to add the all to the list). - $byDayResults = array_merge($byDayResults, $dayHits); + + // if it was negative we count from the end of the array + // might not exist, fx. -5th tuesday + if (isset($dayHits[count($dayHits) + $offset])) { + $byDayResults[] = $dayHits[count($dayHits) + $offset]; + } } + } else { + // There was no counter (first, second, last wednesdays), so we + // just need to add the all to the list). + $byDayResults = array_merge($byDayResults, $dayHits); + } + } $byMonthDayResults = []; - if ($this->byMonthDay) { - foreach ($this->byMonthDay as $monthDay) { - // Removing values that are out of range for this month - if ($monthDay > $startDate->format('t') || + if ($this->byMonthDay) foreach ($this->byMonthDay as $monthDay) { + + // Removing values that are out of range for this month + if ($monthDay > $startDate->format('t') || $monthDay < 0 - $startDate->format('t')) { continue; - } - if ($monthDay > 0) { - $byMonthDayResults[] = $monthDay; - } else { - // Negative values - $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; - } + } + if ($monthDay > 0) { + $byMonthDayResults[] = $monthDay; + } else { + // Negative values + $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; } } @@ -895,6 +947,7 @@ class RRuleIterator implements Iterator $filteredResult = []; foreach ($this->bySetPos as $setPos) { + if ($setPos < 0) { $setPos = count($result) + ($setPos + 1); } @@ -904,8 +957,8 @@ class RRuleIterator implements Iterator } sort($filteredResult, SORT_NUMERIC); - return $filteredResult; + } /** @@ -923,8 +976,8 @@ class RRuleIterator implements Iterator 'SA' => 6, ]; - protected function getHours() - { + protected function getHours() { + $recurrenceHours = []; foreach ($this->byHour as $byHour) { $recurrenceHours[] = $byHour; @@ -933,21 +986,23 @@ class RRuleIterator implements Iterator return $recurrenceHours; } - protected function getDays() - { + protected function getDays() { + $recurrenceDays = []; foreach ($this->byDay as $byDay) { + // The day may be preceeded with a positive (+n) or // negative (-n) integer. However, this does not make // sense in 'weekly' so we ignore it here. $recurrenceDays[] = $this->dayMap[substr($byDay, -2)]; + } return $recurrenceDays; } - protected function getMonths() - { + protected function getMonths() { + $recurrenceMonths = []; foreach ($this->byMonth as $byMonth) { $recurrenceMonths[] = $byMonth; diff --git a/vendor/sabre/vobject/lib/Settings.php b/vendor/sabre/vobject/lib/Settings.php index afc586b0c..3f274ba8e 100644 --- a/vendor/sabre/vobject/lib/Settings.php +++ b/vendor/sabre/vobject/lib/Settings.php @@ -15,8 +15,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Settings -{ +class Settings { + /** * The minimum date we accept for various calculations with dates, such as * recurrences. @@ -25,7 +25,7 @@ class Settings * use-cases. In particular, it covers birthdates for virtually everyone * alive on earth, which is less than 5 people at the time of writing. */ - public static $minDate = '1900-01-01'; + static $minDate = '1900-01-01'; /** * The maximum date we accept for various calculations with dates, such as @@ -34,7 +34,7 @@ class Settings * The choice of 2100 is pretty arbitrary, but should cover most * appointments made for many years to come. */ - public static $maxDate = '2100-01-01'; + static $maxDate = '2100-01-01'; /** * The maximum number of recurrences that will be generated. @@ -51,5 +51,6 @@ class Settings * * Set this value to -1 to disable this control altogether. */ - public static $maxRecurrences = 3500; + static $maxRecurrences = 3500; + } diff --git a/vendor/sabre/vobject/lib/Splitter/ICalendar.php b/vendor/sabre/vobject/lib/Splitter/ICalendar.php index d42566194..c0007ba01 100644 --- a/vendor/sabre/vobject/lib/Splitter/ICalendar.php +++ b/vendor/sabre/vobject/lib/Splitter/ICalendar.php @@ -19,8 +19,8 @@ use Sabre\VObject\Component\VCalendar; * @author Armin Hackmann * @license http://sabre.io/license/ Modified BSD License */ -class ICalendar implements SplitterInterface -{ +class ICalendar implements SplitterInterface { + /** * Timezones. * @@ -38,13 +38,13 @@ class ICalendar implements SplitterInterface /** * Constructor. * - * The splitter should receive an readable file stream as its input. + * The splitter should receive an readable file stream as it's input. * * @param resource $input - * @param int $options parser options, see the OPTIONS constants + * @param int $options Parser options, see the OPTIONS constants. */ - public function __construct($input, $options = 0) - { + function __construct($input, $options = 0) { + $data = VObject\Reader::read($input, $options); if (!$data instanceof VObject\Component\VCalendar) { @@ -57,16 +57,16 @@ class ICalendar implements SplitterInterface } // Get all timezones - if ('VTIMEZONE' === $component->name) { - $this->vtimezones[(string) $component->TZID] = $component; + if ($component->name === 'VTIMEZONE') { + $this->vtimezones[(string)$component->TZID] = $component; continue; } // Get component UID for recurring Events search if (!$component->UID) { - $component->UID = sha1(microtime()).'-vobjectimport'; + $component->UID = sha1(microtime()) . '-vobjectimport'; } - $uid = (string) $component->UID; + $uid = (string)$component->UID; // Take care of recurring events if (!array_key_exists($uid, $this->objects)) { @@ -75,6 +75,7 @@ class ICalendar implements SplitterInterface $this->objects[$uid]->add(clone $component); } + } /** @@ -83,14 +84,15 @@ class ICalendar implements SplitterInterface * * When the end is reached, null will be returned. * - * @return \Sabre\VObject\Component|null + * @return Sabre\VObject\Component|null */ - public function getNext() - { + function getNext() { + if ($object = array_shift($this->objects)) { + // create our baseobject $object->version = '2.0'; - $object->prodid = '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN'; + $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; $object->calscale = 'GREGORIAN'; // add vtimezone information to obj (if we have it) @@ -99,8 +101,13 @@ class ICalendar implements SplitterInterface } return $object; + } else { + return; + } + } + } diff --git a/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php b/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php index c845ac5fc..8f827cc4b 100644 --- a/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php +++ b/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php @@ -15,16 +15,16 @@ namespace Sabre\VObject\Splitter; * @author Dominik Tobschall (http://tobschall.de/) * @license http://sabre.io/license/ Modified BSD License */ -interface SplitterInterface -{ +interface SplitterInterface { + /** * Constructor. * - * The splitter should receive an readable file stream as its input. + * The splitter should receive an readable file stream as it's input. * * @param resource $input */ - public function __construct($input); + function __construct($input); /** * Every time getNext() is called, a new object will be parsed, until we @@ -32,7 +32,8 @@ interface SplitterInterface * * When the end is reached, null will be returned. * - * @return \Sabre\VObject\Component|null + * @return Sabre\VObject\Component|null */ - public function getNext(); + function getNext(); + } diff --git a/vendor/sabre/vobject/lib/Splitter/VCard.php b/vendor/sabre/vobject/lib/Splitter/VCard.php index a20f5c2c1..0bb82abe9 100644 --- a/vendor/sabre/vobject/lib/Splitter/VCard.php +++ b/vendor/sabre/vobject/lib/Splitter/VCard.php @@ -19,8 +19,8 @@ use Sabre\VObject\Parser\MimeDir; * @author Armin Hackmann * @license http://sabre.io/license/ Modified BSD License */ -class VCard implements SplitterInterface -{ +class VCard implements SplitterInterface { + /** * File handle. * @@ -38,15 +38,16 @@ class VCard implements SplitterInterface /** * Constructor. * - * The splitter should receive an readable file stream as its input. + * The splitter should receive an readable file stream as it's input. * * @param resource $input - * @param int $options parser options, see the OPTIONS constants + * @param int $options Parser options, see the OPTIONS constants. */ - public function __construct($input, $options = 0) - { + function __construct($input, $options = 0) { + $this->input = $input; $this->parser = new MimeDir($input, $options); + } /** @@ -55,20 +56,23 @@ class VCard implements SplitterInterface * * When the end is reached, null will be returned. * - * @return \Sabre\VObject\Component|null + * @return Sabre\VObject\Component|null */ - public function getNext() - { + function getNext() { + try { $object = $this->parser->parse(); if (!$object instanceof VObject\Component\VCard) { throw new VObject\ParseException('The supplied input contained non-VCARD data.'); } + } catch (VObject\EofException $e) { return; } return $object; + } + } diff --git a/vendor/sabre/vobject/lib/StringUtil.php b/vendor/sabre/vobject/lib/StringUtil.php index 2333d6ab9..b8615f2ba 100644 --- a/vendor/sabre/vobject/lib/StringUtil.php +++ b/vendor/sabre/vobject/lib/StringUtil.php @@ -9,8 +9,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class StringUtil -{ +class StringUtil { + /** * Returns true or false depending on if a string is valid UTF-8. * @@ -18,14 +18,15 @@ class StringUtil * * @return bool */ - public static function isUTF8($str) - { + static function isUTF8($str) { + // Control characters if (preg_match('%[\x00-\x08\x0B-\x0C\x0E\x0F]%', $str)) { return false; } - return (bool) preg_match('%%u', $str); + return (bool)preg_match('%%u', $str); + } /** @@ -38,12 +39,12 @@ class StringUtil * * @return string */ - public static function convertToUTF8($str) - { + static function convertToUTF8($str) { + $encoding = mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'WINDOWS-1252'], true); switch ($encoding) { - case 'ISO-8859-1': + case 'ISO-8859-1' : $newStr = utf8_encode($str); break; /* Unreachable code. Not sure yet how we can improve this @@ -52,11 +53,14 @@ class StringUtil $newStr = iconv('cp1252', 'UTF-8', $str); break; */ - default: + default : $newStr = $str; + } // Removing any control characters - return preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', '', $newStr); + return (preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', '', $newStr)); + } + } diff --git a/vendor/sabre/vobject/lib/TimeZoneUtil.php b/vendor/sabre/vobject/lib/TimeZoneUtil.php index 5b1a775c2..925183e8d 100644 --- a/vendor/sabre/vobject/lib/TimeZoneUtil.php +++ b/vendor/sabre/vobject/lib/TimeZoneUtil.php @@ -12,30 +12,30 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class TimeZoneUtil -{ - public static $map = null; +class TimeZoneUtil { + + static $map = null; /** * List of microsoft exchange timezone ids. * * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx */ - public static $microsoftExchangeMap = [ - 0 => 'UTC', + static $microsoftExchangeMap = [ + 0 => 'UTC', 31 => 'Africa/Casablanca', // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. // I'm not even kidding.. We handle this special case in the // getTimeZone method. - 2 => 'Europe/Lisbon', - 1 => 'Europe/London', - 4 => 'Europe/Berlin', - 6 => 'Europe/Prague', - 3 => 'Europe/Paris', + 2 => 'Europe/Lisbon', + 1 => 'Europe/London', + 4 => 'Europe/Berlin', + 6 => 'Europe/Prague', + 3 => 'Europe/Paris', 69 => 'Africa/Luanda', // This was a best guess - 7 => 'Europe/Athens', - 5 => 'Europe/Bucharest', + 7 => 'Europe/Athens', + 5 => 'Europe/Bucharest', 49 => 'Africa/Cairo', 50 => 'Africa/Harare', 59 => 'Europe/Helsinki', @@ -117,13 +117,13 @@ class TimeZoneUtil * Alternatively, if $failIfUncertain is set to true, it will throw an * exception if we cannot accurately determine the timezone. * - * @param string $tzid + * @param string $tzid * @param Sabre\VObject\Component $vcalendar * - * @return \DateTimeZone + * @return DateTimeZone */ - public static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) - { + static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) { + // First we will just see if the tzid is a support timezone identifier. // // The only exception is if the timezone starts with (. This is to @@ -135,7 +135,8 @@ class TimeZoneUtil // Since PHP 5.5.10, the first bit will be used as the timezone and // this method will return just GMT+01:00. This is wrong, because it // doesn't take DST into account. - if ('(' !== $tzid[0]) { + if ($tzid[0] !== '(') { + // PHP has a bug that logs PHP warnings even it shouldn't: // https://bugs.php.net/bug.php?id=67881 // @@ -154,6 +155,7 @@ class TimeZoneUtil } } catch (\Exception $e) { } + } self::loadTzMaps(); @@ -176,40 +178,46 @@ class TimeZoneUtil // Maybe the author was hyper-lazy and just included an offset. We // support it, but we aren't happy about it. if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) { + // Note that the path in the source will never be taken from PHP 5.5.10 // onwards. PHP 5.5.10 supports the "GMT+0100" style of format, so it // already gets returned early in this function. Once we drop support // for versions under PHP 5.5.10, this bit can be taken out of the // source. // @codeCoverageIgnoreStart - return new \DateTimeZone('Etc/GMT'.$matches[1].ltrim(substr($matches[2], 0, 2), '0')); + return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2], 0, 2), '0')); // @codeCoverageIgnoreEnd } if ($vcalendar) { + // If that didn't work, we will scan VTIMEZONE objects foreach ($vcalendar->select('VTIMEZONE') as $vtimezone) { - if ((string) $vtimezone->TZID === $tzid) { + + if ((string)$vtimezone->TZID === $tzid) { + // Some clients add 'X-LIC-LOCATION' with the olson name. if (isset($vtimezone->{'X-LIC-LOCATION'})) { - $lic = (string) $vtimezone->{'X-LIC-LOCATION'}; + + $lic = (string)$vtimezone->{'X-LIC-LOCATION'}; // Libical generators may specify strings like // "SystemV/EST5EDT". For those we must remove the // SystemV part. - if ('SystemV/' === substr($lic, 0, 8)) { + if (substr($lic, 0, 8) === 'SystemV/') { $lic = substr($lic, 8); } return self::getTimeZone($lic, null, $failIfUncertain); + } // Microsoft may add a magic number, which we also have an // answer for. if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { - $cdoId = (int) $vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); + $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); // 2 can mean both Europe/Lisbon and Europe/Sarajevo. - if (2 === $cdoId && false !== strpos((string) $vtimezone->TZID, 'Sarajevo')) { + if ($cdoId === 2 && strpos((string)$vtimezone->TZID, 'Sarajevo') !== false) { return new \DateTimeZone('Europe/Sarajevo'); } @@ -217,34 +225,37 @@ class TimeZoneUtil return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]); } } + } + } + } if ($failIfUncertain) { - throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: '.$tzid); + throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid); } // If we got all the way here, we default to UTC. return new \DateTimeZone(date_default_timezone_get()); + } /** * This method will load in all the tz mapping information, if it's not yet * done. */ - public static function loadTzMaps() - { - if (!is_null(self::$map)) { - return; - } + static function loadTzMaps() { + + if (!is_null(self::$map)) return; self::$map = array_merge( - include __DIR__.'/timezonedata/windowszones.php', - include __DIR__.'/timezonedata/lotuszones.php', - include __DIR__.'/timezonedata/exchangezones.php', - include __DIR__.'/timezonedata/php-workaround.php' + include __DIR__ . '/timezonedata/windowszones.php', + include __DIR__ . '/timezonedata/lotuszones.php', + include __DIR__ . '/timezonedata/exchangezones.php', + include __DIR__ . '/timezonedata/php-workaround.php' ); + } /** @@ -258,8 +269,8 @@ class TimeZoneUtil * * @return array */ - public static function getIdentifiersBC() - { - return include __DIR__.'/timezonedata/php-bc.php'; + static function getIdentifiersBC() { + return include __DIR__ . '/timezonedata/php-bc.php'; } + } diff --git a/vendor/sabre/vobject/lib/UUIDUtil.php b/vendor/sabre/vobject/lib/UUIDUtil.php index 066af624c..24ebe3cf8 100644 --- a/vendor/sabre/vobject/lib/UUIDUtil.php +++ b/vendor/sabre/vobject/lib/UUIDUtil.php @@ -13,8 +13,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class UUIDUtil -{ +class UUIDUtil { + /** * Returns a pseudo-random v4 UUID. * @@ -24,9 +24,10 @@ class UUIDUtil * * @return string */ - public static function getUUID() - { + static function getUUID() { + return sprintf( + '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" @@ -56,11 +57,13 @@ class UUIDUtil * * @return bool */ - public static function validateUUID($uuid) - { - return 0 !== preg_match( + static function validateUUID($uuid) { + + return preg_match( '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i', $uuid - ); + ) !== 0; + } + } diff --git a/vendor/sabre/vobject/lib/VCardConverter.php b/vendor/sabre/vobject/lib/VCardConverter.php index 156b83b4e..1f6d016f1 100644 --- a/vendor/sabre/vobject/lib/VCardConverter.php +++ b/vendor/sabre/vobject/lib/VCardConverter.php @@ -9,8 +9,8 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class VCardConverter -{ +class VCardConverter { + /** * Converts a vCard object to a new version. * @@ -27,10 +27,10 @@ class VCardConverter * If input and output version are identical, a clone is returned. * * @param Component\VCard $input - * @param int $targetVersion + * @param int $targetVersion */ - public function convert(Component\VCard $input, $targetVersion) - { + function convert(Component\VCard $input, $targetVersion) { + $inputVersion = $input->getDocumentType(); if ($inputVersion === $targetVersion) { return clone $input; @@ -43,7 +43,7 @@ class VCardConverter throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version'); } - $newVersion = Document::VCARD40 === $targetVersion ? '4.0' : '3.0'; + $newVersion = $targetVersion === Document::VCARD40 ? '4.0' : '3.0'; $output = new Component\VCard([ 'VERSION' => $newVersion, @@ -53,10 +53,13 @@ class VCardConverter unset($output->UID); foreach ($input->children() as $property) { + $this->convertProperty($input, $output, $property, $targetVersion); + } return $output; + } /** @@ -64,11 +67,13 @@ class VCardConverter * * @param Component\VCard $input * @param Component\VCard $output - * @param Property $property - * @param int $targetVersion + * @param Property $property + * @param int $targetVersion + * + * @return void */ - protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) - { + protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) { + // Skipping these, those are automatically added. if (in_array($property->name, ['VERSION', 'PRODID'])) { return; @@ -90,10 +95,15 @@ class VCardConverter $valueType ); - if (Document::VCARD30 === $targetVersion) { + + if ($targetVersion === Document::VCARD30) { + if ($property instanceof Property\Uri && in_array($property->name, ['PHOTO', 'LOGO', 'SOUND'])) { + $newProperty = $this->convertUriToBinary($output, $newProperty); + } elseif ($property instanceof Property\VCard\DateAndOrTime) { + // In vCard 4, the birth year may be optional. This is not the // case for vCard 3. Apple has a workaround for this that // allows applications that support Apple's extension still @@ -103,12 +113,12 @@ class VCardConverter // uses. $parts = DateTimeParser::parseVCardDateTime($property->getValue()); if (is_null($parts['year'])) { - $newValue = '1604-'.$parts['month'].'-'.$parts['date']; + $newValue = '1604-' . $parts['month'] . '-' . $parts['date']; $newProperty->setValue($newValue); $newProperty['X-APPLE-OMIT-YEAR'] = '1604'; } - if ('ANNIVERSARY' == $newProperty->name) { + if ($newProperty->name == 'ANNIVERSARY') { // Microsoft non-standard anniversary $newProperty->name = 'X-ANNIVERSARY'; @@ -117,64 +127,74 @@ class VCardConverter // group, so we first need to find a groupname that doesn't // exist yet. $x = 1; - while ($output->select('ITEM'.$x.'.')) { - ++$x; + while ($output->select('ITEM' . $x . '.')) { + $x++; } - $output->add('ITEM'.$x.'.X-ABDATE', $newProperty->getValue(), ['VALUE' => 'DATE-AND-OR-TIME']); - $output->add('ITEM'.$x.'.X-ABLABEL', '_$!<Anniversary>!$_'); + $output->add('ITEM' . $x . '.X-ABDATE', $newProperty->getValue(), ['VALUE' => 'DATE-AND-OR-TIME']); + $output->add('ITEM' . $x . '.X-ABLABEL', '_$!<Anniversary>!$_'); } - } elseif ('KIND' === $property->name) { + + } elseif ($property->name === 'KIND') { + switch (strtolower($property->getValue())) { - case 'org': + case 'org' : // vCard 3.0 does not have an equivalent to KIND:ORG, // but apple has an extension that means the same // thing. $newProperty = $output->createProperty('X-ABSHOWAS', 'COMPANY'); break; - case 'individual': + case 'individual' : // Individual is implicit, so we skip it. return; - case 'group': + case 'group' : // OS X addressbook property $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND', 'GROUP'); break; } + + } - } elseif (Document::VCARD40 === $targetVersion) { + + } elseif ($targetVersion === Document::VCARD40) { + // These properties were removed in vCard 4.0 if (in_array($property->name, ['NAME', 'MAILER', 'LABEL', 'CLASS'])) { return; } if ($property instanceof Property\Binary) { + $newProperty = $this->convertBinaryToUri($output, $newProperty, $parameters); + } elseif ($property instanceof Property\VCard\DateAndOrTime && isset($parameters['X-APPLE-OMIT-YEAR'])) { + // If a property such as BDAY contained 'X-APPLE-OMIT-YEAR', // then we're stripping the year from the vcard 4 value. $parts = DateTimeParser::parseVCardDateTime($property->getValue()); if ($parts['year'] === $property['X-APPLE-OMIT-YEAR']->getValue()) { - $newValue = '--'.$parts['month'].'-'.$parts['date']; + $newValue = '--' . $parts['month'] . '-' . $parts['date']; $newProperty->setValue($newValue); } // Regardless if the year matched or not, we do need to strip // X-APPLE-OMIT-YEAR. unset($parameters['X-APPLE-OMIT-YEAR']); + } switch ($property->name) { - case 'X-ABSHOWAS': - if ('COMPANY' === strtoupper($property->getValue())) { + case 'X-ABSHOWAS' : + if (strtoupper($property->getValue()) === 'COMPANY') { $newProperty = $output->createProperty('KIND', 'ORG'); } break; - case 'X-ADDRESSBOOKSERVER-KIND': - if ('GROUP' === strtoupper($property->getValue())) { + case 'X-ADDRESSBOOKSERVER-KIND' : + if (strtoupper($property->getValue()) === 'GROUP') { $newProperty = $output->createProperty('KIND', 'GROUP'); } break; - case 'X-ANNIVERSARY': + case 'X-ANNIVERSARY' : $newProperty->name = 'ANNIVERSARY'; // If we already have an anniversary property with the same // value, ignore. @@ -184,15 +204,15 @@ class VCardConverter } } break; - case 'X-ABDATE': + case 'X-ABDATE' : // Find out what the label was, if it exists. if (!$property->group) { break; } - $label = $input->{$property->group.'.X-ABLABEL'}; + $label = $input->{$property->group . '.X-ABLABEL'}; // We only support converting anniversaries. - if (!$label || '_$!<Anniversary>!$_' !== $label->getValue()) { + if (!$label || $label->getValue() !== '_$!<Anniversary>!$_') { break; } @@ -206,20 +226,22 @@ class VCardConverter $newProperty->name = 'ANNIVERSARY'; break; // Apple's per-property label system. - case 'X-ABLABEL': - if ('_$!<Anniversary>!$_' === $newProperty->getValue()) { + case 'X-ABLABEL' : + if ($newProperty->getValue() === '_$!<Anniversary>!$_') { // We can safely remove these, as they are converted to // ANNIVERSARY properties. return; } break; + } + } // set property group $newProperty->group = $property->group; - if (Document::VCARD40 === $targetVersion) { + if ($targetVersion === Document::VCARD40) { $this->convertParameters40($newProperty, $parameters); } else { $this->convertParameters30($newProperty, $parameters); @@ -235,6 +257,8 @@ class VCardConverter } $output->add($newProperty); + + } /** @@ -243,14 +267,14 @@ class VCardConverter * vCard 4.0 no longer supports BINARY properties. * * @param Component\VCard $output - * @param Property\Uri $property the input property - * @param $parameters list of parameters that will eventually be added to - * the new property + * @param Property\Uri $property The input property. + * @param $parameters List of parameters that will eventually be added to + * the new property. * * @return Property\Uri */ - protected function convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters) - { + protected function convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters) { + $value = $newProperty->getValue(); $newProperty = $output->createProperty( $newProperty->name, @@ -263,13 +287,14 @@ class VCardConverter // See if we can find a better mimetype. if (isset($parameters['TYPE'])) { + $newTypes = []; foreach ($parameters['TYPE']->getParts() as $typePart) { if (in_array( strtoupper($typePart), ['JPEG', 'PNG', 'GIF'] )) { - $mimeType = 'image/'.strtolower($typePart); + $mimeType = 'image/' . strtolower($typePart); } else { $newTypes[] = $typePart; } @@ -282,11 +307,12 @@ class VCardConverter } else { unset($parameters['TYPE']); } - } - $newProperty->setValue('data:'.$mimeType.';base64,'.base64_encode($value)); + } + $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($value)); return $newProperty; + } /** @@ -297,16 +323,16 @@ class VCardConverter * possible, to improve compatibility. * * @param Component\VCard $output - * @param Property\Uri $property the input property + * @param Property\Uri $property The input property. * * @return Property\Binary|null */ - protected function convertUriToBinary(Component\VCard $output, Property\Uri $newProperty) - { + protected function convertUriToBinary(Component\VCard $output, Property\Uri $newProperty) { + $value = $newProperty->getValue(); // Only converting data: uris - if ('data:' !== substr($value, 0, 5)) { + if (substr($value, 0, 5) !== 'data:') { return $newProperty; } @@ -328,79 +354,92 @@ class VCardConverter $newProperty['ENCODING'] = 'b'; switch ($mimeType) { - case 'image/jpeg': + + case 'image/jpeg' : $newProperty['TYPE'] = 'JPEG'; break; - case 'image/png': + case 'image/png' : $newProperty['TYPE'] = 'PNG'; break; - case 'image/gif': + case 'image/gif' : $newProperty['TYPE'] = 'GIF'; break; + } + return $newProperty; + } /** * Adds parameters to a new property for vCard 4.0. * * @param Property $newProperty - * @param array $parameters + * @param array $parameters + * + * @return void */ - protected function convertParameters40(Property $newProperty, array $parameters) - { + protected function convertParameters40(Property $newProperty, array $parameters) { + // Adding all parameters. foreach ($parameters as $param) { + // vCard 2.1 allowed parameters with no name - if ($param->noName) { - $param->noName = false; - } + if ($param->noName) $param->noName = false; switch ($param->name) { + // We need to see if there's any TYPE=PREF, because in vCard 4 // that's now PREF=1. - case 'TYPE': + case 'TYPE' : foreach ($param->getParts() as $paramPart) { - if ('PREF' === strtoupper($paramPart)) { + + if (strtoupper($paramPart) === 'PREF') { $newProperty->add('PREF', '1'); } else { $newProperty->add($param->name, $paramPart); } + } break; // These no longer exist in vCard 4 - case 'ENCODING': - case 'CHARSET': + case 'ENCODING' : + case 'CHARSET' : break; - default: + default : $newProperty->add($param->name, $param->getParts()); break; + } + } + } /** * Adds parameters to a new property for vCard 3.0. * * @param Property $newProperty - * @param array $parameters + * @param array $parameters + * + * @return void */ - protected function convertParameters30(Property $newProperty, array $parameters) - { + protected function convertParameters30(Property $newProperty, array $parameters) { + // Adding all parameters. foreach ($parameters as $param) { + // vCard 2.1 allowed parameters with no name - if ($param->noName) { - $param->noName = false; - } + if ($param->noName) $param->noName = false; switch ($param->name) { - case 'ENCODING': + + case 'ENCODING' : // This value only existed in vCard 2.1, and should be // removed for anything else. - if ('QUOTED-PRINTABLE' !== strtoupper($param->getValue())) { + if (strtoupper($param->getValue()) !== 'QUOTED-PRINTABLE') { $newProperty->add($param->name, $param->getParts()); } break; @@ -410,16 +449,19 @@ class VCardConverter * * Any other PREF numbers we'll drop. */ - case 'PREF': - if ('1' == $param->getValue()) { + case 'PREF' : + if ($param->getValue() == '1') { $newProperty->add('TYPE', 'PREF'); } break; - default: + default : $newProperty->add($param->name, $param->getParts()); break; + } + } + } } diff --git a/vendor/sabre/vobject/lib/Version.php b/vendor/sabre/vobject/lib/Version.php index 257e66a79..074b06c4b 100644 --- a/vendor/sabre/vobject/lib/Version.php +++ b/vendor/sabre/vobject/lib/Version.php @@ -9,10 +9,11 @@ namespace Sabre\VObject; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Version -{ +class Version { + /** * Full version number. */ - const VERSION = '4.2.0'; + const VERSION = '4.1.6'; + } diff --git a/vendor/sabre/vobject/lib/Writer.php b/vendor/sabre/vobject/lib/Writer.php index c70a6ae4d..f8a58758d 100644 --- a/vendor/sabre/vobject/lib/Writer.php +++ b/vendor/sabre/vobject/lib/Writer.php @@ -14,8 +14,8 @@ use Sabre\Xml; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class Writer -{ +class Writer { + /** * Serializes a vCard or iCalendar object. * @@ -23,22 +23,24 @@ class Writer * * @return string */ - public static function write(Component $component) - { + static function write(Component $component) { + return $component->serialize(); + } /** * Serializes a jCal or jCard object. * * @param Component $component - * @param int $options + * @param int $options * * @return string */ - public static function writeJson(Component $component, $options = 0) - { + static function writeJson(Component $component, $options = 0) { + return json_encode($component, $options); + } /** @@ -48,8 +50,8 @@ class Writer * * @return string */ - public static function writeXml(Component $component) - { + static function writeXml(Component $component) { + $writer = new Xml\Writer(); $writer->openMemory(); $writer->setIndent(true); @@ -57,11 +59,15 @@ class Writer $writer->startDocument('1.0', 'utf-8'); if ($component instanceof Component\VCalendar) { + $writer->startElement('icalendar'); - $writer->writeAttribute('xmlns', Parser\XML::XCAL_NAMESPACE); + $writer->writeAttribute('xmlns', Parser\Xml::XCAL_NAMESPACE); + } else { + $writer->startElement('vcards'); - $writer->writeAttribute('xmlns', Parser\XML::XCARD_NAMESPACE); + $writer->writeAttribute('xmlns', Parser\Xml::XCARD_NAMESPACE); + } $component->xmlSerialize($writer); @@ -69,5 +75,7 @@ class Writer $writer->endElement(); return $writer->outputMemory(); + } + } diff --git a/vendor/sabre/vobject/lib/timezonedata/exchangezones.php b/vendor/sabre/vobject/lib/timezonedata/exchangezones.php index 89bddc27c..edba5b473 100644 --- a/vendor/sabre/vobject/lib/timezonedata/exchangezones.php +++ b/vendor/sabre/vobject/lib/timezonedata/exchangezones.php @@ -12,83 +12,83 @@ * @license http://sabre.io/license/ Modified BSD License */ return [ - 'Universal Coordinated Time' => 'UTC', - 'Casablanca, Monrovia' => 'Africa/Casablanca', - 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', - 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', - 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', - 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', - 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', - 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', - 'Prague, Central Europe' => 'Europe/Prague', - 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', - 'West Central Africa' => 'Africa/Luanda', // This was a best guess - 'Athens, Istanbul, Minsk' => 'Europe/Athens', - 'Bucharest' => 'Europe/Bucharest', - 'Cairo' => 'Africa/Cairo', - 'Harare, Pretoria' => 'Africa/Harare', - 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', - 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', - 'Baghdad' => 'Asia/Baghdad', - 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', - 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', - 'East Africa, Nairobi' => 'Africa/Nairobi', - 'Tehran' => 'Asia/Tehran', - 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess - 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', - 'Kabul' => 'Asia/Kabul', - 'Ekaterinburg' => 'Asia/Yekaterinburg', - 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', + 'Universal Coordinated Time' => 'UTC', + 'Casablanca, Monrovia' => 'Africa/Casablanca', + 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', + 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', + 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', + 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', + 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', + 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', + 'Prague, Central Europe' => 'Europe/Prague', + 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', + 'West Central Africa' => 'Africa/Luanda', // This was a best guess + 'Athens, Istanbul, Minsk' => 'Europe/Athens', + 'Bucharest' => 'Europe/Bucharest', + 'Cairo' => 'Africa/Cairo', + 'Harare, Pretoria' => 'Africa/Harare', + 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', + 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', + 'Baghdad' => 'Asia/Baghdad', + 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', + 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', + 'East Africa, Nairobi' => 'Africa/Nairobi', + 'Tehran' => 'Asia/Tehran', + 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess + 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', + 'Kabul' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', - 'Kathmandu, Nepal' => 'Asia/Kathmandu', - 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', - 'Astana, Dhaka' => 'Asia/Dhaka', - 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', - 'Rangoon' => 'Asia/Rangoon', - 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', - 'Krasnoyarsk' => 'Asia/Krasnoyarsk', - 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', - 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', - 'Kuala Lumpur, Singapore' => 'Asia/Singapore', - 'Perth, Western Australia' => 'Australia/Perth', - 'Taipei' => 'Asia/Taipei', - 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', - 'Seoul, Korea Standard time' => 'Asia/Seoul', - 'Yakutsk' => 'Asia/Yakutsk', - 'Adelaide, Central Australia' => 'Australia/Adelaide', - 'Darwin' => 'Australia/Darwin', - 'Brisbane, East Australia' => 'Australia/Brisbane', - 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', - 'Guam, Port Moresby' => 'Pacific/Guam', - 'Hobart, Tasmania' => 'Australia/Hobart', - 'Vladivostok' => 'Asia/Vladivostok', - 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', - 'Auckland, Wellington' => 'Pacific/Auckland', - 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', - 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', - 'Azores' => 'Atlantic/Azores', - 'Cape Verde Is.' => 'Atlantic/Cape_Verde', - 'Mid-Atlantic' => 'America/Noronha', - 'Brasilia' => 'America/Sao_Paulo', // Best guess - 'Buenos Aires' => 'America/Argentina/Buenos_Aires', - 'Greenland' => 'America/Godthab', - 'Newfoundland' => 'America/St_Johns', - 'Atlantic Time (Canada)' => 'America/Halifax', - 'Caracas, La Paz' => 'America/Caracas', - 'Santiago' => 'America/Santiago', - 'Bogota, Lima, Quito' => 'America/Bogota', - 'Eastern Time (US & Canada)' => 'America/New_York', - 'Indiana (East)' => 'America/Indiana/Indianapolis', - 'Central America' => 'America/Guatemala', - 'Central Time (US & Canada)' => 'America/Chicago', - 'Mexico City, Tegucigalpa' => 'America/Mexico_City', - 'Saskatchewan' => 'America/Edmonton', - 'Arizona' => 'America/Phoenix', - 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess - 'Pacific Time (US & Canada)' => 'America/Los_Angeles', // Best guess - 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess - 'Alaska' => 'America/Anchorage', - 'Hawaii' => 'Pacific/Honolulu', - 'Midway Island, Samoa' => 'Pacific/Midway', - 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', + 'Kathmandu, Nepal' => 'Asia/Kathmandu', + 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', + 'Astana, Dhaka' => 'Asia/Dhaka', + 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', + 'Rangoon' => 'Asia/Rangoon', + 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', + 'Krasnoyarsk' => 'Asia/Krasnoyarsk', + 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', + 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', + 'Kuala Lumpur, Singapore' => 'Asia/Singapore', + 'Perth, Western Australia' => 'Australia/Perth', + 'Taipei' => 'Asia/Taipei', + 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', + 'Seoul, Korea Standard time' => 'Asia/Seoul', + 'Yakutsk' => 'Asia/Yakutsk', + 'Adelaide, Central Australia' => 'Australia/Adelaide', + 'Darwin' => 'Australia/Darwin', + 'Brisbane, East Australia' => 'Australia/Brisbane', + 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', + 'Guam, Port Moresby' => 'Pacific/Guam', + 'Hobart, Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', + 'Auckland, Wellington' => 'Pacific/Auckland', + 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', + 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde Is.' => 'Atlantic/Cape_Verde', + 'Mid-Atlantic' => 'America/Noronha', + 'Brasilia' => 'America/Sao_Paulo', // Best guess + 'Buenos Aires' => 'America/Argentina/Buenos_Aires', + 'Greenland' => 'America/Godthab', + 'Newfoundland' => 'America/St_Johns', + 'Atlantic Time (Canada)' => 'America/Halifax', + 'Caracas, La Paz' => 'America/Caracas', + 'Santiago' => 'America/Santiago', + 'Bogota, Lima, Quito' => 'America/Bogota', + 'Eastern Time (US & Canada)' => 'America/New_York', + 'Indiana (East)' => 'America/Indiana/Indianapolis', + 'Central America' => 'America/Guatemala', + 'Central Time (US & Canada)' => 'America/Chicago', + 'Mexico City, Tegucigalpa' => 'America/Mexico_City', + 'Saskatchewan' => 'America/Edmonton', + 'Arizona' => 'America/Phoenix', + 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess + 'Pacific Time (US & Canada)' => 'America/Los_Angeles', // Best guess + 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess + 'Alaska' => 'America/Anchorage', + 'Hawaii' => 'Pacific/Honolulu', + 'Midway Island, Samoa' => 'Pacific/Midway', + 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', ]; diff --git a/vendor/sabre/vobject/lib/timezonedata/lotuszones.php b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php index 4b50808f9..79d555a92 100644 --- a/vendor/sabre/vobject/lib/timezonedata/lotuszones.php +++ b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php @@ -8,94 +8,94 @@ * @license http://sabre.io/license/ Modified BSD License */ return [ - 'Dateline' => 'Etc/GMT-12', - 'Samoa' => 'Pacific/Apia', - 'Hawaiian' => 'Pacific/Honolulu', - 'Alaskan' => 'America/Anchorage', - 'Pacific' => 'America/Los_Angeles', - 'Pacific Standard Time' => 'America/Los_Angeles', + 'Dateline' => 'Etc/GMT-12', + 'Samoa' => 'Pacific/Apia', + 'Hawaiian' => 'Pacific/Honolulu', + 'Alaskan' => 'America/Anchorage', + 'Pacific' => 'America/Los_Angeles', + 'Pacific Standard Time' => 'America/Los_Angeles', 'Mexico Standard Time 2' => 'America/Chihuahua', - 'Mountain' => 'America/Denver', + 'Mountain' => 'America/Denver', // 'Mountain Standard Time' => 'America/Chihuahua', // conflict with windows timezones. - 'US Mountain' => 'America/Phoenix', - 'Canada Central' => 'America/Edmonton', + 'US Mountain' => 'America/Phoenix', + 'Canada Central' => 'America/Edmonton', 'Central America' => 'America/Guatemala', - 'Central' => 'America/Chicago', + 'Central' => 'America/Chicago', // 'Central Standard Time' => 'America/Mexico_City', // conflict with windows timezones. - 'Mexico' => 'America/Mexico_City', - 'Eastern' => 'America/New_York', - 'SA Pacific' => 'America/Bogota', - 'US Eastern' => 'America/Indiana/Indianapolis', - 'Venezuela' => 'America/Caracas', - 'Atlantic' => 'America/Halifax', + 'Mexico' => 'America/Mexico_City', + 'Eastern' => 'America/New_York', + 'SA Pacific' => 'America/Bogota', + 'US Eastern' => 'America/Indiana/Indianapolis', + 'Venezuela' => 'America/Caracas', + 'Atlantic' => 'America/Halifax', 'Central Brazilian' => 'America/Manaus', - 'Pacific SA' => 'America/Santiago', - 'SA Western' => 'America/La_Paz', - 'Newfoundland' => 'America/St_Johns', - 'Argentina' => 'America/Argentina/Buenos_Aires', - 'E. South America' => 'America/Belem', - 'Greenland' => 'America/Godthab', - 'Montevideo' => 'America/Montevideo', - 'SA Eastern' => 'America/Belem', + 'Pacific SA' => 'America/Santiago', + 'SA Western' => 'America/La_Paz', + 'Newfoundland' => 'America/St_Johns', + 'Argentina' => 'America/Argentina/Buenos_Aires', + 'E. South America' => 'America/Belem', + 'Greenland' => 'America/Godthab', + 'Montevideo' => 'America/Montevideo', + 'SA Eastern' => 'America/Belem', // 'Mid-Atlantic' => 'Etc/GMT-2', // conflict with windows timezones. - 'Azores' => 'Atlantic/Azores', - 'Cape Verde' => 'Atlantic/Cape_Verde', - 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. - 'Morocco' => 'Africa/Casablanca', - 'Central Europe' => 'Europe/Prague', - 'Central European' => 'Europe/Sarajevo', - 'Romance' => 'Europe/Paris', + 'Azores' => 'Atlantic/Azores', + 'Cape Verde' => 'Atlantic/Cape_Verde', + 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. + 'Morocco' => 'Africa/Casablanca', + 'Central Europe' => 'Europe/Prague', + 'Central European' => 'Europe/Sarajevo', + 'Romance' => 'Europe/Paris', 'W. Central Africa' => 'Africa/Lagos', // Best guess - 'W. Europe' => 'Europe/Amsterdam', - 'E. Europe' => 'Europe/Minsk', - 'Egypt' => 'Africa/Cairo', - 'FLE' => 'Europe/Helsinki', - 'GTB' => 'Europe/Athens', - 'Israel' => 'Asia/Jerusalem', - 'Jordan' => 'Asia/Amman', - 'Middle East' => 'Asia/Beirut', - 'Namibia' => 'Africa/Windhoek', - 'South Africa' => 'Africa/Harare', - 'Arab' => 'Asia/Kuwait', - 'Arabic' => 'Asia/Baghdad', - 'E. Africa' => 'Africa/Nairobi', - 'Georgian' => 'Asia/Tbilisi', - 'Russian' => 'Europe/Moscow', - 'Iran' => 'Asia/Tehran', - 'Arabian' => 'Asia/Muscat', - 'Armenian' => 'Asia/Yerevan', - 'Azerbijan' => 'Asia/Baku', - 'Caucasus' => 'Asia/Yerevan', - 'Mauritius' => 'Indian/Mauritius', - 'Afghanistan' => 'Asia/Kabul', - 'Ekaterinburg' => 'Asia/Yekaterinburg', - 'Pakistan' => 'Asia/Karachi', - 'West Asia' => 'Asia/Tashkent', - 'India' => 'Asia/Calcutta', - 'Sri Lanka' => 'Asia/Colombo', - 'Nepal' => 'Asia/Kathmandu', - 'Central Asia' => 'Asia/Dhaka', - 'N. Central Asia' => 'Asia/Almaty', - 'Myanmar' => 'Asia/Rangoon', - 'North Asia' => 'Asia/Krasnoyarsk', - 'SE Asia' => 'Asia/Bangkok', - 'China' => 'Asia/Shanghai', - 'North Asia East' => 'Asia/Irkutsk', - 'Singapore' => 'Asia/Singapore', - 'Taipei' => 'Asia/Taipei', - 'W. Australia' => 'Australia/Perth', - 'Korea' => 'Asia/Seoul', - 'Tokyo' => 'Asia/Tokyo', - 'Yakutsk' => 'Asia/Yakutsk', - 'AUS Central' => 'Australia/Darwin', - 'Cen. Australia' => 'Australia/Adelaide', - 'AUS Eastern' => 'Australia/Sydney', - 'E. Australia' => 'Australia/Brisbane', - 'Tasmania' => 'Australia/Hobart', - 'Vladivostok' => 'Asia/Vladivostok', - 'West Pacific' => 'Pacific/Guam', - 'Central Pacific' => 'Asia/Magadan', - 'Fiji' => 'Pacific/Fiji', - 'New Zealand' => 'Pacific/Auckland', - 'Tonga' => 'Pacific/Tongatapu', + 'W. Europe' => 'Europe/Amsterdam', + 'E. Europe' => 'Europe/Minsk', + 'Egypt' => 'Africa/Cairo', + 'FLE' => 'Europe/Helsinki', + 'GTB' => 'Europe/Athens', + 'Israel' => 'Asia/Jerusalem', + 'Jordan' => 'Asia/Amman', + 'Middle East' => 'Asia/Beirut', + 'Namibia' => 'Africa/Windhoek', + 'South Africa' => 'Africa/Harare', + 'Arab' => 'Asia/Kuwait', + 'Arabic' => 'Asia/Baghdad', + 'E. Africa' => 'Africa/Nairobi', + 'Georgian' => 'Asia/Tbilisi', + 'Russian' => 'Europe/Moscow', + 'Iran' => 'Asia/Tehran', + 'Arabian' => 'Asia/Muscat', + 'Armenian' => 'Asia/Yerevan', + 'Azerbijan' => 'Asia/Baku', + 'Caucasus' => 'Asia/Yerevan', + 'Mauritius' => 'Indian/Mauritius', + 'Afghanistan' => 'Asia/Kabul', + 'Ekaterinburg' => 'Asia/Yekaterinburg', + 'Pakistan' => 'Asia/Karachi', + 'West Asia' => 'Asia/Tashkent', + 'India' => 'Asia/Calcutta', + 'Sri Lanka' => 'Asia/Colombo', + 'Nepal' => 'Asia/Kathmandu', + 'Central Asia' => 'Asia/Dhaka', + 'N. Central Asia' => 'Asia/Almaty', + 'Myanmar' => 'Asia/Rangoon', + 'North Asia' => 'Asia/Krasnoyarsk', + 'SE Asia' => 'Asia/Bangkok', + 'China' => 'Asia/Shanghai', + 'North Asia East' => 'Asia/Irkutsk', + 'Singapore' => 'Asia/Singapore', + 'Taipei' => 'Asia/Taipei', + 'W. Australia' => 'Australia/Perth', + 'Korea' => 'Asia/Seoul', + 'Tokyo' => 'Asia/Tokyo', + 'Yakutsk' => 'Asia/Yakutsk', + 'AUS Central' => 'Australia/Darwin', + 'Cen. Australia' => 'Australia/Adelaide', + 'AUS Eastern' => 'Australia/Sydney', + 'E. Australia' => 'Australia/Brisbane', + 'Tasmania' => 'Australia/Hobart', + 'Vladivostok' => 'Asia/Vladivostok', + 'West Pacific' => 'Pacific/Guam', + 'Central Pacific' => 'Asia/Magadan', + 'Fiji' => 'Pacific/Fiji', + 'New Zealand' => 'Pacific/Auckland', + 'Tonga' => 'Pacific/Tongatapu', ]; diff --git a/vendor/sabre/vobject/lib/timezonedata/php-workaround.php b/vendor/sabre/vobject/lib/timezonedata/php-workaround.php index 13ff4b302..6b9cb6ef7 100644 --- a/vendor/sabre/vobject/lib/timezonedata/php-workaround.php +++ b/vendor/sabre/vobject/lib/timezonedata/php-workaround.php @@ -15,32 +15,32 @@ * @license http://sabre.io/license/ Modified BSD License */ return [ - 'CST6CDT' => 'America/Chicago', - 'Cuba' => 'America/Havana', - 'Egypt' => 'Africa/Cairo', - 'Eire' => 'Europe/Dublin', - 'EST5EDT' => 'America/New_York', - 'Factory' => 'UTC', - 'GB-Eire' => 'Europe/London', - 'GMT0' => 'UTC', + 'CST6CDT' => 'America/Chicago', + 'Cuba' => 'America/Havana', + 'Egypt' => 'Africa/Cairo', + 'Eire' => 'Europe/Dublin', + 'EST5EDT' => 'America/New_York', + 'Factory' => 'UTC', + 'GB-Eire' => 'Europe/London', + 'GMT0' => 'UTC', 'Greenwich' => 'UTC', - 'Hongkong' => 'Asia/Hong_Kong', - 'Iceland' => 'Atlantic/Reykjavik', - 'Iran' => 'Asia/Tehran', - 'Israel' => 'Asia/Jerusalem', - 'Jamaica' => 'America/Jamaica', - 'Japan' => 'Asia/Tokyo', + 'Hongkong' => 'Asia/Hong_Kong', + 'Iceland' => 'Atlantic/Reykjavik', + 'Iran' => 'Asia/Tehran', + 'Israel' => 'Asia/Jerusalem', + 'Jamaica' => 'America/Jamaica', + 'Japan' => 'Asia/Tokyo', 'Kwajalein' => 'Pacific/Kwajalein', - 'Libya' => 'Africa/Tripoli', - 'MST7MDT' => 'America/Denver', - 'Navajo' => 'America/Denver', - 'NZ-CHAT' => 'Pacific/Chatham', - 'Poland' => 'Europe/Warsaw', - 'Portugal' => 'Europe/Lisbon', - 'PST8PDT' => 'America/Los_Angeles', + 'Libya' => 'Africa/Tripoli', + 'MST7MDT' => 'America/Denver', + 'Navajo' => 'America/Denver', + 'NZ-CHAT' => 'Pacific/Chatham', + 'Poland' => 'Europe/Warsaw', + 'Portugal' => 'Europe/Lisbon', + 'PST8PDT' => 'America/Los_Angeles', 'Singapore' => 'Asia/Singapore', - 'Turkey' => 'Europe/Istanbul', + 'Turkey' => 'Europe/Istanbul', 'Universal' => 'UTC', - 'W-SU' => 'Europe/Moscow', - 'Zulu' => 'UTC', + 'W-SU' => 'Europe/Moscow', + 'Zulu' => 'UTC', ]; diff --git a/vendor/sabre/vobject/lib/timezonedata/windowszones.php b/vendor/sabre/vobject/lib/timezonedata/windowszones.php index af3904b12..29f3a6cb8 100644 --- a/vendor/sabre/vobject/lib/timezonedata/windowszones.php +++ b/vendor/sabre/vobject/lib/timezonedata/windowszones.php @@ -1,7 +1,7 @@ <?php /** - * Automatically generated timezone file. + * Automatically generated timezone file * * Last update: 2016-08-24T17:35:38-04:00 * Source: http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml @@ -11,133 +11,133 @@ */ return [ - 'AUS Central Standard Time' => 'Australia/Darwin', - 'AUS Eastern Standard Time' => 'Australia/Sydney', - 'Afghanistan Standard Time' => 'Asia/Kabul', - 'Alaskan Standard Time' => 'America/Anchorage', - 'Aleutian Standard Time' => 'America/Adak', - 'Altai Standard Time' => 'Asia/Barnaul', - 'Arab Standard Time' => 'Asia/Riyadh', - 'Arabian Standard Time' => 'Asia/Dubai', - 'Arabic Standard Time' => 'Asia/Baghdad', - 'Argentina Standard Time' => 'America/Buenos_Aires', - 'Astrakhan Standard Time' => 'Europe/Astrakhan', - 'Atlantic Standard Time' => 'America/Halifax', - 'Aus Central W. Standard Time' => 'Australia/Eucla', - 'Azerbaijan Standard Time' => 'Asia/Baku', - 'Azores Standard Time' => 'Atlantic/Azores', - 'Bahia Standard Time' => 'America/Bahia', - 'Bangladesh Standard Time' => 'Asia/Dhaka', - 'Belarus Standard Time' => 'Europe/Minsk', - 'Bougainville Standard Time' => 'Pacific/Bougainville', - 'Canada Central Standard Time' => 'America/Regina', - 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde', - 'Caucasus Standard Time' => 'Asia/Yerevan', - 'Cen. Australia Standard Time' => 'Australia/Adelaide', - 'Central America Standard Time' => 'America/Guatemala', - 'Central Asia Standard Time' => 'Asia/Almaty', + 'AUS Central Standard Time' => 'Australia/Darwin', + 'AUS Eastern Standard Time' => 'Australia/Sydney', + 'Afghanistan Standard Time' => 'Asia/Kabul', + 'Alaskan Standard Time' => 'America/Anchorage', + 'Aleutian Standard Time' => 'America/Adak', + 'Altai Standard Time' => 'Asia/Barnaul', + 'Arab Standard Time' => 'Asia/Riyadh', + 'Arabian Standard Time' => 'Asia/Dubai', + 'Arabic Standard Time' => 'Asia/Baghdad', + 'Argentina Standard Time' => 'America/Buenos_Aires', + 'Astrakhan Standard Time' => 'Europe/Astrakhan', + 'Atlantic Standard Time' => 'America/Halifax', + 'Aus Central W. Standard Time' => 'Australia/Eucla', + 'Azerbaijan Standard Time' => 'Asia/Baku', + 'Azores Standard Time' => 'Atlantic/Azores', + 'Bahia Standard Time' => 'America/Bahia', + 'Bangladesh Standard Time' => 'Asia/Dhaka', + 'Belarus Standard Time' => 'Europe/Minsk', + 'Bougainville Standard Time' => 'Pacific/Bougainville', + 'Canada Central Standard Time' => 'America/Regina', + 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde', + 'Caucasus Standard Time' => 'Asia/Yerevan', + 'Cen. Australia Standard Time' => 'Australia/Adelaide', + 'Central America Standard Time' => 'America/Guatemala', + 'Central Asia Standard Time' => 'Asia/Almaty', 'Central Brazilian Standard Time' => 'America/Cuiaba', - 'Central Europe Standard Time' => 'Europe/Budapest', - 'Central European Standard Time' => 'Europe/Warsaw', - 'Central Pacific Standard Time' => 'Pacific/Guadalcanal', - 'Central Standard Time' => 'America/Chicago', - 'Central Standard Time (Mexico)' => 'America/Mexico_City', - 'Chatham Islands Standard Time' => 'Pacific/Chatham', - 'China Standard Time' => 'Asia/Shanghai', - 'Cuba Standard Time' => 'America/Havana', - 'Dateline Standard Time' => 'Etc/GMT+12', - 'E. Africa Standard Time' => 'Africa/Nairobi', - 'E. Australia Standard Time' => 'Australia/Brisbane', - 'E. Europe Standard Time' => 'Europe/Chisinau', - 'E. South America Standard Time' => 'America/Sao_Paulo', - 'Easter Island Standard Time' => 'Pacific/Easter', - 'Eastern Standard Time' => 'America/New_York', - 'Eastern Standard Time (Mexico)' => 'America/Cancun', - 'Egypt Standard Time' => 'Africa/Cairo', - 'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg', - 'FLE Standard Time' => 'Europe/Kiev', - 'Fiji Standard Time' => 'Pacific/Fiji', - 'GMT Standard Time' => 'Europe/London', - 'GTB Standard Time' => 'Europe/Bucharest', - 'Georgian Standard Time' => 'Asia/Tbilisi', - 'Greenland Standard Time' => 'America/Godthab', - 'Greenwich Standard Time' => 'Atlantic/Reykjavik', - 'Haiti Standard Time' => 'America/Port-au-Prince', - 'Hawaiian Standard Time' => 'Pacific/Honolulu', - 'India Standard Time' => 'Asia/Calcutta', - 'Iran Standard Time' => 'Asia/Tehran', - 'Israel Standard Time' => 'Asia/Jerusalem', - 'Jordan Standard Time' => 'Asia/Amman', - 'Kaliningrad Standard Time' => 'Europe/Kaliningrad', - 'Korea Standard Time' => 'Asia/Seoul', - 'Libya Standard Time' => 'Africa/Tripoli', - 'Line Islands Standard Time' => 'Pacific/Kiritimati', - 'Lord Howe Standard Time' => 'Australia/Lord_Howe', - 'Magadan Standard Time' => 'Asia/Magadan', - 'Marquesas Standard Time' => 'Pacific/Marquesas', - 'Mauritius Standard Time' => 'Indian/Mauritius', - 'Middle East Standard Time' => 'Asia/Beirut', - 'Montevideo Standard Time' => 'America/Montevideo', - 'Morocco Standard Time' => 'Africa/Casablanca', - 'Mountain Standard Time' => 'America/Denver', + 'Central Europe Standard Time' => 'Europe/Budapest', + 'Central European Standard Time' => 'Europe/Warsaw', + 'Central Pacific Standard Time' => 'Pacific/Guadalcanal', + 'Central Standard Time' => 'America/Chicago', + 'Central Standard Time (Mexico)' => 'America/Mexico_City', + 'Chatham Islands Standard Time' => 'Pacific/Chatham', + 'China Standard Time' => 'Asia/Shanghai', + 'Cuba Standard Time' => 'America/Havana', + 'Dateline Standard Time' => 'Etc/GMT+12', + 'E. Africa Standard Time' => 'Africa/Nairobi', + 'E. Australia Standard Time' => 'Australia/Brisbane', + 'E. Europe Standard Time' => 'Europe/Chisinau', + 'E. South America Standard Time' => 'America/Sao_Paulo', + 'Easter Island Standard Time' => 'Pacific/Easter', + 'Eastern Standard Time' => 'America/New_York', + 'Eastern Standard Time (Mexico)' => 'America/Cancun', + 'Egypt Standard Time' => 'Africa/Cairo', + 'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg', + 'FLE Standard Time' => 'Europe/Kiev', + 'Fiji Standard Time' => 'Pacific/Fiji', + 'GMT Standard Time' => 'Europe/London', + 'GTB Standard Time' => 'Europe/Bucharest', + 'Georgian Standard Time' => 'Asia/Tbilisi', + 'Greenland Standard Time' => 'America/Godthab', + 'Greenwich Standard Time' => 'Atlantic/Reykjavik', + 'Haiti Standard Time' => 'America/Port-au-Prince', + 'Hawaiian Standard Time' => 'Pacific/Honolulu', + 'India Standard Time' => 'Asia/Calcutta', + 'Iran Standard Time' => 'Asia/Tehran', + 'Israel Standard Time' => 'Asia/Jerusalem', + 'Jordan Standard Time' => 'Asia/Amman', + 'Kaliningrad Standard Time' => 'Europe/Kaliningrad', + 'Korea Standard Time' => 'Asia/Seoul', + 'Libya Standard Time' => 'Africa/Tripoli', + 'Line Islands Standard Time' => 'Pacific/Kiritimati', + 'Lord Howe Standard Time' => 'Australia/Lord_Howe', + 'Magadan Standard Time' => 'Asia/Magadan', + 'Marquesas Standard Time' => 'Pacific/Marquesas', + 'Mauritius Standard Time' => 'Indian/Mauritius', + 'Middle East Standard Time' => 'Asia/Beirut', + 'Montevideo Standard Time' => 'America/Montevideo', + 'Morocco Standard Time' => 'Africa/Casablanca', + 'Mountain Standard Time' => 'America/Denver', 'Mountain Standard Time (Mexico)' => 'America/Chihuahua', - 'Myanmar Standard Time' => 'Asia/Rangoon', - 'N. Central Asia Standard Time' => 'Asia/Novosibirsk', - 'Namibia Standard Time' => 'Africa/Windhoek', - 'Nepal Standard Time' => 'Asia/Katmandu', - 'New Zealand Standard Time' => 'Pacific/Auckland', - 'Newfoundland Standard Time' => 'America/St_Johns', - 'Norfolk Standard Time' => 'Pacific/Norfolk', - 'North Asia East Standard Time' => 'Asia/Irkutsk', - 'North Asia Standard Time' => 'Asia/Krasnoyarsk', - 'North Korea Standard Time' => 'Asia/Pyongyang', - 'Pacific SA Standard Time' => 'America/Santiago', - 'Pacific Standard Time' => 'America/Los_Angeles', - 'Pacific Standard Time (Mexico)' => 'America/Tijuana', - 'Pakistan Standard Time' => 'Asia/Karachi', - 'Paraguay Standard Time' => 'America/Asuncion', - 'Romance Standard Time' => 'Europe/Paris', - 'Russia Time Zone 10' => 'Asia/Srednekolymsk', - 'Russia Time Zone 11' => 'Asia/Kamchatka', - 'Russia Time Zone 3' => 'Europe/Samara', - 'Russian Standard Time' => 'Europe/Moscow', - 'SA Eastern Standard Time' => 'America/Cayenne', - 'SA Pacific Standard Time' => 'America/Bogota', - 'SA Western Standard Time' => 'America/La_Paz', - 'SE Asia Standard Time' => 'Asia/Bangkok', - 'Saint Pierre Standard Time' => 'America/Miquelon', - 'Sakhalin Standard Time' => 'Asia/Sakhalin', - 'Samoa Standard Time' => 'Pacific/Apia', - 'Singapore Standard Time' => 'Asia/Singapore', - 'South Africa Standard Time' => 'Africa/Johannesburg', - 'Sri Lanka Standard Time' => 'Asia/Colombo', - 'Syria Standard Time' => 'Asia/Damascus', - 'Taipei Standard Time' => 'Asia/Taipei', - 'Tasmania Standard Time' => 'Australia/Hobart', - 'Tocantins Standard Time' => 'America/Araguaina', - 'Tokyo Standard Time' => 'Asia/Tokyo', - 'Tomsk Standard Time' => 'Asia/Tomsk', - 'Tonga Standard Time' => 'Pacific/Tongatapu', - 'Transbaikal Standard Time' => 'Asia/Chita', - 'Turkey Standard Time' => 'Europe/Istanbul', - 'Turks And Caicos Standard Time' => 'America/Grand_Turk', - 'US Eastern Standard Time' => 'America/Indianapolis', - 'US Mountain Standard Time' => 'America/Phoenix', - 'UTC' => 'Etc/GMT', - 'UTC+12' => 'Etc/GMT-12', - 'UTC-02' => 'Etc/GMT+2', - 'UTC-08' => 'Etc/GMT+8', - 'UTC-09' => 'Etc/GMT+9', - 'UTC-11' => 'Etc/GMT+11', - 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar', - 'Venezuela Standard Time' => 'America/Caracas', - 'Vladivostok Standard Time' => 'Asia/Vladivostok', - 'W. Australia Standard Time' => 'Australia/Perth', + 'Myanmar Standard Time' => 'Asia/Rangoon', + 'N. Central Asia Standard Time' => 'Asia/Novosibirsk', + 'Namibia Standard Time' => 'Africa/Windhoek', + 'Nepal Standard Time' => 'Asia/Katmandu', + 'New Zealand Standard Time' => 'Pacific/Auckland', + 'Newfoundland Standard Time' => 'America/St_Johns', + 'Norfolk Standard Time' => 'Pacific/Norfolk', + 'North Asia East Standard Time' => 'Asia/Irkutsk', + 'North Asia Standard Time' => 'Asia/Krasnoyarsk', + 'North Korea Standard Time' => 'Asia/Pyongyang', + 'Pacific SA Standard Time' => 'America/Santiago', + 'Pacific Standard Time' => 'America/Los_Angeles', + 'Pacific Standard Time (Mexico)' => 'America/Tijuana', + 'Pakistan Standard Time' => 'Asia/Karachi', + 'Paraguay Standard Time' => 'America/Asuncion', + 'Romance Standard Time' => 'Europe/Paris', + 'Russia Time Zone 10' => 'Asia/Srednekolymsk', + 'Russia Time Zone 11' => 'Asia/Kamchatka', + 'Russia Time Zone 3' => 'Europe/Samara', + 'Russian Standard Time' => 'Europe/Moscow', + 'SA Eastern Standard Time' => 'America/Cayenne', + 'SA Pacific Standard Time' => 'America/Bogota', + 'SA Western Standard Time' => 'America/La_Paz', + 'SE Asia Standard Time' => 'Asia/Bangkok', + 'Saint Pierre Standard Time' => 'America/Miquelon', + 'Sakhalin Standard Time' => 'Asia/Sakhalin', + 'Samoa Standard Time' => 'Pacific/Apia', + 'Singapore Standard Time' => 'Asia/Singapore', + 'South Africa Standard Time' => 'Africa/Johannesburg', + 'Sri Lanka Standard Time' => 'Asia/Colombo', + 'Syria Standard Time' => 'Asia/Damascus', + 'Taipei Standard Time' => 'Asia/Taipei', + 'Tasmania Standard Time' => 'Australia/Hobart', + 'Tocantins Standard Time' => 'America/Araguaina', + 'Tokyo Standard Time' => 'Asia/Tokyo', + 'Tomsk Standard Time' => 'Asia/Tomsk', + 'Tonga Standard Time' => 'Pacific/Tongatapu', + 'Transbaikal Standard Time' => 'Asia/Chita', + 'Turkey Standard Time' => 'Europe/Istanbul', + 'Turks And Caicos Standard Time' => 'America/Grand_Turk', + 'US Eastern Standard Time' => 'America/Indianapolis', + 'US Mountain Standard Time' => 'America/Phoenix', + 'UTC' => 'Etc/GMT', + 'UTC+12' => 'Etc/GMT-12', + 'UTC-02' => 'Etc/GMT+2', + 'UTC-08' => 'Etc/GMT+8', + 'UTC-09' => 'Etc/GMT+9', + 'UTC-11' => 'Etc/GMT+11', + 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar', + 'Venezuela Standard Time' => 'America/Caracas', + 'Vladivostok Standard Time' => 'Asia/Vladivostok', + 'W. Australia Standard Time' => 'Australia/Perth', 'W. Central Africa Standard Time' => 'Africa/Lagos', - 'W. Europe Standard Time' => 'Europe/Berlin', - 'W. Mongolia Standard Time' => 'Asia/Hovd', - 'West Asia Standard Time' => 'Asia/Tashkent', - 'West Bank Standard Time' => 'Asia/Hebron', - 'West Pacific Standard Time' => 'Pacific/Port_Moresby', - 'Yakutsk Standard Time' => 'Asia/Yakutsk', + 'W. Europe Standard Time' => 'Europe/Berlin', + 'W. Mongolia Standard Time' => 'Asia/Hovd', + 'West Asia Standard Time' => 'Asia/Tashkent', + 'West Bank Standard Time' => 'Asia/Hebron', + 'West Pacific Standard Time' => 'Pacific/Port_Moresby', + 'Yakutsk Standard Time' => 'Asia/Yakutsk', ]; diff --git a/vendor/sabre/vobject/tests/bootstrap.php b/vendor/sabre/vobject/tests/bootstrap.php index 46e9014cb..14281e218 100644 --- a/vendor/sabre/vobject/tests/bootstrap.php +++ b/vendor/sabre/vobject/tests/bootstrap.php @@ -3,8 +3,8 @@ date_default_timezone_set('UTC'); $try = [ - __DIR__.'/../vendor/autoload.php', - __DIR__.'/../../../autoload.php', + __DIR__ . '/../vendor/autoload.php', + __DIR__ . '/../../../autoload.php', ]; foreach ($try as $path) { @@ -14,12 +14,12 @@ foreach ($try as $path) { } } -$autoLoader->addPsr4('Sabre\\VObject\\', __DIR__.'/VObject'); +$autoLoader->addPsr4('Sabre\\VObject\\', __DIR__ . '/VObject'); if (!defined('SABRE_TEMPDIR')) { - define('SABRE_TEMPDIR', __DIR__.'/temp/'); + define('SABRE_TEMPDIR', __DIR__ . '/temp/'); } if (!file_exists(SABRE_TEMPDIR)) { - mkdir(SABRE_TEMPDIR); + mkdir(SABRE_TEMPDIR); } |