100 lines
2.2 KiB
PHP
100 lines
2.2 KiB
PHP
<?php
|
|
/* ===========================================================================
|
|
* Copyright (c) 2018-2019 Zindex Software
|
|
*
|
|
* Licensed under the MIT License
|
|
* =========================================================================== */
|
|
|
|
namespace Opis\Closure;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
class ClosureStream
|
|
{
|
|
const STREAM_PROTO = 'closure';
|
|
|
|
protected static $isRegistered = false;
|
|
|
|
protected $content;
|
|
|
|
protected $length;
|
|
|
|
protected $pointer = 0;
|
|
|
|
function stream_open($path, $mode, $options, &$opened_path)
|
|
{
|
|
$this->content = "<?php\nreturn " . substr($path, strlen(static::STREAM_PROTO . '://')) . ";";
|
|
$this->length = strlen($this->content);
|
|
return true;
|
|
}
|
|
|
|
public function stream_read($count)
|
|
{
|
|
$value = substr($this->content, $this->pointer, $count);
|
|
$this->pointer += $count;
|
|
return $value;
|
|
}
|
|
|
|
public function stream_eof()
|
|
{
|
|
return $this->pointer >= $this->length;
|
|
}
|
|
|
|
public function stream_set_option($option, $arg1, $arg2)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public function stream_stat()
|
|
{
|
|
$stat = stat(__FILE__);
|
|
$stat[7] = $stat['size'] = $this->length;
|
|
return $stat;
|
|
}
|
|
|
|
public function url_stat($path, $flags)
|
|
{
|
|
$stat = stat(__FILE__);
|
|
$stat[7] = $stat['size'] = $this->length;
|
|
return $stat;
|
|
}
|
|
|
|
public function stream_seek($offset, $whence = SEEK_SET)
|
|
{
|
|
$crt = $this->pointer;
|
|
|
|
switch ($whence) {
|
|
case SEEK_SET:
|
|
$this->pointer = $offset;
|
|
break;
|
|
case SEEK_CUR:
|
|
$this->pointer += $offset;
|
|
break;
|
|
case SEEK_END:
|
|
$this->pointer = $this->length + $offset;
|
|
break;
|
|
}
|
|
|
|
if ($this->pointer < 0 || $this->pointer >= $this->length) {
|
|
$this->pointer = $crt;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function stream_tell()
|
|
{
|
|
return $this->pointer;
|
|
}
|
|
|
|
public static function register()
|
|
{
|
|
if (!static::$isRegistered) {
|
|
static::$isRegistered = stream_wrapper_register(static::STREAM_PROTO, __CLASS__);
|
|
}
|
|
}
|
|
|
|
}
|