00001 <?php 00002 namespace Habari; 00012 class XMLRPCUtils 00013 { 00014 00021 public static function encode_arg( $params, $arg ) 00022 { 00023 switch ( true ) { 00024 case is_array( $arg ): 00025 $data = $params->addchild( 'value' )->addchild( 'array' )->addchild( 'data' ); 00026 foreach ( $arg as $element ) { 00027 self::encode_arg( $data, $element ); 00028 } 00029 break; 00030 case ( $arg instanceof XMLRPCDate ): 00031 $params->addchild( 'value' )->addchild( 'dateTime.iso8601', date( 'c', $arg->date ) ); 00032 break; 00033 case ( $arg instanceof XMLRPCBinary ): 00034 $params->addchild( 'value' )->addchild( 'base64', base64_encode( $arg->data ) ); 00035 break; 00036 case ( $arg instanceof XMLRPCStruct ): 00037 $struct = $params->addchild( 'value' )->addchild( 'struct' ); 00038 $object_vars = $arg->get_fields(); 00039 foreach ( $object_vars as $field ) { 00040 $member = $struct->addchild( 'member' ); 00041 $member->addchild( 'name', $field ); 00042 self::encode_arg( $member, $arg->$field ); 00043 } 00044 break; 00045 case is_object( $arg ): 00046 $struct = $params->addchild( 'value' )->addchild( 'struct' ); 00047 $object_vars = get_object_vars( $arg ); 00048 foreach ( $object_vars as $key=>$value ) { 00049 $member = $struct->addchild( 'member' ); 00050 $member->addchild( 'name', $key ); 00051 self::encode_arg( $member, $value ); 00052 } 00053 break; 00054 case is_integer( $arg ): 00055 $params->addchild( 'value' )->addchild( 'i4', $arg ); 00056 break; 00057 case is_bool( $arg ): 00058 $params->addchild( 'value' )->addchild( 'boolean', $arg ? '1' : '0' ); 00059 break; 00060 case is_string( $arg ): 00061 $params->addchild( 'value' )->addchild( 'string', $arg ); 00062 break; 00063 case is_float( $arg ): 00064 $params->addchild( 'value' )->addchild( 'double', $arg ); 00065 break; 00066 } 00067 } 00068 00075 public static function decode_args( $value ) 00076 { 00077 if ( count( $value->children() ) ) { 00078 $value = $value->xpath( '*' ); 00079 $value = $value[0]; 00080 } 00081 switch ( $value->getName() ) { 00082 case 'data': 00083 case 'array': 00084 $result_array = array(); 00085 foreach ( $value->xpath( '//data/value' ) as $array_value ) { 00086 $result_array[] = self::decode_args( $array_value ); 00087 } 00088 return $result_array; 00089 break; 00090 case 'struct': 00091 $result_struct = new XMLRPCStruct(); 00092 foreach ( $value->xpath( '//member' ) as $struct_value ) { 00093 $property_name = (string) $struct_value->name; 00094 $children = $struct_value->value->children(); 00095 if ( count( $children ) > 0 ) { 00096 $result_struct->$property_name = self::decode_args( $children[0] ); 00097 } 00098 else { 00099 $result_struct->$property_name = (string) $struct_value->value; 00100 } 00101 } 00102 return $result_struct; 00103 break; 00104 case 'string': 00105 return (string) $value; 00106 case 'i4': 00107 case 'integer': 00108 return (int) $value; 00109 case 'double': 00110 return (double) $value; 00111 case 'boolean': 00112 return ( (int) $value == 1 ) ? true : false; 00113 case 'dateTime.iso8601': 00114 return strtotime( (string) $value ); 00115 default: 00116 return (string) $value; 00117 } 00118 } 00119 00120 } 00121 00122 ?>