Example #1
0
File: Value.php Project: macall/jsd
 /**
  * Choose a XML_RPC2_Value subclass appropriate for the 
  * given value and create it.
  * 
  * This method tries to find the most adequate XML-RPC datatype to hold
  * a given PHP native type. Note that distinguishing some datatypes may be
  * difficult:
  *  - Timestamps are represented by PHP integers, so an XML_RPC2_Value_Datetime is never returned
  *  - Indexed arrays and associative arrays are the same native PHP type. In this case:
  *    a) The array's indexes start at 0 or 1 and increase monotonically with step 1, or
  *    b) they do not
  *    in the first case, an XML_RPC2_Value_Array is returned. In the second, a XML_RPC2_Value_Struct is returned.
  *  - PHP Objects are serialized and represented in an XML_RPC2_Value_Base64
  *
  * Whenever native object automatic detection proves inaccurate, use XML_RPC2_Value::createFromNative providing 
  * a valid explicit type as second argument
  * 
  * the appropriate XML_RPC2_Value child class instead.
  *
  * @param mixed The native value
  * @param string The xml-rpc target encoding type, as per the xmlrpc spec (optional)
  * @throws XML_RPC2_InvalidTypeEncodeException When the native value has a type that can't be translated to XML_RPC
  * @return A new XML_RPC2_Value instance
  * @see XML_RPC_Client::__call
  * @see XML_RPC_Server
  */
 public static function createFromNative($nativeValue, $explicitType = null)
 {
     if (is_null($explicitType)) {
         switch (gettype($nativeValue)) {
             case 'boolean':
                 $explicitType = 'boolean';
                 break;
             case 'integer':
                 $explicitType = 'int';
                 break;
             case 'double':
                 $explicitType = 'double';
                 break;
             case 'string':
                 $explicitType = 'string';
                 break;
             case 'array':
                 $explicitType = 'array';
                 $keys = array_keys($nativeValue);
                 if (count($keys) > 0) {
                     if ($keys[0] !== 0 && $keys[0] !== 1) {
                         $explicitType = 'struct';
                     }
                     $i = 0;
                     do {
                         $previous = $keys[$i];
                         $i++;
                         if (array_key_exists($i, $keys) && $keys[$i] !== $keys[$i - 1] + 1) {
                             $explicitType = 'struct';
                         }
                     } while (array_key_exists($i, $keys) && $explicitType == 'array');
                 }
                 break;
             case 'object':
                 if (strtolower(get_class($nativeValue)) == 'stdclass' && isset($nativeValue->xmlrpc_type)) {
                     // In this case, we have a "stdclass native value" (emulate xmlrpcext)
                     // the type 'base64' or 'datetime' is given by xmlrpc_type public property
                     $explicitType = $nativeValue->xmlrpc_type;
                 } else {
                     $nativeValue = serialize($nativeValue);
                     $explicitType = 'base64';
                 }
                 break;
             case 'resource':
             case 'NULL':
             case 'unknown type':
                 throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Impossible to encode value \'%s\' from type \'%s\'. No analogous type in XML_RPC.', (string) $nativeValue, gettype($nativeValue)));
             default:
                 throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Unexpected PHP native type returned by gettype: \'%s\', for value \'%s\'', gettype($nativeValue), (string) $nativeValue));
         }
     }
     $explicitType = ucfirst(strtolower($explicitType));
     switch ($explicitType) {
         case 'I4':
         case 'Int':
         case 'Boolean':
         case 'Double':
         case 'String':
             require_once 'XML/RPC2/Backend/Php/Value/Scalar.php';
             return XML_RPC2_Backend_Php_Value_Scalar::createFromNative($nativeValue);
             break;
         case 'Datetime.iso8601':
         case 'Datetime':
             require_once 'XML/RPC2/Backend/Php/Value/Datetime.php';
             return new XML_RPC2_Backend_Php_Value_Datetime($nativeValue);
             break;
         case 'Base64':
             require_once 'XML/RPC2/Backend/Php/Value/Base64.php';
             return new XML_RPC2_Backend_Php_Value_Base64($nativeValue);
             break;
         case 'Array':
             require_once 'XML/RPC2/Backend/Php/Value/Array.php';
             return new XML_RPC2_Backend_Php_Value_Array($nativeValue);
             break;
         case 'Struct':
             require_once 'XML/RPC2/Backend/Php/Value/Struct.php';
             return new XML_RPC2_Backend_Php_Value_Struct($nativeValue);
             break;
         default:
             throw new XML_RPC2_InvalidTypeEncodeException(sprintf('Unexpected explicit encoding type \'%s\'', $explicitType));
     }
 }
Example #2
0
 /**
  * Constructor. Will build a new XML_RPC2_Value_Boolean with the given value
  *
  * @param mixed value
  */
 public function __construct($nativeValue)
 {
     parent::__construct('boolean', $nativeValue);
 }