public static function encode_arg($params, $arg)
{
switch (true) {
case is_array($arg):
$data = $params->addchild('value')->addchild('array')->addchild('data');
foreach ($arg as $element) {
self::encode_arg($data, $element);
}
break;
case $arg instanceof XMLRPCDate:
$params->addchild('value')->addchild('dateTime.iso8601', date('c', $arg->date));
break;
case $arg instanceof XMLRPCBinary:
$params->addchild('value')->addchild('base64', base64_encode($arg->data));
break;
case $arg instanceof XMLRPCStruct:
$struct = $params->addchild('value')->addchild('struct');
$object_vars = $arg->get_fields();
foreach ($object_vars as $field) {
$member = $struct->addchild('member');
$member->addchild('name', $field);
self::encode_arg($member, $arg->{$field});
}
break;
case is_object($arg):
$struct = $params->addchild('value')->addchild('struct');
$object_vars = get_object_vars($arg);
foreach ($object_vars as $key => $value) {
$member = $struct->addchild('member');
$member->addchild('name', $key);
self::encode_arg($member, $value);
}
break;
case is_integer($arg):
$params->addchild('value')->addchild('i4', $arg);
break;
case is_bool($arg):
$params->addchild('value')->addchild('boolean', $arg ? '1' : '0');
break;
case is_string($arg):
$params->addchild('value')->addchild('string', $arg);
break;
case is_float($arg):
$params->addchild('value')->addchild('double', $arg);
break;
}
}