setMode($mode); switch ($streamName) { case '0': $streamName = 'php://stdin'; break; case '1': $streamName = 'php://stdout'; break; case '2': $streamName = 'php://stderr'; break; default: if (true === ctype_digit($streamName)) { if (PHP_VERSION_ID >= 50306) { $streamName = 'php://fd/' . $streamName; } else { throw new Exception( 'You need PHP5.3.6 to use a file descriptor ' . 'other than 0, 1 or 2 (tried %d with PHP%s).', 0, [$streamName, PHP_VERSION] ); } } } parent::__construct($streamName, $context, $wait); return; } /** * Open the stream and return the associated resource. * * @param string $streamName Stream name (e.g. path or URL). * @param \Hoa\Stream\Context $context Context. * @return resource * @throws \Hoa\File\Exception\FileDoesNotExist * @throws \Hoa\File\Exception */ protected function &_open($streamName, Stream\Context $context = null) { if (substr($streamName, 0, 4) == 'file' && false === is_dir(dirname($streamName))) { throw new Exception( 'Directory %s does not exist. Could not open file %s.', 1, [dirname($streamName), basename($streamName)] ); } if (null === $context) { if (false === $out = @fopen($streamName, $this->getMode(), true)) { throw new Exception( 'Failed to open stream %s.', 2, $streamName ); } return $out; } $out = @fopen( $streamName, $this->getMode(), true, $context->getContext() ); if (false === $out) { throw new Exception( 'Failed to open stream %s.', 3, $streamName ); } return $out; } /** * Close the current stream. * * @return bool */ protected function _close() { return @fclose($this->getStream()); } /** * Start a new buffer. * The callable acts like a light filter. * * @param mixed $callable Callable. * @param int $size Size. * @return int */ public function newBuffer($callable = null, $size = null) { $this->setStreamBuffer($size); //@TODO manage $callable as a filter? return 1; } /** * Flush the output to a stream. * * @return bool */ public function flush() { return fflush($this->getStream()); } /** * Delete buffer. * * @return bool */ public function deleteBuffer() { return $this->disableStreamBuffer(); } /** * Get bufffer level. * * @return int */ public function getBufferLevel() { return 1; } /** * Get buffer size. * * @return int */ public function getBufferSize() { return $this->getStreamBufferSize(); } /** * Portable advisory locking. * * @param int $operation Operation, use the * \Hoa\Stream\IStream\Lockable::LOCK_* constants. * @return bool */ public function lock($operation) { return flock($this->getStream(), $operation); } /** * Rewind the position of a stream pointer. * * @return bool */ public function rewind() { return rewind($this->getStream()); } /** * Seek on a stream pointer. * * @param int $offset Offset (negative value should be supported). * @param int $whence Whence, use the * \Hoa\Stream\IStream\Pointable::SEEK_* constants. * @return int */ public function seek($offset, $whence = Stream\IStream\Pointable::SEEK_SET) { return fseek($this->getStream(), $offset, $whence); } /** * Get the current position of the stream pointer. * * @return int */ public function tell() { $stream = $this->getStream(); if (null === $stream) { return 0; } return ftell($stream); } /** * Create a file. * * @param string $name File name. * @param mixed $dummy To be compatible with childs. * @return bool */ public static function create($name, $dummy) { if (file_exists($name)) { return true; } return touch($name); } } /** * Flex entity. */ Consistency::flexEntity('Hoa\File\File');