diff options
author | Sascha Schumann <sas@php.net> | 2000-08-07 17:25:57 +0000 |
---|---|---|
committer | Sascha Schumann <sas@php.net> | 2000-08-07 17:25:57 +0000 |
commit | 5d02c74b6bde6013dd8475611b5e4b4ce22a8198 (patch) | |
tree | dcd2321a48d279874af57127a8e9c60192b69af9 | |
parent | d9960867fd977f97195cb1e395ce5ca87cf2dc60 (diff) | |
download | php-git-5d02c74b6bde6013dd8475611b5e4b4ce22a8198.tar.gz |
Add support for <binary> WDDX element.
-rw-r--r-- | ext/wddx/php_wddx_api.h | 2 | ||||
-rw-r--r-- | ext/wddx/wddx.c | 39 |
2 files changed, 39 insertions, 2 deletions
diff --git a/ext/wddx/php_wddx_api.h b/ext/wddx/php_wddx_api.h index 73ed4f70b3..e12f2920d7 100644 --- a/ext/wddx/php_wddx_api.h +++ b/ext/wddx/php_wddx_api.h @@ -23,6 +23,8 @@ #define WDDX_ARRAY_S "<array length='%d'>" #define WDDX_ARRAY_E "</array>" +#define WDDX_BINARY_S "<binary>" +#define WDDX_BINARY_E "</binary>" #define WDDX_BOOLEAN "<boolean value='%s'/>" #define WDDX_CHAR "<char code='%02X'/>" #define WDDX_COMMENT_S "<comment>" diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index 7fc0c422fb..25ca884cf1 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -38,11 +38,13 @@ #define PHP_XML_INTERNAL #include "ext/xml/php_xml.h" #include "ext/standard/php_incomplete_class.h" +#include "ext/standard/base64.h" #define WDDX_BUF_LEN 256 #define PHP_CLASS_NAME_VAR "php_class_name" #define EL_ARRAY "array" +#define EL_BINARY "binary" #define EL_BOOLEAN "boolean" #define EL_CHAR "char" #define EL_CHAR_CODE "code" @@ -82,6 +84,7 @@ typedef struct { ST_NULL, ST_NUMBER, ST_STRING, + ST_BINARY, ST_STRUCT } type; char *varname; @@ -634,6 +637,16 @@ static void php_wddx_push_element(void *user_data, const char *name, const char ent.data->value.str.val = empty_string; ent.data->value.str.len = 0; wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry)); + } else if (!strcmp(name, EL_BINARY)) { + ent.type = ST_BINARY; + SET_STACK_VARNAME; + + ALLOC_ZVAL(ent.data); + INIT_PZVAL(ent.data); + ent.data->type = IS_STRING; + ent.data->value.str.val = empty_string; + ent.data->value.str.len = 0; + wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry)); } else if (!strcmp(name, EL_CHAR)) { int i; char tmp_buf[2]; @@ -721,12 +734,23 @@ static void php_wddx_pop_element(void *user_data, const char *name) if (stack->top == 0) return; - + 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_ARRAY) || !strcmp(name, EL_STRUCT) || + !strcmp(name, EL_BINARY)) { wddx_stack_top(stack, (void**)&ent1); + if (!strcmp(name, EL_BINARY)) { + int new_len=0; + unsigned char *new_str; + + new_str = php_base64_decode(Z_STRVAL_P(ent1->data), Z_STRLEN_P(ent1->data), &new_len); + efree(Z_STRVAL_P(ent1->data)); + Z_STRVAL_P(ent1->data) = new_str; + Z_STRLEN_P(ent1->data) = new_len; + } + /* Call __wakeup() method on the object. */ if (ent1->data->type == IS_OBJECT) { zval *fname, *retval = NULL; @@ -835,6 +859,17 @@ static void php_wddx_process_data(void *user_data, const char *s, int len) efree(decoded_value); break; + case ST_BINARY: + if (Z_STRLEN_P(ent->data) == 0) { + Z_STRVAL_P(ent->data) = estrndup(s, len + 1); + } else { + Z_STRVAL_P(ent->data) = erealloc(Z_STRVAL_P(ent->data), Z_STRLEN_P(ent->data) + len + 1); + memcpy(Z_STRVAL_P(ent->data) + Z_STRLEN_P(ent->data), s, len); + } + Z_STRLEN_P(ent->data) += len; + Z_STRVAL_P(ent->data)[Z_STRLEN_P(ent->data)] = '\0'; + break; + case ST_NUMBER: ent->data->type = IS_STRING; ent->data->value.str.len = len; |