summaryrefslogtreecommitdiff
path: root/ext/wddx
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2003-06-28 06:55:47 +0000
committerIlia Alshanetsky <iliaa@php.net>2003-06-28 06:55:47 +0000
commit58c25fb24a28c055026c983b40c99d2d5ffe74a6 (patch)
tree0f4510a8e692d72a945bf4c37cb9e247b78d8ece /ext/wddx
parentf783d06d651a18e18f876c802668bb47d9b026c1 (diff)
downloadphp-git-58c25fb24a28c055026c983b40c99d2d5ffe74a6.tar.gz
Added missing handling of dateTime
Fixed compiler warning involving streams Added a test case for wddx_deserialize()
Diffstat (limited to 'ext/wddx')
-rw-r--r--ext/wddx/tests/001.phpt57
-rw-r--r--ext/wddx/tests/wddx.xml60
-rw-r--r--ext/wddx/wddx.c36
3 files changed, 150 insertions, 3 deletions
diff --git a/ext/wddx/tests/001.phpt b/ext/wddx/tests/001.phpt
new file mode 100644
index 0000000000..857cc2f304
--- /dev/null
+++ b/ext/wddx/tests/001.phpt
@@ -0,0 +1,57 @@
+--TEST--
+wddz deserialization test
+--FILE--
+<?php
+ $path = dirname(__FILE__);
+ var_dump(wddx_deserialize(file_get_contents("{$path}/wddx.xml")));
+?>
+--EXPECT--
+array(11) {
+ ["aNull"]=>
+ NULL
+ ["aString"]=>
+ string(8) "a string"
+ ["aNumber"]=>
+ float(-12.456)
+ ["aDateTime"]=>
+ int(897600732)
+ ["aDateTime2"]=>
+ string(19) "1930-06-12T04:32:12"
+ ["aDateTime3"]=>
+ string(19) "2040-06-12T04:32:12"
+ ["aBoolean"]=>
+ bool(true)
+ ["anArray"]=>
+ array(2) {
+ [0]=>
+ int(10)
+ [1]=>
+ string(14) "second element"
+ }
+ ["aBinary"]=>
+ string(11) "binary data"
+ ["anObject"]=>
+ array(2) {
+ ["s"]=>
+ string(8) "a string"
+ ["n"]=>
+ float(-12.456)
+ }
+ ["aRecordset"]=>
+ array(2) {
+ ["NAME"]=>
+ array(2) {
+ [0]=>
+ string(8) "John Doe"
+ [1]=>
+ string(8) "Jane Doe"
+ }
+ ["AGE"]=>
+ array(2) {
+ [0]=>
+ int(34)
+ [1]=>
+ int(31)
+ }
+ }
+}
diff --git a/ext/wddx/tests/wddx.xml b/ext/wddx/tests/wddx.xml
new file mode 100644
index 0000000000..8713159636
--- /dev/null
+++ b/ext/wddx/tests/wddx.xml
@@ -0,0 +1,60 @@
+<?xml version='1.0'?>
+<!DOCTYPE wddxPacket SYSTEM 'wddx_0100.dtd'>
+<wddxPacket version='1.0'>
+<header/>
+ <data>
+ <struct>
+ <var name='aNull'>
+ <null/>
+ </var>
+ <var name='aString'>
+ <string>a string</string>
+ </var>
+ <var name='aNumber'>
+ <number>-12.456</number>
+ </var>
+ <var name='aDateTime'>
+ <dateTime>1998-06-12T04:32:12</dateTime>
+ </var>
+ <var name='aDateTime2'>
+ <dateTime>1930-06-12T04:32:12</dateTime>
+ </var>
+ <var name='aDateTime3'>
+ <dateTime>2040-06-12T04:32:12</dateTime>
+ </var>
+ <var name='aBoolean'>
+ <boolean value='true'/>
+ </var>
+ <var name='anArray'>
+ <array length='2'>
+ <number>10</number>
+ <string>second element</string>
+ </array>
+ </var>
+ <var name='aBinary'>
+ <binary length='11'>YmluYXJ5IGRhdGE=</binary>
+ </var>
+ <var name='anObject'>
+ <struct>
+ <var name='s'>
+ <string>a string</string>
+ </var>
+ <var name='n'>
+ <number>-12.456</number>
+ </var>
+ </struct>
+ </var>
+ <var name='aRecordset'>
+ <recordset rowCount='2' fieldNames='NAME,AGE'>
+ <field name='NAME'>
+ <string>John Doe</string>
+ <string>Jane Doe</string>
+ </field>
+ <field name='AGE'>
+ <number>34</number>
+ <number>31</number>
+ </field>
+ </recordset>
+ </struct>
+ </data>
+</wddxPacket>
diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c
index 1f25a328b3..959b66ad88 100644
--- a/ext/wddx/wddx.c
+++ b/ext/wddx/wddx.c
@@ -34,6 +34,7 @@
#include "ext/standard/php_smart_str.h"
#include "ext/standard/html.h"
#include "ext/standard/php_string.h"
+#include "ext/standard/php_parsedate.h"
#define WDDX_BUF_LEN 256
#define PHP_CLASS_NAME_VAR "php_class_name"
@@ -54,6 +55,7 @@
#define EL_VERSION "version"
#define EL_RECORDSET "recordset"
#define EL_FIELD "field"
+#define EL_DATETIME "dateTime"
#define php_wddx_deserialize(a,b) \
php_wddx_deserialize_ex((a)->value.str.val, (a)->value.str.len, (b))
@@ -79,7 +81,8 @@ typedef struct {
ST_BINARY,
ST_STRUCT,
ST_RECORDSET,
- ST_FIELD
+ ST_FIELD,
+ ST_DATETIME
} type;
char *varname;
} st_entry;
@@ -861,6 +864,14 @@ static void php_wddx_push_element(void *user_data, const char *name, const char
}
wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+ } else if (!strcmp(name, EL_DATETIME)) {
+ ent.type = ST_DATETIME;
+ SET_STACK_VARNAME;
+
+ ALLOC_ZVAL(ent.data);
+ INIT_PZVAL(ent.data);
+ Z_TYPE_P(ent.data) = IS_LONG;
+ wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
}
}
/* }}} */
@@ -884,7 +895,8 @@ static void php_wddx_pop_element(void *user_data, const char *name)
if (!strcmp(name, EL_STRING) || !strcmp(name, EL_NUMBER) ||
!strcmp(name, EL_BOOLEAN) || !strcmp(name, EL_NULL) ||
!strcmp(name, EL_ARRAY) || !strcmp(name, EL_STRUCT) ||
- !strcmp(name, EL_RECORDSET) || !strcmp(name, EL_BINARY)) {
+ !strcmp(name, EL_RECORDSET) || !strcmp(name, EL_BINARY) ||
+ !strcmp(name, EL_DATETIME)) {
wddx_stack_top(stack, (void**)&ent1);
if (!strcmp(name, EL_BINARY)) {
@@ -1048,6 +1060,24 @@ static void php_wddx_process_data(void *user_data, const char *s, int len)
}
break;
+ case ST_DATETIME: {
+ char *tmp;
+
+ tmp = do_alloca(len + 1);
+ memcpy(tmp, s, len);
+ tmp[len] = '\0';
+
+ Z_LVAL_P(ent->data) = php_parse_date(tmp, NULL);
+ /* date out of range < 1969 or > 2038 */
+ if (Z_LVAL_P(ent->data) == -1) {
+ Z_TYPE_P(ent->data) = IS_STRING;
+ Z_STRLEN_P(ent->data) = len;
+ Z_STRVAL_P(ent->data) = estrndup(s, len);
+ }
+ free_alloca(tmp);
+ }
+ break;
+
default:
break;
}
@@ -1280,7 +1310,7 @@ PHP_FUNCTION(wddx_deserialize)
payload_len = Z_STRLEN_P(packet);
}
else if (Z_TYPE_P(packet) == IS_RESOURCE) {
- stream = php_stream_from_zval(stream, &packet);
+ php_stream_from_zval(stream, &packet);
if (stream) {
payload_len = php_stream_copy_to_mem(stream, &payload, PHP_STREAM_COPY_ALL, 0);
}