201 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @package     Joomla.Platform
 | |
|  * @subpackage  Input
 | |
|  *
 | |
|  * @copyright   Copyright (C) 2005-2016 Open Source Matters, Inc. All rights reserved.
 | |
|  * @license     GNU General Public License version 2 or later; see LICENSE
 | |
|  */
 | |
| 
 | |
| defined('JPATH_PLATFORM') or die;
 | |
| 
 | |
| /**
 | |
|  * Joomla! Input CLI Class
 | |
|  *
 | |
|  * @since  11.1
 | |
|  */
 | |
| class JInputCli extends JInput
 | |
| {
 | |
| 	/**
 | |
| 	 * The executable that was called to run the CLI script.
 | |
| 	 *
 | |
| 	 * @var    string
 | |
| 	 * @since  11.1
 | |
| 	 */
 | |
| 	public $executable;
 | |
| 
 | |
| 	/**
 | |
| 	 * The additional arguments passed to the script that are not associated
 | |
| 	 * with a specific argument name.
 | |
| 	 *
 | |
| 	 * @var    array
 | |
| 	 * @since  11.1
 | |
| 	 */
 | |
| 	public $args = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @param   array  $source   Source data (Optional, default is $_REQUEST)
 | |
| 	 * @param   array  $options  Array of configuration parameters (Optional)
 | |
| 	 *
 | |
| 	 * @since   11.1
 | |
| 	 */
 | |
| 	public function __construct(array $source = null, array $options = array())
 | |
| 	{
 | |
| 		if (isset($options['filter']))
 | |
| 		{
 | |
| 			$this->filter = $options['filter'];
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$this->filter = JFilterInput::getInstance();
 | |
| 		}
 | |
| 
 | |
| 		// Get the command line options
 | |
| 		$this->parseArguments();
 | |
| 
 | |
| 		// Set the options for the class.
 | |
| 		$this->options = $options;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to serialize the input.
 | |
| 	 *
 | |
| 	 * @return  string  The serialized input.
 | |
| 	 *
 | |
| 	 * @since   12.1
 | |
| 	 */
 | |
| 	public function serialize()
 | |
| 	{
 | |
| 		// Load all of the inputs.
 | |
| 		$this->loadAllInputs();
 | |
| 
 | |
| 		// Remove $_ENV and $_SERVER from the inputs.
 | |
| 		$inputs = $this->inputs;
 | |
| 		unset($inputs['env']);
 | |
| 		unset($inputs['server']);
 | |
| 
 | |
| 		// Serialize the executable, args, options, data, and inputs.
 | |
| 		return serialize(array($this->executable, $this->args, $this->options, $this->data, $inputs));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to unserialize the input.
 | |
| 	 *
 | |
| 	 * @param   string  $input  The serialized input.
 | |
| 	 *
 | |
| 	 * @return  JInput  The input object.
 | |
| 	 *
 | |
| 	 * @since   12.1
 | |
| 	 */
 | |
| 	public function unserialize($input)
 | |
| 	{
 | |
| 		// Unserialize the executable, args, options, data, and inputs.
 | |
| 		list($this->executable, $this->args, $this->options, $this->data, $this->inputs) = unserialize($input);
 | |
| 
 | |
| 		// Load the filter.
 | |
| 		if (isset($this->options['filter']))
 | |
| 		{
 | |
| 			$this->filter = $this->options['filter'];
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$this->filter = JFilterInput::getInstance();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialise the options and arguments
 | |
| 	 *
 | |
| 	 * Not supported: -abc c-value
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 *
 | |
| 	 * @since   11.1
 | |
| 	 */
 | |
| 	protected function parseArguments()
 | |
| 	{
 | |
| 		$argv = $_SERVER['argv'];
 | |
| 
 | |
| 		$this->executable = array_shift($argv);
 | |
| 
 | |
| 		$out = array();
 | |
| 
 | |
| 		for ($i = 0, $j = count($argv); $i < $j; $i++)
 | |
| 		{
 | |
| 			$arg = $argv[$i];
 | |
| 
 | |
| 			// --foo --bar=baz
 | |
| 			if (substr($arg, 0, 2) === '--')
 | |
| 			{
 | |
| 				$eqPos = strpos($arg, '=');
 | |
| 
 | |
| 				// --foo
 | |
| 				if ($eqPos === false)
 | |
| 				{
 | |
| 					$key = substr($arg, 2);
 | |
| 
 | |
| 					// --foo value
 | |
| 					if ($i + 1 < $j && $argv[$i + 1][0] !== '-')
 | |
| 					{
 | |
| 						$value = $argv[$i + 1];
 | |
| 						$i++;
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						$value = isset($out[$key]) ? $out[$key] : true;
 | |
| 					}
 | |
| 
 | |
| 					$out[$key] = $value;
 | |
| 				}
 | |
| 
 | |
| 				// --bar=baz
 | |
| 				else
 | |
| 				{
 | |
| 					$key = substr($arg, 2, $eqPos - 2);
 | |
| 					$value = substr($arg, $eqPos + 1);
 | |
| 					$out[$key] = $value;
 | |
| 				}
 | |
| 			}
 | |
| 			elseif (substr($arg, 0, 1) === '-')
 | |
| 			// -k=value -abc
 | |
| 			{
 | |
| 				// -k=value
 | |
| 				if (substr($arg, 2, 1) === '=')
 | |
| 				{
 | |
| 					$key = substr($arg, 1, 1);
 | |
| 					$value = substr($arg, 3);
 | |
| 					$out[$key] = $value;
 | |
| 				}
 | |
| 				else
 | |
| 				// -abc
 | |
| 				{
 | |
| 					$chars = str_split(substr($arg, 1));
 | |
| 
 | |
| 					foreach ($chars as $char)
 | |
| 					{
 | |
| 						$key = $char;
 | |
| 						$value = isset($out[$key]) ? $out[$key] : true;
 | |
| 						$out[$key] = $value;
 | |
| 					}
 | |
| 
 | |
| 					// -a a-value
 | |
| 					if ((count($chars) === 1) && ($i + 1 < $j) && ($argv[$i + 1][0] !== '-'))
 | |
| 					{
 | |
| 						$out[$key] = $argv[$i + 1];
 | |
| 						$i++;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				// Plain-arg
 | |
| 				$this->args[] = $arg;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$this->data = $out;
 | |
| 	}
 | |
| }
 |