Hoa central
Console.php
Go to the documentation of this file.
1 <?php
2 
37 namespace Hoa\Console;
38 
39 use Hoa\Core;
40 
49 class Console
50 {
56  const IS_FIFO = 0;
57 
63  const IS_CHARACTER = 1;
64 
70  const IS_DIRECTORY = 2;
71 
77  const IS_BLOCK = 3;
78 
84  const IS_REGULAR = 4;
85 
91  const IS_LINK = 5;
92 
98  const IS_SOCKET = 6;
99 
105  const IS_WHITEOUT = 7;
106 
112  private static $_advanced = null;
113 
119  private static $_old = null;
120 
126  protected static $_mode = [];
127 
133  protected static $_tput = null;
134 
135 
136 
142  public static function advancedInteraction()
143  {
144  if (null !== self::$_advanced) {
145  return self::$_advanced;
146  }
147 
148  if (OS_WIN) {
149  return self::$_advanced = false;
150  }
151 
152  if (false === self::isDirect(STDIN)) {
153  return self::$_advanced = false;
154  }
155 
156  self::$_old = Processus::execute('stty -g');
157  Processus::execute('stty -echo -icanon min 1 time 0');
158 
159  return self::$_advanced = true;
160  }
161 
167  public static function restoreInteraction()
168  {
169  if (null === self::$_old) {
170  return;
171  }
172 
173  Processus::execute('stty ' . self::$_old);
174 
175  return;
176  }
177 
185  public static function getMode($pipe = STDIN)
186  {
187  $_pipe = (int) $pipe;
188 
189  if (isset(self::$_mode[$_pipe])) {
190  return self::$_mode[$_pipe];
191  }
192 
193  $stat = fstat($pipe);
194 
195  switch ($stat['mode'] & 0170000) {
196  // named pipe (fifo).
197  case 0010000:
198  $mode = self::IS_FIFO;
199 
200  break;
201 
202  // character special.
203  case 0020000:
204  $mode = self::IS_CHARACTER;
205 
206  break;
207 
208  // directory.
209  case 0040000:
210  $mode = self::IS_DIRECTORY;
211 
212  break;
213 
214  // block special.
215  case 0060000:
216  $mode = self::IS_BLOCK;
217 
218  break;
219 
220  // regular.
221  case 0100000:
222  $mode = self::IS_REGULAR;
223 
224  break;
225 
226  // symbolic link.
227  case 0120000:
228  $mode = self::IS_LINK;
229 
230  break;
231 
232  // socket.
233  case 0140000:
234  $mode = self::IS_SOCKET;
235 
236  break;
237 
238  // whiteout.
239  case 0160000:
240  $mode = self::IS_WHITEOUT;
241 
242  break;
243 
244  default:
245  $mode = -1;
246  }
247 
248  return self::$_mode[$_pipe] = $mode;
249  }
250 
261  public static function isDirect($pipe)
262  {
263  return self::IS_CHARACTER === self::getMode($pipe);
264  }
265 
275  public static function isPipe($pipe)
276  {
277  return self::IS_FIFO === self::getMode($pipe);
278  }
279 
289  public static function isRedirection($pipe)
290  {
291  $mode = self::getMode($pipe);
292 
293  return
294  self::IS_REGULAR === $mode ||
295  self::IS_DIRECTORY === $mode ||
296  self::IS_LINK === $mode ||
297  self::IS_SOCKET === $mode ||
298  self::IS_BLOCK === $mode;
299  }
300 
306  public static function getTput()
307  {
308  if (null === static::$_tput) {
309  static::$_tput = new Tput();
310  }
311 
312  return static::$_tput;
313  }
314 }
315 
319 Core::registerShutdownFunction('Hoa\Console\Console', 'restoreInteraction');
320 
324 Core\Consistency::flexEntity('Hoa\Console\Console');
static execute($commandLine, $escape=true)
Definition: Processus.php:1165
static getMode($pipe=STDIN)
Definition: Console.php:185
static getTput()
Definition: Console.php:306
static advancedInteraction()
Definition: Console.php:142
static isPipe($pipe)
Definition: Console.php:275
static isRedirection($pipe)
Definition: Console.php:289
static restoreInteraction()
Definition: Console.php:167
static registerShutdownFunction($class= '', $method= '')
Definition: Core.php:404
static isDirect($pipe)
Definition: Console.php:261