<?php
/**
 * This file is part of the StreamHitching package.
 * (c) 2010 Christian Schaefer <caefer@ical.ly>>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @package    StreamHitching
 * @author     Christian Schaefer <caefer@ical.ly>
 * @version    SVN: $Id: $
 */

/**
 * Stream wrapper for read only access of a local file.
 *
 * @package    StreamHitching
 * @subpackage wrapper
 * @author     Christian Schaefer <caefer@ical.ly>
 */
class Stream_Wrapper_ReadOnlyFile_Mock implements Stream_Wrapper_ReadOnlyFile_Interface
{
  public $context;
  private $position = 0;
  public $content = '001 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
002 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
003 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
004 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
005 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
006 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
007 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
008 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
009 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
010 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
011 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
012 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
013 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
014 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
015 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
016 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
017 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
018 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
019 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
020 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
021 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
022 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
023 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
024 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
025 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
026 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
027 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
028 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
029 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
030 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
031 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
032 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
033 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
034 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
035 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
036 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
037 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
038 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
039 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
040 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
041 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
042 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
043 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
044 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
045 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
046 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
047 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
048 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
049 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
040 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
051 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
052 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
053 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
054 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
055 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
056 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
057 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
058 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
059 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
060 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
061 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
062 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
063 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
064 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
065 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
066 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
067 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
068 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
069 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
070 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
071 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
072 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
073 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
074 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
075 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
076 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
077 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
078 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
089 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
080 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
081 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
082 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
083 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
084 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
085 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
086 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
087 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
088 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
089 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
090 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
091 : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
092 : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
093 : 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
094 : 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
095 : 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
096 : 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
097 : 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
098 : 7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
099 : 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
100 : 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
';
  protected static $calls = array(
    'stream_close' => false,
    'stream_eof'   => false,
    'stream_flush' => false,
    'stream_open'  => false,
    'stream_read'  => false,
    'stream_seek'  => false,
    'stream_stat'  => false,
    'stream_tell'  => false,
    'url_stat'     => false
  );

  public function stream_close()
  {
    self::$calls[__FUNCTION__] = true;
  }

  public function stream_eof()
  {
    self::$calls[__FUNCTION__] = true;
    return $this->position >= strlen($this->content);
  }

  public function stream_flush()
  {
    self::$calls[__FUNCTION__] = true;
    return true;
  }

  public function stream_open($path, $mode, $options, &$opened_path)
  {
    self::$calls[__FUNCTION__] = true;
    return true;
  }

  public function stream_read($count)
  {
    self::$calls[__FUNCTION__] = true;
    if($this->position >= strlen($this->content)) return false;
    $retval = substr($this->content, $this->position, $count);
    $this->position += strlen($retval);
    return $retval;
  }

  public function stream_seek($offset, $whence)
  {
    self::$calls[__FUNCTION__] = true;
    switch($whence)
    {
      case SEEK_SET:
        $this->position = $offset;
        break;
      case SEEK_CUR:
        $this->position += $offset;
        break;
      case SEEK_END:
        $this->position = strlen($this->content) + $offset;
        break;
    }
    $this->position = min(strlen($this->content), $this->position);
    $this->position = max(0, $this->position);
    return true;
  }

  public function stream_stat()
  {
    self::$calls[__FUNCTION__] = true;
    $stat = array();
    $stat['dev'] = 0;
    $stat['ino'] = 0;
    $stat['mode'] = 0444;
    $stat['nlink'] = 0;
    $stat['uid'] = 0;
    $stat['gid'] = 0;
    $stat['rdev'] = 0;
    $stat['size'] = 0;
    $stat['atime'] = 0;
    $stat['mtime'] = 0;
    $stat['ctime'] = 0;
    $stat['blksize'] = 0;
    $stat['blocks'] = 0;
    $stat['size'] = strlen($this->content);;
    $stat['atime'] = time();
    $stat['mode'] |= 0100000;
    return $stat;
  }

  public function stream_tell()
  {
    self::$calls[__FUNCTION__] = true;
    return $this->position;
  }

  public function url_stat($path, $flags)
  {
    self::$calls[__FUNCTION__] = true;
    return $this->stream_stat();
  }

  public static function wasCalled($methodName)
  {
    return self::$calls[$methodName];
  }
}
