vendor/swiftmailer/lib/classes/Swift/CharacterStream/ArrayCharacterStream.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of SwiftMailer.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * (c) 2004-2009 Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * A CharacterStream implementation which stores characters in an internal array.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * @package Swift
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @subpackage CharacterStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * @author Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
class Swift_CharacterStream_ArrayCharacterStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  implements Swift_CharacterStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  /** A map of byte values and their respective characters */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  private static $_charMap;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  /** A map of characters and their derivative byte values */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  private static $_byteMap;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  /** The char reader (lazy-loaded) for the current charset */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  private $_charReader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  /** A factory for creatiing CharacterReader instances */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  private $_charReaderFactory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
  /** The character set this stream is using */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
  private $_charset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
  /** Array of characters */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
  private $_array = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
  /** Size of the array of character */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
  private $_array_size = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
  /** The current character offset in the stream */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
  private $_offset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
   * Create a new CharacterStream with the given $chars, if set.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
   * @param Swift_CharacterReaderFactory $factory for loading validators
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
   * @param string $charset used in the stream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  public function __construct(Swift_CharacterReaderFactory $factory,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    $charset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    self::_initializeMaps();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    $this->setCharacterReaderFactory($factory);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    $this->setCharacterSet($charset);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
   * Set the character set used in this CharacterStream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
   * @param string $charset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  public function setCharacterSet($charset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
    $this->_charset = $charset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    $this->_charReader = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
   * Set the CharacterReaderFactory for multi charset support.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
   * @param Swift_CharacterReaderFactory $factory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  public function setCharacterReaderFactory(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    Swift_CharacterReaderFactory $factory)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    $this->_charReaderFactory = $factory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
   * Overwrite this character stream using the byte sequence in the byte stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
   * @param Swift_OutputByteStream $os output stream to read from
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
  public function importByteStream(Swift_OutputByteStream $os)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    if (!isset($this->_charReader))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
      $this->_charReader = $this->_charReaderFactory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        ->getReaderFor($this->_charset);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    $startLength = $this->_charReader->getInitialByteSize();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    while (false !== $bytes = $os->read($startLength))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
      $c = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
      for ($i = 0, $len = strlen($bytes); $i < $len; ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        $c[] = self::$_byteMap[$bytes[$i]];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
      $size = count($c);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
      $need = $this->_charReader
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        ->validateByteSequence($c, $size);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
      if ($need > 0 &&
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        false !== $bytes = $os->read($need))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        for ($i = 0, $len = strlen($bytes); $i < $len; ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
          $c[] = self::$_byteMap[$bytes[$i]];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
      $this->_array[] = $c;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
      ++$this->_array_size;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
   * Import a string a bytes into this CharacterStream, overwriting any existing
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
   * data in the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
   * @param string $string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
  public function importString($string)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    $this->flushContents();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    $this->write($string);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
   * Read $length characters from the stream and move the internal pointer
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
   * $length further into the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
   * @param int $length
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
   * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
  public function read($length)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    if ($this->_offset == $this->_array_size)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
      return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    // Don't use array slice
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    $arrays = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    $end = $length + $this->_offset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
    for ($i = $this->_offset; $i < $end; ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
      if (!isset($this->_array[$i]))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
      $arrays[] = $this->_array[$i];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    $this->_offset += $i - $this->_offset; // Limit function calls
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    $chars = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    foreach ($arrays as $array)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
      $chars .= implode('', array_map('chr', $array));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    return $chars;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
   * Read $length characters from the stream and return a 1-dimensional array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
   * containing there octet values.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
   * @param int $length
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
   * @return int[]
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
  public function readBytes($length)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
    if ($this->_offset == $this->_array_size)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
      return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
    $arrays = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    $end = $length + $this->_offset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    for ($i = $this->_offset; $i < $end; ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
      if (!isset($this->_array[$i]))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
      $arrays[] = $this->_array[$i];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    $this->_offset += ($i - $this->_offset); // Limit function calls
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
    return call_user_func_array('array_merge', $arrays);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
   * Write $chars to the end of the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
   * @param string $chars
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
  public function write($chars)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    if (!isset($this->_charReader))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
      $this->_charReader = $this->_charReaderFactory->getReaderFor(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
        $this->_charset);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    $startLength = $this->_charReader->getInitialByteSize();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    $fp = fopen('php://memory', 'w+b');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
    fwrite($fp, $chars);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
    unset($chars);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    fseek($fp, 0, SEEK_SET);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
    $buffer = array(0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    $buf_pos = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
    $buf_len = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
    $has_datas = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
    do
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
      $bytes = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
      // Buffer Filing
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
      if ($buf_len - $buf_pos < $startLength)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
        $buf = array_splice($buffer, $buf_pos);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        $new = $this->_reloadBuffer($fp, 100);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
        if ($new)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
          $buffer = array_merge($buf, $new);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
          $buf_len = count($buffer);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
          $buf_pos = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        else
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
          $has_datas = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
      if ($buf_len - $buf_pos > 0)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
        $size = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        for ($i = 0; $i < $startLength && isset($buffer[$buf_pos]); ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
        {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
          ++$size;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
          $bytes[] = $buffer[$buf_pos++];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        $need = $this->_charReader->validateByteSequence(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
          $bytes, $size);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
        if ($need > 0)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
        {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
          if ($buf_len - $buf_pos < $need)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
          {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
            $new = $this->_reloadBuffer($fp, $need);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
            if ($new)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
            {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
              $buffer = array_merge($buffer, $new);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
              $buf_len = count($buffer);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
          }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
          for ($i = 0; $i < $need && isset($buffer[$buf_pos]); ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
          {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
            $bytes[] = $buffer[$buf_pos++];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
          }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
        $this->_array[] = $bytes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        ++$this->_array_size;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    while ($has_datas);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
    fclose($fp);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
   * Move the internal pointer to $charOffset in the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
   * @param int $charOffset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
  public function setPointer($charOffset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
    if ($charOffset > $this->_array_size)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
      $charOffset = $this->_array_size;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
    elseif ($charOffset < 0)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
      $charOffset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    $this->_offset = $charOffset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
   * Empty the stream and reset the internal pointer.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
  public function flushContents()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    $this->_offset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
    $this->_array = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    $this->_array_size = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
  private function _reloadBuffer($fp, $len)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
    if (!feof($fp) && ($bytes = fread($fp, $len)) !== false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
      $buf = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
      for ($i = 0, $len = strlen($bytes); $i < $len; ++$i)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        $buf[] = self::$_byteMap[$bytes[$i]];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
      return $buf;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
  private static function _initializeMaps()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    if (!isset(self::$_charMap))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
      self::$_charMap = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
      for ($byte = 0; $byte < 256; ++$byte)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        self::$_charMap[$byte] = chr($byte);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
      self::$_byteMap = array_flip(self::$_charMap);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
}