web/lib/Zend/Amf/Util/BinaryStream.php
changeset 807 877f952ae2bd
parent 207 621fa6caec0c
child 1230 68c69c656a2c
--- a/web/lib/Zend/Amf/Util/BinaryStream.php	Thu Mar 21 17:31:31 2013 +0100
+++ b/web/lib/Zend/Amf/Util/BinaryStream.php	Thu Mar 21 19:50:53 2013 +0100
@@ -15,9 +15,9 @@
  * @category   Zend
  * @package    Zend_Amf
  * @subpackage Util
- * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id: BinaryStream.php 22101 2010-05-04 20:07:13Z matthew $
+ * @version    $Id: BinaryStream.php 25241 2013-01-22 11:07:36Z frosch $
  */
 
 /**
@@ -25,7 +25,7 @@
  *
  * @package    Zend_Amf
  * @subpackage Util
- * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  * @license    http://framework.zend.com/license/new-bsd     New BSD License
  */
 class Zend_Amf_Util_BinaryStream
@@ -51,6 +51,11 @@
     protected $_needle;
 
     /**
+     * @var bool str* functions overloaded using mbstring.func_overload?
+     */
+    protected $_mbStringFunctionsOverloaded;
+
+    /**
      * Constructor
      *
      * Create a reference to a byte stream that is going to be parsed or created
@@ -69,7 +74,8 @@
 
         $this->_stream       = $stream;
         $this->_needle       = 0;
-        $this->_streamLength = strlen($stream);
+        $this->_mbStringFunctionsOverloaded = function_exists('mb_strlen') && (ini_get('mbstring.func_overload') !== '') && ((int)ini_get('mbstring.func_overload') & 2);
+        $this->_streamLength = $this->_mbStringFunctionsOverloaded ? mb_strlen($stream, '8bit') : strlen($stream);
         $this->_bigEndian    = (pack('l', 1) === "\x00\x00\x00\x01");
     }
 
@@ -97,7 +103,7 @@
             require_once 'Zend/Amf/Exception.php';
             throw new Zend_Amf_Exception('Buffer underrun at needle position: ' . $this->_needle . ' while requesting length: ' . $length);
         }
-        $bytes = substr($this->_stream, $this->_needle, $length);
+        $bytes = $this->_mbStringFunctionsOverloaded ? mb_substr($this->_stream, $this->_needle, $length, '8bit') : substr($this->_stream, $this->_needle, $length);
         $this->_needle+= $length;
         return $bytes;
     }
@@ -120,12 +126,18 @@
      * Reads a signed byte
      *
      * @return int Value is in the range of -128 to 127.
+     * @throws Zend_Amf_Exception
      */
     public function readByte()
     {
         if (($this->_needle + 1) > $this->_streamLength) {
             require_once 'Zend/Amf/Exception.php';
-            throw new Zend_Amf_Exception('Buffer underrun at needle position: ' . $this->_needle . ' while requesting length: ' . $length);
+            throw new Zend_Amf_Exception(
+                'Buffer underrun at needle position: '
+                . $this->_needle
+                . ' while requesting length: '
+                . $this->_streamLength
+            );
         }
 
         return ord($this->_stream{$this->_needle++});
@@ -184,7 +196,7 @@
      */
     public function writeUtf($stream)
     {
-        $this->writeInt(strlen($stream));
+        $this->writeInt($this->_mbStringFunctionsOverloaded ? mb_strlen($stream, '8bit') : strlen($stream));
         $this->_stream.= $stream;
         return $this;
     }
@@ -209,7 +221,7 @@
      */
     public function writeLongUtf($stream)
     {
-        $this->writeLong(strlen($stream));
+        $this->writeLong($this->_mbStringFunctionsOverloaded ? mb_strlen($stream, '8bit') : strlen($stream));
         $this->_stream.= $stream;
     }
 
@@ -255,7 +267,7 @@
      */
     public function readDouble()
     {
-        $bytes = substr($this->_stream, $this->_needle, 8);
+        $bytes = $this->_mbStringFunctionsOverloaded ? mb_substr($this->_stream, $this->_needle, 8, '8bit') : substr($this->_stream, $this->_needle, 8);
         $this->_needle+= 8;
 
         if (!$this->_bigEndian) {