File indexing completed on 2024-12-22 05:36:56
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Pdf 0017 * @subpackage FileParser 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id$ 0021 */ 0022 0023 /** 0024 * Abstract helper class for {@link Zend_Pdf_FileParser} that provides the 0025 * data source for parsing. 0026 * 0027 * Concrete subclasses allow for parsing of in-memory, filesystem, and other 0028 * sources through a common API. These subclasses also take care of error 0029 * handling and other mundane tasks. 0030 * 0031 * Subclasses must implement at minimum {@link __construct()}, 0032 * {@link __destruct()}, {@link readBytes()}, and {@link readAllBytes()}. 0033 * Subclasses should also override {@link moveToOffset()} and 0034 * {@link __toString()} as appropriate. 0035 * 0036 * @package Zend_Pdf 0037 * @subpackage FileParser 0038 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0039 * @license http://framework.zend.com/license/new-bsd New BSD License 0040 */ 0041 abstract class Zend_Pdf_FileParserDataSource 0042 { 0043 /**** Instance Variables ****/ 0044 0045 0046 /** 0047 * Total size in bytes of the data source. 0048 * @var integer 0049 */ 0050 protected $_size = 0; 0051 0052 /** 0053 * Byte offset of the current read position within the data source. 0054 * @var integer 0055 */ 0056 protected $_offset = 0; 0057 0058 0059 0060 /**** Public Interface ****/ 0061 0062 0063 /* Abstract Methods */ 0064 0065 /** 0066 * Object destructor. Closes the data source. 0067 * 0068 * May also perform cleanup tasks such as deleting temporary files. 0069 */ 0070 abstract public function __destruct(); 0071 0072 /** 0073 * Returns the specified number of raw bytes from the data source at the 0074 * byte offset of the current read position. 0075 * 0076 * Must advance the read position by the number of bytes read by updating 0077 * $this->_offset. 0078 * 0079 * Throws an exception if there is insufficient data to completely fulfill 0080 * the request or if an error occurs. 0081 * 0082 * @param integer $byteCount Number of bytes to read. 0083 * @return string 0084 * @throws Zend_Pdf_Exception 0085 */ 0086 abstract public function readBytes($byteCount); 0087 0088 /** 0089 * Returns the entire contents of the data source as a string. 0090 * 0091 * This method may be called at any time and so must preserve the byte 0092 * offset of the read position, both through $this->_offset and whatever 0093 * other additional pointers (such as the seek position of a file pointer) 0094 * that might be used. 0095 * 0096 * @return string 0097 */ 0098 abstract public function readAllBytes(); 0099 0100 0101 /* Object Magic Methods */ 0102 0103 /** 0104 * Returns a description of the object for debugging purposes. 0105 * 0106 * Subclasses should override this method to provide a more specific 0107 * description of the actual object being represented. 0108 * 0109 * @return string 0110 */ 0111 public function __toString() 0112 { 0113 return get_class($this); 0114 } 0115 0116 0117 /* Accessors */ 0118 0119 /** 0120 * Returns the byte offset of the current read position within the data 0121 * source. 0122 * 0123 * @return integer 0124 */ 0125 public function getOffset() 0126 { 0127 return $this->_offset; 0128 } 0129 0130 /** 0131 * Returns the total size in bytes of the data source. 0132 * 0133 * @return integer 0134 */ 0135 public function getSize() 0136 { 0137 return $this->_size; 0138 } 0139 0140 0141 /* Primitive Methods */ 0142 0143 /** 0144 * Moves the current read position to the specified byte offset. 0145 * 0146 * Throws an exception you attempt to move before the beginning or beyond 0147 * the end of the data source. 0148 * 0149 * If a subclass needs to perform additional tasks (such as performing a 0150 * fseek() on a filesystem source), it should do so after calling this 0151 * parent method. 0152 * 0153 * @param integer $offset Destination byte offset. 0154 * @throws Zend_Pdf_Exception 0155 */ 0156 public function moveToOffset($offset) 0157 { 0158 if ($this->_offset == $offset) { 0159 return; // Not moving; do nothing. 0160 } 0161 if ($offset < 0) { 0162 // require_once 'Zend/Pdf/Exception.php'; 0163 throw new Zend_Pdf_Exception('Attempt to move before start of data source', 0164 Zend_Pdf_Exception::MOVE_BEFORE_START_OF_FILE); 0165 } 0166 if ($offset >= $this->_size) { // Offsets are zero-based. 0167 // require_once 'Zend/Pdf/Exception.php'; 0168 throw new Zend_Pdf_Exception('Attempt to move beyond end of data source', 0169 Zend_Pdf_Exception::MOVE_BEYOND_END_OF_FILE); 0170 } 0171 $this->_offset = $offset; 0172 } 0173 0174 /** 0175 * Shifts the current read position within the data source by the specified 0176 * number of bytes. 0177 * 0178 * You may move forward (positive numbers) or backward (negative numbers). 0179 * Throws an exception you attempt to move before the beginning or beyond 0180 * the end of the data source. 0181 * 0182 * @param integer $byteCount Number of bytes to skip. 0183 * @throws Zend_Pdf_Exception 0184 */ 0185 public function skipBytes($byteCount) 0186 { 0187 $this->moveToOffset($this->_offset + $byteCount); 0188 } 0189 }