91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of the Symfony package.
 | |
|  *
 | |
|  * (c) Fabien Potencier <fabien@symfony.com>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| namespace Symfony\Component\Process;
 | |
| 
 | |
| use Symfony\Component\Process\Exception\RuntimeException;
 | |
| 
 | |
| /**
 | |
|  * Provides a way to continuously write to the input of a Process until the InputStream is closed.
 | |
|  *
 | |
|  * @author Nicolas Grekas <p@tchwork.com>
 | |
|  */
 | |
| class InputStream implements \IteratorAggregate
 | |
| {
 | |
|     /** @var callable|null */
 | |
|     private $onEmpty = null;
 | |
|     private $input = array();
 | |
|     private $open = true;
 | |
| 
 | |
|     /**
 | |
|      * Sets a callback that is called when the write buffer becomes empty.
 | |
|      */
 | |
|     public function onEmpty(callable $onEmpty = null)
 | |
|     {
 | |
|         $this->onEmpty = $onEmpty;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Appends an input to the write buffer.
 | |
|      *
 | |
|      * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar,
 | |
|      *                                                                stream resource or \Traversable
 | |
|      */
 | |
|     public function write($input)
 | |
|     {
 | |
|         if (null === $input) {
 | |
|             return;
 | |
|         }
 | |
|         if ($this->isClosed()) {
 | |
|             throw new RuntimeException(sprintf('%s is closed', static::class));
 | |
|         }
 | |
|         $this->input[] = ProcessUtils::validateInput(__METHOD__, $input);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Closes the write buffer.
 | |
|      */
 | |
|     public function close()
 | |
|     {
 | |
|         $this->open = false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Tells whether the write buffer is closed or not.
 | |
|      */
 | |
|     public function isClosed()
 | |
|     {
 | |
|         return !$this->open;
 | |
|     }
 | |
| 
 | |
|     public function getIterator()
 | |
|     {
 | |
|         $this->open = true;
 | |
| 
 | |
|         while ($this->open || $this->input) {
 | |
|             if (!$this->input) {
 | |
|                 yield '';
 | |
|                 continue;
 | |
|             }
 | |
|             $current = array_shift($this->input);
 | |
| 
 | |
|             if ($current instanceof \Iterator) {
 | |
|                 yield from $current;
 | |
|             } else {
 | |
|                 yield $current;
 | |
|             }
 | |
|             if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) {
 | |
|                 $this->write($onEmpty($this));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
