299 lines
5.2 KiB
PHP
299 lines
5.2 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage FileSystem
|
||
|
*
|
||
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||
|
* @license GNU General Public License version 2 or later; see LICENSE
|
||
|
*/
|
||
|
|
||
|
defined('JPATH_PLATFORM') or die;
|
||
|
|
||
|
jimport('joomla.filesystem.support.stringcontroller');
|
||
|
|
||
|
/**
|
||
|
* String Stream Wrapper
|
||
|
*
|
||
|
* This class allows you to use a PHP string in the same way that
|
||
|
* you would normally use a regular stream wrapper
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage FileSystem
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JStreamString
|
||
|
{
|
||
|
/**
|
||
|
* The current string
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $currentString;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* The path
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $path;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* The mode
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $mode;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Enter description here ...
|
||
|
* @var string
|
||
|
*
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $options;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Enter description here ...
|
||
|
* @var string
|
||
|
*
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $openedPath;
|
||
|
|
||
|
/**
|
||
|
* Current position
|
||
|
*
|
||
|
* @var integer
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $pos;
|
||
|
|
||
|
/**
|
||
|
* Length of the string
|
||
|
*
|
||
|
* @var string
|
||
|
*
|
||
|
* @since 12.1
|
||
|
*/
|
||
|
protected $len;
|
||
|
|
||
|
/**
|
||
|
* Statistics for a file
|
||
|
*
|
||
|
* @var array
|
||
|
* @since 12.1
|
||
|
*
|
||
|
* @see http://us.php.net/manual/en/function.stat.php
|
||
|
*/
|
||
|
protected $stat;
|
||
|
|
||
|
/**
|
||
|
* Method to open a file or URL.
|
||
|
*
|
||
|
* @param string $path The stream path.
|
||
|
* @param string $mode Not used.
|
||
|
* @param integer $options Not used.
|
||
|
* @param string &$opened_path Not used.
|
||
|
*
|
||
|
* @return boolean
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stream_open($path, $mode, $options, &$opened_path)
|
||
|
{
|
||
|
$this->currentString = &JStringController::getRef(str_replace('string://', '', $path));
|
||
|
|
||
|
if ($this->currentString)
|
||
|
{
|
||
|
$this->len = strlen($this->currentString);
|
||
|
$this->pos = 0;
|
||
|
$this->stat = $this->url_stat($path, 0);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to retrieve information from a file resource
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @see http://www.php.net/manual/en/streamwrapper.stream-stat.php
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stream_stat()
|
||
|
{
|
||
|
return $this->stat;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to retrieve information about a file.
|
||
|
*
|
||
|
* @param string $path File path or URL to stat
|
||
|
* @param integer $flags Additional flags set by the streams API
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @see http://php.net/manual/en/streamwrapper.url-stat.php
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function url_stat($path, $flags = 0)
|
||
|
{
|
||
|
$now = time();
|
||
|
$string = &JStringController::getRef(str_replace('string://', '', $path));
|
||
|
$stat = array(
|
||
|
'dev' => 0,
|
||
|
'ino' => 0,
|
||
|
'mode' => 0,
|
||
|
'nlink' => 1,
|
||
|
'uid' => 0,
|
||
|
'gid' => 0,
|
||
|
'rdev' => 0,
|
||
|
'size' => strlen($string),
|
||
|
'atime' => $now,
|
||
|
'mtime' => $now,
|
||
|
'ctime' => $now,
|
||
|
'blksize' => '512',
|
||
|
'blocks' => ceil(strlen($string) / 512));
|
||
|
|
||
|
return $stat;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to read a given number of bytes starting at the current position
|
||
|
* and moving to the end of the string defined by the current position plus the
|
||
|
* given number.
|
||
|
*
|
||
|
* @param integer $count Bytes of data from the current position should be returned.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*
|
||
|
* @see http://www.php.net/manual/en/streamwrapper.stream-read.php
|
||
|
*/
|
||
|
public function stream_read($count)
|
||
|
{
|
||
|
$result = substr($this->currentString, $this->pos, $count);
|
||
|
$this->pos += $count;
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stream write, always returning false.
|
||
|
*
|
||
|
* @param string $data The data to write.
|
||
|
*
|
||
|
* @return boolean
|
||
|
*
|
||
|
* @since 11.1
|
||
|
* @note Updating the string is not supported.
|
||
|
*/
|
||
|
public function stream_write($data)
|
||
|
{
|
||
|
// We don't support updating the string.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Method to get the current position
|
||
|
*
|
||
|
* @return integer The position
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stream_tell()
|
||
|
{
|
||
|
return $this->pos;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* End of field check
|
||
|
*
|
||
|
* @return boolean True if at end of field.
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stream_eof()
|
||
|
{
|
||
|
if ($this->pos > $this->len)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stream offset
|
||
|
*
|
||
|
* @param integer $offset The starting offset.
|
||
|
* @param integer $whence SEEK_SET, SEEK_CUR, SEEK_END
|
||
|
*
|
||
|
* @return boolean True on success.
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function stream_seek($offset, $whence)
|
||
|
{
|
||
|
// $whence: SEEK_SET, SEEK_CUR, SEEK_END
|
||
|
if ($offset > $this->len)
|
||
|
{
|
||
|
// We can't seek beyond our len.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
switch ($whence)
|
||
|
{
|
||
|
case SEEK_SET:
|
||
|
$this->pos = $offset;
|
||
|
break;
|
||
|
|
||
|
case SEEK_CUR:
|
||
|
if (($this->pos + $offset) < $this->len)
|
||
|
{
|
||
|
$this->pos += $offset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case SEEK_END:
|
||
|
$this->pos = $this->len - $offset;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stream flush, always returns true.
|
||
|
*
|
||
|
* @return boolean
|
||
|
*
|
||
|
* @since 11.1
|
||
|
* @note Data storage is not supported
|
||
|
*/
|
||
|
public function stream_flush()
|
||
|
{
|
||
|
// We don't store data.
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
stream_wrapper_register('string', 'JStreamString') or die('JStreamString Wrapper Registration Failed');
|