Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
14 / 14
CRAP
100.00% covered (success)
100.00%
39 / 39
FileHandler
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
14 / 14
17
100.00% covered (success)
100.00%
39 / 39
 setFile(File $file)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 write($data)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
9 / 9
 read($bytes)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 position($position = null)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
 seekToEnd()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 offsetPosition($offset)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 atEof()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 truncate($newSize = 0)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 setReadOnlyMode()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setReadWriteMode()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setWriteOnlyMode()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 isOpenedForWriting()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 isOpenedForReading()
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 lock($resource, $operation)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
<?php
/*
 * This file is part of the php-vfs package.
 *
 * (c) Michael Donat <michael.donat@me.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace VirtualFileSystem\Wrapper;
use VirtualFileSystem\Structure\File;
/**
 * User as file handle by streamWrapper implementation.
 *
 * This class is responsible mainly for managing the pointer position during reading and writing.
 *
 * @author Michael Donat <michael.donat@me.com>
 * @package php-vfs
 */
class FileHandler
{
    const READ_MODE     = 1;
    const WRITE_MODE    = 2;
    protected $position = 0;
    protected $mode = 0;
    /**
     * @var File
     */
    protected $file;
    /**
     * Sets file in context.
     *
     * @param File $file
     */
    public function setFile(File $file)
    {
        $this->file = $file;
    }
    /**
     * Writes data to file. Will return the number of bytes written. Will advance pointer by number of bytes written.
     *
     * @param string $data
     *
     * @return int
     */
    public function write($data)
    {
        $content = $this->file->data();
        $content = substr($content, 0, $this->position());
        $content .= $data;
        $this->file->setData($content);
        $written = strlen($data);
        $this->offsetPosition($written);
        $this->file->setModificationTime(time());
        $this->file->setChangeTime(time());
        return $written;
    }
    /**
     * Will read and return $bytes bytes from file. Will advance pointer by $bytes bytes.
     *
     * @param int $bytes
     *
     * @return string
     */
    public function read($bytes)
    {
        $content = $this->file->data();
        $return = substr($content, $this->position(), $bytes);
        $newPosition = $this->position()+$bytes;
        $newPosition = $newPosition > strlen($content) ? strlen($content) : $newPosition;
        $this->position($newPosition);
        $this->file->setAccessTime(time());
        return $return;
    }
    /**
     * Returns current pointer position.
     *
     * @param integer $position
     *
     * @return int
     */
    public function position($position = null)
    {
        return is_null($position) ? $this->position : $this->position = $position;
    }
    /**
     * Moves pointer to the end of file (for append modes).
     *
     * @return int
     */
    public function seekToEnd()
    {
        return $this->position(strlen($this->file->data()));
    }
    /**
     * Offsets position by $offset
     *
     * @param int $offset
     */
    public function offsetPosition($offset)
    {
        $this->position += $offset;
    }
    /**
     * Tells whether pointer is at the end of file.
     *
     * @return bool
     */
    public function atEof()
    {
        return $this->position() >= strlen($this->file->data());
    }
    /**
     * Removed all data from file and sets pointer to 0
     *
     * @param int $newSize
     *
     * @return void
     */
    public function truncate($newSize = 0)
    {
        $this->position(0);
        $newData = substr($this->file->data(), 0, $newSize);
        $newData = false === $newData ? '' : $newData;
        $this->file->setData($newData);
        $this->file->setModificationTime(time());
        $this->file->setChangeTime(time());
        return;
    }
    /**
     * Sets handler to read only
     */
    public function setReadOnlyMode()
    {
        $this->mode = self::READ_MODE;
    }
    /**
     * Sets handler into read/write mode
     */
    public function setReadWriteMode()
    {
        $this->mode = self::READ_MODE | self::WRITE_MODE;
    }
    public function setWriteOnlyMode()
    {
        $this->mode = self::WRITE_MODE;
    }
    /**
     * Checks if pointer allows writing
     *
     * @return bool
     */
    public function isOpenedForWriting()
    {
        return (bool) ($this->mode & self::WRITE_MODE);
    }
    /**
     * Checks if pointer allows reading
     *
     * @return bool
     */
    public function isOpenedForReading()
    {
        return (bool) ($this->mode & self::READ_MODE);
    }
    /**
     * @param  $resource
     */
    public function lock($resource, $operation)
    {
        return $this->file->lock($resource, $operation);
    }
}