ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
XML_RPC2_Backend_Php_Value Class Reference
+ Inheritance diagram for XML_RPC2_Backend_Php_Value:
+ Collaboration diagram for XML_RPC2_Backend_Php_Value:

Public Member Functions

 getNativeValue ()
 nativeValue property getter

Static Public Member Functions

static createFromNative ($nativeValue, $explicitType=null)
 Choose a XML_RPC2_Value subclass appropriate for the given value and create it.
static createFromDecode ($simpleXML)
 Decode an encoded value and build the applicable XML_RPC2_Value subclass.

Protected Member Functions

 setNativeValue ($value)
 nativeValue setter

Private Attributes

 $_nativeValue = null

Detailed Description

Definition at line 57 of file Value.php.

Member Function Documentation

static XML_RPC2_Backend_Php_Value::createFromDecode (   $simpleXML)
static

Decode an encoded value and build the applicable XML_RPC2_Value subclass.

Parameters
SimpleXMLElementThe encoded XML-RPC value
Returns
mixed the corresponding XML_RPC2_Value object

Definition at line 215 of file Value.php.

References createFromNative().

Referenced by XML_RPC2_Backend_Php_Value_Array\decode(), XML_RPC2_Backend_Php_Value_Struct\decode(), and XML_RPC2_Backend_Php_Response\decode().

{
// TODO Remove reparsing of XML fragment, when SimpleXML proves more solid. Currently it segfaults when
// xpath is used both in an element and in one of its children
$simpleXML = simplexml_load_string($simpleXML->asXML());
$valueType = $simpleXML->xpath('./*');
if (count($valueType) == 1) { // Usually we must check the node name
$nodename = dom_import_simplexml($valueType[0])->nodeName;
switch ($nodename) {
case 'i4':
case 'int':
$nativeType = 'Integer';
break;
case 'boolean':
$nativeType = 'Boolean';
break;
case 'double':
$nativeType = 'Double';
break;
case 'string':
$nativeType = 'String';
break;
case 'dateTime.iso8601':
$nativeType = 'Datetime';
break;
case 'base64':
$nativeType = 'Base64';
break;
case 'array':
$nativeType = 'Array';
break;
case 'struct':
$nativeType = 'Struct';
break;
default:
throw new XML_RPC2_DecodeException(sprintf('Unable to decode XML-RPC value. Value type is not recognized \'%s\'', $nodename));
}
} elseif (count($valueType) == 0) { // Default type is string
$nodename = null;
$nativeType = 'String';
} else {
throw new XML_RPC2_DecodeException(sprintf('Unable to decode XML-RPC value. Value presented %s type nodes: %s.', count($valueType), $simpleXML->asXML()));
}
require_once(sprintf('XML/RPC2/Backend/Php/Value/%s.php', $nativeType));
$nativeType = 'XML_RPC2_Backend_Php_Value_' . $nativeType;
return self::createFromNative(@call_user_func(array($nativeType, 'decode'), $simpleXML), $nodename);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static XML_RPC2_Backend_Php_Value::createFromNative (   $nativeValue,
  $explicitType = null 
)
static

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.

Parameters
mixedThe native value
stringThe xml-rpc target encoding type, as per the xmlrpc spec (optional)
Exceptions
XML_RPC2_InvalidTypeEncodeExceptionWhen the native value has a type that can't be translated to XML_RPC
Returns
A new XML_RPC2_Value instance
See Also
XML_RPC_Client::__call
XML_RPC_Server

Reimplemented from XML_RPC2_Value.

Reimplemented in XML_RPC2_Backend_Php_Value_Scalar.

Definition at line 123 of file Value.php.

Referenced by createFromDecode(), XML_RPC2_Backend_Php_Response\encode(), XML_RPC2_Backend_Php_Value_Array\encode(), XML_RPC2_Backend_Php_Value_Struct\encode(), and XML_RPC2_Backend_Php_Request\encode().

{
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';
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));
}
}

+ Here is the caller graph for this function:

XML_RPC2_Backend_Php_Value::getNativeValue ( )
XML_RPC2_Backend_Php_Value::setNativeValue (   $value)
protected

Field Documentation

XML_RPC2_Backend_Php_Value::$_nativeValue = null
private

Definition at line 66 of file Value.php.

Referenced by getNativeValue().


The documentation for this class was generated from the following file: