1: <?php
2: /**
3: * ConsoleInput file.
4: *
5: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
6: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
7: *
8: * Licensed under The MIT License
9: * For full copyright and license information, please see the LICENSE.txt
10: * Redistributions of files must retain the above copyright notice.
11: *
12: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
13: * @link https://cakephp.org CakePHP(tm) Project
14: * @package Cake.Console
15: * @since CakePHP(tm) v 2.0
16: * @license https://opensource.org/licenses/mit-license.php MIT License
17: */
18:
19: /**
20: * Object wrapper for interacting with stdin
21: *
22: * @package Cake.Console
23: */
24: class ConsoleInput {
25:
26: /**
27: * Input value.
28: *
29: * @var resource
30: */
31: protected $_input;
32:
33: /**
34: * Can this instance use readline?
35: * Two conditions must be met:
36: * 1. Readline support must be enabled.
37: * 2. Handle we are attached to must be stdin.
38: * Allows rich editing with arrow keys and history when inputting a string.
39: *
40: * @var bool
41: */
42: protected $_canReadline;
43:
44: /**
45: * Constructor
46: *
47: * @param string $handle The location of the stream to use as input.
48: */
49: public function __construct($handle = 'php://stdin') {
50: $this->_canReadline = extension_loaded('readline') && $handle === 'php://stdin' ? true : false;
51: $this->_input = fopen($handle, 'r');
52: }
53:
54: /**
55: * Read a value from the stream
56: *
57: * @return mixed The value of the stream
58: */
59: public function read() {
60: if ($this->_canReadline) {
61: $line = readline('');
62: if (!empty($line)) {
63: readline_add_history($line);
64: }
65: return $line;
66: }
67: return fgets($this->_input);
68: }
69:
70: /**
71: * Checks if data is available on the stream
72: *
73: * @param int $timeout An optional time to wait for data
74: * @return bool True for data available, false otherwise
75: */
76: public function dataAvailable($timeout = 0) {
77: $readFds = array($this->_input);
78: $readyFds = stream_select($readFds, $writeFds, $errorFds, $timeout);
79: return ($readyFds > 0);
80: }
81:
82: }
83: