Skip to content

Commit aadb0c9

Browse files
author
Jan Lehnardt
committed
- Added wddx_serialize_type(). Allows users to cast values to WDDX types
@- Added wddx_serialize_type(). Allows users to cast values to WDDX types (jan)
1 parent 1731767 commit aadb0c9

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

ext/wddx/php_wddx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ extern zend_module_entry wddx_module_entry;
3030

3131
PHP_FUNCTION(wddx_serialize_value);
3232
PHP_FUNCTION(wddx_serialize_vars);
33+
PHP_FUNCTION(wddx_serialize_type);
3334
PHP_FUNCTION(wddx_packet_start);
3435
PHP_FUNCTION(wddx_packet_end);
3536
PHP_FUNCTION(wddx_add_vars);

ext/wddx/php_wddx_api.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#define WDDX_ARRAY_E "</array>"
2828
#define WDDX_BINARY_S "<binary>"
2929
#define WDDX_BINARY_E "</binary>"
30+
#define WDDX_BINARY "<binary>%s</binary>"
3031
#define WDDX_BOOLEAN "<boolean value='%s'/>"
3132
#define WDDX_CHAR "<char code='%02X'/>"
3233
#define WDDX_COMMENT_S "<comment>"
@@ -47,6 +48,17 @@
4748
#define WDDX_VAR_S "<var name='%s'>"
4849
#define WDDX_VAR_E "</var>"
4950

51+
#define WDDX_NUMBER_T 0
52+
#define WDDX_BOOLEAN_T 1
53+
#define WDDX_NULL_T 2
54+
#define WDDX_STRING_T 3
55+
#define WDDX_DATETIME_T 4
56+
#define WDDX_ARRAY_T 5
57+
#define WDDX_STRUCT_T 6
58+
#define WDDX_RECORDSET_T 7
59+
#define WDDX_BINARY_T 8
60+
61+
5062
#define php_wddx_add_chunk(packet, str) smart_str_appends(packet, str)
5163
#define php_wddx_add_chunk_ex(packet, str, len) smart_str_appendl(packet, str, len)
5264
#define php_wddx_add_chunk_static(packet, str) smart_str_appendl(packet, str, sizeof(str)-1)

ext/wddx/wddx.c

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ static void php_wddx_process_data(void *user_data, const char *s, int len);
9696
*/
9797
function_entry wddx_functions[] = {
9898
PHP_FE(wddx_serialize_value, NULL)
99+
PHP_FE(wddx_serialize_type, NULL)
99100
PHP_FE(wddx_serialize_vars, NULL)
100101
PHP_FE(wddx_packet_start, NULL)
101102
PHP_FE(wddx_packet_end, NULL)
@@ -304,6 +305,15 @@ PS_SERIALIZER_DECODE_FUNC(wddx)
304305
PHP_MINIT_FUNCTION(wddx)
305306
{
306307
le_wddx = zend_register_list_destructors_ex(release_wddx_packet_rsrc, NULL, "wddx", module_number);
308+
REGISTER_LONG_CONSTANT("WDDX_BOOLEAN", WDDX_BOOLEAN_T, CONST_CS | CONST_PERSISTENT);
309+
REGISTER_LONG_CONSTANT("WDDX_NUMBER", WDDX_NUMBER_T, CONST_CS | CONST_PERSISTENT);
310+
REGISTER_LONG_CONSTANT("WDDX_NULL", WDDX_NULL_T, CONST_CS | CONST_PERSISTENT);
311+
REGISTER_LONG_CONSTANT("WDDX_DATETIME", WDDX_DATETIME_T, CONST_CS | CONST_PERSISTENT);
312+
REGISTER_LONG_CONSTANT("WDDX_ARRAY", WDDX_ARRAY_T, CONST_CS | CONST_PERSISTENT);
313+
REGISTER_LONG_CONSTANT("WDDX_RECORDSET", WDDX_RECORDSET_T, CONST_CS | CONST_PERSISTENT);
314+
REGISTER_LONG_CONSTANT("WDDX_STRUCT", WDDX_STRUCT_T, CONST_CS | CONST_PERSISTENT);
315+
REGISTER_LONG_CONSTANT("WDDX_STRING", WDDX_STRING_T, CONST_CS | CONST_PERSISTENT);
316+
REGISTER_LONG_CONSTANT("WDDX_BINARY", WDDX_BINARY_T, CONST_CS | CONST_PERSISTENT);
307317

308318
#if HAVE_PHP_SESSION
309319
php_session_register_serializer("wddx",
@@ -432,6 +442,24 @@ static void php_wddx_serialize_number(wddx_packet *packet, zval *var)
432442
}
433443
/* }}} */
434444

445+
/* {{{ php_wddx_serialize_binary
446+
*/
447+
static void php_wddx_serialize_binary(wddx_packet *packet, zval *var)
448+
{
449+
char tmp_buf[WDDX_BUF_LEN];
450+
zval tmp;
451+
452+
tmp = *var;
453+
zval_copy_ctor(&tmp);
454+
convert_to_string(&tmp);
455+
456+
sprintf(tmp_buf, WDDX_BINARY, Z_STRVAL(tmp));
457+
zval_dtor(&tmp);
458+
459+
php_wddx_add_chunk(packet, tmp_buf);
460+
}
461+
/* }}} */
462+
435463
/* {{{ php_wddx_serialize_boolean
436464
*/
437465
static void php_wddx_serialize_boolean(wddx_packet *packet, zval *var)
@@ -1123,6 +1151,64 @@ PHP_FUNCTION(wddx_serialize_value)
11231151
}
11241152
/* }}} */
11251153

1154+
/* {{{ proto string wddx_serialize_type(mixed var, int type, [, string comment])
1155+
Creates a new packet, serializes the given value and casts the type*/
1156+
PHP_FUNCTION(wddx_serialize_type)
1157+
{
1158+
zval *var;
1159+
char *comment = NULL;
1160+
int comment_len = 0, type = 0;
1161+
wddx_packet *packet;
1162+
1163+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl|s",
1164+
&var, &type, &comment, &comment_len) == FAILURE)
1165+
return;
1166+
1167+
packet = php_wddx_constructor();
1168+
if (!packet) {
1169+
RETURN_FALSE;
1170+
}
1171+
1172+
php_wddx_packet_start(packet, comment, comment_len);
1173+
1174+
switch(type) {
1175+
case WDDX_NULL_T:
1176+
php_wddx_serialize_unset(packet);
1177+
break;
1178+
case WDDX_BOOLEAN_T:
1179+
convert_to_boolean(var);
1180+
php_wddx_serialize_boolean(packet, var);
1181+
break;
1182+
case WDDX_NUMBER_T:
1183+
convert_to_long(var);
1184+
php_wddx_serialize_number(packet, var);
1185+
break;
1186+
case WDDX_DATETIME_T: /* break omitted intentionally! */
1187+
case WDDX_STRING_T:
1188+
convert_to_string(var);
1189+
php_wddx_serialize_string(packet, var);
1190+
break;
1191+
case WDDX_ARRAY_T:
1192+
case WDDX_STRUCT_T: /* breaks omitted intentionally! */
1193+
case WDDX_RECORDSET_T:
1194+
convert_to_array(var);
1195+
php_wddx_serialize_array(packet, var);
1196+
break;
1197+
case WDDX_BINARY_T:
1198+
php_wddx_serialize_binary(packet, var);
1199+
break;
1200+
default:
1201+
break;
1202+
}
1203+
1204+
php_wddx_packet_end(packet);
1205+
1206+
ZVAL_STRINGL(return_value, packet->c, packet->len, 1);
1207+
smart_str_free(packet);
1208+
efree(packet);
1209+
}
1210+
/* }}} */
1211+
11261212
/* {{{ proto string wddx_serialize_vars(mixed var_name [, mixed ...])
11271213
Creates a new packet and serializes given variables into a struct */
11281214
PHP_FUNCTION(wddx_serialize_vars)

0 commit comments

Comments
 (0)