tony2001 Thu Jul 12 10:04:42 2007 UTC
Modified files:
/php-src/ext/xmlrpc xmlrpc-epi-php.c
Log:
fix ws, cs and folding
http://cvs.php.net/viewvc.cgi/php-src/ext/xmlrpc/xmlrpc-epi-php.c?r1=1.49&r2=1.50&diff_format=u
Index: php-src/ext/xmlrpc/xmlrpc-epi-php.c
diff -u php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.49
php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.50
--- php-src/ext/xmlrpc/xmlrpc-epi-php.c:1.49 Fri Jan 12 12:31:31 2007
+++ php-src/ext/xmlrpc/xmlrpc-epi-php.c Thu Jul 12 10:04:42 2007
@@ -51,7 +51,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xmlrpc-epi-php.c,v 1.49 2007/01/12 12:31:31 tony2001 Exp $ */
+/* $Id: xmlrpc-epi-php.c,v 1.50 2007/07/12 10:04:42 tony2001 Exp $ */
/**********************************************************************
* BUGS: *
@@ -199,7 +199,7 @@
* startup / shutdown *
*********************/
-static void destroy_server_data(xmlrpc_server_data *server)
+static void destroy_server_data(xmlrpc_server_data *server) /* {{{ */
{
if (server) {
XMLRPC_ServerDestroy(server->server_ptr);
@@ -213,26 +213,28 @@
efree(server);
}
}
+/* }}} */
/* called when server is being destructed. either when xmlrpc_server_destroy
* is called, or when request ends. */
-static void xmlrpc_server_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+static void xmlrpc_server_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /*
{{{ */
{
if (rsrc && rsrc->ptr) {
destroy_server_data((xmlrpc_server_data*) rsrc->ptr);
}
}
+/* }}} */
/* module init */
-PHP_MINIT_FUNCTION(xmlrpc)
+PHP_MINIT_FUNCTION(xmlrpc) /* {{{ */
{
le_xmlrpc_server =
zend_register_list_destructors_ex(xmlrpc_server_destructor, NULL, "xmlrpc
server", module_number);
-
return SUCCESS;
}
+/* }}} */
/* display info in phpinfo() */
-PHP_MINFO_FUNCTION(xmlrpc)
+PHP_MINFO_FUNCTION(xmlrpc) /* {{{ */
{
php_info_print_table_start();
php_info_print_table_row(2, "core library version",
XMLRPC_GetVersionString());
@@ -242,10 +244,11 @@
php_info_print_table_row(2, "open sourced by", "Epinions.com");
php_info_print_table_end();
}
+/* }}} */
/*******************
-* random utilities *
-*******************/
+ * random utilities *
+ *******************/
/* Utility functions for adding data types to arrays, with or without key
(assoc, non-assoc).
* Could easily be further generalized to work with objects.
@@ -273,7 +276,7 @@
#endif
-static int add_zval(zval* list, const char* id, zval** val)
+static int add_zval(zval* list, const char* id, zval** val) /* {{{ */
{
if (list && val) {
if (id) {
@@ -291,17 +294,18 @@
/* what is the correct return on error? */
return 0;
}
+/* }}} */
#define my_zend_hash_get_current_key(ht, my_key, num_index)
zend_hash_get_current_key(ht, my_key, num_index, 0)
/*************************
-* input / output options *
-*************************/
+ * input / output options *
+ *************************/
/* parse an array (user input) into output options suitable for use by xmlrpc
engine
* and determine whether to return data as xml or php vars */
-static void set_output_options(php_output_options* options, zval* output_opts)
+static void set_output_options(php_output_options* options, zval* output_opts)
/* {{{ */
{
if (options) {
@@ -349,280 +353,270 @@
} else if (!strcmp(Z_STRVAL_PP(val),
VERSION_VALUE_SIMPLE)) {
options->xmlrpc_out.version =
xmlrpc_version_simple;
} else if
(!strcmp((*val)->value.str.val, VERSION_VALUE_SOAP11)) {
-
options->xmlrpc_out.version = xmlrpc_version_soap_1_1;
- } else { /*
if(!strcmp((*val)->value.str.val, VERSION_VALUE_AUTO)) { */
- options->b_auto_version
= 1;
+ options->xmlrpc_out.version =
xmlrpc_version_soap_1_1;
+ } else { /*
if(!strcmp((*val)->value.str.val, VERSION_VALUE_AUTO)) */
+ options->b_auto_version = 1;
}
}
}
- /* encoding code set */
- if(zend_hash_find(Z_ARRVAL_P(output_opts),
- ENCODING_KEY, ENCODING_KEY_LEN + 1,
- (void**)&val) == SUCCESS) {
- if(Z_TYPE_PP(val) == IS_STRING) {
- options->xmlrpc_out.xml_elem_opts.encoding =
estrdup(Z_STRVAL_PP(val));
- }
- }
-
- /* escaping options */
- if(zend_hash_find(Z_ARRVAL_P(output_opts),
- ESCAPING_KEY, ESCAPING_KEY_LEN + 1,
- (void**)&val) == SUCCESS) {
- /* multiple values allowed. check if array */
- if(Z_TYPE_PP(val) == IS_ARRAY) {
- zval** iter_val;
- zend_hash_internal_pointer_reset(Z_ARRVAL_PP(val));
- options->xmlrpc_out.xml_elem_opts.escaping =
xml_elem_no_escaping;
- while(1) {
- if(zend_hash_get_current_data(Z_ARRVAL_PP(val),
(void**)&iter_val) == SUCCESS) {
- if(Z_TYPE_PP(iter_val) == IS_STRING &&
Z_STRVAL_PP(iter_val)) {
- if(!strcmp(Z_STRVAL_PP(iter_val),
ESCAPING_VALUE_CDATA)) {
- options->xmlrpc_out.xml_elem_opts.escaping
|= xml_elem_cdata_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(iter_val),
ESCAPING_VALUE_NON_ASCII)) {
- options->xmlrpc_out.xml_elem_opts.escaping
|= xml_elem_non_ascii_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(iter_val),
ESCAPING_VALUE_NON_PRINT)) {
- options->xmlrpc_out.xml_elem_opts.escaping
|= xml_elem_non_print_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(iter_val),
ESCAPING_VALUE_MARKUP)) {
- options->xmlrpc_out.xml_elem_opts.escaping
|= xml_elem_markup_escaping;
- }
- }
- }
- else {
- break;
- }
-
- zend_hash_move_forward(Z_ARRVAL_PP(val));
- }
- }
- /* else, check for single value */
- else if(Z_TYPE_PP(val) == IS_STRING) {
- if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_CDATA)) {
- options->xmlrpc_out.xml_elem_opts.escaping =
xml_elem_cdata_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_NON_ASCII)) {
- options->xmlrpc_out.xml_elem_opts.escaping =
xml_elem_non_ascii_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_NON_PRINT)) {
- options->xmlrpc_out.xml_elem_opts.escaping =
xml_elem_non_print_escaping;
- }
- else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_MARKUP)) {
- options->xmlrpc_out.xml_elem_opts.escaping =
xml_elem_markup_escaping;
- }
- }
- }
- }
+ /* encoding code set */
+ if(zend_hash_find(Z_ARRVAL_P(output_opts),
ENCODING_KEY, ENCODING_KEY_LEN + 1, (void**)&val) == SUCCESS) {
+ if(Z_TYPE_PP(val) == IS_STRING) {
+
options->xmlrpc_out.xml_elem_opts.encoding = estrdup(Z_STRVAL_PP(val));
+ }
+ }
+
+ /* escaping options */
+ if(zend_hash_find(Z_ARRVAL_P(output_opts),
ESCAPING_KEY, ESCAPING_KEY_LEN + 1, (void**)&val) == SUCCESS) {
+ /* multiple values allowed. check if array */
+ if(Z_TYPE_PP(val) == IS_ARRAY) {
+ zval** iter_val;
+
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(val));
+
options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_no_escaping;
+ while(1) {
+
if(zend_hash_get_current_data(Z_ARRVAL_PP(val), (void**)&iter_val) == SUCCESS) {
+ if(Z_TYPE_PP(iter_val)
== IS_STRING && Z_STRVAL_PP(iter_val)) {
+
if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_CDATA)) {
+
options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_cdata_escaping;
+ } else
if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_ASCII)) {
+
options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_ascii_escaping;
+ } else
if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_PRINT)) {
+
options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_print_escaping;
+ } else
if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_MARKUP)) {
+
options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_markup_escaping;
+ }
+ }
+ } else {
+ break;
+ }
+
+
zend_hash_move_forward(Z_ARRVAL_PP(val));
+ }
+ }
+ /* else, check for single value */
+ else if(Z_TYPE_PP(val) == IS_STRING) {
+ if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_CDATA)) {
+
options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_cdata_escaping;
+ } else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_NON_ASCII)) {
+
options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_ascii_escaping;
+ } else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_NON_PRINT)) {
+
options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_print_escaping;
+ } else if(!strcmp(Z_STRVAL_PP(val),
ESCAPING_VALUE_MARKUP)) {
+
options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping;
+ }
+ }
+ }
+ }
}
}
+/* }}} */
/******************
-* encode / decode *
-******************/
+ * encode / decode *
+ ******************/
/* php arrays have no distinction between array and struct types.
* they even allow mixed. Thus, we determine the type by iterating
* through the entire array and figuring out each element.
* room for some optimation here if we stop after a specific # of elements.
*/
-static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht)
+static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) /* {{{ */
{
- int bArray = 0, bStruct = 0, bMixed = 0;
- unsigned long num_index;
- char* my_key;
-
- zend_hash_internal_pointer_reset(ht);
- while(1) {
- int res = my_zend_hash_get_current_key(ht, &my_key, &num_index);
- if(res == HASH_KEY_IS_LONG) {
- if(bStruct) {
- bMixed = 1;
- break;
- }
- bArray = 1;
- }
- else if(res == HASH_KEY_NON_EXISTANT) {
- break;
- }
- else if(res == HASH_KEY_IS_STRING) {
- if(bArray) {
- bMixed = 1;
- break;
- }
- bStruct = 1;
- }
-
- zend_hash_move_forward(ht);
- }
- return bMixed ? xmlrpc_vector_mixed : (bStruct ? xmlrpc_vector_struct :
xmlrpc_vector_array);
+ int bArray = 0, bStruct = 0, bMixed = 0;
+ unsigned long num_index;
+ char* my_key;
+
+ zend_hash_internal_pointer_reset(ht);
+ while(1) {
+ int res = my_zend_hash_get_current_key(ht, &my_key, &num_index);
+ if(res == HASH_KEY_IS_LONG) {
+ if(bStruct) {
+ bMixed = 1;
+ break;
+ }
+ bArray = 1;
+ } else if(res == HASH_KEY_NON_EXISTANT) {
+ break;
+ } else if(res == HASH_KEY_IS_STRING) {
+ if(bArray) {
+ bMixed = 1;
+ break;
+ }
+ bStruct = 1;
+ }
+
+ zend_hash_move_forward(ht);
+ }
+ return bMixed ? xmlrpc_vector_mixed : (bStruct ? xmlrpc_vector_struct :
xmlrpc_vector_array);
}
+/* }}} */
/* recursively convert php values into xmlrpc values */
-static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int
depth TSRMLS_DC)
+static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int
depth TSRMLS_DC) /* {{{ */
{
- XMLRPC_VALUE xReturn = NULL;
- if(in_val) {
- zval* val = NULL;
- XMLRPC_VALUE_TYPE type = get_zval_xmlrpc_type(in_val, &val);
- if(val) {
- switch(type) {
- case xmlrpc_base64:
- if(Z_TYPE_P(val) == IS_NULL) {
- xReturn = XMLRPC_CreateValueEmpty();
+ XMLRPC_VALUE xReturn = NULL;
+ if(in_val) {
+ zval* val = NULL;
+ XMLRPC_VALUE_TYPE type = get_zval_xmlrpc_type(in_val, &val);
+ if(val) {
+ switch(type) {
+ case xmlrpc_base64:
+ if(Z_TYPE_P(val) == IS_NULL) {
+ xReturn =
XMLRPC_CreateValueEmpty();
XMLRPC_SetValueID(xReturn, key,
0);
- }
- else {
- xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL_P(val),
Z_STRLEN_P(val));
- }
- break;
- case xmlrpc_datetime:
- convert_to_string(val);
- xReturn = XMLRPC_CreateValueDateTime_ISO8601(key,
Z_STRVAL_P(val));
- break;
- case xmlrpc_boolean:
- convert_to_boolean(val);
- xReturn = XMLRPC_CreateValueBoolean(key, Z_LVAL_P(val));
- break;
- case xmlrpc_int:
- convert_to_long(val);
- xReturn = XMLRPC_CreateValueInt(key, Z_LVAL_P(val));
- break;
- case xmlrpc_double:
- convert_to_double(val);
- xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL_P(val));
- break;
- case xmlrpc_string:
- convert_to_string(val);
- xReturn = XMLRPC_CreateValueString(key, Z_STRVAL_P(val),
Z_STRLEN_P(val));
- break;
- case xmlrpc_vector:
- {
- unsigned long num_index;
- zval** pIter;
- char* my_key;
- HashTable *ht = NULL;
-
- ht = HASH_OF(val);
- if (ht && ht->nApplyCount > 1) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "XML-RPC
doesn't support circular references");
- return NULL;
- }
-
- convert_to_array(val);
- xReturn = XMLRPC_CreateVector(key,
determine_vector_type(Z_ARRVAL_P(val)));
-
- zend_hash_internal_pointer_reset(Z_ARRVAL_P(val));
- while(zend_hash_get_current_data(Z_ARRVAL_P(val),
(void**)&pIter) == SUCCESS) {
- int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val),
&my_key, &num_index);
-
- switch (res) {
- case HASH_KEY_NON_EXISTANT:
- break;
- default:
- ht = HASH_OF(*pIter);
- if (ht) {
- ht->nApplyCount++;
- }
- if (res == HASH_KEY_IS_LONG) {
- XMLRPC_AddValueToVector(xReturn,
PHP_to_XMLRPC_worker(0, *pIter, depth++ TSRMLS_CC));
- }
- else {
- XMLRPC_AddValueToVector(xReturn,
PHP_to_XMLRPC_worker(my_key, *pIter, depth++ TSRMLS_CC));
- }
- if (ht) {
- ht->nApplyCount--;
- }
- break;
- }
- zend_hash_move_forward(Z_ARRVAL_P(val));
- }
- }
- break;
- default:
- break;
- }
- }
- }
- return xReturn;
+ } else {
+ xReturn =
XMLRPC_CreateValueBase64(key, Z_STRVAL_P(val), Z_STRLEN_P(val));
+ }
+ break;
+ case xmlrpc_datetime:
+ convert_to_string(val);
+ xReturn =
XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL_P(val));
+ break;
+ case xmlrpc_boolean:
+ convert_to_boolean(val);
+ xReturn =
XMLRPC_CreateValueBoolean(key, Z_LVAL_P(val));
+ break;
+ case xmlrpc_int:
+ convert_to_long(val);
+ xReturn = XMLRPC_CreateValueInt(key,
Z_LVAL_P(val));
+ break;
+ case xmlrpc_double:
+ convert_to_double(val);
+ xReturn = XMLRPC_CreateValueDouble(key,
Z_DVAL_P(val));
+ break;
+ case xmlrpc_string:
+ convert_to_string(val);
+ xReturn = XMLRPC_CreateValueString(key,
Z_STRVAL_P(val), Z_STRLEN_P(val));
+ break;
+ case xmlrpc_vector:
+ {
+ unsigned long num_index;
+ zval** pIter;
+ char* my_key;
+ HashTable *ht = NULL;
+
+ ht = HASH_OF(val);
+ if (ht && ht->nApplyCount > 1) {
+ php_error_docref(NULL
TSRMLS_CC, E_ERROR, "XML-RPC doesn't support circular references");
+ return NULL;
+ }
+
+ convert_to_array(val);
+ xReturn =
XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val)));
+
+
zend_hash_internal_pointer_reset(Z_ARRVAL_P(val));
+
while(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) {
+ int res =
my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index);
+
+ switch (res) {
+ case
HASH_KEY_NON_EXISTANT:
+ break;
+ default:
+ ht =
HASH_OF(*pIter);
+ if (ht)
{
+
ht->nApplyCount++;
+ }
+ if (res
== HASH_KEY_IS_LONG) {
+
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(0, *pIter, depth++
TSRMLS_CC));
+ } else {
+
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key, *pIter, depth++
TSRMLS_CC));
+ }
+ if (ht)
{
+
ht->nApplyCount--;
+ }
+ break;
+ }
+
zend_hash_move_forward(Z_ARRVAL_P(val));
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return xReturn;
}
+/* }}} */
-static XMLRPC_VALUE PHP_to_XMLRPC(zval* root_val TSRMLS_DC)
+static XMLRPC_VALUE PHP_to_XMLRPC(zval* root_val TSRMLS_DC) /* {{{ */
{
- return PHP_to_XMLRPC_worker(NULL, root_val, 0 TSRMLS_CC);
+ return PHP_to_XMLRPC_worker(NULL, root_val, 0 TSRMLS_CC);
}
+/* }}} */
/* recursively convert xmlrpc values into php values */
-static zval* XMLRPC_to_PHP(XMLRPC_VALUE el)
+static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) /* {{{ */
{
- zval* elem = NULL;
- const char* pStr;
+ zval* elem = NULL;
+ const char* pStr;
- if(el) {
- XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(el);
+ if(el) {
+ XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(el);
- MAKE_STD_ZVAL(elem); /* init. very important. spent a frustrating day
finding this out. */
-
- switch(type) {
- case xmlrpc_empty:
- Z_TYPE_P(elem) = IS_NULL;
- break;
- case xmlrpc_string:
- pStr = XMLRPC_GetValueString(el);
- if(pStr) {
- Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el);
- Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem));
- Z_TYPE_P(elem) = IS_STRING;
- }
- break;
- case xmlrpc_int:
- Z_LVAL_P(elem) = XMLRPC_GetValueInt(el);
- Z_TYPE_P(elem) = IS_LONG;
- break;
- case xmlrpc_boolean:
- Z_LVAL_P(elem) = XMLRPC_GetValueBoolean(el);
- Z_TYPE_P(elem) = IS_BOOL;
- break;
- case xmlrpc_double:
- Z_DVAL_P(elem) = XMLRPC_GetValueDouble(el);
- Z_TYPE_P(elem) = IS_DOUBLE;
- break;
- case xmlrpc_datetime:
- Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el);
- Z_STRVAL_P(elem) = estrndup(XMLRPC_GetValueDateTime_ISO8601(el),
Z_STRLEN_P(elem));
- Z_TYPE_P(elem) = IS_STRING;
- break;
- case xmlrpc_base64:
- pStr = XMLRPC_GetValueBase64(el);
- if(pStr) {
- Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el);
- Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem));
- Z_TYPE_P(elem) = IS_STRING;
- }
- break;
- case xmlrpc_vector:
- array_init(elem);
- {
- XMLRPC_VALUE xIter = XMLRPC_VectorRewind(el);
-
- while( xIter ) {
- zval *val = XMLRPC_to_PHP(xIter);
- if (val) {
- add_zval(elem,
XMLRPC_GetValueID(xIter), &val);
+ MAKE_STD_ZVAL(elem); /* init. very important. spent a
frustrating day finding this out. */
+
+ switch(type) {
+ case xmlrpc_empty:
+ Z_TYPE_P(elem) = IS_NULL;
+ break;
+ case xmlrpc_string:
+ pStr = XMLRPC_GetValueString(el);
+ if(pStr) {
+ Z_STRLEN_P(elem) =
XMLRPC_GetValueStringLen(el);
+ Z_STRVAL_P(elem) = estrndup(pStr,
Z_STRLEN_P(elem));
+ Z_TYPE_P(elem) = IS_STRING;
}
- xIter = XMLRPC_VectorNext(el);
- }
+ break;
+ case xmlrpc_int:
+ Z_LVAL_P(elem) = XMLRPC_GetValueInt(el);
+ Z_TYPE_P(elem) = IS_LONG;
+ break;
+ case xmlrpc_boolean:
+ Z_LVAL_P(elem) = XMLRPC_GetValueBoolean(el);
+ Z_TYPE_P(elem) = IS_BOOL;
+ break;
+ case xmlrpc_double:
+ Z_DVAL_P(elem) = XMLRPC_GetValueDouble(el);
+ Z_TYPE_P(elem) = IS_DOUBLE;
+ break;
+ case xmlrpc_datetime:
+ Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el);
+ Z_STRVAL_P(elem) =
estrndup(XMLRPC_GetValueDateTime_ISO8601(el), Z_STRLEN_P(elem));
+ Z_TYPE_P(elem) = IS_STRING;
+ break;
+ case xmlrpc_base64:
+ pStr = XMLRPC_GetValueBase64(el);
+ if(pStr) {
+ Z_STRLEN_P(elem) =
XMLRPC_GetValueStringLen(el);
+ Z_STRVAL_P(elem) = estrndup(pStr,
Z_STRLEN_P(elem));
+ Z_TYPE_P(elem) = IS_STRING;
+ }
+ break;
+ case xmlrpc_vector:
+ array_init(elem);
+ {
+ XMLRPC_VALUE xIter =
XMLRPC_VectorRewind(el);
+
+ while( xIter ) {
+ zval *val =
XMLRPC_to_PHP(xIter);
+ if (val) {
+ add_zval(elem,
XMLRPC_GetValueID(xIter), &val);
+ }
+ xIter = XMLRPC_VectorNext(el);
+ }
+ }
+ break;
+ default:
+ break;
}
- break;
- default:
- break;
- }
- set_zval_xmlrpc_type(elem, type);
- }
- return elem;
+ set_zval_xmlrpc_type(elem, type);
+ }
+ return elem;
}
+/* }}} */
/* {{{ proto string xmlrpc_encode_request(string method, mixed params)
Generates XML for a method request */
@@ -663,7 +657,7 @@
XMLRPC_RequestFree(xRequest, 1);
}
}
-
+
if (out.xmlrpc_out.xml_elem_opts.encoding != ENCODING_DEFAULT) {
efree((char *)out.xmlrpc_out.xml_elem_opts.encoding);
}
@@ -701,34 +695,34 @@
}
/* }}} */
-
-zval* decode_request_worker (zval* xml_in, zval* encoding_in, zval*
method_name_out)
+zval* decode_request_worker (zval* xml_in, zval* encoding_in, zval*
method_name_out) /* {{{ */
{
- zval* retval = NULL;
- XMLRPC_REQUEST response;
- STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS opts = {{0}};
- opts.xml_elem_opts.encoding = encoding_in ?
utf8_get_encoding_id_from_string(Z_STRVAL_P(encoding_in)) : ENCODING_DEFAULT;
-
- /* generate XMLRPC_REQUEST from raw xml */
- response = XMLRPC_REQUEST_FromXML(Z_STRVAL_P(xml_in), Z_STRLEN_P(xml_in),
&opts);
- if(response) {
- /* convert xmlrpc data to native php types */
- retval = XMLRPC_to_PHP(XMLRPC_RequestGetData(response));
-
- if(XMLRPC_RequestGetRequestType(response) == xmlrpc_request_call) {
- if(method_name_out) {
- zval_dtor(method_name_out);
- Z_TYPE_P(method_name_out) = IS_STRING;
- Z_STRVAL_P(method_name_out) =
estrdup(XMLRPC_RequestGetMethodName(response));
- Z_STRLEN_P(method_name_out) = strlen(Z_STRVAL_P(method_name_out));
- }
- }
-
- /* dust, sweep, and mop */
- XMLRPC_RequestFree(response, 1);
- }
- return retval;
+ zval* retval = NULL;
+ XMLRPC_REQUEST response;
+ STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS opts = {{0}};
+ opts.xml_elem_opts.encoding = encoding_in ?
utf8_get_encoding_id_from_string(Z_STRVAL_P(encoding_in)) : ENCODING_DEFAULT;
+
+ /* generate XMLRPC_REQUEST from raw xml */
+ response = XMLRPC_REQUEST_FromXML(Z_STRVAL_P(xml_in),
Z_STRLEN_P(xml_in), &opts);
+ if(response) {
+ /* convert xmlrpc data to native php types */
+ retval = XMLRPC_to_PHP(XMLRPC_RequestGetData(response));
+
+ if(XMLRPC_RequestGetRequestType(response) ==
xmlrpc_request_call) {
+ if(method_name_out) {
+ zval_dtor(method_name_out);
+ Z_TYPE_P(method_name_out) = IS_STRING;
+ Z_STRVAL_P(method_name_out) =
estrdup(XMLRPC_RequestGetMethodName(response));
+ Z_STRLEN_P(method_name_out) =
strlen(Z_STRVAL_P(method_name_out));
+ }
+ }
+
+ /* dust, sweep, and mop */
+ XMLRPC_RequestFree(response, 1);
+ }
+ return retval;
}
+/* }}} */
/* {{{ proto array xmlrpc_decode_request(string xml, string& method [, string
encoding])
Decodes XML into native PHP types */
@@ -757,7 +751,6 @@
}
/* }}} */
-
/* {{{ proto array xmlrpc_decode(string xml [, string encoding])
Decodes XML into native PHP types */
PHP_FUNCTION(xmlrpc_decode)
@@ -784,10 +777,9 @@
}
/* }}} */
-
/*************************
-* server related methods *
-*************************/
+ * server related methods *
+ *************************/
/* {{{ proto resource xmlrpc_server_create(void)
Creates an xmlrpc server */
@@ -802,10 +794,10 @@
xmlrpc_server_data *server =
emalloc(sizeof(xmlrpc_server_data));
MAKE_STD_ZVAL(method_map);
MAKE_STD_ZVAL(introspection_map);
-
+
array_init(method_map);
array_init(introspection_map);
-
+
/* allocate server data. free'd in destroy_server_data() */
server->method_map = method_map;
server->introspection_map = introspection_map;
@@ -847,104 +839,105 @@
}
/* }}} */
-
/* called by xmlrpc C engine as method handler for all registered methods.
* it then calls the corresponding PHP function to handle the method.
*/
-static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST
xRequest, void* data)
+static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST
xRequest, void* data) /* {{{ */
{
- xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data;
- zval* xmlrpc_params;
- zval* callback_params[3];
- TSRMLS_FETCH();
-
- /* convert xmlrpc to native php types */
- xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest));
-
- /* setup data hoojum */
- callback_params[0] = pData->xmlrpc_method;
- callback_params[1] = xmlrpc_params;
- callback_params[2] = pData->caller_params;
+ xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data;
+ zval* xmlrpc_params;
+ zval* callback_params[3];
+ TSRMLS_FETCH();
+
+ /* convert xmlrpc to native php types */
+ xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest));
+
+ /* setup data hoojum */
+ callback_params[0] = pData->xmlrpc_method;
+ callback_params[1] = xmlrpc_params;
+ callback_params[2] = pData->caller_params;
- /* Use same C function for all methods */
+ /* Use same C function for all methods */
- /* php func prototype: function user_func($method_name, $xmlrpc_params,
$user_params) */
- call_user_function(CG(function_table), NULL, pData->php_function,
pData->return_data, 3, callback_params TSRMLS_CC);
+ /* php func prototype: function user_func($method_name, $xmlrpc_params,
$user_params) */
+ call_user_function(CG(function_table), NULL, pData->php_function,
pData->return_data, 3, callback_params TSRMLS_CC);
- pData->php_executed = 1;
+ pData->php_executed = 1;
zval_dtor(xmlrpc_params);
FREE_ZVAL(xmlrpc_params);
return NULL;
}
+/* }}} */
/* called by the C server when it first receives an introspection request. We
pass this on to
* our PHP listeners, if any
*/
-static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data)
+static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void*
data) /* {{{ */
{
- zval *retval_ptr, **php_function;
- zval* callback_params[1];
- xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data;
- TSRMLS_FETCH();
-
- MAKE_STD_ZVAL(retval_ptr);
- Z_TYPE_P(retval_ptr) = IS_NULL;
-
- /* setup data hoojum */
- callback_params[0] = pData->caller_params;
-
- /* loop through and call all registered callbacks */
-
zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map));
- while(1) {
-
if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map),
- (void**)&php_function) == SUCCESS) {
-
- /* php func prototype: function string user_func($user_params) */
- if(call_user_function(CG(function_table), NULL, *php_function,
- retval_ptr, 1, callback_params TSRMLS_CC) ==
SUCCESS) {
- XMLRPC_VALUE xData;
- STRUCT_XMLRPC_ERROR err = {0};
-
- /* return value should be a string */
- convert_to_string(retval_ptr);
-
- xData =
XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err);
-
- if(xData) {
- if(!XMLRPC_ServerAddIntrospectionData(server, xData)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add
introspection data returned from %s(), improper element structure",
Z_STRVAL_PP(php_function));
- }
- XMLRPC_CleanupValue(xData);
- }
- else {
- /* could not create description */
- if(err.xml_elem_error.parser_code) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse
error: [line %ld, column %ld, message: %s] Unable to add introspection data
returned from %s()",
- err.xml_elem_error.column,
err.xml_elem_error.line, err.xml_elem_error.parser_error,
Z_STRVAL_PP(php_function));
- }
- else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add
introspection data returned from %s()",
- Z_STRVAL_PP(php_function));
- }
- }
- }
- else {
- /* user func failed */
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user
introspection callback: %s()", Z_STRVAL_PP(php_function));
- }
- }
- else {
- break;
- }
+ zval *retval_ptr, **php_function;
+ zval* callback_params[1];
+ xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data;
+ TSRMLS_FETCH();
+
+ MAKE_STD_ZVAL(retval_ptr);
+ Z_TYPE_P(retval_ptr) = IS_NULL;
+
+ /* setup data hoojum */
+ callback_params[0] = pData->caller_params;
+
+ /* loop through and call all registered callbacks */
+
zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map));
+ while(1) {
+
if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map),
+ (void**)&php_function) == SUCCESS) {
+
+ /* php func prototype: function string
user_func($user_params) */
+ if(call_user_function(CG(function_table), NULL,
*php_function,
+ retval_ptr, 1, callback_params
TSRMLS_CC) == SUCCESS) {
+ XMLRPC_VALUE xData;
+ STRUCT_XMLRPC_ERROR err = {0};
+
+ /* return value should be a string */
+ convert_to_string(retval_ptr);
+
+ xData =
XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err);
+
+ if(xData) {
+
if(!XMLRPC_ServerAddIntrospectionData(server, xData)) {
+ php_error_docref(NULL
TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(),
improper element structure", Z_STRVAL_PP(php_function));
+ }
+ XMLRPC_CleanupValue(xData);
+ }
+ else {
+ /* could not create description */
+ if(err.xml_elem_error.parser_code) {
+ php_error_docref(NULL
TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s]
Unable to add introspection data returned from %s()",
+
err.xml_elem_error.column, err.xml_elem_error.line,
err.xml_elem_error.parser_error, Z_STRVAL_PP(php_function));
+ }
+ else {
+ php_error_docref(NULL
TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()",
+
Z_STRVAL_PP(php_function));
+ }
+ }
+ }
+ else {
+ /* user func failed */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Error calling user introspection callback: %s()", Z_STRVAL_PP(php_function));
+ }
+ }
+ else {
+ break;
+ }
- zend_hash_move_forward(Z_ARRVAL_P(pData->server->introspection_map));
- }
+
zend_hash_move_forward(Z_ARRVAL_P(pData->server->introspection_map));
+ }
- /* so we don't call the same callbacks ever again */
- zend_hash_clean(Z_ARRVAL_P(pData->server->introspection_map));
+ /* so we don't call the same callbacks ever again */
+ zend_hash_clean(Z_ARRVAL_P(pData->server->introspection_map));
}
+/* }}} */
/* {{{ proto bool xmlrpc_server_register_method(resource server, string
method_name, string function)
Register a PHP function to handle method matching method_name */
@@ -980,7 +973,6 @@
}
/* }}} */
-
/* {{{ proto bool xmlrpc_server_register_introspection_callback(resource
server, string function)
Register a PHP function to generate documentation */
PHP_FUNCTION(xmlrpc_server_register_introspection_callback)
@@ -1010,9 +1002,7 @@
}
/* }}} */
-
/* this function is itchin for a re-write */
-
/* {{{ proto mixed xmlrpc_server_call_method(resource server, string xml,
mixed user_data [, array output_options])
Parses XML requests and call methods */
PHP_FUNCTION(xmlrpc_server_call_method)
@@ -1025,15 +1015,14 @@
int type;
php_output_options out;
int argc =ZEND_NUM_ARGS();
-
+
if (argc < 3 || argc > 4 || (zend_get_parameters_ex(argc, &handle,
&rawxml, &caller_params, &output_opts) != SUCCESS)) {
WRONG_PARAM_COUNT;
}
/* user output options */
if (argc == 3) {
set_output_options(&out, NULL);
- }
- else {
+ } else {
set_output_options(&out, *output_opts);
}
@@ -1058,7 +1047,7 @@
if (!methodname) {
methodname = "";
}
-
+
/* setup some data to pass to the callback function */
Z_STRVAL_P(data.xmlrpc_method) = estrdup(methodname);
Z_STRLEN_P(data.xmlrpc_method) = strlen(methodname);
@@ -1069,9 +1058,9 @@
/* check if the called method has been previous
registered */
if(zend_hash_find(Z_ARRVAL_P(server->method_map),
- Z_STRVAL_P(data.xmlrpc_method),
- Z_STRLEN_P(data.xmlrpc_method) + 1,
- (void**)&php_function) == SUCCESS) {
+ Z_STRVAL_P(data.xmlrpc_method),
+ Z_STRLEN_P(data.xmlrpc_method)
+ 1,
+ (void**)&php_function) ==
SUCCESS) {
data.php_function = *php_function;
}
@@ -1139,7 +1128,6 @@
}
/* }}} */
-
/* {{{ proto int xmlrpc_server_add_introspection_data(resource server, array
desc)
Adds introspection documentation */
PHP_FUNCTION(xmlrpc_server_add_introspection_data)
@@ -1166,7 +1154,6 @@
}
/* }}} */
-
/* {{{ proto array xmlrpc_parse_method_descriptions(string xml)
Decodes XML into a list of method descriptions */
PHP_FUNCTION(xmlrpc_parse_method_descriptions)
@@ -1195,7 +1182,7 @@
/* could not create description */
if(err.xml_elem_error.parser_code) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"xml parse error: [line %ld, column %ld, message: %s] Unable to create
introspection data",
- err.xml_elem_error.column,
err.xml_elem_error.line, err.xml_elem_error.parser_error);
+ err.xml_elem_error.column,
err.xml_elem_error.line, err.xml_elem_error.parser_error);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Invalid xml structure. Unable to create introspection data");
}
@@ -1206,188 +1193,191 @@
}
/* }}} */
-
/************
-* type data *
-************/
+ * type data *
+ ************/
#define XMLRPC_TYPE_COUNT 9
#define XMLRPC_VECTOR_TYPE_COUNT 4
#define TYPE_STR_MAP_SIZE (XMLRPC_TYPE_COUNT + XMLRPC_VECTOR_TYPE_COUNT)
/* return a string matching a given xmlrpc type */
-static const char** get_type_str_mapping(void)
+static const char** get_type_str_mapping(void) /* {{{ */
{
- static const char* str_mapping[TYPE_STR_MAP_SIZE];
- static int first = 1;
- if (first) {
- /* warning. do not add/delete without changing size define */
- str_mapping[xmlrpc_none] = "none";
- str_mapping[xmlrpc_empty] = "empty";
- str_mapping[xmlrpc_base64] = "base64";
- str_mapping[xmlrpc_boolean] = "boolean";
- str_mapping[xmlrpc_datetime] = "datetime";
- str_mapping[xmlrpc_double] = "double";
- str_mapping[xmlrpc_int] = "int";
- str_mapping[xmlrpc_string] = "string";
- str_mapping[xmlrpc_vector] = "vector";
- str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_none] = "none";
- str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_array] = "array";
- str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_mixed] = "mixed";
- str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_struct] = "struct";
- first = 0;
- }
- return (const char**)str_mapping;
+ static const char* str_mapping[TYPE_STR_MAP_SIZE];
+ static int first = 1;
+ if (first) {
+ /* warning. do not add/delete without changing size define */
+ str_mapping[xmlrpc_none] = "none";
+ str_mapping[xmlrpc_empty] = "empty";
+ str_mapping[xmlrpc_base64] = "base64";
+ str_mapping[xmlrpc_boolean] = "boolean";
+ str_mapping[xmlrpc_datetime] = "datetime";
+ str_mapping[xmlrpc_double] = "double";
+ str_mapping[xmlrpc_int] = "int";
+ str_mapping[xmlrpc_string] = "string";
+ str_mapping[xmlrpc_vector] = "vector";
+ str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_none] = "none";
+ str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_array] = "array";
+ str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_mixed] = "mixed";
+ str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_struct] =
"struct";
+ first = 0;
+ }
+ return (const char**)str_mapping;
}
+/* }}} */
/* map an xmlrpc type to a string */
-const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE
vtype)
+const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE
vtype) /* {{{ */
{
- const char** str_mapping = get_type_str_mapping();
+ const char** str_mapping = get_type_str_mapping();
- if (vtype == xmlrpc_vector_none) {
- return str_mapping[type];
- } else {
- return str_mapping[XMLRPC_TYPE_COUNT + vtype];
- }
+ if (vtype == xmlrpc_vector_none) {
+ return str_mapping[type];
+ } else {
+ return str_mapping[XMLRPC_TYPE_COUNT + vtype];
+ }
}
+/* }}} */
/* map a string to an xmlrpc type */
-XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str)
+XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str) /* {{{ */
{
- const char** str_mapping = get_type_str_mapping();
- int i;
+ const char** str_mapping = get_type_str_mapping();
+ int i;
- if (str) {
- for (i = 0; i < XMLRPC_TYPE_COUNT; i++) {
- if (!strcmp(str_mapping[i], str)) {
- return (XMLRPC_VALUE_TYPE) i;
- }
- }
- }
- return xmlrpc_none;
+ if (str) {
+ for (i = 0; i < XMLRPC_TYPE_COUNT; i++) {
+ if (!strcmp(str_mapping[i], str)) {
+ return (XMLRPC_VALUE_TYPE) i;
+ }
+ }
+ }
+ return xmlrpc_none;
}
+/* }}} */
/* map a string to an xmlrpc vector type */
-XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str)
+XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str) /* {{{ */
{
- const char** str_mapping = get_type_str_mapping();
- int i;
+ const char** str_mapping = get_type_str_mapping();
+ int i;
- if (str) {
- for (i = XMLRPC_TYPE_COUNT; i < TYPE_STR_MAP_SIZE; i++) {
- if (!strcmp(str_mapping[i], str)) {
- return (XMLRPC_VECTOR_TYPE) (i - XMLRPC_TYPE_COUNT);
- }
- }
- }
- return xmlrpc_none;
+ if (str) {
+ for (i = XMLRPC_TYPE_COUNT; i < TYPE_STR_MAP_SIZE; i++) {
+ if (!strcmp(str_mapping[i], str)) {
+ return (XMLRPC_VECTOR_TYPE) (i -
XMLRPC_TYPE_COUNT);
+ }
+ }
+ }
+ return xmlrpc_none;
}
-
+/* }}} */
/* set a given value to a particular type.
* note: this only works on strings, and only for date and base64,
* which do not have native php types. black magic lies herein.
*/
-int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype)
+int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */
{
- int bSuccess = FAILURE;
- TSRMLS_FETCH();
+ int bSuccess = FAILURE;
+ TSRMLS_FETCH();
- /* we only really care about strings because they can represent
- * base64 and datetime. all other types have corresponding php types
- */
- if (Z_TYPE_P(value) == IS_STRING) {
- if (newtype == xmlrpc_base64 || newtype == xmlrpc_datetime) {
- const char* typestr = xmlrpc_type_as_str(newtype, xmlrpc_vector_none);
- zval* type;
-
- MAKE_STD_ZVAL(type);
-
- Z_TYPE_P(type) = IS_STRING;
- Z_STRVAL_P(type) = estrdup(typestr);
- Z_STRLEN_P(type) = strlen(typestr);
-
- if(newtype == xmlrpc_datetime) {
- XMLRPC_VALUE v = XMLRPC_CreateValueDateTime_ISO8601(NULL,
value->value.str.val);
- if(v) {
- time_t timestamp = XMLRPC_GetValueDateTime(v);
- if(timestamp) {
- zval* ztimestamp;
-
- MAKE_STD_ZVAL(ztimestamp);
-
- ztimestamp->type = IS_LONG;
- ztimestamp->value.lval = timestamp;
-
- convert_to_object(value);
- if(SUCCESS == zend_hash_update(Z_OBJPROP_P(value),
OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *),
NULL)) {
- bSuccess = zend_hash_update(Z_OBJPROP_P(value),
OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR), (void *) &ztimestamp,
sizeof(zval *), NULL);
- }
- }
- XMLRPC_CleanupValue(v);
- }
- }
- else {
- convert_to_object(value);
- bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR,
sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL);
- }
- }
- }
-
- return bSuccess;
+ /* we only really care about strings because they can represent
+ * base64 and datetime. all other types have corresponding php types
+ */
+ if (Z_TYPE_P(value) == IS_STRING) {
+ if (newtype == xmlrpc_base64 || newtype == xmlrpc_datetime) {
+ const char* typestr = xmlrpc_type_as_str(newtype,
xmlrpc_vector_none);
+ zval* type;
+
+ MAKE_STD_ZVAL(type);
+
+ Z_TYPE_P(type) = IS_STRING;
+ Z_STRVAL_P(type) = estrdup(typestr);
+ Z_STRLEN_P(type) = strlen(typestr);
+
+ if(newtype == xmlrpc_datetime) {
+ XMLRPC_VALUE v =
XMLRPC_CreateValueDateTime_ISO8601(NULL, value->value.str.val);
+ if(v) {
+ time_t timestamp =
XMLRPC_GetValueDateTime(v);
+ if(timestamp) {
+ zval* ztimestamp;
+
+ MAKE_STD_ZVAL(ztimestamp);
+
+ ztimestamp->type = IS_LONG;
+ ztimestamp->value.lval =
timestamp;
+
+ convert_to_object(value);
+ if(SUCCESS ==
zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR,
sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL)) {
+ bSuccess =
zend_hash_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR,
sizeof(OBJECT_VALUE_TS_ATTR), (void *) &ztimestamp, sizeof(zval *), NULL);
+ }
+ }
+ XMLRPC_CleanupValue(v);
+ }
+ }
+ else {
+ convert_to_object(value);
+ bSuccess = zend_hash_update(Z_OBJPROP_P(value),
OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *),
NULL);
+ }
+ }
+ }
+
+ return bSuccess;
}
+/* }}} */
/* return xmlrpc type of a php value */
-XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue)
+XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */
{
- XMLRPC_VALUE_TYPE type = xmlrpc_none;
- TSRMLS_FETCH();
+ XMLRPC_VALUE_TYPE type = xmlrpc_none;
+ TSRMLS_FETCH();
- if (value) {
- switch (Z_TYPE_P(value)) {
- case IS_NULL:
- type = xmlrpc_base64;
- break;
+ if (value) {
+ switch (Z_TYPE_P(value)) {
+ case IS_NULL:
+ type = xmlrpc_base64;
+ break;
#ifndef BOOL_AS_LONG
- /* Right thing to do, but it breaks some legacy code. */
- case IS_BOOL:
- type = xmlrpc_boolean;
- break;
+ /* Right thing to do, but it breaks some legacy
code. */
+ case IS_BOOL:
+ type = xmlrpc_boolean;
+ break;
#else
- case IS_BOOL:
+ case IS_BOOL:
#endif
- case IS_LONG:
- case IS_RESOURCE:
- type = xmlrpc_int;
- break;
- case IS_DOUBLE:
- type = xmlrpc_double;
- break;
- case IS_CONSTANT:
- type = xmlrpc_string;
- break;
- case IS_STRING:
- type = xmlrpc_string;
- break;
- case IS_ARRAY:
- case IS_CONSTANT_ARRAY:
- type = xmlrpc_vector;
- break;
- case IS_OBJECT:
- {
- zval** attr;
- type = xmlrpc_vector;
-
- if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR,
sizeof(OBJECT_TYPE_ATTR), (void**) &attr) == SUCCESS) {
- if (Z_TYPE_PP(attr) == IS_STRING) {
- type = xmlrpc_str_as_type(Z_STRVAL_PP(attr));
- }
- }
- break;
- }
- }
+ case IS_LONG:
+ case IS_RESOURCE:
+ type = xmlrpc_int;
+ break;
+ case IS_DOUBLE:
+ type = xmlrpc_double;
+ break;
+ case IS_CONSTANT:
+ type = xmlrpc_string;
+ break;
+ case IS_STRING:
+ type = xmlrpc_string;
+ break;
+ case IS_ARRAY:
+ case IS_CONSTANT_ARRAY:
+ type = xmlrpc_vector;
+ break;
+ case IS_OBJECT:
+ {
+ zval** attr;
+ type = xmlrpc_vector;
+
+ if (zend_hash_find(Z_OBJPROP_P(value),
OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void**) &attr) == SUCCESS) {
+ if (Z_TYPE_PP(attr) ==
IS_STRING) {
+ type =
xmlrpc_str_as_type(Z_STRVAL_PP(attr));
+ }
+ }
+ break;
+ }
+ }
/* if requested, return an unmolested (magic removed) copy of
the value */
if (newvalue) {
@@ -1405,7 +1395,7 @@
return type;
}
-
+/* }}} */
/* {{{ proto bool xmlrpc_set_type(string value, string type)
Sets xmlrpc type, base64 or datetime, for a PHP string value */
@@ -1447,7 +1437,7 @@
if (type == xmlrpc_vector) {
vtype = determine_vector_type((Z_TYPE_PP(arg) == IS_OBJECT) ?
Z_OBJPROP_PP(arg) : Z_ARRVAL_PP(arg));
}
-
+
RETURN_STRING((char*) xmlrpc_type_as_str(type, vtype), 1);
}
/* }}} */
@@ -1472,7 +1462,7 @@
* a big array. Thus, we resort to this not so clever hackery.
*/
if (zend_hash_find(Z_ARRVAL_PP(arg), FAULT_CODE, FAULT_CODE_LEN
+ 1, (void**) &val) == SUCCESS &&
- zend_hash_find(Z_ARRVAL_PP(arg), FAULT_STRING,
FAULT_STRING_LEN + 1, (void**) &val) == SUCCESS) {
+ zend_hash_find(Z_ARRVAL_PP(arg), FAULT_STRING,
FAULT_STRING_LEN + 1, (void**) &val) == SUCCESS) {
RETURN_TRUE;
}
}
@@ -1481,8 +1471,6 @@
}
/* }}} */
-
-
/*
* Local variables:
* tab-width: 4
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php