FestinHegre/vendor/symfony/intl/Util/GzipStreamWrapper.php

84 lines
2.2 KiB
PHP
Raw Normal View History

2024-09-26 17:26:04 +02:00
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Util;
/**
* @internal
*/
class GzipStreamWrapper
{
/** @var resource|null */
public $context;
/** @var resource */
private $handle;
private string $path;
public static function require(string $path): array
{
if (!\extension_loaded('zlib')) {
throw new \LogicException(sprintf('The "zlib" extension is required to load the "%s/%s" map, please enable it in your php.ini file.', basename(\dirname($path)), basename($path)));
}
if (!\function_exists('opcache_is_script_cached') || !@opcache_is_script_cached($path)) {
stream_wrapper_unregister('file');
stream_wrapper_register('file', self::class);
}
return require $path;
}
public function stream_open(string $path, string $mode): bool
{
stream_wrapper_restore('file');
$this->path = $path;
return false !== $this->handle = fopen('compress.zlib://'.$path, $mode);
}
public function stream_read(int $count): string|false
{
return fread($this->handle, $count);
}
public function stream_eof(): bool
{
return feof($this->handle);
}
public function stream_set_option(int $option, int $arg1, int $arg2): bool
{
return match ($option) {
\STREAM_OPTION_BLOCKING => stream_set_blocking($this->handle, $arg1),
\STREAM_OPTION_READ_TIMEOUT => stream_set_timeout($this->handle, $arg1, $arg2),
\STREAM_OPTION_WRITE_BUFFER => 0 === stream_set_write_buffer($this->handle, $arg2),
default => false,
};
}
public function stream_stat(): array|false
{
if (!$stat = stat($this->path)) {
return false;
}
$h = fopen($this->path, 'r');
fseek($h, -4, \SEEK_END);
$size = unpack('V', fread($h, 4));
fclose($h);
$stat[7] = $stat['size'] = end($size);
return $stat;
}
}