. * * Consult LICENSE file for details ************************************************/ class MAPIStreamWrapper { const PROTOCOL = "mapistream"; private $mapistream; private $position; private $streamlength; /** * Opens the stream * The mapistream reference is passed over the context * * @param string $path Specifies the URL that was passed to the original function * @param string $mode The mode used to open the file, as detailed for fopen() * @param int $options Holds additional flags set by the streams API * @param string $opened_path If the path is opened successfully, and STREAM_USE_PATH is set in options, * opened_path should be set to the full path of the file/resource that was actually opened. * * @access public * @return boolean */ public function stream_open($path, $mode, $options, &$opened_path) { $contextOptions = stream_context_get_options($this->context); if (!isset($contextOptions[self::PROTOCOL]['stream'])) return false; $this->position = 0; // this is our stream! $this->mapistream = $contextOptions[self::PROTOCOL]['stream']; // get the data length from mapi $stat = mapi_stream_stat($this->mapistream); $this->streamlength = $stat["cb"]; ZLog::Write(LOGLEVEL_DEBUG, sprintf("MAPIStreamWrapper::stream_open(): initialized mapistream: %s streamlength: %d", $this->mapistream, $this->streamlength)); return true; } /** * Reads from stream * * @param int $len amount of bytes to be read * * @access public * @return string */ public function stream_read($len) { $len = ($this->position + $len > $this->streamlength) ? ($this->streamlength - $this->position) : $len; $data = mapi_stream_read($this->mapistream, $len); $this->position += strlen($data); return $data; } /** * Returns the current position on stream * * @access public * @return int */ public function stream_tell() { return $this->position; } /** * Indicates if 'end of file' is reached * * @access public * @return boolean */ public function stream_eof() { return ($this->position >= $this->streamlength); } /** * Retrieves information about a stream * * @access public * @return array */ public function stream_stat() { return array( 7 => $this->streamlength, 'size' => $this->streamlength, ); } /** * Instantiates a MAPIStreamWrapper * * @param mapistream $mapistream The stream to be wrapped * * @access public * @return MAPIStreamWrapper */ static public function Open($mapistream) { $context = stream_context_create(array(self::PROTOCOL => array('stream' => &$mapistream))); return fopen(self::PROTOCOL . "://",'r', false, $context); } } stream_wrapper_register(MAPIStreamWrapper::PROTOCOL, "MAPIStreamWrapper") ?>