| 
<?php/**
 * This file is part of the PHP Generics package.
 *
 * @package Generics
 */
 namespace Generics\Streams;
 
 use Generics\Streams\Interceptor\StreamInterceptor;
 use Countable;
 
 /**
 * This class provides a stream for standard output
 *
 * @author Maik Greubel <greubel@nkey.de>
 */
 class StandardOutputStream implements OutputStream
 {
 
 /**
 * Interceptor
 *
 * @var StreamInterceptor
 */
 private $interceptor;
 
 /**
 * The standard out channel
 *
 * @var resource
 */
 private $stdout;
 
 /**
 * Create a new instance of StandardOutputStream
 */
 public function __construct()
 {
 $this->open();
 }
 
 /**
 * Opens a new standard output channel
 */
 private function open()
 {
 $this->stdout = fopen("php://stdout", "w");
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\Stream::isOpen()
 */
 public function isOpen(): bool
 {
 return is_resource($this->stdout);
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\OutputStream::flush()
 */
 public function flush()
 {
 if ($this->isOpen()) {
 fflush($this->stdout);
 }
 if ($this->interceptor instanceof StreamInterceptor) {
 $this->interceptor->reset();
 }
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\Stream::ready()
 */
 public function ready(): bool
 {
 return $this->isOpen();
 }
 
 /**
 *
 * {@inheritdoc}
 * @see Countable::count()
 */
 public function count()
 {
 return 0;
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Resettable::reset()
 */
 public function reset()
 {
 $this->close();
 $this->open();
 
 if ($this->interceptor instanceof StreamInterceptor) {
 $this->interceptor->reset();
 $this->setInterceptor($this->interceptor);
 }
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\OutputStream::write()
 */
 public function write($buffer)
 {
 if ($this->isWriteable()) {
 fwrite($this->stdout, $buffer);
 }
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\Stream::close()
 */
 public function close()
 {
 if ($this->isOpen()) {
 fclose($this->stdout);
 $this->stdout = null;
 }
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\OutputStream::isWriteable()
 */
 public function isWriteable(): bool
 {
 return $this->isOpen();
 }
 
 /**
 * Apply a stream interceptor
 *
 * @param StreamInterceptor $interceptor
 */
 public function setInterceptor(StreamInterceptor $interceptor)
 {
 $this->interceptor = $interceptor;
 stream_filter_append($this->stdout, $interceptor->getFilterName());
 }
 }
 
 |