<?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()); 
    } 
} 
 
 |