vendor/swiftmailer/lib/classes/Swift/ByteStream/ArrayByteStream.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
 * Allows reading and writing of bytes to and from an array.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * @package Swift
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * @subpackage ByteStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @author Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class Swift_ByteStream_ArrayByteStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
  implements Swift_InputByteStream, Swift_OutputByteStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
{
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
   * The internal stack of bytes.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
   * @var string[]
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  private $_array = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
   * The size of the stack
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
   * @var int
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
  private $_arraySize = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
   * The internal pointer offset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
   * @var int
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
  private $_offset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
  /** Bound streams */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
  private $_mirrors = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
   * Create a new ArrayByteStream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
   * If $stack is given the stream will be populated with the bytes it contains.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
   * @param mixed $stack of bytes in string or array form, optional
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
  public function __construct($stack = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    if (is_array($stack))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
      $this->_array = $stack;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
      $this->_arraySize = count($stack);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    elseif (is_string($stack))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
      $this->write($stack);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    else
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
      $this->_array = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
   * Reads $length bytes from the stream into a string and moves the pointer
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
   * through the stream by $length. If less bytes exist than are requested the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
   * remaining bytes are given instead. If no bytes are remaining at all, boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
   * false is returned.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
   * @param int $length
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
   * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  public function read($length)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    if ($this->_offset == $this->_arraySize)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
      return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    // Don't use array slice
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    $end = $length + $this->_offset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    $end = $this->_arraySize<$end
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
      ?$this->_arraySize
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
      :$end;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    $ret = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    for (; $this->_offset < $end; ++$this->_offset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
      $ret .= $this->_array[$this->_offset];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    return $ret;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
   * Writes $bytes to the end of the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
   * @param string $bytes
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
  public function write($bytes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    $to_add = str_split($bytes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    foreach ($to_add as $value)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
      $this->_array[] = $value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    $this->_arraySize = count($this->_array);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    foreach ($this->_mirrors as $stream)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
      $stream->write($bytes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    }
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
   * Not used.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
  public function commit()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
   * Attach $is to this stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
   * The stream acts as an observer, receiving all data that is written.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
   * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
   *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
   * @param Swift_InputByteStream $is
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
  public function bind(Swift_InputByteStream $is)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    $this->_mirrors[] = $is;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
   * Remove an already bound stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
   * If $is is not bound, no errors will be raised.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
   * If the stream currently has any buffered data it will be written to $is
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
   * before unbinding occurs.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
   *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
   * @param Swift_InputByteStream $is
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
  public function unbind(Swift_InputByteStream $is)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    foreach ($this->_mirrors as $k => $stream)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
      if ($is === $stream)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
        unset($this->_mirrors[$k]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
   * Move the internal read pointer to $byteOffset in the stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
   * @param int $byteOffset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
   * @return boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  public function setReadPointer($byteOffset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    if ($byteOffset > $this->_arraySize)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
      $byteOffset = $this->_arraySize;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    elseif ($byteOffset < 0)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
      $byteOffset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    $this->_offset = $byteOffset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
   * Flush the contents of the stream (empty it) and set the internal pointer
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
   * to the beginning.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
  public function flushBuffers()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
    $this->_offset = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
    $this->_array = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    $this->_arraySize = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    foreach ($this->_mirrors as $stream)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
      $stream->flushBuffers();
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
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
}