diff options
author | SVN Migration <svn@php.net> | 2002-09-08 15:38:45 +0000 |
---|---|---|
committer | SVN Migration <svn@php.net> | 2002-09-08 15:38:45 +0000 |
commit | e94c67742f6f4bf9fe9a381273d1ea6a16db5ec3 (patch) | |
tree | 7cb16c2c460931bbf4798a79167770dfb48ff643 | |
parent | 6c22f90b4a3d24a8da83e78f8eef97cba6c05197 (diff) | |
download | php-git-e94c67742f6f4bf9fe9a381273d1ea6a16db5ec3.tar.gz |
This commit was manufactured by cvs2svn to create tagphp-4.3.0dev_zend2_alpha3
'php_4_3_0_dev_zend2_alpha3'.
68 files changed, 822 insertions, 10971 deletions
diff --git a/Zend/ChangeLog b/Zend/ChangeLog index f9bd40b66e..9e05547d74 100644 --- a/Zend/ChangeLog +++ b/Zend/ChangeLog @@ -1,3 +1,205 @@ +2002-09-05 Stanislav Malyshev <stas@zend.com> + + * zend_compile.c: quick-n-dirty inheritance support for __handlers + +2002-09-04 Sebastian Bergmann <sb@sebastian-bergmann.de> + + * ZEND_CHANGES: Whitespace fixes. + +2002-09-04 Stanislav Malyshev <stas@zend.com> + + * zend_object_handlers.c: remove dead code + + * ZEND_CHANGES + zend_object_handlers.c: Fix __call and add some docs + +2002-09-04 Sebastian Bergmann <sb@sebastian-bergmann.de> + + * zend_object_handlers.c: Fix ZTS build. + + * ZEND_CHANGES: TBD: __call(), __get(), __set(). + +2002-09-04 Stanislav Malyshev <stas@zend.com> + + * zend.h + zend_compile.c + zend_compile.h + zend_execute.c + zend_extensions.h + zend_object_handlers.c + zend_objects.c: Support for __get, __set and __call in classes. + This should work as follows: if class hasn't member with given name, + __get/__set is called. If class has no method with given name, __call is called. + __get/__set are not recursive, __call can be. + +2002-09-04 Sebastian Bergmann <sb@sebastian-bergmann.de> + + * ZEND_CHANGES: Workaround for superfluous comma in var_export() result. + + * ZEND_CHANGES: + Let debug_backtrace() example print out the class name, if applicable, and the function/method arguments. + +2002-09-03 Thies C. Arntzen <thies@thieso.net> + + * zend_builtin_functions.c: nuke warning + + * zend_builtin_functions.c: nuke unneeded stuff + +2002-09-03 Zeev Suraski <zeev@zend.com> + + * zend.c + zend.h + zend_ini.c: MFZE1 + +2002-09-03 Derick Rethans <d.rethans@jdimedia.nl> + + * zend_ini.c: - Revert + + * zend_ini.c: + - MFH for: Apply rest of html errors fix (Patch by Jan Lehnardt <jan@php.net>) + +2002-09-03 Sebastian Bergmann <sb@sebastian-bergmann.de> + + * zend.h: + Add html_errors to zend_utility_values. Patch by Jan Lehnardt <jan@php.net>. + +2002-09-03 Andi Gutmans <andi@zend.com> + + * zend_builtin_functions.c: - Fix typo + +2002-09-02 Thies C. Arntzen <thies@thieso.net> + + * zend_builtin_functions.c: + refine last patch. if the argument-stack is not consistent don't try to show + arguments. no call to zend_error is made as we might end up in an infinite + recursion if called from an error_handler. + so: if the arguments to functions aren't shown in debug_backtrace this is 'cause + the arument stack was not consistent when debug_backtrace was called. + + * zend_builtin_functions.c: + debug_backtrace() now checks the complete argument-stack for consistency. + +2002-09-02 Stanislav Malyshev <stas@zend.com> + + * zend_execute.c: MFZE1 + +2002-09-01 Andi Gutmans <andi@zend.com> + + * zend_llist.c: - Fix leak reported by "l0t3k" <cshmoove@hotmail.com> + +2002-09-01 Stanislav Malyshev <stas@zend.com> + + * zend_operators.c: MFZE1 + +2002-08-28 Thies Arntzen <thies@pb1.pair.com> + + * zend_builtin_functions.c + zend_execute_API.c: debug_backtrace() + - make args passed to functions called vy call_user_function available again. + + * zend_builtin_functions.c: debug_backtrace(): + - make args work if called from the error_handler + - fix refcount for args + + * zend.c: + clear current_execute_data on bailout as it would point into some freed area + on the stack. + +2002-08-28 derick <derick@pb1.pair.com> + + * zend.c: - MFZE1 + +2002-08-26 Thies Arntzen <thies@pb1.pair.com> + + * zend_builtin_functions.c: + debug_backtrace(): show name of included file for include and require calls + plus some small fixes suggested by andi. + +2002-08-24 Andi Gutmans <andi@pb1.pair.com> + + * zend_builtin_functions.c: - Whitespace + + * zend_builtin_functions.c: - Whitespace and better variable name + +2002-08-24 Thies Arntzen <thies@pb1.pair.com> + + * zend_builtin_functions.c: fix warning + +2002-08-23 Andi Gutmans <andi@pb1.pair.com> + + * Zend.m4: - Add \n to configure fprintf + + * zend_extensions.c: - dlerror -> DL_ERROR + +2002-08-23 Thies Arntzen <thies@pb1.pair.com> + + * zend_builtin_functions.c: + debug_backtrace: show include/require/eval as normal functions on the stack + +2002-08-23 derick <derick@pb1.pair.com> + + * zend_builtin_functions.c: - No spaces :) + +2002-08-23 Thies Arntzen <thies@pb1.pair.com> + + * zend_builtin_functions.c: + - debug_backtrace now also returns an array containing the arguments of the + called function. + + zeev, andi - is knowing the structure of the stack considered a bad thing in + zend_builtin_function? if yes i would have to create a new function in + zend_ptr_stack.c (but i think we are save this way) + + * zend_builtin_functions.c + zend_execute_API.c: - debug_backtrace: + added "type" ('->' or '::') for object calls. + made calls done thru call_user_func show-up correct in backtraces. + + andi, + does this look correct to you? + + * zend_execute.c: those are set by RETURN_FROM_EXECUTE + +2002-08-21 Thies Arntzen <thies@pb1.pair.com> + + * zend_execute.c: + zend_execute: make sure that current_execute_data points to the right thing + after coming back from recursion. + +2002-08-19 Zeev Suraski <zeev@pb1.pair.com> + + * zend_operators.c: MFZE1 + +2002-08-17 Andi Gutmans <andi@pb1.pair.com> + + * zend_execute.c: MFZE1 + +2002-08-17 Zeev Suraski <zeev@pb1.pair.com> + + * zend_execute.c + zend_hash.c: MFZE1 + +2002-08-16 Stig Bakken <ssb@pb1.pair.com> + + * zend.c: * append emacs footer + + * zend.c: * remove builtin exception class + +2002-08-16 Andi Gutmans <andi@pb1.pair.com> + + * zend.c: - Fix whitespace + +2002-08-16 Stig Bakken <ssb@pb1.pair.com> + + * zend_execute_API.c + zend_globals.h + zend.c + zend_builtin_functions.c: + - Added set_exception_handler() function for registering a global, + catch-all exception handling function + - Added set_exception_handler() function for registering a global, + catch-all exception handling function (Stig) + 2002-08-15 Zeev Suraski <zeev@pb1.pair.com> * flex.skl diff --git a/Zend/ZEND_CHANGES b/Zend/ZEND_CHANGES index 8b7f465964..817001cc4b 100644 --- a/Zend/ZEND_CHANGES +++ b/Zend/ZEND_CHANGES @@ -483,7 +483,7 @@ Changes in the Zend Engine 2.0 <?php class foo { - static $my_static = 5; + static $my_static = 5; } print foo::$my_static; @@ -510,11 +510,22 @@ Changes in the Zend Engine 2.0 $backtrace = debug_backtrace(); foreach ($backtrace as $step) { - $class = isset($step['class']) ? $step['class'] . '::' : ''; + if (!empty($step['args'])) { + foreach ($step['args'] as $arg) { + $args = isset($args) ? $args . ', ' : ''; + $args .= var_export($arg, true); + } + } else { + $args = ''; + } + + $args = str_replace(array("\n", ',)'), array('', ')'), $args); printf( - "%s [%s:%s]\n", + "%s%s(%s) [%s:%s]\n", + isset($step['class']) ? $step['class'] . '::' : '', $step['function'], + $args, $step['file'], $step['line'] ); @@ -523,6 +534,67 @@ Changes in the Zend Engine 2.0 * __autoload(). TBD. + * Method calls and property accesses can be overloaded + by class methods __call(), __get() and __set(). + + __get() and __set() Example: + + <?php + class Setter { + public $n; + public $x = array('a' => 1, 'b' => 2, 'c' => 3); + + function __get($nm) { + print "Getting [$nm]\n"; + + if(isset($this->x[$nm])) { + $r = $this->x[$nm]; + print "Returning: $r\n"; + return $r; + } else { + print "Nothing!\n"; + } + } + + function __set($nm, $val) { + print "Setting [$nm] to $val\n"; + + if(isset($this->x[$nm])) { + $this->x[$nm] = $val; + print "OK!\n"; + } else { + print "Not OK!\n"; + } + } + } + + $foo = new Setter(); + $foo->n = 1; + $foo->a = 100; + $foo->a++; + $foo->z++; + var_dump($foo); + ?> + + __call() Example: + + <?php + class Caller { + var $x = array(1, 2, 3); + + function __call($m, $a) { + print "Method $m called:\n"; + var_dump($a); + return $this->x; + } + } + + $foo = new Caller(); + $a = $foo->test(1, '2', 3.4, true); + var_dump($a); + ?> + + Changes in the Zend Engine 1.0 The Zend Engine was designed from the ground up for increased speed, diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index 2f49e45c09..84a80af285 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -209,7 +209,7 @@ int main() } fp = fopen("conftest.zend", "w"); - fprintf(fp, "%d %d", ZEND_MM_ALIGNMENT, zeros); + fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros); fclose(fp); exit(0); diff --git a/Zend/zend.c b/Zend/zend.c index 1940aea4e4..09cf2294da 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -65,7 +65,7 @@ zend_class_entry global_main_class; HashTable *global_auto_globals_table; #endif -zend_utility_values zend_uv; +ZEND_API zend_utility_values zend_uv; ZEND_API zval zval_used_for_init; /* True global variable */ @@ -208,7 +208,7 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int ZEND_PUTS("Array\n"); if (++expr->value.ht->nApplyCount>1) { ZEND_PUTS(" *RECURSION*"); - expr->value.ht->nApplyCount=0; + expr->value.ht->nApplyCount--; return; } print_hash(expr->value.ht, indent); @@ -220,7 +220,7 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int if (++object->properties->nApplyCount>1) { ZEND_PUTS(" *RECURSION*"); - object->properties->nApplyCount=0; + object->properties->nApplyCount--; return; } zend_printf("%s Object\n", object->ce->name); @@ -549,6 +549,7 @@ ZEND_API void _zend_bailout(char *filename, uint lineno) } CG(unclean_shutdown) = 1; CG(in_compilation) = EG(in_execution) = 0; + EG(current_execute_data) = NULL; longjmp(EG(bailout), FAILURE); } END_EXTERN_C() diff --git a/Zend/zend.h b/Zend/zend.h index 94009199ee..393203d7f3 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -22,7 +22,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "2.0.0-alpha2" +#define ZEND_VERSION "2.0.0-alpha3" #define ZEND_ENGINE_2 @@ -226,6 +226,8 @@ typedef struct _zend_class_entry zend_class_entry; typedef struct _zend_object { zend_class_entry *ce; HashTable *properties; + int in_get:1; + int in_set:1; } zend_object; typedef unsigned int zend_object_handle; @@ -311,9 +313,14 @@ struct _zend_class_entry { union _zend_function *constructor; union _zend_function *destructor; union _zend_function *clone; + union _zend_function *__get; + union _zend_function *__set; + union _zend_function *__call; /* handlers */ zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC); + + /* old handlers */ void (*handle_function_call)(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference); zval (*handle_property_get)(zend_property_reference *property_reference); int (*handle_property_set)(zend_property_reference *property_reference, zval *value); @@ -336,6 +343,7 @@ typedef struct _zend_utility_functions { typedef struct _zend_utility_values { char *import_use_extension; uint import_use_extension_length; + zend_bool html_errors; } zend_utility_values; @@ -462,7 +470,7 @@ void zenderror(char *error); /* The following #define is used for code duality in PHP for Engine 1 & 2 */ #define ZEND_STANDARD_CLASS_DEF_PTR zend_standard_class_def extern ZEND_API zend_class_entry *zend_standard_class_def; -extern zend_utility_values zend_uv; +extern ZEND_API zend_utility_values zend_uv; extern ZEND_API zval zval_used_for_init; END_EXTERN_C() diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index f58ab23876..5a49e761f4 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1247,6 +1247,26 @@ ZEND_FUNCTION(get_defined_constants) /* }}} */ +static zval *debug_backtrace_get_args(void ***curpos TSRMLS_DC) { + void **p = *curpos - 2; + zval *arg_array, **arg; + int arg_count = (ulong) *p; + + *curpos -= (arg_count+2); + + MAKE_STD_ZVAL(arg_array); + array_init(arg_array); + p -= arg_count; + + while (--arg_count >= 0) { + arg = (zval **) p++; + SEPARATE_ZVAL_TO_MAKE_IS_REF(arg); + (*arg)->refcount++; + add_next_index_zval(arg_array, *arg); + } + return arg_array; +} + /* {{{ proto void debug_backtrace(void) Prints out a backtrace */ ZEND_FUNCTION(debug_backtrace) @@ -1256,43 +1276,130 @@ ZEND_FUNCTION(debug_backtrace) char *function_name; char *filename; char *class_name; + char *call_type; + char *include_filename = NULL; zval *stack_frame; + void **cur_arg_pos = EG(argument_stack).top_element; + void **args = cur_arg_pos; + int arg_stack_consistent = 0; + + if (ZEND_NUM_ARGS()) { + WRONG_PARAM_COUNT; + } + + while (--args >= EG(argument_stack).elements) { + if (*args--) { + break; + } + args -= *(ulong*)args; + + if (args == EG(argument_stack).elements) { + arg_stack_consistent = 1; + break; + } + } ptr = EG(current_execute_data); - /* Skip debug_backtrace() itself */ + /* skip debug_backtrace() */ ptr = ptr->prev_execute_data; - + cur_arg_pos -= 2; + array_init(return_value); while (ptr) { MAKE_STD_ZVAL(stack_frame); array_init(stack_frame); - class_name = NULL; - - if (ptr->object) { - class_name = Z_OBJCE(*ptr->object)->name; - } - if (ptr->function_state.function->common.scope) { - class_name = ptr->function_state.function->common.scope->name; + if (ptr->op_array) { + filename = ptr->op_array->filename; + lineno = ptr->opline->lineno; + add_assoc_string_ex(stack_frame, "file", sizeof("file"), filename, 1); + add_assoc_long_ex(stack_frame, "line", sizeof("line"), lineno); + + /* try to fetch args only if an FCALL was just made - elsewise we're in the middle of a function + * and debug_baktrace() might have been called by the error_handler. in this case we don't + * want to pop anything of the argument-stack */ + } else { + filename = NULL; } + function_name = ptr->function_state.function->common.function_name; - - filename = ptr->op_array->filename; - lineno = ptr->opline->lineno; if (function_name) { add_assoc_string_ex(stack_frame, "function", sizeof("function"), function_name, 1); + + if (ptr->object) { + class_name = Z_OBJCE(*ptr->object)->name; + call_type = "->"; + } else if (ptr->function_state.function->common.scope) { + class_name = ptr->function_state.function->common.scope->name; + call_type = "::"; + } else { + class_name = NULL; + call_type = NULL; + } + + if (class_name) { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 1); + add_assoc_string_ex(stack_frame, "type", sizeof("type"), call_type, 1); + } + + if ((! ptr->opline) || ((ptr->opline->opcode == ZEND_DO_FCALL_BY_NAME) || (ptr->opline->opcode == ZEND_DO_FCALL))) { + if (arg_stack_consistent) { + add_assoc_zval_ex(stack_frame, "args", sizeof("args"), debug_backtrace_get_args(&cur_arg_pos TSRMLS_CC)); + } + } + } else { + /* i know this is kinda ugly, but i'm trying to avoid extra cycles in the main execution loop */ + zend_bool build_filename_arg = 1; + + switch (ptr->opline->op2.u.constant.value.lval) { + case ZEND_EVAL: + function_name = "eval"; + build_filename_arg = 0; + break; + case ZEND_INCLUDE: + function_name = "include"; + break; + case ZEND_REQUIRE: + function_name = "require"; + break; + case ZEND_INCLUDE_ONCE: + function_name = "include_once"; + break; + case ZEND_REQUIRE_ONCE: + function_name = "require_once"; + break; + default: + /* this can actually happen if you use debug_backtrace() in your error_handler and + * you're in the top-scope */ + function_name = "unknown"; + build_filename_arg = 0; + break; + } + + if (build_filename_arg && include_filename) { + zval *arg_array; + + MAKE_STD_ZVAL(arg_array); + array_init(arg_array); + + /* include_filename always points to the last filename of the last last called-fuction. + if we have called include in the frame above - this is the file we have included. + */ + + add_next_index_string(arg_array, include_filename, 1); + add_assoc_zval_ex(stack_frame, "args", sizeof("args"), arg_array); + } + + add_assoc_string_ex(stack_frame, "function", sizeof("function"), function_name, 1); } - if (class_name) { - add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 1); - } - add_assoc_string_ex(stack_frame, "file", sizeof("file"), filename, 1); - add_assoc_long_ex(stack_frame, "line", sizeof("line"), lineno); - /* add_assoc_stringl_ex(stack_frame, "class", sizeof("class")-1, class_name, class_name_length, 1); */ + add_next_index_zval(return_value, stack_frame); + include_filename = filename; + ptr = ptr->prev_execute_data; } } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index bb7403b0c2..34d3e87608 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -895,10 +895,6 @@ void zend_do_free(znode *op1 TSRMLS_DC) } } -#define ZEND_CLONE_FUNC_NAME "__clone" -#define ZEND_CONSTRUCTOR_FUNC_NAME "__construct" -#define ZEND_DESTRUCTOR_FUNC_NAME "__destruct" - void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference TSRMLS_DC) { zend_op_array op_array; @@ -938,6 +934,12 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n CG(active_class_entry)->destructor = (zend_function *) CG(active_op_array); } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_CLONE_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_CLONE_FUNC_NAME, sizeof(ZEND_CLONE_FUNC_NAME)))) { CG(active_class_entry)->clone = (zend_function *) CG(active_op_array); + } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_CALL_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_CALL_FUNC_NAME, sizeof(ZEND_CALL_FUNC_NAME)))) { + CG(active_class_entry)->__call = (zend_function *) CG(active_op_array); + } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_GET_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_GET_FUNC_NAME, sizeof(ZEND_GET_FUNC_NAME)))) { + CG(active_class_entry)->__get = (zend_function *) CG(active_op_array); + } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_SET_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_SET_FUNC_NAME, sizeof(ZEND_SET_FUNC_NAME)))) { + CG(active_class_entry)->__set = (zend_function *) CG(active_op_array); } } else { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -1501,6 +1503,9 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) function_add_ref(function); } ce->constructor = ce->parent->constructor; + ce->__get = ce->parent->__get; + ce->__set = ce->parent->__set; + ce->__call = ce->parent->__call; } void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) @@ -1551,6 +1556,9 @@ static void create_class(HashTable *class_table, char *name, int name_length, ze new_class_entry->constructor = NULL; new_class_entry->destructor = NULL; new_class_entry->clone = NULL; + new_class_entry->__get = NULL; + new_class_entry->__set = NULL; + new_class_entry->__call = NULL; new_class_entry->create_object = NULL; new_class_entry->handle_function_call = NULL; @@ -2050,6 +2058,9 @@ void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znod new_class_entry->constructor = NULL; new_class_entry->destructor = NULL; new_class_entry->clone = NULL; + new_class_entry->__get = NULL; + new_class_entry->__set = NULL; + new_class_entry->__call = NULL; new_class_entry->create_object = NULL; new_class_entry->handle_function_call = NULL; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 69f98864d7..94422bf766 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -710,4 +710,11 @@ int zendlex(znode *zendlval TSRMLS_DC); END_EXTERN_C() +#define ZEND_CLONE_FUNC_NAME "__clone" +#define ZEND_CONSTRUCTOR_FUNC_NAME "__construct" +#define ZEND_DESTRUCTOR_FUNC_NAME "__destruct" +#define ZEND_GET_FUNC_NAME "__get" +#define ZEND_SET_FUNC_NAME "__set" +#define ZEND_CALL_FUNC_NAME "__call" + #endif /* ZEND_COMPILE_H */ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d397ccf387..fb10e0eda0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -140,7 +140,7 @@ static inline zval **_get_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC) static inline zval **zend_fetch_property_address_inner(zval *object, znode *op2, temp_variable *Ts, int type TSRMLS_DC) { zval *prop_ptr = get_zval_ptr(op2, Ts, &EG(free_op2), BP_VAR_R); - zval **retval; + zval **retval = NULL; zval tmp; @@ -161,7 +161,9 @@ static inline zval **zend_fetch_property_address_inner(zval *object, znode *op2, if(Z_OBJ_HT_P(object)->get_property_ptr != NULL) { retval = Z_OBJ_HT_P(object)->get_property_ptr(object, prop_ptr TSRMLS_CC); - } else { + } + + if(retval == NULL) { zend_error(E_WARNING, "This object doesn't support property references"); retval = &EG(error_zval_ptr); } @@ -321,6 +323,7 @@ static inline void zend_assign_to_object_op(znode *result, znode *op1, znode *op zval *property = get_zval_ptr(op2, Ts, &EG(free_op2), BP_VAR_R); zval tmp; zval **retval = &Ts[result->u.var].var.ptr; + int have_get_ptr = 0; Ts[result->u.var].var.ptr_ptr = NULL; make_real_object(object_ptr TSRMLS_CC); @@ -356,12 +359,17 @@ static inline void zend_assign_to_object_op(znode *result, znode *op1, znode *op if(Z_OBJ_HT_P(object)->get_property_zval_ptr) { zval **zptr = Z_OBJ_HT_P(object)->get_property_zval_ptr(object, property TSRMLS_CC); - SEPARATE_ZVAL_IF_NOT_REF(zptr); + if(zptr != NULL) { /* NULL means no success in getting PTR */ + SEPARATE_ZVAL_IF_NOT_REF(zptr); - binary_op(*zptr, *zptr, value TSRMLS_CC); - *retval = *zptr; - SELECTIVE_PZVAL_LOCK(*retval, result); - } else { + have_get_ptr = 1; + binary_op(*zptr, *zptr, value TSRMLS_CC); + *retval = *zptr; + SELECTIVE_PZVAL_LOCK(*retval, result); + } + } + + if(!have_get_ptr) { zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC); SEPARATE_ZVAL_IF_NOT_REF(&z); binary_op(z, z, value TSRMLS_CC); @@ -989,6 +997,7 @@ static void zend_pre_incdec_property(znode *result, znode *op1, znode *op2, temp zval *object; zval *property = get_zval_ptr(op2, Ts, &EG(free_op2), BP_VAR_R); zval **retval = &Ts[result->u.var].var.ptr; + int have_get_ptr = 0; make_real_object(object_ptr TSRMLS_CC); object = *object_ptr; @@ -1006,12 +1015,17 @@ static void zend_pre_incdec_property(znode *result, znode *op1, znode *op2, temp if(Z_OBJ_HT_P(object)->get_property_zval_ptr) { zval **zptr = Z_OBJ_HT_P(object)->get_property_zval_ptr(object, property TSRMLS_CC); - SEPARATE_ZVAL_IF_NOT_REF(zptr); + if(zptr != NULL) { /* NULL means no success in getting PTR */ + SEPARATE_ZVAL_IF_NOT_REF(zptr); - incdec_op(*zptr); - *retval = *zptr; - SELECTIVE_PZVAL_LOCK(*retval, result); - } else { + have_get_ptr = 1; + incdec_op(*zptr); + *retval = *zptr; + SELECTIVE_PZVAL_LOCK(*retval, result); + } + } + + if(!have_get_ptr) { zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC); SEPARATE_ZVAL_IF_NOT_REF(&z); incdec_op(z); @@ -1030,6 +1044,7 @@ static void zend_post_incdec_property(znode *result, znode *op1, znode *op2, tem zval *object; zval *property = get_zval_ptr(op2, Ts, &EG(free_op2), BP_VAR_R); zval *retval = &Ts[result->u.var].tmp_var; + int have_get_ptr = 0; make_real_object(object_ptr TSRMLS_CC); object = *object_ptr; @@ -1045,13 +1060,19 @@ static void zend_post_incdec_property(znode *result, znode *op1, znode *op2, tem if(Z_OBJ_HT_P(object)->get_property_zval_ptr) { zval **zptr = Z_OBJ_HT_P(object)->get_property_zval_ptr(object, property TSRMLS_CC); - SEPARATE_ZVAL_IF_NOT_REF(zptr); + if(zptr != NULL) { /* NULL means no success in getting PTR */ + have_get_ptr = 1; + SEPARATE_ZVAL_IF_NOT_REF(zptr); + + *retval = **zptr; + zendi_zval_copy_ctor(*retval); + + incdec_op(*zptr); - *retval = **zptr; - zendi_zval_copy_ctor(*retval); + } + } - incdec_op(*zptr); - } else { + if(!have_get_ptr) { zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_RW TSRMLS_CC); SEPARATE_ZVAL_IF_NOT_REF(&z); *retval = *z; @@ -1627,6 +1648,8 @@ binary_assign_op_addr_obj: EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.val[0] = 0; EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.len = 0; EX(Ts)[EX(opline)->result.u.var].tmp_var.refcount = 1; + EX(Ts)[EX(opline)->result.u.var].tmp_var.type = IS_STRING; + EX(Ts)[EX(opline)->result.u.var].tmp_var.is_ref = 0; NEXT_OPCODE(); case ZEND_ADD_CHAR: add_char_to_string( &EX(Ts)[EX(opline)->result.u.var].tmp_var, @@ -2077,6 +2100,7 @@ do_fcall_common: ALLOC_ZVAL(EX(Ts)[EX(opline)->result.u.var].var.ptr); INIT_ZVAL(*(EX(Ts)[EX(opline)->result.u.var].var.ptr)); ((zend_internal_function *) EX(function_state).function)->handler(EX(opline)->extended_value, EX(Ts)[EX(opline)->result.u.var].var.ptr, EX(object), return_value_used TSRMLS_CC); + EG(current_execute_data) = &execute_data; EX(Ts)[EX(opline)->result.u.var].var.ptr->is_ref = 0; EX(Ts)[EX(opline)->result.u.var].var.ptr->refcount = 1; if (!return_value_used) { @@ -2673,7 +2697,11 @@ send_by_ref: file_handle.free_filename = 0; if (file_handle.handle.fp) { - if (!opened_path || zend_hash_add(&EG(included_files), opened_path, strlen(opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) { + if( !opened_path ) { + opened_path = file_handle.opened_path = estrndup(inc_filename->value.str.val, inc_filename->value.str.len); + } + + if (zend_hash_add(&EG(included_files), opened_path, strlen(opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) { new_op_array = zend_compile_file(&file_handle, (EX(opline)->op2.u.constant.value.lval==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC); zend_destroy_file_handle(&file_handle TSRMLS_CC); opened_path = NULL; /* zend_destroy_file_handle() already frees it */ diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 7f7d8bce89..03a8304cd9 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -459,7 +459,6 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun int i; zval **original_return_value; HashTable *calling_symbol_table; - zend_function_state function_state; zend_function_state *original_function_state_ptr; zend_op_array *original_op_array; zend_op **original_opline_ptr; @@ -471,6 +470,14 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun zend_class_entry *calling_scope = NULL; zval *current_this; + zend_execute_data execute_data; + + /* Initialize execute_data */ + EX(fbc) = NULL; + EX(object) = NULL; + EX(Ts) = NULL; + EX(op_array) = NULL; + EX(opline) = NULL; *retval_ptr_ptr = NULL; if (function_name->type==IS_ARRAY) { /* assume array($obj, $name) couple */ @@ -501,6 +508,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun } function_table = &Z_OBJCE_PP(object_pp)->function_table; + EX(object) = *object_pp; calling_scope = Z_OBJCE_PP(object_pp); } else if (Z_TYPE_PP(object_pp) == IS_STRING) { zend_class_entry **ce; @@ -530,7 +538,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun zend_str_tolower(function_name_copy.value.str.val, function_name_copy.value.str.len); original_function_state_ptr = EG(function_state_ptr); - if (zend_hash_find(function_table, function_name_copy.value.str.val, function_name_copy.value.str.len+1, (void **) &function_state.function)==FAILURE) { + if (zend_hash_find(function_table, function_name_copy.value.str.val, function_name_copy.value.str.len+1, (void **) &EX(function_state).function)==FAILURE) { zval_dtor(&function_name_copy); return FAILURE; } @@ -539,9 +547,9 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun for (i=0; i<param_count; i++) { zval *param; - if (function_state.function->common.arg_types - && i<function_state.function->common.arg_types[0] - && function_state.function->common.arg_types[i+1]==BYREF_FORCE + if (EX(function_state).function->common.arg_types + && i<EX(function_state).function->common.arg_types[0] + && EX(function_state).function->common.arg_types[i+1]==BYREF_FORCE && !PZVAL_IS_REF(*params[i])) { if ((*params[i])->refcount>1) { zval *new_zval; @@ -572,7 +580,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) (long) param_count, NULL); - EG(function_state_ptr) = &function_state; + EG(function_state_ptr) = &EX(function_state); current_scope = EG(scope); EG(scope) = calling_scope; @@ -597,8 +605,10 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun EG(This) = NULL; } + EX(prev_execute_data) = EG(current_execute_data); + EG(current_execute_data) = &execute_data; - if (function_state.function->type == ZEND_USER_FUNCTION) { + if (EX(function_state).function->type == ZEND_USER_FUNCTION) { calling_symbol_table = EG(active_symbol_table); if (symbol_table) { EG(active_symbol_table) = symbol_table; @@ -610,7 +620,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun original_return_value = EG(return_value_ptr_ptr); original_op_array = EG(active_op_array); EG(return_value_ptr_ptr) = retval_ptr_ptr; - EG(active_op_array) = (zend_op_array *) function_state.function; + EG(active_op_array) = (zend_op_array *) EX(function_state).function; original_opline_ptr = EG(opline_ptr); orig_free_op1 = EG(free_op1); orig_free_op2 = EG(free_op2); @@ -631,7 +641,7 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun EG(binary_op) = orig_binary_op; } else { ALLOC_INIT_ZVAL(*retval_ptr_ptr); - ((zend_internal_function *) function_state.function)->handler(param_count, *retval_ptr_ptr, (object_pp?*object_pp:NULL), 1 TSRMLS_CC); + ((zend_internal_function *) EX(function_state).function)->handler(param_count, *retval_ptr_ptr, (object_pp?*object_pp:NULL), 1 TSRMLS_CC); INIT_PZVAL(*retval_ptr_ptr); } zend_ptr_stack_clear_multiple(TSRMLS_C); @@ -642,7 +652,8 @@ int call_user_function_ex(HashTable *function_table, zval **object_pp, zval *fun } EG(scope) = current_scope; EG(This) = current_this; - + EG(current_execute_data) = EX(prev_execute_data); \ + return SUCCESS; } diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index 6e50ae1398..8104a583d8 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -33,7 +33,7 @@ int zend_load_extension(char *path) handle = DL_LOAD(path); if (!handle) { #ifndef ZEND_WIN32 - fprintf(stderr, "Failed loading %s: %s\n", path, dlerror()); + fprintf(stderr, "Failed loading %s: %s\n", path, DL_ERROR()); #else fprintf(stderr, "Failed loading %s\n", path); #endif diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 3f7e0ebfd3..0e540b72e6 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -23,7 +23,7 @@ #include "zend_compile.h" -#define ZEND_EXTENSION_API_NO 20010710 +#define ZEND_EXTENSION_API_NO 220020901 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 079069175b..3b01663945 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -1109,7 +1109,7 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, IS_CONSISTENT(ht); - if (ht->nNumOfElements <= 1) { /* Doesn't require sorting */ + if (!(ht->nNumOfElements>1) && !(renumber && ht->nNumOfElements>0)) { /* Doesn't require sorting */ return SUCCESS; } arTmp = (Bucket **) pemalloc(ht->nNumOfElements * sizeof(Bucket *), ht->persistent); diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index 42e28379cc..cfeae83363 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -25,6 +25,8 @@ static HashTable *registered_zend_ini_directives; +#define NO_VALUE_PLAINTEXT "no value" +#define NO_VALUE_HTML "<i>no value</i>" /* * hash_apply functions @@ -305,15 +307,25 @@ static void zend_ini_displayer_cb(zend_ini_entry *ini_entry, int type) display_string = ini_entry->orig_value; display_string_length = ini_entry->orig_value_length; } else { - display_string = "<i>no value</i>"; - display_string_length = sizeof("<i>no value</i>")-1; + if(zend_uv.html_errors) { + display_string = NO_VALUE_HTML; + display_string_length = sizeof(NO_VALUE_HTML)-1; + } else { + display_string = NO_VALUE_PLAINTEXT; + display_string_length = sizeof(NO_VALUE_PLAINTEXT)-1; + } } } else if (ini_entry->value && ini_entry->value[0]) { display_string = ini_entry->value; display_string_length = ini_entry->value_length; } else { - display_string = "<i>no value</i>"; - display_string_length = sizeof("<i>no value</i>")-1; + if(zend_uv.html_errors) { + display_string = NO_VALUE_HTML; + display_string_length = sizeof(NO_VALUE_HTML)-1; + } else { + display_string = NO_VALUE_PLAINTEXT; + display_string_length = sizeof(NO_VALUE_PLAINTEXT)-1; + } } ZEND_WRITE(display_string, display_string_length); } @@ -351,9 +363,17 @@ ZEND_INI_DISP(zend_ini_color_displayer_cb) value = NULL; } if (value) { - zend_printf("<font color=\"%s\">%s</font>", value, value); + if (zend_uv.html_errors) { + zend_printf("<font color=\"%s\">%s</font>", value, value); + } else { + ZEND_PUTS(value); + } } else { - ZEND_PUTS("<i>no value</i>;"); + if (zend_uv.html_errors) { + ZEND_PUTS(NO_VALUE_HTML); + } else { + ZEND_PUTS(NO_VALUE_PLAINTEXT); + } } } diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index b9f8eb2b10..bb47f9b459 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -82,8 +82,8 @@ ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element) }\ if ((l)->dtor) {\ (l)->dtor((current)->data);\ - pefree((current), (l)->persistent);\ }\ + pefree((current), (l)->persistent);\ --l->count; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 9c131e2626..caae823cc9 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -8,6 +8,23 @@ #define DEBUG_OBJECT_HANDLERS 0 +/* + __X accessors explanation: + + if we have __get and property that is not part of the properties array is + requested, we call __get handler. If it fails, we return uninitialized. + + if we have __set and property that is not part of the properties array is + set, we call __set handler. If it fails, we do not change the array. + + for both handlers above, when we are inside __get/__set, no further calls for + __get/__set for these objects will be made, to prevent endless recursion and + enable accessors to change properties array. + + if we have __call and method which is not part of the class function table is + called, we cal __call handler. +*/ + static HashTable *zend_std_get_properties(zval *object TSRMLS_DC) { zend_object *zobj; @@ -15,11 +32,109 @@ static HashTable *zend_std_get_properties(zval *object TSRMLS_DC) return zobj->properties; } +static zval *zend_std_call_getter(zval *object, zval *member TSRMLS_DC) +{ + zval **call_args[1]; + zval *retval = NULL; + zval __get_name; + int call_result; + + /* __get handler is called with two arguments: + property name + return value for the object (by reference) + + it should return whether the call was successfull or not + */ + INIT_PZVAL(&__get_name); + ZVAL_STRINGL(&__get_name, ZEND_GET_FUNC_NAME, sizeof(ZEND_GET_FUNC_NAME)-1, 0); + + call_args[0] = &member; + + /* go call the __get handler */ + call_result = call_user_function_ex(NULL, + &object, + &__get_name, + &retval, + 1, call_args, + 0, NULL TSRMLS_CC); + + /* + call_result is if call_user_function gone OK. + retval returns the value that is received + */ + + + if(call_result == FAILURE) { + zend_error(E_ERROR, "Could not call __get handler for class %s", Z_OBJCE_P(object)->name); + return NULL; + } + + retval->refcount--; + + return retval; +} + +static int zend_std_call_setter(zval *object, zval *member, zval *value TSRMLS_DC) +{ + zval **call_args[2]; + zval *retval = NULL; + zval __set_name; + int call_result; + int ret; + + /* __set handler is called with two arguments: + property name + value to be set + + it should return whether the call was successfull or not + */ + INIT_PZVAL(&__set_name); + ZVAL_STRINGL(&__set_name, ZEND_SET_FUNC_NAME, sizeof(ZEND_SET_FUNC_NAME)-1, 0); + + call_args[0] = &member; + value->refcount++; + call_args[1] = &value; + + /* go call the __set handler */ + call_result = call_user_function_ex(NULL, + &object, + &__set_name, + &retval, + 2, call_args, + 0, NULL TSRMLS_CC); + + /* + call_result is if call_user_function gone OK. + retval shows if __get method went OK. + */ + + + if(call_result == FAILURE) { + zend_error(E_ERROR, "Could not call __set handler for class %s", Z_OBJCE_P(object)->name); + return FAILURE; + } + + zval_ptr_dtor(&value); + + if (retval && zval_is_true(retval)) { + ret = SUCCESS; + } else { + ret = FAILURE; + } + + if(retval) { + zval_ptr_dtor(&retval); + } + + return ret; +} + zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC) { zend_object *zobj; zval tmp_member; zval **retval; + zval *rv = NULL; zobj = Z_OBJ_P(object); @@ -35,25 +150,38 @@ zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC) #endif if (zend_hash_find(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &retval) == FAILURE) { - switch (type) { - case BP_VAR_R: - zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member)); - /* break missing intentionally */ - case BP_VAR_IS: - retval = &EG(uninitialized_zval_ptr); - break; - case BP_VAR_RW: - zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member)); - /* break missing intentionally */ - case BP_VAR_W: { + if(zobj->ce->__get && !zobj->in_get) { + /* have getter - try with it! */ + zobj->in_get = 1; /* prevent circular getting */ + rv = zend_std_call_getter(object, member TSRMLS_CC); + zobj->in_get = 0; + + if(rv) { + retval = &rv; + } else { + retval = &EG(uninitialized_zval_ptr); + } + } else { + switch (type) { + case BP_VAR_R: + zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member)); + /* break missing intentionally */ + case BP_VAR_IS: + retval = &EG(uninitialized_zval_ptr); + break; + case BP_VAR_RW: + zend_error(E_NOTICE,"Undefined property: %s", Z_STRVAL_P(member)); + /* break missing intentionally */ + case BP_VAR_W: { zval *new_zval = &EG(uninitialized_zval); - + new_zval->refcount++; zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &new_zval, sizeof(zval *), (void **) &retval); - } + } break; EMPTY_SWITCH_DEFAULT_CASE() - + + } } } if (member == &tmp_member) { @@ -67,6 +195,7 @@ static void zend_std_write_property(zval *object, zval *member, zval *value TSRM zend_object *zobj; zval tmp_member; zval **variable_ptr; + int setter_done = 0; zobj = Z_OBJ_P(object); @@ -88,10 +217,21 @@ static void zend_std_write_property(zval *object, zval *member, zval *value TSRM FREE_ZVAL(*variable_ptr); } } + } else { + if(zobj->ce->__set && !zobj->in_set) { + zobj->in_set = 1; /* prevent circular setting */ + if(zend_std_call_setter(object, member, value TSRMLS_CC) != SUCCESS) { +// zend_error(E_NOTICE,"Cannot set undefined property: %s", Z_STRVAL_P(member)); + } + setter_done = 1; + zobj->in_set = 0; + } } - value->refcount++; - zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &value, sizeof(zval *), NULL); + if(!setter_done) { + value->refcount++; + zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &value, sizeof(zval *), NULL); + } if (member == &tmp_member) { zval_dtor(member); } @@ -117,11 +257,19 @@ static zval **zend_std_get_property_ptr(zval *object, zval *member TSRMLS_DC) #endif if (zend_hash_find(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &retval) == FAILURE) { - zval *new_zval = &EG(uninitialized_zval); + zval *new_zval; + + if(!zobj->ce->__get) { + /* we don't have getter - will just add it */ + new_zval = &EG(uninitialized_zval); - zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member)); - new_zval->refcount++; - zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &new_zval, sizeof(zval *), (void **) &retval); + zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member)); + new_zval->refcount++; + zend_hash_update(zobj->properties, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, &new_zval, sizeof(zval *), (void **) &retval); + } else { + /* we do have getter - fail and let it try again with usual get/set */ + retval = NULL; + } } if (member == &tmp_member) { zval_dtor(member); @@ -148,12 +296,86 @@ static void zend_std_unset_property(zval *object, zval *member TSRMLS_DC) } } +static void zend_std_call_user_call(INTERNAL_FUNCTION_PARAMETERS) +{ + zval ***args; + zend_internal_function *func = (zend_internal_function *)EG(function_state_ptr)->function; + zval method_name, method_args, __call_name; + zval *method_name_ptr, *method_args_ptr; + zval **call_args[2]; + zval *method_result_ptr = NULL; + int i, call_result; + + args = (zval ***)emalloc(ZEND_NUM_ARGS() * sizeof(zval **)); + + if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { + efree(args); + zend_error(E_ERROR, "Cannot get arguments for __call"); + RETURN_FALSE; + } + + method_name_ptr = &method_name; + INIT_PZVAL(method_name_ptr); + ZVAL_STRING(method_name_ptr, func->function_name, 0); /* no dup - it's a copy */ + + method_args_ptr = &method_args; + INIT_PZVAL(method_args_ptr); + array_init(method_args_ptr); + + for(i=0; i<ZEND_NUM_ARGS(); i++) { + zval_add_ref(args[i]); + add_next_index_zval(method_args_ptr, *args[i]); + } + + efree(args); + + INIT_PZVAL(&__call_name); + ZVAL_STRINGL(&__call_name, ZEND_CALL_FUNC_NAME, sizeof(ZEND_CALL_FUNC_NAME)-1, 0); + + /* __call handler is called with two arguments: + method name + array of method parameters + + */ + call_args[0] = &method_name_ptr; + call_args[1] = &method_args_ptr; + + /* go call the __call handler */ + call_result = call_user_function_ex(NULL, + &this_ptr, + &__call_name, + &method_result_ptr, + 2, call_args, + 0, NULL TSRMLS_CC); + + /* call_result is if call_user_function gone OK. + method_result_ptr is the true result of the called method + */ + + if(method_result_ptr) { + *return_value = *method_result_ptr; + zval_copy_ctor(return_value); + zval_ptr_dtor(&method_result_ptr); + } + + if(call_result == FAILURE) { + zend_error(E_ERROR, "Could not call __call handler for class %s", Z_OBJCE_P(this_ptr)->name); + } + + /* now destruct all auxiliaries */ + zval_dtor(method_args_ptr); + zval_dtor(method_name_ptr); + + /* destruct the function also, then - we have allocated it in get_method */ + efree(func); +} + static union _zend_function *zend_std_get_method(zval *object, char *method_name, int method_len TSRMLS_DC) { zend_object *zobj; zend_function *func_method; char *lc_method_name; - + lc_method_name = do_alloca(method_len+1); /* Create a zend_copy_str_tolower(dest, src, src_length); */ memcpy(lc_method_name, method_name, method_len+1); @@ -161,6 +383,17 @@ static union _zend_function *zend_std_get_method(zval *object, char *method_name zobj = Z_OBJ_P(object); if(zend_hash_find(&zobj->ce->function_table, lc_method_name, method_len+1, (void **)&func_method) == FAILURE) { + if(zobj->ce->__call != NULL) { + zend_internal_function *call_user_call = emalloc(sizeof(zend_internal_function)); + call_user_call->type = ZEND_INTERNAL_FUNCTION; + call_user_call->handler = zend_std_call_user_call; + call_user_call->arg_types = NULL; + call_user_call->scope = NULL; + call_user_call->function_name = estrndup(method_name, method_len); + + free_alloca(lc_method_name); + return (union _zend_function *)call_user_call; + } zend_error(E_ERROR, "Call to undefined function %s()", method_name); } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 3e253cc406..a6b7579350 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -57,6 +57,8 @@ ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_ent (*object)->ce = class_type; retval.handle = zend_objects_store_put(*object, (zend_objects_store_dtor_t) zend_objects_destroy_object, NULL TSRMLS_CC); retval.handlers = &std_object_handlers; + (*object)->in_get = 0; + (*object)->in_set = 0; return retval; } diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 897d807020..50b9e7555b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -36,7 +36,7 @@ ZEND_API int zend_atoi(const char *str, int str_len) if (!str_len) { str_len = strlen(str); } - retval = atoi(str); + retval = strtol(str, NULL, 0); if (str_len>0) { switch (str[str_len-1]) { case 'k': @@ -871,7 +871,7 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) result_str[i] |= shorter->value.str.val[i]; } if (result==op1) { - efree(result->value.str.val); + STR_FREE(result->value.str.val); } result->value.str.val = result_str; result->value.str.len = result_len; @@ -910,7 +910,7 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) result_str[i] &= longer->value.str.val[i]; } if (result==op1) { - efree(result->value.str.val); + STR_FREE(result->value.str.val); } result->value.str.val = result_str; result->value.str.len = result_len; @@ -951,7 +951,7 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) result_str[i] ^= longer->value.str.val[i]; } if (result==op1) { - efree(result->value.str.val); + STR_FREE(result->value.str.val); } result->value.str.val = result_str; result->value.str.len = result_len; @@ -1489,12 +1489,12 @@ ZEND_API int increment_function(zval *op1) op1->value.lval = lval+1; op1->type = IS_LONG; } - efree(strval); + efree(strval); /* should never be empty_string */ break; case IS_DOUBLE: op1->value.dval = dval+1; op1->type = IS_DOUBLE; - efree(strval); + efree(strval); /* should never be empty_string */ break; #if 0 case FLAG_IS_BC: diff --git a/ext/imap/imap.h b/ext/imap/imap.h deleted file mode 100644 index 914d128316..0000000000 --- a/ext/imap/imap.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef _INCLUDED_IMAP_H -#define _INCLUDED_IMAP_H - -#if COMPILE_DL -#undef HAVE_IMAP -#define HAVE_IMAP 1 -#endif - -#if HAVE_IMAP - -#ifndef PHP_WIN32 -#include "build-defs.h" -#endif - -/* Functions accessable to PHP */ -extern zend_module_entry imap_module_entry; -#define imap_module_ptr &imap_module_entry - -extern PHP_MINIT_FUNCTION(imap); -extern PHP_RINIT_FUNCTION(imap); -extern PHP_RSHUTDOWN_FUNCTION(imap); -PHP_MINFO_FUNCTION(imap); -PHP_FUNCTION(imap_open); -PHP_FUNCTION(imap_popen); -PHP_FUNCTION(imap_reopen); -PHP_FUNCTION(imap_num_msg); -PHP_FUNCTION(imap_num_recent); -PHP_FUNCTION(imap_headers); -PHP_FUNCTION(imap_headerinfo); -PHP_FUNCTION(imap_rfc822_parse_headers); -PHP_FUNCTION(imap_body); -PHP_FUNCTION(imap_fetchstructure); -PHP_FUNCTION(imap_fetchbody); -PHP_FUNCTION(imap_expunge); -PHP_FUNCTION(imap_delete); -PHP_FUNCTION(imap_undelete); -PHP_FUNCTION(imap_check); -PHP_FUNCTION(imap_close); -PHP_FUNCTION(imap_mail_copy); -PHP_FUNCTION(imap_mail_move); -PHP_FUNCTION(imap_createmailbox); -PHP_FUNCTION(imap_renamemailbox); -PHP_FUNCTION(imap_deletemailbox); -PHP_FUNCTION(imap_listmailbox); -PHP_FUNCTION(imap_scanmailbox); -PHP_FUNCTION(imap_subscribe); -PHP_FUNCTION(imap_unsubscribe); -PHP_FUNCTION(imap_append); -PHP_FUNCTION(imap_ping); -PHP_FUNCTION(imap_base64); -PHP_FUNCTION(imap_qprint); -PHP_FUNCTION(imap_8bit); -PHP_FUNCTION(imap_binary); -PHP_FUNCTION(imap_mailboxmsginfo); -PHP_FUNCTION(imap_rfc822_write_address); -PHP_FUNCTION(imap_rfc822_parse_adrlist); -PHP_FUNCTION(imap_setflag_full); -PHP_FUNCTION(imap_clearflag_full); -PHP_FUNCTION(imap_sort); -PHP_FUNCTION(imap_fetchheader); -PHP_FUNCTION(imap_fetchtext); -PHP_FUNCTION(imap_uid); -PHP_FUNCTION(imap_msgno); -PHP_FUNCTION(imap_list); -PHP_FUNCTION(imap_list_full); -PHP_FUNCTION(imap_listscan); -PHP_FUNCTION(imap_lsub); -PHP_FUNCTION(imap_lsub_full); -PHP_FUNCTION(imap_create); -PHP_FUNCTION(imap_rename); -PHP_FUNCTION(imap_status); -PHP_FUNCTION(imap_bodystruct); -PHP_FUNCTION(imap_fetch_overview); -PHP_FUNCTION(imap_mail_compose); -PHP_FUNCTION(imap_alerts); -PHP_FUNCTION(imap_errors); -PHP_FUNCTION(imap_last_error); -PHP_FUNCTION(imap_mail); -PHP_FUNCTION(imap_search); -PHP_FUNCTION(imap_utf8); -PHP_FUNCTION(imap_utf7_decode); -PHP_FUNCTION(imap_utf7_encode); -PHP_FUNCTION(imap_mime_header_decode); -#else -#define imap_module_ptr NULL -#endif /* HAVE_IMAP */ - -#endif - - - - - - -#define phpext_imap_ptr imap_module_ptr - - - - - - - - diff --git a/ext/pcre/config0.m4 b/ext/pcre/config0.m4 deleted file mode 100644 index 2563494468..0000000000 --- a/ext/pcre/config0.m4 +++ /dev/null @@ -1,57 +0,0 @@ -dnl -dnl $Id$ -dnl - -dnl By default we'll compile and link against the bundled PCRE library -dnl if DIR is supplied, we'll use that for linking - -PHP_ARG_WITH(pcre-regex,for PCRE support, -[ --without-pcre-regex Do not include Perl Compatible Regular Expressions - support. Use --with-pcre-regex=DIR to specify DIR - where PCRE's include and library files are located, - if not using bundled library.],yes) - -if test "$PHP_PCRE_REGEX" != "no"; then - if test "$PHP_PCRE_REGEX" = "yes"; then - PHP_NEW_EXTENSION(pcre, pcrelib/maketables.c pcrelib/get.c pcrelib/study.c pcrelib/pcre.c php_pcre.c, $ext_shared,,-DSUPPORT_UTF8 -I@ext_srcdir@/pcrelib) - PHP_ADD_BUILD_DIR($ext_builddir/pcrelib) - AC_DEFINE(HAVE_BUNDLED_PCRE, 1, [ ]) - else - test -f $PHP_PCRE_REGEX/pcre.h && PCRE_INCDIR=$PHP_PCRE_REGEX - test -f $PHP_PCRE_REGEX/include/pcre.h && PCRE_INCDIR=$PHP_PCRE_REGEX/include - test -f $PHP_PCRE_REGEX/include/pcre/pcre.h && PCRE_INCDIR=$PHP_PCRE_REGEX/include/pcre - - if test -z "$PCRE_INCDIR"; then - AC_MSG_RESULT(Could not find pcre.h in $PHP_PCRE_REGEX) - fi - - changequote({,}) - pcre_major=`grep PCRE_MAJOR $PCRE_INCDIR/pcre.h | sed -e 's/[^0-9]//g'` - pcre_minor=`grep PCRE_MINOR $PCRE_INCDIR/pcre.h | sed -e 's/[^0-9]//g'` - changequote([,]) - pcre_minor_length=`echo "$pcre_minor" | wc -c | sed -e 's/[^0-9]//g'` - if test "$pcre_minor_length" -eq 2 ; then - pcre_minor="$pcre_minor"0 - fi - pcre_version=$pcre_major$pcre_minor - if test "$pcre_version" -lt 208; then - AC_MSG_ERROR(The PCRE extension requires PCRE library version >= 2.08) - fi - - test -f $PHP_PCRE_REGEX/libpcre.a && PCRE_LIBDIR=$PHP_PCRE_REGEX - test -f $PHP_PCRE_REGEX/lib/libpcre.a && PCRE_LIBDIR=$PHP_PCRE_REGEX/lib - - if test -z "$PCRE_LIBDIR" ; then - AC_MSG_ERROR(Could not find libpcre.a in $PHP_PCRE_REGEX) - fi - - PHP_ADD_LIBRARY_WITH_PATH(pcre, $PCRE_LIBDIR, PCRE_SHARED_LIBADD) - - AC_DEFINE(HAVE_PCRE, 1, [ ]) - PHP_ADD_INCLUDE($PCRE_INCDIR) - PHP_NEW_EXTENSION(pcre, php_pcre.c, $ext_shared,,-DSUPPORT_UTF8) - fi -fi -PHP_SUBST(PCRE_SHARED_LIBADD) - -AC_CHECK_FUNC(memmove, [], [AC_DEFINE(USE_BCOPY, 1, [ ])]) diff --git a/ext/soap/EXPERIMENTAL b/ext/soap/EXPERIMENTAL deleted file mode 100644 index e69de29bb2..0000000000 --- a/ext/soap/EXPERIMENTAL +++ /dev/null diff --git a/ext/soap/Makefile b/ext/soap/Makefile deleted file mode 100644 index 1107a700bd..0000000000 --- a/ext/soap/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -top_srcdir = /usr/local/src/php-4.2.0 -top_builddir = /usr/local/src/php-4.2.0 -srcdir = /usr/local/src/php-4.2.0/ext/soap -builddir = /usr/local/src/php-4.2.0/ext/soap -VPATH = /usr/local/src/php-4.2.0/ext/soap -# $Id$ - -LTLIBRARY_NAME = libsoap.la -LTLIBRARY_SOURCES = soap.c php_sdl.c php_schema.c php_xml.c php_encoding.c php_http.c php_packet_soap.c -LTLIBRARY_SHARED_NAME = soap.la -LTLIBRARY_SHARED_LIBADD = $(SOAP_SHARED_LIBADD) - -include $(top_srcdir)/build/dynlib.mk diff --git a/ext/soap/Makefile.in b/ext/soap/Makefile.in deleted file mode 100644 index eb52167d2d..0000000000 --- a/ext/soap/Makefile.in +++ /dev/null @@ -1,8 +0,0 @@ -# $Id$ - -LTLIBRARY_NAME = libsoap.la -LTLIBRARY_SOURCES = soap.c php_sdl.c php_schema.c php_xml.c php_encoding.c php_http.c php_packet_soap.c -LTLIBRARY_SHARED_NAME = soap.la -LTLIBRARY_SHARED_LIBADD = $(SOAP_SHARED_LIBADD) - -include $(top_srcdir)/build/dynlib.mk diff --git a/ext/soap/TODO b/ext/soap/TODO deleted file mode 100644 index b70760add7..0000000000 --- a/ext/soap/TODO +++ /dev/null @@ -1,36 +0,0 @@ -TODO: -make sure soap 1.1 and 1.2 is supported fully -Better WSDL support Client and server (how much validation is needed here?) -UDDI?? -make internal refrences for soap encoding (use seralization logic) -add ini option for always soap_error_handler -provide user space overriding of serialization certin objects and types -serialization in general needs to be polished/finished... all xsd types -make perstistant objects and work with or without register_globals on -look to see if php-soap will work with out always_populate_raw_post_data on -see if client will work with ssl.. should be eaiser with php_streams -work on soap seralizer (php serialization) -work on a soap-service 'regiestry' and 'proxy' (apache soap style) -convert all string mainpulation to use smart_str -make the 'soap' packet abstract.. maybe incorperate xml-rpc -make the transport layer abstract.. what other transport layers are needed?... who uses smtp? what about jabber? -make $soap_object->data = 'text'; maybe invoke a set_*() and/or get_*() method -when using wsdls and function names are similar find the best match - void test(int); - void test(string); - maybe use the same alogrithim as ext/java. -investigate further http keep_alive... inital testing proved slower.. maybe php_streams will speed things up.. -provide schema 1999/2001 support.... -through memory leak testing -possible using shared memory for sdl caching... -api for clearing/checking sdl caching... -make php-soap work as a standalone server using php_streams and the new socket extension -http authication -proxy support -wsdl generation static and auto (.net style (http://server.com/soapserver.php?WSDL)) using phpdoc parsing engine -interpo testing... -BENCHMARKING...... lets prove how fast it is. -do some more work on website - -does this list stop... what exactly have i done? -im sure im forgetting 20 thousand more things.... diff --git a/ext/soap/config.m4 b/ext/soap/config.m4 deleted file mode 100644 index 44c12cb037..0000000000 --- a/ext/soap/config.m4 +++ /dev/null @@ -1,16 +0,0 @@ -dnl $Id$ -dnl config.m4 for extension soap - -dnl Comments in this file start with the string 'dnl'. -dnl Remove where necessary. This file will not work -dnl without editing. - -PHP_ARG_ENABLE(soap, whether to enable soap support, -Make sure that the comment is aligned: -[ --enable-soap Enable soap support]) - -if test "$PHP_SOAP" != "no"; then - PHP_ADD_INCLUDE(/usr/local/include/libxml2) - PHP_ADD_LIBRARY_WITH_PATH(xml2,/usr/local/lib,SOAP_SHARED_LIBADD) - PHP_EXTENSION(soap, $ext_shared) -fi diff --git a/ext/soap/interop/base.php b/ext/soap/interop/base.php deleted file mode 100644 index 435d9aa6f0..0000000000 --- a/ext/soap/interop/base.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -class Interop_Base -{ -} - -?>
\ No newline at end of file diff --git a/ext/soap/interop/client_round2.php b/ext/soap/interop/client_round2.php deleted file mode 100644 index 5583bb6c17..0000000000 --- a/ext/soap/interop/client_round2.php +++ /dev/null @@ -1,102 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> - -<html> -<head> - <title>Round 2 Interop Client Tests</title> -</head> - -<body> -<a href="index.php">Back to Interop Index</a><br> -<p> </p> -<?php -require_once 'SOAP/interop/client_round2_interop.php'; - -$iop = new Interop_Client(); - -function endpointList($test,$sel_endpoint) -{ - global $iop; - $iop->getEndpoints($test); - echo "<select name='endpoint'>\n"; - foreach ($iop->endpoints as $epname => $epinfo) { - $selected = ''; - if ($sel_endpoint == $epname) $selected = ' SELECTED'; - echo "<option value='$epname'$selected>$epname</option>\n"; - } - echo "</select>\n"; -} -function methodList($test,$sel_method) -{ - global $iop; - - $ml = $iop->getMethodList($test); - echo "<select name='method'>\n"; - foreach ($ml as $method) { - $selected = ''; - if ($sel_method == $method) $selected = ' SELECTED'; - echo "<option value='$method'$selected>$method</option>\n"; - } - echo "<option value='ALL'>Run All Methods</option>\n"; - echo "</select>\n"; -} - -function endpointTestForm($test, $endpoint, $method, $paramType, $useWSDL) -{ - global $PHP_SELF; - if (!$test) $test = 'base'; - echo "Round 2 '$test' Selected<br>\n"; - echo "Select endpoint and method to run:<br>\n"; - echo "<form action='$PHP_SELF' method='post'>\n"; - echo "<input type='hidden' name='test' value='$test'>\n"; - endpointList($test, $endpoint); - methodList($test, $method); - echo "<select name='paramType'><option value='soapval'>soap value</option>"; - echo "<option value='php'".($paramType=='php'?' selected':'').">php internal type</option></select>\n"; - echo "<select name='useWSDL'><option value='0'>go Direct</option><option value='1'".($useWSDL?' selected':'').">use WSDL</option></select>\n"; - echo "<input type='submit' value='Go'>\n"; - echo "</form><br>\n"; -} - -function testSelectForm($selected_test = NULL) -{ - global $iop, $PHP_SELF; - echo "Select a Round 2 test case to run:<br>\n"; - echo "<form action='$PHP_SELF' method='post'>\n"; - echo "<select name='test'>\n"; - foreach ($iop->tests as $test) { - $selected = ''; - if ($selected_test == $test) $selected = ' SELECTED'; - echo "<option value='$test'$selected>$test</option>\n"; - } - echo "</select>\n"; - echo "<input type='submit' value='Go'>\n"; - echo "</form><br>\n"; -} - -testSelectForm($_POST['test']); -endpointTestForm($_POST['test'],$_POST['endpoint'],$_POST['method'],$_POST['paramType'],$_POST['useWSDL']); - -if ($_POST['test'] && array_key_exists('endpoint', $_POST) && array_key_exists('method', $_POST)) { - // here we execute the orders - echo "<h2>Calling {$_POST['method']} at {$_POST['endpoint']}</h2>\n"; - echo "NOTE: wire's are slightly modified to display better in web browsers.<br>\n"; - - $iop->currentTest = $_POST['test']; // see $tests above - $iop->paramType = $_POST['paramType']; // 'php' or 'soapval' - $iop->useWSDL = $_POST['useWSDL']; // 1= do wsdl tests - $iop->numServers = 0; // 0 = all - $iop->specificEndpoint = $_POST['endpoint']; // test only this endpoint - $iop->testMethod = $_POST['method']=='ALL'?'':$_POST['method']; // test only this method - $iop->skipEndpointList = array(); // endpoints to skip - $this->nosave = 0; // 1= disable saving results to database - // debug output - $iop->show = 1; - $iop->debug = 1; - $iop->showFaults = 0; // used in result table output - echo '<pre>'; - $iop->doTest(); // run a single set of tests using above options - echo '</pre>'; -} -?> -</body> -</html> diff --git a/ext/soap/interop/client_round2_interop.php b/ext/soap/interop/client_round2_interop.php deleted file mode 100644 index 1e77ed92c8..0000000000 --- a/ext/soap/interop/client_round2_interop.php +++ /dev/null @@ -1,796 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -require_once 'DB.php'; // PEAR/DB -require_once 'base.php'; -require_once 'client_round2_params.php'; -require_once 'test.utility.php'; - -error_reporting(E_ALL ^ E_NOTICE); - -class Interop_Client extends Interop_Base -{ - // database DNS - var $DSN = 'mysql://user@localhost/interop2'; - - // our central interop server, where we can get the list of endpoints - var $interopServer = "http://www.whitemesa.net/interopInfo"; - - // our local endpoint, will always get added to the database for all tests - var $localEndpoint; - - // specify testing - var $currentTest = 'base'; // see $tests above - var $paramType = 'php'; // 'php' or 'soapval' - var $useWSDL = 0; // 1= do wsdl tests - var $numServers = 0; // 0 = all - var $specificEndpoint = ''; // test only this endpoint - var $testMethod = ''; // test only this method - var $skipEndpointList = array(); // endpoints to skip - var $nosave = 0; - var $startAt = ''; // start in list at this endpoint - // debug output - var $show = 1; - var $debug = 0; - var $showFaults = 0; // used in result table output - - // PRIVATE VARIABLES - var $dbc = NULL; - var $totals = array(); - var $tests = array('base','GroupB', 'GroupC'); - var $paramTypes = array('php', 'soapval'); - var $endpoints = array(); - - function Interop_Client() { - // set up the database connection - $this->dbc = DB::connect($this->DSN, true); - // if it errors out, just ignore it and rely on regular methods - if (DB::isError($this->dbc)) { - echo $this->dbc->getMessage(); - $this->dbc = NULL; - } - // set up local endpoint - $this->localEndpoint['base'] = array( - 'endpointName'=>'PEAR SOAP', - 'endpointURL'=>'http://localhost/soap_interop/server_round2.php', - 'wsdlURL'=>'http://localhost/soap_interop/interop.wsdl' - ); - $this->localEndpoint['GroupB'] = array( - 'endpointName'=>'PEAR SOAP', - 'endpointURL'=>'http://localhost/soap_interop/server_round2.php', - 'wsdlURL'=>'http://localhost/soap_interop/interopB.wsdl' - ); - $this->localEndpoint['GroupC'] = array( - 'endpointName'=>'PEAR SOAP', - 'endpointURL'=>'http://localhost/soap_interop/server_round2.php', - 'wsdlURL'=>'http://localhost/soap_interop/echoheadersvc.wsdl' - ); - } - - function _fetchEndpoints(&$soapclient, $test) { - $this->_getEndpoints($test, 1); - - // retreive endpoints from the endpoint server - $endpointArray = $soapclient->call("GetEndpointInfo",array("groupName"=>$test),"http://soapinterop.org/info/","http://soapinterop.org/info/"); - if (PEAR::isError($endpointArray)) { - print $soapclient->wire; - print_r($endpointArray); - return; - } - - // add our local endpoint - if ($this->localEndpoint[$test]) { - array_push($endpointArray, $this->localEndpoint[$test]); - } - - if (!$endpointArray) return; - - // reset the status to zero - $res = $this->dbc->query("update endpoints set status = 0 where class='$test'"); - if (DB::isError($res)) { - die ($res->getMessage()); - } - if (is_object($res)) $res->free(); - // save new endpoints into database - foreach($endpointArray as $k => $v){ - if (array_key_exists($v['endpointName'],$this->endpoints)) { - $res = $this->dbc->query("update endpoints set endpointURL='{$v['endpointURL']}', wsdlURL='{$v['wsdlURL']}', status=1 where id={$this->endpoints[$v['endpointName']]['id']}"); - } else { - $res = $this->dbc->query("insert into endpoints (endpointName,endpointURL,wsdlURL,class) values('{$v['endpointName']}','{$v['endpointURL']}','{$v['wsdlURL']}','$test')"); - } - if (DB::isError($res)) { - die ($res->getMessage()); - } - if (is_object($res)) $res->free(); - } - } - - /** - * fetchEndpoints - * retreive endpoints interop server - * - * @return boolean result - * @access private - */ - function fetchEndpoints($test = NULL) { - // fetch from the interop server - $soapclient = new SoapObject($this->interopServer); - - if ($test) { - $this->_fetchEndpoints($soapclient, $test); - } else { - foreach ($this->tests as $test) { - $this->_fetchEndpoints($soapclient, $test); - } - $test = 'base'; - } - - // retreive all endpoints now - $this->currentTest = $test; - return $this->_getEndpoints($test); - } - - /** - * getEndpoints - * retreive endpoints from either database or interop server - * - * @param string base (see local var $tests) - * @param boolean all (if false, only get valid endpoints, status=1) - * @return boolean result - * @access private - */ - function getEndpoints($base = 'base', $all = 0) { - if (!$this->_getEndpoints($base, $all)) { - return $this->fetchEndpoints($base); - } - return TRUE; - } - - /** - * _getEndpoints - * retreive endpoints from database - * - * @param string base (see local var $tests) - * @param boolean all (if false, only get valid endpoints, status=1) - * @return boolean result - * @access private - */ - function _getEndpoints($base = "", $all = 0) { - $this->endpoints = array(); - - // build sql - $sql = "select * from endpoints "; - if ($base) { - $sql .= "where class='$base' "; - if (!$all) $sql .= "and status=1"; - } else - if (!$all) $sql .= "where status=1"; - - $db_ep = $this->dbc->getAll($sql,NULL, DB_FETCHMODE_ASSOC ); - if (DB::isError($db_ep)) { - echo $sql."\n"; - echo $db_ep->getMessage(); - return FALSE; - } - // rearange the array - foreach ($db_ep as $entry) { - $this->endpoints[$entry['endpointName']] = $entry; - } - if (count($this->endpoints) > 0) { - $this->currentTest = $base; - return TRUE; - } - return FALSE; - } - - /** - * getResults - * retreive results from the database, stuff them into the endpoint array - * - * @access private - */ - function getResults($test = 'base', $type = 'php', $wsdl = 0) { - // be sure we have the right endpoints for this test result - $this->getEndpoints($test); - - // retreive the results and put them into the endpoint info - $sql = "select * from results where class='$test' and type='$type' and wsdl=$wsdl"; - $results = $this->dbc->getAll($sql,NULL, DB_FETCHMODE_ASSOC ); - foreach ($results as $result) { - // find the endpoint - foreach ($this->endpoints as $epn => $epi) { - if ($epi['id'] == $result['endpoint']) { - // store the info - $this->endpoints[$epn]['methods'][$result['function']] = $result; - break; - } - } - } - } - - /** - * saveResults - * save the results of a method test into the database - * - * @access private - */ - function _saveResults($endpoint_id, &$soap_test) { - if ($this->nosave) return; - - $result = $soap_test->result; - $wire = $result['wire']; - if ($result['success']) { - $success = 'OK'; - $error = ''; - } else { - $success = $result['fault']->faultcode; - $error = $result['fault']->faultstring; - if (!$wire) $wire= $result['fault']->detail; - } - - $test_name = $soap_test->test_name; - // add header info to the test name - if ($soap_test->headers) { - foreach ($soap_test->headers as $h) { - $destination = 0; - if (get_class($h) == 'soap_header') { - if ($h->attributes['SOAP-ENV:actor'] == 'http://schemas.xmlsoap.org/soap/actor/next') $destination = 1; - $test_name .= ":{$h->name},$destination,{$h->attributes['SOAP-ENV:mustUnderstand']}"; - } else { - if (!$h[3] || $h[3] == 'http://schemas.xmlsoap.org/soap/actor/next') $destination = 1; - if (!$h[2]) $h[2] = 0; - $qn = new QName($h[0]); - $test_name .= ":{$qn->name},$destination,".(int)$h[2]; - } - } - } - - $sql = "delete from results where endpoint=$endpoint_id ". - "and class='$this->currentTest' and type='$this->paramType' ". - "and wsdl=$this->useWSDL and function=". - $this->dbc->quote($test_name); - #echo "\n".$sql; - $res = $this->dbc->query($sql); - if (DB::isError($res)) { - die ($res->getMessage()); - } - if (is_object($res)) $res->free(); - - $sql = "insert into results (endpoint,stamp,class,type,wsdl,function,result,error,wire) ". - "values($endpoint_id,".time().",'$this->currentTest',". - "'$this->paramType',$this->useWSDL,". - $this->dbc->quote($test_name).",". - $this->dbc->quote($success).",". - $this->dbc->quote($error).",". - ($wire?$this->dbc->quote($wire):"''").")"; - #echo "\n".$sql; - $res = $this->dbc->query($sql); - - if (DB::isError($res)) { - die ($res->getMessage()); - } - if (is_object($res)) $res->free(); - } - - /** - * decodeSoapval - * decodes a soap value to php type, used for test result comparisions - * - * @param SOAP_Value soapval - * @return mixed result - * @access public - */ - function decodeSoapval($soapval) - { - if (gettype($soapval) == "object" && - (strcasecmp(get_class($soapval),"soapparam") == 0 || - strcasecmp(get_class($soapval),"soapvar") == 0)) { - if (strcasecmp(get_class($soapval),"soapparam") == 0) - $val = $soapval->param_data->enc_value; - else - $val = $soapval->enc_value; - } else { - $val = $soapval; - } - if (is_array($val)) { - foreach($val as $k => $v) { - if (gettype($v) == "object" && - (strcasecmp(get_class($soapval),"soapparam") == 0 || - strcasecmp(get_class($soapval),"soapvar") == 0)) { - $val[$k] = $this->decodeSoapval($v); - } - } - } - return $val; - } - - /** - * compareResult - * compare two php types for a match - * - * @param string expect - * @param string test_result - * @return boolean result - * @access public - */ - function compareResult($expect, $result, $type = NULL) - { - $ok = 0; - $expect_type = gettype($expect); - $result_type = gettype($result); - if ($expect_type == "array" && $result_type == "array") { - # compare arrays - $ok = array_compare($expect, $result); - } else { - if ($type == 'boolean') - $ok = boolean_compare($expect, $result); - else - $ok = string_compare($expect, $result); - } - return $ok; - } - - - /** - * doEndpointMethod - * run a method on an endpoint and store it's results to the database - * - * @param array endpoint_info - * @param SOAP_Test test - * @return boolean result - * @access public - */ - function doEndpointMethod(&$endpoint_info, &$soap_test) { - $ok = FALSE; - - // prepare a holder for the test results - $soap_test->result['class'] = $this->currentTest; - $soap_test->result['type'] = $this->paramType; - $soap_test->result['wsdl'] = $this->useWSDL; - - if ($this->useWSDL) { - if (array_key_exists('wsdlURL',$endpoint_info)) { - if (!array_key_exists('client',$endpoint_info)) { - $endpoint_info['client'] = new SoapObject($endpoint_info['wsdlURL']); - } - $soap =& $endpoint_info['client']; - - # XXX how do we determine a failure on retreiving/parsing wsdl? - if ($soap->wsdl->fault) { - $fault = $soap->wsdl->fault->getFault(); - $soap_test->setResult(0,'WSDL', - $fault->faultstring."\n\n".$fault->detail, - $fault->faultstring, - $fault - ); - return FALSE; - } - } else { - $fault = new SoapFault('WSDL',"no WSDL defined for $endpoint"); - $soap_test->setResult(0,'WSDL', - $fault->faultstring, - $fault->faultstring, - $fault - ); - return FALSE; - } - $namespace = false; - $soapaction = false; - } else { - $namespace = $soapaction = 'http://soapinterop.org/'; - // hack to make tests work with MS SoapToolkit - // it's the only one that uses this soapaction, and breaks if - // it isn't right. Can't wait for soapaction to be fully depricated - if ($this->currentTest == 'base' && - strstr($endpoint_info['endpointName'],'MS SOAP ToolKit 2.0')) { - $soapaction = 'urn:soapinterop'; - } - if (!array_key_exists('client',$endpoint_info)) { - $endpoint_info['client'] = new SoapObject($endpoint_info['endpointURL'],$soapaction); - } - $soap = $endpoint_info['client']; - } - // add headers to the test - if ($soap_test->headers) { - // $header is already a SOAP_Header class - foreach ($soap_test->headers as $header) { - $soap->addHeader($header); - } - } - // XXX no way to set encoding - // this lets us set UTF-8, US-ASCII or other - //$soap->setEncoding($soap_test->encoding); - - if ($this->useWSDL) { - $args = ''; - foreach ($soap_test->method_params as $pname => $param) { - $arg = '$soap_test->method_params["'.$pname.'"]'; - $args .= $args?','.$arg:$arg; - } - $return = eval('return $soap->'.$soap_test->method_name.'('.$args.');'); - } else { - $return = $soap->__call($soap_test->method_name,$soap_test->method_params,$soapaction, $namespace); - } - - // save the wire - $wire = $soap->__getlastrequest()."\n\n".$soap->__getlastresponse(); - $wire = str_replace('>',">\n",$wire); - $wire = str_replace('" ',"\" \n",$wire); - #print $wire; - - if(!$soap->__isfault()){ - if (is_array($soap_test->method_params) && count($soap_test->method_params) == 1) { - $sent = array_shift($soap_test->method_params); - } else { - $sent = $soap_test->method_params; - } - - // compare header results - $header_result = array(); - $headers_ok = TRUE; - - # XXX need to implement header support! - # - #if ($soap_test->headers) { - # // $header is already a SOAP_Header class - # foreach ($soap_test->headers as $header) { - # if (get_class($header) != 'soap_header') { - # // assume it's an array - # $header = new SOAP_Header($header[0], NULL, $header[1], $header[2], $header[3], $header[4]); - # } - # $expect = $soap_test->headers_expect[$header->name]; - # $header_result[$header->name] = array(); - # // XXX need to fix need_result to identify the actor correctly - # $need_result = $hresult || - # ($header->attributes['SOAP-ENV:actor'] == 'http://schemas.xmlsoap.org/soap/actor/next' - # && $header->attributes['SOAP-ENV:mustUnderstand']); - # if ($expect) { - # $hresult = $soap->headers[key($expect)]; - # $ok = !$need_result || $this->compareResult($hresult ,$expect[key($expect)]); - # } else { - # $hresult = $soap->headers[$header->name]; - # $expect = $this->decodeSoapval($header); - # $ok = !$need_result || $this->compareResult($hresult ,$expect); - # } - # $header_result[$header->name]['ok'] = $ok; - # if (!$ok) $headers_ok = FALSE; - # } - #} - - # we need to decode what we sent so we can compare! - $sent_d = $this->decodeSoapval($sent); - - $soap_test->result['sent'] = $sent; - $soap_test->result['return'] = $return; - // compare the results with what we sent - $ok = $this->compareResult($sent_d,$return, $sent->type); - if (!$ok && $soap_test->expect) { - $ok = $this->compareResult($soap_test->expect,$return); - } - - if($ok){ - if (!$headers_ok) { - $fault = new SoapFault('HEADER','The returned result did not match what we expected to receive'); - $soap_test->setResult(0,$fault->faultcode, - $wire, - $fault->faultstring, - $fault - ); - } else { - $soap_test->setResult(1,'OK',$wire); - $success = TRUE; - } - } else { - $fault = new SoapFault('RESULT','The returned result did not match what we expected to receive'); - $soap_test->setResult(0,$fault->faultcode, - $wire, - $fault->faultstring, - $fault - ); - } - } else { - $fault = $soap->__getfault(); - if ($soap_test->expect_fault) { - $ok = 1; - $res = 'OK'; - } else { - $ok = 0; - $res =$fault->faultcode; - } - $soap_test->setResult($ok,$res, $wire,$fault->faultstring, $fault); - } - return $ok; - } - - - /** - * doTest - * run a single round of tests - * - * @access public - */ - function doTest() { - global $soap_tests; - // get endpoints for this test - $this->getEndpoints($this->currentTest); - #clear totals - $this->totals = array(); - - $i = 0; - foreach($this->endpoints as $endpoint => $endpoint_info){ - - // if we specify an endpoint, skip until we find it - if ($this->specificEndpoint && $endpoint != $this->specificEndpoint) continue; - if ($this->useWSDL && !$endpoint_info['endpointURL']) continue; - - $skipendpoint = FALSE; - $this->totals['servers']++; - #$endpoint_info['tests'] = array(); - - if ($this->show) print "Processing $endpoint at {$endpoint_info['endpointURL']}<br>\n"; - - foreach($soap_tests[$this->currentTest] as $soap_test) { - //foreach(array_keys($method_params[$this->currentTest][$this->paramType]) as $method) - - // only run the type of test we're looking for (php or soapval) - if ($soap_test->type != $this->paramType) continue; - - // if we haven't reached our startpoint, skip - if ($this->startAt && $this->startAt != $endpoint_info['endpointName']) continue; - $this->startAt = ''; - - // if this is in our skip list, skip it - if (in_array($endpoint, $this->skipEndpointList)) { - $skipendpoint = TRUE; - $skipfault = new SoapFault('SKIP','endpoint skipped'); - $soap_test->setResult(0,$fault->faultcode, '', - $skipfault->faultstring, - $skipfault - ); - #$endpoint_info['tests'][] = &$soap_test; - #$soap_test->showTestResult($this->debug); - #$this->_saveResults($endpoint_info['id'], $soap_test->method_name); - $soap_test->result = NULL; - continue; - } - - // if we're looking for a specific method, skip unless we have it - if ($this->testMethod && !strstr($this->testMethod,$soap_test->test_name)) continue; - if ($this->testMethod && $this->currentTest == 'GroupC') { - // we have to figure things out now - if (!preg_match('/(.*):(.*),(\d),(\d)/',$this->testMethod, $m)) continue; - - // is the header in the headers list? - $gotit = FALSE; - foreach ($soap_test->headers as $header) { - if (get_class($header) == 'soap_header') { - if ($header->name == $m[2]) { - $gotit = $header->attributes['SOAP-ENV:actor'] == ($m[3]?SOAP_TEST_ACTOR_NEXT:SOAP_TEST_ACTOR_OTHER); - $gotit = $gotit && $header->attributes['SOAP-ENV:mustUnderstand'] == $m[4]; - } - } else { - if ($header[0] == $m[2]) { - $gotit = $gotit && $header[3] == ($m[3]?SOAP_TEST_ACTOR_NEXT:SOAP_TEST_ACTOR_OTHER); - $gotit = $gotit && $header[4] == $m[4]; - } - } - } - if (!$gotit) continue; - } - - // if we are skipping the rest of the tests (due to error) note a fault - if ($skipendpoint) { - $soap_test->setResult(0,$fault->faultcode, '', - $skipfault->faultstring, - $skipfault - ); - #$endpoint_info['tests'][] = &$soap_test; - $this->totals['fail']++; - } else { - // run the endpoint test - if ($this->doEndpointMethod($endpoint_info, $soap_test)) { - $this->totals['success']++; - } else { - $skipendpoint = $soap_test->result['fault']->faultcode=='HTTP' - && strstr($soap_test->result['fault']->faultstring,'Connect Error'); - $skipfault = $soap_test->result['fault']; - $this->totals['fail']++; - } - #$endpoint_info['tests'][] = &$soap_test; - } - $soap_test->showTestResult($this->debug); - $this->_saveResults($endpoint_info['id'], $soap_test); - $soap_test->result = NULL; - $this->totals['calls']++; - } - if ($this->numservers && ++$i >= $this->numservers) break; - } - } - - function doGroupTests() { - $dowsdl = array(0,1); - foreach($dowsdl as $usewsdl) { - $this->useWSDL = $usewsdl; - foreach($this->paramTypes as $ptype) { - // skip a pointless test - if ($usewsdl && $ptype == 'soapval') break; - $this->paramType = $ptype; - $this->doTest(); - } - } - } - - /** - * doTests - * go all out. This takes time. - * - * @access public - */ - function doTests() { - // the mother of all interop tests - $dowsdl = array(0,1); - foreach($this->tests as $test) { - $this->currentTest = $test; - foreach($dowsdl as $usewsdl) { - $this->useWSDL = $usewsdl; - foreach($this->paramTypes as $ptype) { - // skip a pointless test - if ($usewsdl && $ptype == 'soapval') break; - $this->paramType = $ptype; - $this->doTest(); - } - } - } - } - - // *********************************************************** - // output functions - - /** - * getResults - * retreive results from the database, stuff them into the endpoint array - * - * @access private - */ - function getMethodList($test = 'base') { - // retreive the results and put them into the endpoint info - $sql = "select distinct(function) from results where class='$test' order by function"; - $results = $this->dbc->getAll($sql); - $ar = array(); - foreach($results as $result) { - $ar[] = $result[0]; - } - return $ar; - } - - function outputTable() - { - $methods = $this->getMethodList($this->currentTest); - if (!$methods) return; - $this->getResults($this->currentTest,$this->paramType,$this->useWSDL); - - echo "<b>Testing $this->currentTest "; - if ($this->useWSDL) echo "using WSDL "; - else echo "using Direct calls "; - echo "with $this->paramType values</b><br>\n"; - - // calculate totals for this table - $this->totals['success'] = 0; - $this->totals['fail'] = 0; - $this->totals['servers'] = 0; #count($this->endpoints); - foreach ($this->endpoints as $endpoint => $endpoint_info) { - if (count($endpoint_info['methods']) > 0) { - $this->totals['servers']++; - foreach ($methods as $method) { - $r = $endpoint_info['methods'][$method]['result']; - if ($r == 'OK') $this->totals['success']++; - else $this->totals['fail']++; - } - } else { - unset($this->endpoints[$endpoint]); - } - } - $this->totals['calls'] = count($methods) * $this->totals['servers']; - - if ($this->totals['fail'] == $this->totals['calls']) { - // assume tests have not run, skip outputing table - print "No Data Available<br>\n"; - return; - } - - echo "\n\n<b>Servers: {$this->totals['servers']} Calls: {$this->totals['calls']} Success: {$this->totals['success']} Fail: {$this->totals['fail']}</b><br>\n"; - - echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n"; - echo "<tr><td class=\"BLANK\">Endpoint</td>\n"; - foreach ($methods as $method) { - $info = split(':', $method); - echo "<td class='BLANK' valign='top'>"; - foreach ($info as $m) { - $hi = split(',',$m); - echo '<b>'.$hi[0]."</b><br>\n"; - if (count($hi) > 1) { - echo " Actor=".($hi[1]?'Target':'Not Target')."<br>\n"; - echo " MustUnderstand=$hi[2]<br>\n"; - } - } - echo "</td>\n"; - } - echo "</tr>\n"; - $faults = array(); - $fi = 0; - foreach ($this->endpoints as $endpoint => $endpoint_info) { - if (array_key_exists('wsdlURL',$endpoint_info)) { - echo "<tr><td class=\"BLANK\"><a href=\"{$endpoint_info['wsdlURL']}\">$endpoint</a></td>\n"; - } else { - echo "<tr><td class=\"BLANK\">$endpoint</td>\n"; - } - foreach ($methods as $method) { - $id = $endpoint_info['methods'][$method]['id']; - $r = $endpoint_info['methods'][$method]['result']; - $e = $endpoint_info['methods'][$method]['error']; - if ($e) { - $faults[$fi++] = $e; - } - if ($r) { - echo "<td class='$r'><a href='$PHP_SELF?wire=$id'>$r</a></td>\n"; - } else { - echo "<td class='untested'>untested</td>\n"; - } - } - echo "</tr>\n"; - } - echo "</table><br>\n"; - if ($this->showFaults && count($faults) > 0) { - echo "<b>ERROR Details:</b><br>\n<ul>\n"; - # output more error detail - foreach ($faults as $fault) { - echo '<li>'.HTMLSpecialChars($fault)."</li>\n"; - } - } - echo "</ul><br><br>\n"; - } - - function outputTables() { - // the mother of all interop tests - $dowsdl = array(0,1); - foreach($this->tests as $test) { - $this->currentTest = $test; - foreach($dowsdl as $usewsdl) { - $this->useWSDL = $usewsdl; - foreach($this->paramTypes as $ptype) { - // skip a pointless test - if ($usewsdl && $ptype == 'soapval') break; - $this->paramType = $ptype; - $this->outputTable(); - } - } - } - } - - function showWire($id) { - $results = $this->dbc->getAll("select * from results where id=$id",NULL, DB_FETCHMODE_ASSOC ); - #$wire = preg_replace("/>/",">\n",$results[0]['wire']); - $wire = $results[0]['wire']; - echo "<pre>\n".HTMLSpecialChars($wire)."</pre>\n"; - } - -} - -?>
\ No newline at end of file diff --git a/ext/soap/interop/client_round2_params.php b/ext/soap/interop/client_round2_params.php deleted file mode 100644 index aa50edb763..0000000000 --- a/ext/soap/interop/client_round2_params.php +++ /dev/null @@ -1,636 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -define('SOAP_TEST_ACTOR_NEXT','http://schemas.xmlsoap.org/soap/actor/next'); -define('SOAP_TEST_ACTOR_OTHER','http://some/other/actor'); - -class SOAP_Test { - var $type = 'php'; - var $test_name = NULL; - var $method_name = NULL; - var $method_params = NULL; - var $expect = NULL; - var $expect_fault = FALSE; - var $headers = NULL; - var $headers_expect = NULL; - var $result = array(); - var $show = 1; - var $debug = 0; - var $encoding = 'UTF-8'; - - function SOAP_Test($methodname, $params, $expect = NULL) { - # XXX we have to do this to make php-soap happy with NULL params - if (!$params) $params = array(); - - if (strchr($methodname,'(')) { - preg_match('/(.*)\((.*)\)/',$methodname,$matches); - $this->test_name = $methodname; - $this->method_name = $matches[1]; - } else { - $this->test_name = $this->method_name = $methodname; - } - $this->method_params = $params; - $this->expect = $expect; - - // determine test type - if ($params) { - $v = array_values($params); - if (gettype($v[0]) == 'object' && - (get_class($v[0]) == 'soapvar' || get_class($v[0]) == 'soapparam')) - $this->type = 'soapval'; - } - } - - function setResult($ok, $result, $wire, $error = '', $fault = NULL) - { - $this->result['success'] = $ok; - $this->result['result'] = $result; - $this->result['error'] = $error; - $this->result['wire'] = $wire; - $this->result['fault'] = $fault; - } - - /** - * showMethodResult - * print simple output about a methods result - * - * @param array endpoint_info - * @param string method - * @access public - */ - function showTestResult($debug = 0) { - // debug output - if ($debug) $this->show = 1; - if ($debug) { - echo str_repeat("-",50)."<br>\n"; - } - - echo "testing $this->test_name : "; - if ($this->headers) { - foreach ($this->headers as $h) { - if (get_class($h) == 'soap_header') { - - echo "\n {$h->name},{$h->attributes['SOAP-ENV:actor']},{$h->attributes['SOAP-ENV:mustUnderstand']} : "; - } else { - if (!$h[4]) $h[4] = SOAP_TEST_ACTOR_NEXT; - if (!$h[3]) $h[3] = 0; - echo "\n $h[0],$h[4],$h[3] : "; - } - } - } - - if ($debug) { - print "method params: "; - print_r($this->params); - print "\n"; - } - - $ok = $this->result['success']; - if ($ok) { - print "SUCCESS\n"; - } else { - $fault = $this->result['fault']; - if ($fault) { - print "FAILED: {$fault->faultcode} {$fault->faultstring}\n"; - } else { - print "FAILED: ".$this->result['result']."\n"; - } - } - if ($debug) { - echo "<pre>\n".htmlentities($this->result['wire'])."</pre>\n"; - } - } -} - -# XXX I know this isn't quite right, need to deal with this better -function make_2d($x, $y) -{ - for ($_x = 0; $_x < $x; $_x++) { - for ($_y = 0; $_y < $y; $_y++) { - $a[$_x][$_y] = "x{$_x}y{$_y}"; - } - } - return $a; -} - -function soap_value($name, $value, $type) { - return new soapparam(new soapvar($value,$type),$name); -} - -class SOAPStruct { - var $varString; - var $varInt; - var $varFloat; - function SOAPStruct($s, $i, $f) { - $this->varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } -} - -//*********************************************************** -// Base echoString - -$soap_tests['base'][] = new SOAP_Test('echoString', array('inputString' => 'hello world!')); -$soap_tests['base'][] = new SOAP_Test('echoString', array('inputString' => soap_value('inputString','hello world',XSD_STRING))); -$soap_tests['base'][] = new SOAP_Test('echoString(null)', array('inputString' => "")); -$soap_tests['base'][] = new SOAP_Test('echoString(null)', array('inputString' => soap_value('inputString','',XSD_STRING))); -$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => 'hello world\nline 2\n')); -$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => soap_value('inputString','hello world\nline 2\n',XSD_STRING))); -$test = new SOAP_Test('echoString(utf-8)', array('inputString' => utf8_encode('ỗÈéóÒ₧⅜ỗỸ'))); -$test->encoding = 'UTF-8'; -$soap_tests['base'][] = $test; -$test = new SOAP_Test('echoString(utf-8)', array('inputString' => soap_value('inputString',utf8_encode('ỗÈéóÒ₧⅜ỗỸ'),XSD_STRING))); -$test->encoding = 'UTF-8'; -$soap_tests['base'][] = $test; - -//*********************************************************** -// Base echoStringArray - -$soap_tests['base'][] = new SOAP_Test('echoStringArray', - array('inputStringArray' => array('good','bad'))); -$soap_tests['base'][] = new SOAP_Test('echoStringArray', - array('inputStringArray' => - soap_value('inputStringArray',array('good','bad'),SOAP_ENC_ARRAY))); - -// null array test -# XXX NULL Arrays not supported -#$soap_tests['base'][] = new SOAP_Test('echoStringArray(null)', array('inputStringArray' => NULL)); -#$soap_tests['base'][] = new SOAP_Test('echoStringArray(null)', array('inputStringArray' => soap_value('inputStringArray',NULL,XSD_STRING))); - -//*********************************************************** -// Base echoInteger - -$soap_tests['base'][] = new SOAP_Test('echoInteger', array('inputInteger' => 34345)); -$soap_tests['base'][] = new SOAP_Test('echoInteger', array('inputInteger' => soap_value('inputInteger',12345,XSD_INT))); - -//*********************************************************** -// Base echoIntegerArray - -$soap_tests['base'][] = new SOAP_Test('echoIntegerArray', array('inputIntegerArray' => array(1,234324324,2))); -$soap_tests['base'][] = new SOAP_Test('echoIntegerArray', - array('inputIntegerArray' => - soap_value('inputIntegerArray', - array(new soapvar(12345,XSD_INT),new soapvar(654321,XSD_INT)), - SOAP_ENC_ARRAY))); -# -#// null array test -# XXX NULL Arrays not supported -#$soap_tests['base'][] = new SOAP_Test('echoIntegerArray(null)', array('inputIntegerArray' => NULL)); -#$soap_tests['base'][] = new SOAP_Test('echoIntegerArray(null)', array('inputIntegerArray' => new SOAP_Value('inputIntegerArray','Array',NULL))); -# -//*********************************************************** -// Base echoFloat - -$soap_tests['base'][] = new SOAP_Test('echoFloat', array('inputFloat' => 342.23)); -$soap_tests['base'][] = new SOAP_Test('echoFloat', array('inputFloat' => soap_value('inputFloat',123.45,XSD_FLOAT))); - -//*********************************************************** -// Base echoFloatArray - -$soap_tests['base'][] = new SOAP_Test('echoFloatArray', array('inputFloatArray' => array(1.3223,34.2,325.325))); -$soap_tests['base'][] = new SOAP_Test('echoFloatArray', - array('inputFloatArray' => - soap_value('inputFloatArray', - array(new soapvar(123.45,XSD_FLOAT),new soapvar(654.321,XSD_FLOAT)), - SOAP_ENC_ARRAY))); -//*********************************************************** -// Base echoStruct - -$soapstruct = new SOAPStruct('arg',34,325.325); -# XXX no way to set a namespace!!! -$soapsoapstruct = soap_value('inputStruct',$soapstruct,SOAP_ENC_OBJECT); -$soap_tests['base'][] = new SOAP_Test('echoStruct', array('inputStruct' =>$soapstruct)); -$soap_tests['base'][] = new SOAP_Test('echoStruct', array('inputStruct' =>$soapsoapstruct)); - -//*********************************************************** -// Base echoStructArray - -$soap_tests['base'][] = new SOAP_Test('echoStructArray', array('inputStructArray' => array( - $soapstruct,$soapstruct,$soapstruct))); -$soap_tests['base'][] = new SOAP_Test('echoStructArray', array('inputStructArray' => - soap_value('inputStructArray',array($soapstruct,$soapstruct,$soapstruct),SOAP_ENC_ARRAY))); - - -//*********************************************************** -// Base echoVoid - -$soap_tests['base'][] = new SOAP_Test('echoVoid', NULL); -$test = new SOAP_Test('echoVoid', NULL); -$test->type = 'soapval'; -$soap_tests['base'][] = $test; - -//*********************************************************** -// Base echoBase64 - -$soap_tests['base'][] = new SOAP_Test('echoBase64', array('inputBase64' => 'TmVicmFza2E=')); -$soap_tests['base'][] = new SOAP_Test('echoBase64', array('inputBase64' => - soap_value('inputBase64','TmVicmFza2E=',XSD_BASE64BINARY))); - -//*********************************************************** -// Base echoHexBinary - -$soap_tests['base'][] = new SOAP_Test('echoHexBinary', array('inputHexBinary' => '736F61707834')); -$soap_tests['base'][] = new SOAP_Test('echoHexBinary', array('inputHexBinary' => - soap_value('inputHexBinary','736F61707834',XSD_HEXBINARY))); - -//*********************************************************** -// Base echoDecimal - -# XXX test fails because php-soap incorrectly sets decimal to long rather than float -$soap_tests['base'][] = new SOAP_Test('echoDecimal', array('inputDecimal' => 12345.67890)); -$soap_tests['base'][] = new SOAP_Test('echoDecimal', array('inputDecimal' => - soap_value('inputDecimal',12345.67890,XSD_DECIMAL))); - -//*********************************************************** -// Base echoDate - -# php-soap doesn't handle datetime types properly yet -$soap_tests['base'][] = new SOAP_Test('echoDate', array('inputDate' => '2001-05-24T17:31:41Z')); -$soap_tests['base'][] = new SOAP_Test('echoDate', array('inputDate' => - soap_value('inputDate','2001-05-24T17:31:41Z',XSD_DATETIME)));#'2001-04-25T13:31:41-0700' - -//*********************************************************** -// Base echoBoolean - -# php-soap sends boolean as zero or one, which is ok, but to be explicit, send true or false. -$soap_tests['base'][] = new SOAP_Test('echoBoolean', array('inputBoolean' => TRUE)); -$soap_tests['base'][] = new SOAP_Test('echoBoolean', array('inputBoolean' => - soap_value('inputBoolean',TRUE,XSD_BOOLEAN))); -$soap_tests['base'][] = new SOAP_Test('echoBoolean', array('inputBoolean' => FALSE)); -$soap_tests['base'][] = new SOAP_Test('echoBoolean', array('inputBoolean' => - soap_value('inputBoolean',FALSE,XSD_BOOLEAN))); - -# -# -#//*********************************************************** -#// GROUP B -# -# -#//*********************************************************** -#// GroupB echoStructAsSimpleTypes -# -#$expect = array( -# 'outputString'=>'arg', -# 'outputInteger'=>34, -# 'outputFloat'=>325.325 -# ); -#$soap_tests['GroupB'][] = new SOAP_Test('echoStructAsSimpleTypes', -# array('inputStruct' => array( -# 'varString'=>'arg', -# 'varInt'=>34, -# 'varFloat'=>325.325 -# )), $expect); -#$soap_tests['GroupB'][] = new SOAP_Test('echoStructAsSimpleTypes', -# array('inputStruct' => -# new SOAP_Value('inputStruct','SOAPStruct', -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# ))), $expect); -# -#//*********************************************************** -#// GroupB echoSimpleTypesAsStruct -# -#$expect = -# array( -# 'varString'=>'arg', -# 'varInt'=>34, -# 'varFloat'=>325.325 -# ); -#$soap_tests['GroupB'][] = new SOAP_Test('echoSimpleTypesAsStruct', -# array( -# 'inputString'=>'arg', -# 'inputInteger'=>34, -# 'inputFloat'=>325.325 -# ), $expect); -#$soap_tests['GroupB'][] = new SOAP_Test('echoSimpleTypesAsStruct', -# array( -# new SOAP_Value('inputString','string','arg'), -# new SOAP_Value('inputInteger','int',34), -# new SOAP_Value('inputFloat','float',325.325) -# ), $expect); -# -#//*********************************************************** -#// GroupB echo2DStringArray -# -#$soap_tests['GroupB'][] = new SOAP_Test('echo2DStringArray', -# array('input2DStringArray' => make_2d(3,3))); -# -#$multidimarray = -# new SOAP_Value('input2DStringArray','Array', -# array( -# array( -# new SOAP_Value('item','string','row0col0'), -# new SOAP_Value('item','string','row0col1'), -# new SOAP_Value('item','string','row0col2') -# ), -# array( -# new SOAP_Value('item','string','row1col0'), -# new SOAP_Value('item','string','row1col1'), -# new SOAP_Value('item','string','row1col2') -# ) -# ) -# ); -#$multidimarray->options['flatten'] = TRUE; -#$soap_tests['GroupB'][] = new SOAP_Test('echo2DStringArray', -# array('input2DStringArray' => $multidimarray)); -# -#//*********************************************************** -#// GroupB echoNestedStruct -# -#$soap_tests['GroupB'][] = new SOAP_Test('echoNestedStruct', -# array('inputStruct' => array( -# 'varString'=>'arg', -# 'varInt'=>34, -# 'varFloat'=>325.325, -# 'varStruct' => array( -# 'varString'=>'arg', -# 'varInt'=>34, -# 'varFloat'=>325.325 -# ) -# ))); -#$soap_tests['GroupB'][] = new SOAP_Test('echoNestedStruct', -# array('inputStruct' => -# new SOAP_Value('inputStruct','struct', -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325), -# new SOAP_Value('varStruct','SOAPStruct', -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# ) -# /*,NULL,'http://soapinterop.org/xsd'*/) -# ) -# ))); -# -#//*********************************************************** -#// GroupB echoNestedArray -# -#$soap_tests['GroupB'][] = new SOAP_Test('echoNestedArray', -# array('inputStruct' => array( -# 'varString'=>'arg', -# 'varInt'=>34, -# 'varFloat'=>325.325, -# 'varArray' => array('red','blue','green') -# ))); -#$soap_tests['GroupB'][] = new SOAP_Test('echoNestedArray', -# array('inputStruct' => -# new SOAP_Value('inputStruct','struct', -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325), -# new SOAP_Value('varArray','Array', -# array( #push struct elements into one soap value -# new SOAP_Value('item','string','red'), -# new SOAP_Value('item','string','blue'), -# new SOAP_Value('item','string','green') -# ) -# ) -# ) -# ))); -# -# -#//*********************************************************** -#// GROUP C header tests -# -#//*********************************************************** -#// echoMeStringRequest php val tests -# -#// echoMeStringRequest with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'hello world', 0,SOAP_TEST_ACTOR_NEXT); -#$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>'hello world'); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'hello world', 1,SOAP_TEST_ACTOR_NEXT); -#$this->type = 'soapval'; // force a soapval version of this test -#$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>'hello world'); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'hello world', 0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStringRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'hello world', 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStringRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#//*********************************************************** -#// echoMeStringRequest soapval tests -# -#// echoMeStringRequest with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', 'hello world'); -#$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>'hello world'); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', 'hello world', 1); -#$this->type = 'soapval'; // force a soapval version of this test -#$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>'hello world'); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', 'hello world', 0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStringRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', 'hello world', 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStringRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStringRequest with endpoint header destination, must understand, -#// invalid namespace, should recieve a fault -##$test = new SOAP_Test('echoVoid', NULL); -##$test->type = 'soapval'; -##$test->headers[] = new SOAP_Header('{http://unknown.org/echoheader/}echoMeStringRequest', 'string', 'hello world', 1); -##$test->headers_expect['echoMeStringRequest'] = array(); -##$test->expect_fault = TRUE; -##$soap_tests['GroupC'][] = $test; -# -#//*********************************************************** -#// php val tests -#// echoMeStructRequest with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStructRequest', -# array('varString'=>'arg', 'varInt'=>34, 'varFloat'=>325.325), -# 0,SOAP_TEST_ACTOR_NEXT); -#$test->headers_expect['echoMeStructRequest'] = -# array('echoMeStructResponse'=> array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325)); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStructRequest', -# array('varString'=>'arg', 'varInt'=>34, 'varFloat'=>325.325), -# 1,SOAP_TEST_ACTOR_NEXT); -#$test->headers_expect['echoMeStructRequest'] = -# array('echoMeStructResponse'=> array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325)); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStructRequest', -# array('varString'=>'arg', 'varInt'=>34, 'varFloat'=>325.325), -# 0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStructRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStructRequest', -# array('varString'=>'arg', 'varInt'=>34, 'varFloat'=>325.325), -# 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStructRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#//*********************************************************** -#// soapval tests -#// echoMeStructRequest with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStructRequest',NULL, -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# )); -#$test->headers_expect['echoMeStructRequest'] = -# array('echoMeStructResponse'=> array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325)); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStructRequest',NULL, -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# ), 1); -#$test->headers_expect['echoMeStructRequest'] = -# array('echoMeStructResponse'=> array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325)); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStructRequest',NULL, -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# ), 0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStructRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeStructRequest with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStructRequest',NULL, -# array( #push struct elements into one soap value -# new SOAP_Value('varString','string','arg'), -# new SOAP_Value('varInt','int',34), -# new SOAP_Value('varFloat','float',325.325) -# ), 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeStructRequest'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#//*********************************************************** -#// echoMeUnknown php val tests -#// echoMeUnknown with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', 'nobody understands me!',0,SOAP_TEST_ACTOR_NEXT); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', 'nobody understands me!',1,SOAP_TEST_ACTOR_NEXT); -#$test->headers_expect['echoMeUnknown'] = array(); -#$test->expect_fault = TRUE; -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', 'nobody understands me!',0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', 'nobody understands me!', 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#//*********************************************************** -#// echoMeUnknown soapval tests -#// echoMeUnknown with endpoint as header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string','nobody understands me!'); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint as header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string','nobody understands me!',1); -#$test->headers_expect['echoMeUnknown'] = array(); -#$test->expect_fault = TRUE; -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint NOT header destination, doesn't have to understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string','nobody understands me!', 0, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; -# -#// echoMeUnknown with endpoint NOT header destination, must understand -#$test = new SOAP_Test('echoVoid', NULL); -#$test->type = 'soapval'; -#$test->headers[] = new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string','nobody understands me!', 1, SOAP_TEST_ACTOR_OTHER); -#$test->headers_expect['echoMeUnknown'] = array(); -#$soap_tests['GroupC'][] = $test; - - -?>
\ No newline at end of file diff --git a/ext/soap/interop/client_round2_results.php b/ext/soap/interop/client_round2_results.php deleted file mode 100644 index 538513e3e0..0000000000 --- a/ext/soap/interop/client_round2_results.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -// NOTE: do not run this directly under a web server, as it will take a very long -// time to execute. Run from a command line or something, and redirect output -// to an html file. -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -require_once 'client_round2_interop.php'; -?> -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> - -<html> -<head> -<style> -TD { background-color: Red; } -TD.BLANK { background-color: White; } -TD.OK { background-color: Lime; } -TD.RESULT { background-color: Green; } -TD.untested { background-color: White; } -TD.CONNECT { background-color: Yellow; } -TD.TRANSPORT { background-color: Yellow; } -TD.WSDL { background-color: Yellow; } -TD.WSDLCACHE { background-color: Yellow; } -TD.WSDLPARSER { background-color: Yellow; } -TD.HTTP { background-color: Yellow; } -TD.SMTP { background-color: Yellow; } -</style> - <title>PEAR-PHP SOAP Interop Tests</title> -</head> - -<body bgcolor="White" text="Black"> -<h2 align="center">SOAP Client Interop Test Results: Round2</h2> - -<a href="index.php">Back to Interop Index</a><br> -<p> </p> - -<?php -$iop = new Interop_Client(); - -if ($_GET['detail'] == 1) $iop->showFaults = 1; - -if ($_GET['wire']) { - $iop->showWire($_GET['wire']); -} else { - $iop->getEndpoints(); - $iop->getResults(); - - if ($_GET['test']) { - $iop->currentTest = $_GET['test']; - $iop->useWSDL = $_GET['wsdl']?$_GET['wsdl']:0; - $iop->paramType = $_GET['type']?$_GET['type']:'php'; - $iop->outputTable(); - } else { - $iop->outputTables(); - } -} -?> -</body> -</html> diff --git a/ext/soap/interop/client_round2_run.php b/ext/soap/interop/client_round2_run.php deleted file mode 100644 index 3b8910e6b6..0000000000 --- a/ext/soap/interop/client_round2_run.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -// this script is usefull for quickly testing stuff, use the 'pretty' file for html output -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -set_time_limit(0); -require_once 'client_round2_interop.php'; - -$iop = new Interop_Client(); -// force a fetch of endpoints, this happens irregardless if no endpoints in database -#$iop->fetchEndpoints(); - -// set some options -$iop->currentTest = 'base'; // see $tests above -$iop->paramType = 'php'; // 'php' or 'soapval' -$iop->useWSDL = 1; // 1= do wsdl tests -$iop->numServers = 0; // 0 = all -$iop->specificEndpoint = '4s4c'; // test only this endpoint -$iop->testMethod = 'echoString'; // test only this method - -#XXX MS SOAP ToolKit 2.0/3.0 crashes php-soap in __getfault! - -// endpoints to skip -$iop->skipEndpointList = array('Apache Axis','IONA XMLBus','IONA XMLBus (CORBA)','MS SOAP ToolKit 2.0','MS SOAP ToolKit 3.0','Spheon JSOAP','SQLData SOAP Server','WASP Advanced 3.0'); -$iop->startAt=''; -$this->nosave = 0; // 1= disable saving results to database -// debug output -$iop->show = 1; -$iop->debug = 0; -$iop->showFaults = 0; // used in result table output - -$iop->doTest(); // run a single set of tests using above options -#$iop->doGroupTests(); // run a group of tests set in $currentTest -#$iop->doTests(); // run all tests, ignore above options -#$iop->outputTables(); -echo "done"; - -?> diff --git a/ext/soap/interop/database_round2.sql b/ext/soap/interop/database_round2.sql deleted file mode 100644 index 79669a04c2..0000000000 --- a/ext/soap/interop/database_round2.sql +++ /dev/null @@ -1,45 +0,0 @@ -# phpMyAdmin MySQL-Dump -# version 2.2.5 -# http://phpwizard.net/phpMyAdmin/ -# http://phpmyadmin.sourceforge.net/ (download page) -# -# Host: localhost -# Generation Time: Apr 08, 2002 at 08:32 PM -# Server version: 3.23.49 -# PHP Version: 4.1.1 -# Database : `interop` -# -------------------------------------------------------- - -# -# Table structure for table `endpoints` -# - -CREATE TABLE endpoints ( - id int(11) NOT NULL auto_increment, - endpointName varchar(50) NOT NULL default '', - endpointURL varchar(255) NOT NULL default '', - wsdlURL varchar(255) NOT NULL default '', - class varchar(20) NOT NULL default '', - status int(11) NOT NULL default '1', - PRIMARY KEY (id) -) TYPE=MyISAM; -# -------------------------------------------------------- - -# -# Table structure for table `results` -# - -CREATE TABLE results ( - id int(11) NOT NULL auto_increment, - endpoint int(11) NOT NULL default '0', - stamp int(11) NOT NULL default '0', - class varchar(10) NOT NULL default '', - type varchar(10) default NULL, - wsdl int(11) NOT NULL default '0', - function varchar(255) NOT NULL default '', - result varchar(25) NOT NULL default '', - error text, - wire text NOT NULL, - PRIMARY KEY (id) -) TYPE=MyISAM; - diff --git a/ext/soap/interop/echoheadersvc.wsdl b/ext/soap/interop/echoheadersvc.wsdl deleted file mode 100644 index a279580dc3..0000000000 --- a/ext/soap/interop/echoheadersvc.wsdl +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0"?> -<definitions name="InteropTest" targetNamespace="http://soapinterop.org/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://soapinterop.org/" xmlns:s="http://soapinterop.org/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> - - <import location="http://www.whitemesa.com/interop/InteropTest.wsdl" namespace="http://soapinterop.org/"/> - <import location="http://www.whitemesa.com/interop/InteropTest.wsdl" namespace="http://soapinterop.org/xsd"/> - <import location="http://www.whitemesa.com/interop/InteropTestC.wsdl" namespace="http://soapinterop.org/"/> - - <service name="interopLabEchoHeader"> - - <port name="interopPortEchoHdr" binding="tns:InteropEchoHeaderBinding"> - <soap:address location="http://localhost/soap_interop/server_round2.php"/> - </port> - - </service> - -</definitions> diff --git a/ext/soap/interop/endpointdata.sql b/ext/soap/interop/endpointdata.sql deleted file mode 100644 index 80d9d5ac9c..0000000000 --- a/ext/soap/interop/endpointdata.sql +++ /dev/null @@ -1,85 +0,0 @@ -# phpMyAdmin MySQL-Dump -# version 2.2.5 -# http://phpwizard.net/phpMyAdmin/ -# http://phpmyadmin.sourceforge.net/ (download page) -# -# Host: localhost -# Generation Time: Jul 14, 2002 at 03:13 PM -# Server version: 3.23.49 -# PHP Version: 4.2.1 -# Database : `interop2` - -# -# Dumping data for table `endpoints` -# - -INSERT INTO endpoints VALUES (1, '4s4c', 'http://soap.4s4c.com/ilab/soap.asp', 'http://www.pocketsoap.com/services/ilab.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (2, '4s4c v2.0', 'http://soap.4s4c.com/ilab2/soap.asp', 'http://soap.4s4c.com/ilab2/ilab.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (3, 'Apache Axis', 'http://nagoya.apache.org:5049/axis/services/echo', 'http://nagoya.apache.org:5049/axis/services/echo?wsdl', 'base', 1); -INSERT INTO endpoints VALUES (4, 'Apache SOAP 2.2', 'http://nagoya.apache.org:5049/soap/servlet/rpcrouter', 'http://www.apache.org/~rubys/ApacheSoap.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (5, 'ASP.NET Web Services', 'http://www.mssoapinterop.org/asmx/simple.asmx', 'http://www.mssoapinterop.org/asmx/simple.asmx?wsdl', 'base', 1); -INSERT INTO endpoints VALUES (6, 'CapeConnect', 'http://interop.capeclear.com/ccx/soapbuilders-round2', 'http://interop.capeclear.com/wsdl/soapbuilders-round2.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (7, 'Delphi SOAP', 'http://soap-server.borland.com/WebServices/Interop/cgi-bin/InteropService.exe/soap/InteropTestPortType', 'http://soap-server.borland.com/WebServices/Interop/cgi-bin/InteropService.exe/wsdl/InteropTestPortType', 'base', 1); -INSERT INTO endpoints VALUES (8, 'EasySoap++', 'http://easysoap.sourceforge.net/cgi-bin/interopserver', 'http://easysoap.sourceforge.net/interopA.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (9, 'eSOAP', 'http://www.quakersoft.net/cgi-bin/interop2_server.cgi', 'http://www.quakersoft.net/wsdl/interop2.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (10, 'gSOAP', 'http://websrv.cs.fsu.edu/~engelen/interop2.cgi', 'http://www.cs.fsu.edu/~engelen/interop2.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (11, 'Frontier', 'http://www.soapware.org/xmethodsInterop', '', 'base', 1); -INSERT INTO endpoints VALUES (12, 'GLUE', 'http://www.themindelectric.net:8005/glue/round2', 'http://www.themindelectric.net:8005/glue/round2.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (13, 'HP SOAP', 'http://soap.bluestone.com/hpws/soap/EchoService', 'http://soap.bluestone.com/hpws/soap/EchoService.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (14, 'IONA XMLBus', 'http://interop.xmlbus.com:7002/xmlbus/container/InteropTest/BaseService/BasePort', 'http://interop.xmlbus.com:7002/xmlbus/container/InteropTest/BaseService/BasePort', 'base', 1); -INSERT INTO endpoints VALUES (15, 'IONA XMLBus (CORBA)', 'http://interop.xmlbus.com:7002/xmlbus/container/CORBAInterop/BaseService/BasePort', 'http://interop.xmlbus.com:7002/xmlbus/container/CORBAInterop/BaseService/BasePort', 'base', 1); -INSERT INTO endpoints VALUES (16, 'kSOAP', 'http://kissen.cs.uni-dortmund.de:8080/ksoapinterop', 'http://www.whitemesa.com/interop/kSOAP.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (17, 'MS .NET Remoting', 'http://www.mssoapinterop.org/remoting/ServiceA.soap', 'http://www.mssoapinterop.org/remoting/ServiceA.soap?wsdl', 'base', 1); -INSERT INTO endpoints VALUES (18, 'MS SOAP ToolKit 2.0', 'http://mssoapinterop.org/stk/Interop.wsdl', 'http://mssoapinterop.org/stk/Interop.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (19, 'MS SOAP ToolKit 3.0', 'http://mssoapinterop.org/stkV3/Interop.wsdl', 'http://mssoapinterop.org/stkV3/Interop.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (20, 'NuSOAP', 'http://dietrich.ganx4.com/nusoap/testbed/round2_base_server.php', 'http://dietrich.ganx4.com/nusoap/testbed/round2_base.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (21, 'OpenLink', 'http://demo.openlinksw.com:8890/Interop', 'http://demo.openlinksw.com:8890/Interop/services.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (24, 'SIM', 'http://soapinterop.simdb.com/round2', 'http://soapinterop.simdb.com/round2?WSDL', 'base', 1); -INSERT INTO endpoints VALUES (25, 'SOAP4R', 'http://www.jin.gr.jp/~nahi/Ruby/SOAP4R/SOAPBuildersInterop/', 'http://www.jin.gr.jp/~nahi/Ruby/SOAP4R/SOAPBuildersInterop/SOAP4R_SOAPBuildersInteropTest_R2base.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (26, 'SOAP:Lite', 'http://services.soaplite.com/interop.cgi', 'http://services.soaplite.com/interop2.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (27, 'Spheon JSOAP', 'http://213.23.125.181:8081/RPC', 'http://213.23.125.181:8081/interop.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (28, 'Spray 2001', 'http://www.dolphinharbor.org/services/interop2001', 'http://www.dolphinharbor.org/services/interop2001/service.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (29, 'SQLData SOAP Server', 'http://soapclient.com/interop/sqldatainterop.wsdl', 'http://soapclient.com/interop/sqldatainterop.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (30, 'WASP Advanced 3.0', 'http://soap.systinet.net:6060/InteropService/', 'http://soap.systinet.net:6060/InteropService/', 'base', 1); -INSERT INTO endpoints VALUES (32, 'White Mesa SOAP Server', 'http://www.whitemesa.net/interop/std', 'http://www.whitemesa.net/wsdl/std/interop.wsdl', 'base', 1); -INSERT INTO endpoints VALUES (33, 'PEAR SOAP', 'http://localhost/soap_interop/server_round2.php', 'http://localhost/soap_interop/interop.wsdl.php', 'base', 1); -INSERT INTO endpoints VALUES (34, '4s4c', 'http://soap.4s4c.com/ilab/soap.asp', 'http://www.pocketsoap.com/services/ilab_b.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (35, '4s4c v2.0', 'http://soap.4s4c.com/ilab2/soap.asp', 'http://soap.4s4c.com/ilab2/ilab_b.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (36, 'Apache Axis', 'http://nagoya.apache.org:5049/axis/services/echo', 'http://nagoya.apache.org:5049/axis/services/echo?wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (37, 'ASP.NET Web Services', 'http://www.mssoapinterop.org/asmx/simpleB.asmx', 'http://www.mssoapinterop.org/asmx/simpleb.asmx?wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (38, 'Delphi SOAP', 'http://soap-server.borland.com/WebServices/Interop/cgi-bin/InteropGroupB.exe/soap/InteropTestPortTypeB', 'http://soap-server.borland.com/WebServices/Interop/cgi-bin/InteropGroupB.exe/wsdl/InteropTestPortTypeB', 'GroupB', 1); -INSERT INTO endpoints VALUES (39, 'EasySoap++', 'http://easysoap.sourceforge.net/cgi-bin/interopserver', 'http://easysoap.sourceforge.net/interopB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (40, 'GLUE', 'http://www.themindelectric.net:8005/glue/round2B', 'http://www.themindelectric.net:8005/glue/round2B.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (41, 'gSOAP', 'http://websrv.cs.fsu.edu/~engelen/interop2B.cgi', 'http://www.cs.fsu.edu/~engelen/interop2B.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (42, 'HP SOAP', 'http://soap.bluestone.com/hpws/soap/EchoService', 'http://soap.bluestone.com/hpws/soap/EchoService.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (43, 'IONA XMLBus', 'http://interop.xmlbus.com:7002/xmlbus/container/InteropTest/GroupBService/GroupBPort', 'http://interop.xmlbus.com:7002/xmlbus/container/InteropTest/GroupBService/GroupBPort', 'GroupB', 1); -INSERT INTO endpoints VALUES (44, 'MS .NET Remoting', 'http://www.mssoapinterop.org/remoting/ServiceB.soap', 'http://www.mssoapinterop.org/remoting/ServiceB.soap?wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (45, 'MS SOAP ToolKit 2.0', 'http://mssoapinterop.org/stk/InteropBtyped.wsdl', 'http://mssoapinterop.org/stk/InteropBtyped.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (46, 'MS SOAP ToolKit 3.0', 'http://mssoapinterop.org/stkV3/InteropB.wsdl', 'http://mssoapinterop.org/stkV3/InteropB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (47, 'NuSOAP', 'http://dietrich.ganx4.com/nusoap/testbed/round2_groupb_server.php', 'http://dietrich.ganx4.com/nusoap/testbed/round2_groupb.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (48, 'OpenLink', 'http://demo.openlinksw.com:8890/Interop', 'http://demo.openlinksw.com:8890/Interop/services.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (50, 'SIM', 'http://soapinterop.simdb.com/round2B', 'http://soapinterop.simdb.com/round2B?WSDL', 'GroupB', 1); -INSERT INTO endpoints VALUES (51, 'SOAP4R', 'http://www.jin.gr.jp/~nahi/Ruby/SOAP4R/SOAPBuildersInterop/', 'http://www.jin.gr.jp/~nahi/Ruby/SOAP4R/SOAPBuildersInterop/SOAP4R_SOAPBuildersInteropTest_R2GroupB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (52, 'SOAP:Lite', 'http://services.soaplite.com/interop.cgi', 'http://services.soaplite.com/InteropTestB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (53, 'Spheon JSOAP', 'http://213.23.125.181:8081/RPC', 'http://213.23.125.181:8081/interopb.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (54, 'Spray 2001', 'http://www.dolphinharbor.org/services/interopB2001', 'http://www.dolphinharbor.org/services/interopB2001/service.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (55, 'SQLData SOAP Server', 'http://soapclient.com/interop/InteropB.wsdl', 'http://soapclient.com/interop/InteropB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (56, 'WASP Advanced 3.0', 'http://soap.systinet.net:6060/InteropBService/', 'http://soap.systinet.net:6060/InteropBService/', 'GroupB', 1); -INSERT INTO endpoints VALUES (58, 'White Mesa SOAP Server', 'http://www.whitemesa.net/interop/std/groupB', 'http://www.whitemesa.net/wsdl/std/interopB.wsdl', 'GroupB', 1); -INSERT INTO endpoints VALUES (59, 'PEAR SOAP', 'http://localhost/soap_interop/server_round2.php', 'http://localhost/soap_interop/interopB.wsdl.php', 'GroupB', 1); -INSERT INTO endpoints VALUES (60, '4s4c v2.0', 'http://soap.4s4c.com/ilab2/soap.asp', 'http://soap.4s4c.com/ilab2/ilab_c.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (61, 'Apache Axis', 'http://nagoya.apache.org:5049/axis/services/echo', 'http://nagoya.apache.org:5049/axis/services/echo?wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (62, 'ASP.NET Web Services', 'http://mssoapinterop.org/asmx/header.asmx', 'http://mssoapinterop.org/asmx/header.asmx?wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (63, 'EasySoap++', 'http://easysoap.sourceforge.net/cgi-bin/interopserver', 'http://easysoap.sourceforge.net/interopC.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (64, 'MS SOAP ToolKit 2.0', 'http://mssoapinterop.org/stk/InteropC.wsdl', 'http://mssoapinterop.org/stk/InteropC.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (65, 'MS SOAP ToolKit 3.0', 'http://mssoapinterop.org/stkV3/InteropC.wsdl', 'http://mssoapinterop.org/stkV3/InteropC.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (66, 'OpenLink', 'http://demo.openlinksw.com:8890/Interop', 'http://demo.openlinksw.com:8890/Interop/services.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (67, 'SOAP:Lite', 'http://services.soaplite.com/interopC.cgi', 'http://services.soaplite.com/InteropTestC.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (68, 'Spray 2001', 'http://www.dolphinharbor.org/services/interopC', 'http://www.dolphinharbor.org/services/interopC/service.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (69, 'SQLData SOAP Server', 'http://soapclient.com/interop/interopC.wsdl', 'http://soapclient.com/interop/interopC.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (70, 'WASP Advanced 3.0', 'http://soap.systinet.net:6060/InteropCService/', 'http://soap.systinet.net:6060/InteropCService/', 'GroupC', 1); -INSERT INTO endpoints VALUES (71, 'White Mesa SOAP Server', 'http://www.whitemesa.net/interop/std/echohdr', 'http://www.whitemesa.net/wsdl/std/echoheadersvc.wsdl', 'GroupC', 1); -INSERT INTO endpoints VALUES (72, 'PEAR SOAP', 'http://localhost/soap_interop/server_round2.php', 'http://localhost/soap_interop/echoheadersvc.wsdl.php', 'GroupC', 1); - - - diff --git a/ext/soap/interop/index.php b/ext/soap/interop/index.php deleted file mode 100644 index ed222479b2..0000000000 --- a/ext/soap/interop/index.php +++ /dev/null @@ -1,70 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> - -<html> -<head> - <title>PEAR SOAP Interop</title> -</head> -<?php -// get our endpoint -$server = $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT']; -$endpoint = 'http://'.$server."/soap_interop/server_round2.php"; -$base = 'http://'.$server."/soap_interop/interop.wsdl"; -$groupb = 'http://'.$server."/soap_interop/interopB.wsdl"; -$groupc = 'http://'.$server."/soap_interop/echoheadersvc.wsdl"; -?> -<body> - -<h2 align='center'>PEAR SOAP Interop</h2> -<p>Welcome to the PEAR SOAP Interop pages. These pages are set up for -SOAP Builder interop tests. You can find out more about the interop tests -at <a href="http://www.whitemesa.com/interop.htm">White Mesa</a>.</p> -<p>Currently Round 2 base, Group B and Group C interop tests are enabled.</p> - -<h3>Round 2 Interop Server</h3> -Endpoint: <?php echo $endpoint; ?><br> -Base WSDL: <a href="<?php echo $base ?>"><?php echo $base ?></a><br> -Group B WSDL: <a href="<?php echo $groupb ?>"><?php echo $groupb ?></a><br> -Group C WSDL: <a href="<?php echo $groupc ?>"><?php echo $groupc ?></a><br> - -<h3>Interop Client</h3> - -<p> -Notes: -Tests are done both "Direct" and with "WSDL". WSDL tests use the supplied interop WSDL -to run the tests against. The Direct method uses an internal prebuilt list of methods and parameters -for the test.</p> -<p> -Tests are also run against two methods of generating method parameters. The first, 'php', attempts -to directly serialize PHP variables into soap values. The second method, 'soapval', uses a SOAP_Value -class to define what the type of the value is. The second method is more interopable than the first -by nature. -</p> - -<h3>Client Test Interface</h3> -<p>The <a href="client_round2.php">client interface</a> allows you to run the PEAR SOAP -Client against a choosen interop server. Each run updates the results database below.</p> - -<h3>Interop Client Test Results</h3> -<p>This is a database of the current test results using PEAR SOAP Clients against interop servers.</p> -<p> -More detail (wire) about errors (marked yellow or red) can be obtained by clicking on the -link in the result box. If we have an HTTP error -attempting to connect to the endpoint, we will mark all consecutive attempts as errors, and skip -testing that endpoint. This reduces the time it takes to run the tests if a server is unavailable. -WSDLCACHE errors mean we cannot retreive the WSDL file specified for the endpoint. -</p> - -<ul> -<li><a href="client_round2_results.php?test=base&type=php&wsdl=0">Base results using PHP native types</a></li> -<li><a href="client_round2_results.php?test=base&type=soapval&wsdl=0">Base results using SOAP types</a></li> -<li><a href="client_round2_results.php?test=base&type=php&wsdl=1">Base results using PHP native types with WSDL</a></li> -<li><a href="client_round2_results.php?test=GroupB&type=php&wsdl=0">Group B results using PHP native types</a></li> -<li><a href="client_round2_results.php?test=GroupB&type=soapval&wsdl=0">Group B results using SOAP types</a></li> -<li><a href="client_round2_results.php?test=GroupB&type=php&wsdl=1">Group B results using PHP native types with WSDL</a></li> -<li><a href="client_round2_results.php?test=GroupC&type=php&wsdl=0">Group C results using PHP native types</a></li> -<li><a href="client_round2_results.php?test=GroupC&type=soapval&wsdl=0">Group C results using SOAP types</a></li> -<li><a href="client_round2_results.php?test=GroupC&type=php&wsdl=1">Group C results using PHP native types with WSDL</a></li> -<li><a href="client_round2_results.php">Show All Results</a></li> -</ul> -</body> -</html> diff --git a/ext/soap/interop/info.php b/ext/soap/interop/info.php deleted file mode 100644 index 147cebcdd4..0000000000 --- a/ext/soap/interop/info.php +++ /dev/null @@ -1 +0,0 @@ -<?php phpinfo(); ?> diff --git a/ext/soap/interop/interop.wsdl b/ext/soap/interop/interop.wsdl deleted file mode 100644 index 6a835b571f..0000000000 --- a/ext/soap/interop/interop.wsdl +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0"?> - -<definitions name="InteropTest" targetNamespace="http://soapinterop.org/" - xmlns="http://schemas.xmlsoap.org/wsdl/" - xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" - xmlns:tns="http://soapinterop.org/"> - - <import location="http://www.whitemesa.com/wsdl/wmmsgrouter.xsd" namespace="http://whitemesa.com/headers/soapmsgrouter.xsd"/> - <import location="http://www.whitemesa.com/interop/InteropTest.wsdl" namespace="http://soapinterop.org/"/> - <import location="http://www.whitemesa.com/interop/InteropTest.wsdl" namespace="http://soapinterop.org/xsd"/> - - <service name="interopLab"> - <port name="interopTestPort" binding="tns:InteropTestSoapBinding"> - <soap:address location="http://localhost/soap_interop/server_round2.php"/> - </port> - </service> - -</definitions> diff --git a/ext/soap/interop/interopB.wsdl b/ext/soap/interop/interopB.wsdl deleted file mode 100644 index 92301af334..0000000000 --- a/ext/soap/interop/interopB.wsdl +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<definitions name="InteropTest" targetNamespace="http://soapinterop.org/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://soapinterop.org/" xmlns:s="http://soapinterop.org/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> - - <import location="http://www.whitemesa.com/interop/InteropTestB.wsdl" namespace="http://soapinterop.org/"/> - <import location="http://www.whitemesa.com/interop/InteropTestB.wsdl" namespace="http://soapinterop.org/xsd"/> - - <service name="interopLabB"> - <port name="interopTestPortB" binding="tns:InteropTestSoapBindingB"> - <soap:address location="http://localhost/soap_interop/server_round2.php"/> - </port> - </service> - -</definitions> diff --git a/ext/soap/interop/server_round2.php b/ext/soap/interop/server_round2.php deleted file mode 100644 index 84a8333c7b..0000000000 --- a/ext/soap/interop/server_round2.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'SOAP/Server.php'; - -$server = new SOAP_Server; - -require_once 'server_round2_base.php'; -require_once 'server_round2_groupB.php'; -require_once 'server_round2_groupC.php'; - -$server->service(isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:NULL); -#echo "Content-Length is {$_SERVER['CONTENT_LENGTH']}\n\n"; -#echo "<!---\n\nlen:".strlen($HTTP_RAW_POST_DATA)."\n\n"; -#echo "[$HTTP_RAW_POST_DATA"; -#print "]\n\nend of input data-->"; -?>
\ No newline at end of file diff --git a/ext/soap/interop/server_round2_base.php b/ext/soap/interop/server_round2_base.php deleted file mode 100644 index abbd9223bb..0000000000 --- a/ext/soap/interop/server_round2_base.php +++ /dev/null @@ -1,184 +0,0 @@ -<? -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> Port to PEAR and more | -// | Authors: Dietrich Ayala <dietrich@ganx4.com> Original Author | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -require_once 'SOAP/Server.php'; - -function generateFault($short, $long) -{ - $params = array( - "faultcode" => "Server", - "faultstring" => $short, - "detail" => $long - ); - - $faultmsg = new SOAP_Message("Fault",$params,"http://schemas.xmlsoap.org/soap/envelope/"); - return $faultmsg; -} - -function hex2bin($data) -{ - $len = strlen($data); - return pack("H" . $len, $data); -} - - -class SOAP_Interop_Base { - var $method_namespace = 'http://soapinterop.org/'; - - function SOAP_Interop_Base() { - #if ($server) { - # $server->addToMap("echoString",array("string"),array("string")); - # $server->addToMap("echoStringArray",array(),array()); - # $server->addToMap("echoInteger",array("int"),array("int")); - # $server->addToMap("echoIntegerArray",array(),array()); - # $server->addToMap("echoFloat",array("float"),array("float")); - # $server->addToMap("echoFloatArray",array(),array()); - # $server->addToMap("echoStruct",array(),array()); - # $server->addToMap("echoStructArray",array(),array()); - # $server->addToMap("echoVoid",array(),array()); - # $server->addToMap("echoBase64",array("base64Binary"),array("base64Binary")); - # $server->addToMap("echoDate",array("dateTime"),array("dateTime")); - # $server->addToMap("echoHexBinary",array("hexBinary"),array("hexBinary")); - # $server->addToMap("echoDecimal",array("decimal"),array("decimal")); - # $server->addToMap("echoBoolean",array("boolean"),array("boolean")); - #} - } - - function echoString($inputString) - { - return new SOAP_Value('outputString','string',$inputString); - } - - function echoStringArray($inputStringArray) - { - $ra = array(); - if ($inputStringArray) { - foreach($inputStringArray as $s) { - $ra[] = new SOAP_Value('item','string',$s); - } - } - return new SOAP_Value('outputStringArray',NULL,$ra); - } - - - function echoInteger($inputInteger) - { - return new SOAP_Value('outputInteger','int',(integer)$inputInteger); - } - - function echoIntegerArray($inputIntegerArray) - { - $ra = array(); - if ($inputIntegerArray) { - foreach ($inputIntegerArray as $i) { - $ra[] = new SOAP_Value('item','int',$i); - } - } - return new SOAP_Value('outputIntArray',NULL,$ra); - } - - function echoFloat($inputFloat) - { - return new SOAP_Value('outputFloat','float',(FLOAT)$inputFloat); - } - - function echoFloatArray($inputFloatArray) - { - $ra = array(); - if ($inputFloatArray) { - foreach($inputFloatArray as $float) { - $ra[] = new SOAP_Value('item','float',(FLOAT)$float); - } - } - return new SOAP_Value('outputFloatArray',NULL,$ra); - } - - function echoStruct($inputStruct) - { - return new SOAP_Value('return','{http://soapinterop.org/xsd}SOAPStruct', - array( - new SOAP_Value('varInt','int',$inputStruct['varInt']), - new SOAP_Value('varFloat','float',$inputStruct['varFloat']), - new SOAP_Value('varString','string',$inputStruct['varString']) - )); - } - - function echoStructArray($inputStructArray) - { - $ra = array(); - if ($inputStructArray) { - foreach($inputStructArray as $struct) { - $ra[] = new SOAP_Value('item','{http://soapinterop.org/xsd}SOAPStruct', - array( - new SOAP_Value('varInt','int',$struct['varInt']), - new SOAP_Value('varFloat','float',$struct['varFloat']), - new SOAP_Value('varString','string',$struct['varString']) - )); - } - } - return $ra; - } - - function echoVoid() - { - return NULL; - } - - function echoBase64($b_encoded) - { - return new SOAP_Value('return','base64Binary',base64_encode(base64_decode($b_encoded))); - } - - function echoDate($timeInstant) - { - $dt = new SOAP_Type_dateTime($timeInstant); - if ($dt->toUnixtime() != -1) { - $value = $dt->toSOAP(); - return new SOAP_Value('return','dateTime',$value); - } else { - return new SOAP_Fault("Value $timeInstant is not a dateTime value"); - } - } - - function echoHexBinary($hb) - { - return new SOAP_Value('return','hexBinary',bin2hex(hex2bin($hb))); - } - - function echoDecimal($dec) - { - return new SOAP_Value('return','decimal',(FLOAT)$dec); - } - - function echoBoolean($boolean) - { - return new SOAP_Value('return','boolean',$boolean); - } - - function echoMimeAttachment($stuff) - { - return new SOAP_Attachment('return','application/octet-stream',NULL,$stuff); - } -} - -$base = new SOAP_Interop_Base(); -$server->addObjectMap($base); -?>
\ No newline at end of file diff --git a/ext/soap/interop/server_round2_groupB.php b/ext/soap/interop/server_round2_groupB.php deleted file mode 100644 index cf28f58de1..0000000000 --- a/ext/soap/interop/server_round2_groupB.php +++ /dev/null @@ -1,87 +0,0 @@ -<? -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> Port to PEAR and more | -// | Authors: Dietrich Ayala <dietrich@ganx4.com> Original Author | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -require_once 'SOAP/Server.php'; - -class SOAP_Interop_GroupB { - var $method_namespace = 'http://soapinterop.org/'; - var $dispatch_map = array(); - - function SOAP_Interop_GroupB() { - $this->dispatch_map['echoStructAsSimpleTypes'] = - array('in' => array('inputStruct' => 'SOAPStruct'), - 'out' => array('outputString' => 'string', 'outputInteger' => 'int', 'outputFloat' => 'float') - ); - -# $server->addToMap('echoSimpleTypesAsStruct', -# array('outputString' => 'string', 'outputInteger' => 'int', 'outputFloat' => 'float'), -# array('return' => 'struct')); -# $server->addToMap('echoNestedStruct', array(), array()); -# $server->addToMap('echo2DStringArray', array(), array()); -# $server->addToMap('echoNestedArray', array(), array()); - } - function echoStructAsSimpleTypes ($struct) - { - # convert a SOAPStruct to an array - $vals = array_values($struct); - return array( - new SOAP_Value('outputString','string',$struct['varString']), - new SOAP_Value('outputInteger','int',$struct['varInt']), - new SOAP_Value('outputFloat','float',$struct['varFloat']) - ); - return array_values($struct); - } - - function echoSimpleTypesAsStruct($string, $int, $float) - { - # convert a input into struct - $ret = new SOAP_Value('return','{http://soapinterop.org/xsd}SOAPStruct', - array( #push struct elements into one soap value - new SOAP_Value('varString','string',$string), - new SOAP_Value('varInt','int',(int)$int), - new SOAP_Value('varFloat','float',(FLOAT)$float) - ) - ); - return $ret; - } - - function echoNestedStruct($struct) - { - return $struct; - } - - function echo2DStringArray($ary) - { - $ret = new SOAP_Value('return','Array',$ary); - $ret->options['flatten'] = TRUE; - return $ret; - } - - function echoNestedArray($ary) - { - return $ary; - } -} - -$groupb = new SOAP_Interop_GroupB(); -$server->addObjectMap($groupb); - -?>
\ No newline at end of file diff --git a/ext/soap/interop/server_round2_groupC.php b/ext/soap/interop/server_round2_groupC.php deleted file mode 100644 index 02d9804bee..0000000000 --- a/ext/soap/interop/server_round2_groupC.php +++ /dev/null @@ -1,41 +0,0 @@ -<? -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> | -// +----------------------------------------------------------------------+ -// -// $Id$ -// -require_once 'SOAP/Server.php'; -require_once 'SOAP/Value.php'; - -class SOAP_Interop_GroupC { - var $method_namespace = 'http://soapinterop.org/echoheader/'; - - function echoMeStringRequest($string) - { - return new SOAP_Value('{'.$this->method_namespace.'}echoMeStringResponse','string',$string); - } - - function echoMeStructRequest($struct) - { - return new SOAP_Value('{'.$this->method_namespace.'}echoMeStructResponse','SOAPStruct',$struct); - } -} - -$groupc = new SOAP_Interop_GroupC(); -$server->addObjectMap($groupc); - -?>
\ No newline at end of file diff --git a/ext/soap/interop/server_round2_test.php b/ext/soap/interop/server_round2_test.php deleted file mode 100644 index 1158abe563..0000000000 --- a/ext/soap/interop/server_round2_test.php +++ /dev/null @@ -1,258 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4 | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2002 The PHP Group | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.02 of the PHP license, | -// | that is bundled with this package in the file LICENSE, and is | -// | available at through the world-wide-web at | -// | http://www.php.net/license/2_02.txt. | -// | If you did not receive a copy of the PHP license and are unable to | -// | obtain it through the world-wide-web, please send a note to | -// | license@php.net so we can mail you a copy immediately. | -// +----------------------------------------------------------------------+ -// | Authors: Shane Caraveo <Shane@Caraveo.com> Port to PEAR and more | -// +----------------------------------------------------------------------+ -// -// $Id$ -// - -require_once 'SOAP/Server.php'; - -$server = new SOAP_Server; - -require_once 'server_round2_base.php'; -require_once 'server_round2_groupB.php'; -require_once 'server_round2_groupC.php'; - -$test = '<?xml version="1.0"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:si="http://soapinterop.org/xsd" - xmlns:ns6="http://soapinterop.org/echoheader/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Header> - -<ns6:echoMeStringRequest xsi:type="xsd:string" SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" SOAP-ENV:mustUnderstand="0">hello world</ns6:echoMeStringRequest> -</SOAP-ENV:Header> -<SOAP-ENV:Body> - -<echoVoid></echoVoid> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope>'; - -$test = '<?xml version="1.0"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:si="http://soapinterop.org/xsd" - xmlns:ns6="http://soapinterop.org/echoheader/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Header> - -<ns6:echoMeStructRequest xsi:type="si:SOAPStruct" - SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" - SOAP-ENV:mustUnderstand="1"> -<varString xsi:type="xsd:string">arg</varString> - -<varInt xsi:type="xsd:int">34</varInt> - -<varFloat xsi:type="xsd:float">325.325</varFloat> -</ns6:echoMeStructRequest> -</SOAP-ENV:Header> -<SOAP-ENV:Body> - -<echoVoid></echoVoid> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope> -'; - -$test = '<?xml version="1.0"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:si="http://soapinterop.org/xsd" - xmlns:ns6="http://soapinterop.org/echoheader/" - xmlns:ns7="http://soapinterop.org/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Body> - -<ns7:echoString> -<inputString xsi:type="xsd:string"></inputString> -</ns7:echoString> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope> -'; -$test = '<?xml version="1.0" encoding="US-ASCII"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:si="http://soapinterop.org/xsd" - xmlns:ns6="http://soapinterop.org/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Body> -<ns6:echoVoid/> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope>'; - -$test = '<?xml version="1.0" encoding="US-ASCII"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:si="http://soapinterop.org/xsd" - xmlns:ns6="http://soapinterop.org/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Body> -<ns6:echoIntegerArray><inputIntegerArray xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:int[3]" SOAP-ENC:offset="[0]"><item xsi:type="xsd:int">1</item> -<item xsi:type="xsd:int">234324324</item> -<item xsi:type="xsd:int">2</item> -</inputIntegerArray> -</ns6:echoIntegerArray> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope>'; - -#$test = "<S:Envelope -#S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' -#xmlns:Enc='http://schemas.xmlsoap.org/soap/encoding/' -#xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' -#xmlns:a='http://soapinterop.org/' -#xmlns:b='http://soapinterop.org/xsd' -#xmlns:XS='http://www.w3.org/2001/XMLSchema' -#xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> -#<S:Body> -#<b:SOAPStruct Enc:root='0' id='21b56c4' XI:type='b:SOAPStruct'> -#<varInt XI:type='XS:int'>1</varInt> -#<varFloat XI:type='XS:float'>2</varFloat> -#<varString XI:type='XS:string'>wilma</varString> -#</b:SOAPStruct> -#<a:echoStructArray> -#<inputStructArray XI:type='Enc:Array' Enc:arrayType='XS:anyType[3]'> -#<fred href='#21b56c4'/> -#<i href='#21b56c4'/> -#<i href='#21b56c4'/> -#</inputStructArray> -#</a:echoStructArray> -#</S:Body></S:Envelope>"; - -#$test = "<S:Envelope S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:Enc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:a='http://soapinterop.org/' xmlns:b='http://soapinterop.org/xsd' xmlns:XS='http://www.w3.org/2001/XMLSchema' xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> <S:Body><a:echoStructArray><inputStructArray XI:type='Enc:Array' Enc:arrayType='b:SOAPStruct[2]'><inputStruct href='#213e654'/> <inputStruct href='#21b8c4c'/> </inputStructArray> </a:echoStructArray> <b:SOAPStruct Enc:root='0' id='21b8c4c' XI:type='b:SOAPStruct'><varInt XI:type='XS:int'>-1</varInt> <varFloat XI:type='XS:float'>-1</varFloat> <varString XI:type='XS:string'>lean on into the groove y'all</varString> </b:SOAPStruct> <b:SOAPStruct Enc:root='0' id='213e654' XI:type='b:SOAPStruct'><varInt XI:type='XS:int'>1073741824</varInt> <varFloat XI:type='XS:float'>-42.24</varFloat> <varString XI:type='XS:string'>pocketSOAP rocks!<g></varString> </b:SOAPStruct> </S:Body></S:Envelope>"; - -#$test = "<S:Envelope S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:b='http://soapinterop.org/' xmlns:a='http://soapinterop.org/headers/' xmlns:XS='http://www.w3.org/2001/XMLSchema' xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> <S:Header> <a:Transaction S:mustUnderstand='1' XI:type='XS:short'>5</a:Transaction> </S:Header> <S:Body><b:echoString><inputString XI:type='XS:string'>Opps, should never see me</inputString> </b:echoString> </S:Body></S:Envelope>"; -#$test = "<S:Envelope S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:b='http://soapinterop.org/' xmlns:a='http://soapinterop.org/headers/' xmlns:XS='http://www.w3.org/2001/XMLSchema' xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> <S:Header> <a:Transaction XI:type='XS:short'>5</a:Transaction> </S:Header> <S:Body><b:echoString><inputString XI:type='XS:string'>Opps, should never see me</inputString> </b:echoString> </S:Body></S:Envelope>"; -#$test = "<S:Envelope S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:Enc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:a='http://soapinterop.org/' xmlns:b='http://soapinterop.org/xsd' xmlns:XS='http://www.w3.org/2001/XMLSchema' xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> <S:Body><a:echoStructAsSimpleTypes><inputStruct href='#213e59c'/> </a:echoStructAsSimpleTypes> <b:SOAPStruct Enc:root='0' id='213e59c' XI:type='b:SOAPStruct'><varInt XI:type='XS:int'>42</varInt> <varString XI:type='XS:string'>Orbital</varString> <varFloat XI:type='XS:float'>-42.42</varFloat> </b:SOAPStruct> </S:Body></S:Envelope>"; - -// white mesa failures -/*$test = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><h:echoMeStringRequest SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:mustUnderstand="1" xmlns:h="http://unknown.org/">White Mesa Test Header String.</h:echoMeStringRequest></SOAP-ENV:Header><SOAP-ENV:Body><m:echoVoid SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:m="http://soapinterop.org/" /></SOAP-ENV:Body></SOAP-ENV:Envelope>'; -*/ -/* -$test = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><h:echoMeStringRequest SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:mustUnderstand="1" xmlns:h="http://unknown.org/">White Mesa Test Header String.</h:echoMeStringRequest></SOAP-ENV:Header><SOAP-ENV:Body><m:echoVoid SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:m="http://soapinterop.org/" /></SOAP-ENV:Body></SOAP-ENV:Envelope>'; -*/ -//$test = "<S:Envelope S:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:a='http://soapinterop.org/' xmlns:XI='http://www.w3.org/2001/XMLSchema-instance'> <S:Body><a:echoIntegerArray><inputIntegerArray XI:nil='true'></inputIntegerArray> </a:echoIntegerArray> </S:Body></S:Envelope>"; - -$test = '<?xml version="1.0" encoding="UTF-8"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - xmlns:ns4="http://soapinterop.org/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Body> - -<ns4:echo2DStringArray> -<input2DStringArray xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[2,3]"> -<item xsi:type="xsd:string">row0col0</item> -<item xsi:type="xsd:string">row0col1</item> -<item xsi:type="xsd:string">row0col2</item> -<item xsi:type="xsd:string">row1col0</item> -<item xsi:type="xsd:string">row1col1</item> -<item xsi:type="xsd:string">row1col2</item></input2DStringArray></ns4:echo2DStringArray> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope>'; - -$_SERVER['REQUEST_METHOD'] = "POST"; -$_SERVER['CONTENT_TYPE'] = 'multipart/related; type=text/xml; boundary="=_d624611fe466a88d956a205651c74fdb"'; - -$test = '--=_d624611fe466a88d956a205651c74fdb -Content-Type: text/xml; charset="UTF-8" -Content-Transfer-Encoding: base64 - -PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPFNPQVAtRU5WOkVudmVs -b3BlICB4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZl -bG9wZS8iDQogIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQog -IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQog -IHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5n -LyINCiAgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcv -c29hcC9lbmNvZGluZy8iPg0KPFNPQVAtRU5WOkJvZHk+DQoNCjxlY2hvTWltZUF0dGFjaG1lbnQ+ -DQo8dGVzdCBocmVmPSJjaWQ6ZTZiOTg0M2JiYzUxY2JiMDAzOTk0MGVmN2VlNzY2MDMiLz48L2Vj -aG9NaW1lQXR0YWNobWVudD4NCjwvU09BUC1FTlY6Qm9keT4NCjwvU09BUC1FTlY6RW52ZWxvcGU+ -DQo= ---=_d624611fe466a88d956a205651c74fdb -Content-Disposition: attachment.php -Content-Type: text/plain -Content-Transfer-Encoding: base64 -Content-ID: <e6b9843bbc51cbb0039940ef7ee76603> - -PD9waHANCnJlcXVpcmVfb25jZSgiU09BUC9DbGllbnQucGhwIik7DQpyZXF1aXJlX29uY2UoIlNP -QVAvdGVzdC90ZXN0LnV0aWxpdHkucGhwIik7DQpyZXF1aXJlX29uY2UoIlNPQVAvVmFsdWUucGhw -Iik7DQokc29hcF9iYXNlID0gbmV3IFNPQVBfQmFzZSgpOw0KDQokdiA9ICBuZXcgU09BUF9BdHRh -Y2htZW50KCd0ZXN0JywndGV4dC9wbGFpbicsJ2F0dGFjaG1lbnQucGhwJyk7DQokbWV0aG9kVmFs -dWUgPSBuZXcgU09BUF9WYWx1ZSgndGVzdGF0dGFjaCcsICdTdHJ1Y3QnLCBhcnJheSgkdikpOw0K -DQovLyBzZWUgdGhlIG1pbWUgYXJyYXkNCi8vJHZhbCA9ICRzb2FwX2Jhc2UtPl9tYWtlRW52ZWxv -cGUoJG1ldGhvZFZhbHVlKTsNCi8vcHJpbnRfcigkdmFsKTsNCg0KJGNsaWVudCA9IG5ldyBTT0FQ -X0NsaWVudCgnaHR0cDovL2xvY2FsaG9zdC9zb2FwX2ludGVyb3Avc2VydmVyX3JvdW5kMi5waHAn -KTsNCiRyZXNwID0gJGNsaWVudC0+Y2FsbCgnZWNob01pbWVBdHRhY2htZW50JyxhcnJheSgkdikp -Ow0KcHJpbnRfcigkcmVzcCk7DQpwcmludCAkY2xpZW50LT53aXJlOw0KPz4= ---=_d624611fe466a88d956a205651c74fdb--'; - -$_SERVER['CONTENT_TYPE'] = 'multipart/related; type=text/xml; boundary="=_a2cbb051424cc43e72d3c8c8d0b8f70e"'; -$test='--=_a2cbb051424cc43e72d3c8c8d0b8f70e -Content-Type: text/xml; charset="UTF-8" - -<?xml version="1.0" encoding="UTF-8"?> - -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" - SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> -<SOAP-ENV:Body> - -<echoMimeAttachment> -<test href="cid:a223fea3c35b5f0e6dedf8da75efd6b3"/></echoMimeAttachment> -</SOAP-ENV:Body> -</SOAP-ENV:Envelope> - ---=_a2cbb051424cc43e72d3c8c8d0b8f70e -Content-Disposition: attachment.php -Content-Type: text/plain -Content-Transfer-Encoding: base64 -Content-ID: <a223fea3c35b5f0e6dedf8da75efd6b3> - -PD9waHANCnJlcXVpcmVfb25jZSgiU09BUC9DbGllbnQucGhwIik7DQpyZXF1aXJlX29uY2UoIlNP -QVAvdGVzdC90ZXN0LnV0aWxpdHkucGhwIik7DQpyZXF1aXJlX29uY2UoIlNPQVAvVmFsdWUucGhw -Iik7DQokc29hcF9iYXNlID0gbmV3IFNPQVBfQmFzZSgpOw0KDQokdiA9ICBuZXcgU09BUF9BdHRh -Y2htZW50KCd0ZXN0JywndGV4dC9wbGFpbicsJ2F0dGFjaG1lbnQucGhwJyk7DQokbWV0aG9kVmFs -dWUgPSBuZXcgU09BUF9WYWx1ZSgndGVzdGF0dGFjaCcsICdTdHJ1Y3QnLCBhcnJheSgkdikpOw0K -DQovLyBzZWUgdGhlIG1pbWUgYXJyYXkNCi8vJHZhbCA9ICRzb2FwX2Jhc2UtPl9tYWtlRW52ZWxv -cGUoJG1ldGhvZFZhbHVlKTsNCi8vcHJpbnRfcigkdmFsKTsNCg0KJGNsaWVudCA9IG5ldyBTT0FQ -X0NsaWVudCgnaHR0cDovL2xvY2FsaG9zdC9zb2FwX2ludGVyb3Avc2VydmVyX3JvdW5kMi5waHAn -KTsNCiRyZXNwID0gJGNsaWVudC0+Y2FsbCgnZWNob01pbWVBdHRhY2htZW50JyxhcnJheSgkdikp -Ow0KI3ByaW50X3IoJHJlc3ApOw0KcHJpbnQgJGNsaWVudC0+d2lyZTsNCj8+ ---=_a2cbb051424cc43e72d3c8c8d0b8f70e-- -'; -$server->service($test, '',TRUE); -print $server->response; -?>
\ No newline at end of file diff --git a/ext/soap/interop/test.utility.php b/ext/soap/interop/test.utility.php deleted file mode 100644 index 9af61c22fb..0000000000 --- a/ext/soap/interop/test.utility.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -require_once("SOAP/Parser.php"); -require_once("SOAP/Value.php"); - -function number_compare($f1, $f2) -{ - # figure out which has the least fractional digits - preg_match('/.*?\.(.*)/',$f1,$m1); - preg_match('/.*?\.(.*)/',$f2,$m2); - #print_r($m1); - # always use at least 2 digits of precision - $d = max(min(strlen(count($m1)?$m1[1]:'0'),strlen(count($m2)?$m2[1]:'0')),2); - $f1 = round($f1, $d); - $f2 = round($f2, $d); - return bccomp($f1, $f2, $d) == 0; -} - -function boolean_compare($f1, $f2) -{ - if (($f1 == 'true' || $f1 === TRUE || $f1 != 0) && - ($f2 == 'true' || $f2 === TRUE || $f2 != 0)) return TRUE; - if (($f1 == 'false' || $f1 === FALSE || $f1 == 0) && - ($f2 == 'false' || $f2 === FALSE || $f2 == 0)) return TRUE; - return FALSE; -} - -function string_compare($e1, $e2) -{ - if (is_numeric($e1) && is_numeric($e2)) { - return number_compare($e1, $e2); - } - # handle dateTime comparison - $e1_type = gettype($e1); - $e2_type = gettype($e2); - $ok = FALSE; - if ($e1_type == "string") { - $dt = new SOAP_Type_dateTime(); - $ok = $dt->compare($e1, $e2) == 0; - } - return $ok || $e1 == $e2 || strcasecmp(trim($e1), trim($e2)) == 0; -} - -function array_compare(&$ar1, &$ar2) -{ - if (gettype($ar1) != 'array' || gettype($ar2) != 'array') return FALSE; - # first a shallow diff - if (count($ar1) != count($ar2)) return FALSE; - $diff = array_diff($ar1, $ar2); - if (count($diff) == 0) return TRUE; - - # diff failed, do a full check of the array - foreach ($ar1 as $k => $v) { - #print "comparing $v == $ar2[$k]\n"; - if (gettype($v) == "array") { - if (!array_compare($v, $ar2[$k])) return FALSE; - } else { - if (!string_compare($v, $ar2[$k])) return FALSE; - } - } - return TRUE; -} - - -function parseMessage($msg) -{ - # strip line endings - #$msg = preg_replace('/\r|\n/', ' ', $msg); - $response = new SOAP_Parser($msg); - if ($response->fault) { - return $response->fault->getFault(); - } - $return = $response->getResponse(); - $v = $response->decode($return); - if (gettype($v) == 'array' && count($v)==1) { - return array_shift($v); - } - return $v; -} - - -?>
\ No newline at end of file diff --git a/ext/soap/interop/testclient.php b/ext/soap/interop/testclient.php deleted file mode 100644 index b70c628ee5..0000000000 --- a/ext/soap/interop/testclient.php +++ /dev/null @@ -1,17 +0,0 @@ -<html><body> -<? -error_reporting(2039); -include("SOAP/Client.php"); - -$txt = "Bjoern"; - -$soapc = new SOAP_Client("http://localhost/soap_interop/testserver.php"); -$soapc->debug_flag = TRUE; -print_r($soapc->call("testMethod",array("txt" => $txt))); -print "<br>Debug: "; -print $soapc->wire; -print "<br><br>"; -unset($soapc); - -?> -</html></body>
\ No newline at end of file diff --git a/ext/soap/interop/testserver.php b/ext/soap/interop/testserver.php deleted file mode 100644 index 03973c8863..0000000000 --- a/ext/soap/interop/testserver.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -include "SOAP/Server.php"; - -function testMethod($arg) { - if ($arg != "") { - return crypt($arg); - } else { - return "Please supply a text"; - } -} - -$server = new soap_server(); - -$server->addToMap("testMethod",array("string"),array("string")); -$server->service($HTTP_RAW_POST_DATA); -echo "<!-- this is a test -->"; -?>
\ No newline at end of file diff --git a/ext/soap/libs.mk b/ext/soap/libs.mk deleted file mode 100644 index 7c6e176717..0000000000 --- a/ext/soap/libs.mk +++ /dev/null @@ -1,7 +0,0 @@ -include $(top_builddir)/config_vars.mk -LTLIBRARY_OBJECTS = $(LTLIBRARY_SOURCES:.c=.lo) $(LTLIBRARY_OBJECTS_X) -LTLIBRARY_SHARED_OBJECTS = $(LTLIBRARY_OBJECTS:.lo=.slo) -$(LTLIBRARY_NAME): $(LTLIBRARY_OBJECTS) $(LTLIBRARY_DEPENDENCIES) - $(LINK) $(LTLIBRARY_LDFLAGS) $(LTLIBRARY_OBJECTS) $(LTLIBRARY_LIBADD) - -targets = $(LTLIBRARY_NAME) diff --git a/ext/soap/package.xml b/ext/soap/package.xml deleted file mode 100644 index 34c0395dcf..0000000000 --- a/ext/soap/package.xml +++ /dev/null @@ -1,61 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1" ?> -<!-- do not use the "Type" attribute here, that one is only for - generated package.xml files --> -<package> - <name>soap</name> - <summary>Provides SOAP Services</summary> - <description> - Description of package.... - </description> - <status>beta</status> - <maintainers> - <maintainer> - <user>rodif_bl</user> - <name>Brad Lafountain</name> - <email>rodif_bl@yahoo.com</email> - <role>lead</role> - </maintainer> - <maintainer> - <user>shane</user> - <name>Shane Caraveo</name> - <email>shane@caraveo.com</email> - <role>lead</role> - </maintainer> - </maintainers> - <license>PHP</license> - <release> - <version>0.1</version> - <date>2002-07-07</date> - <state>alpha</state> - <notes> - - First offical PEAR/PECL release - </notes> - </release> - <filelist> - <dir name="/"> - <file role="doc">EXPERIMENTAL</file> - <file role="doc">TODO</file> - <file role="src">config.m4</file> - <file role="src">Makefile</file> - <file role="src">Makefile.in</file> - <file role="src">libs.mk</file> - <file role="src">php_encoding.c</file> - <file role="src">php_encoding.h</file> - <file role="src">php_http.c</file> - <file role="src">php_http.h</file> - <file role="src">php_packet_soap.c</file> - <file role="src">php_packet_soap.h</file> - <file role="src">php_schema.c</file> - <file role="src">php_schema.h</file> - <file role="src">php_sdl.c</file> - <file role="src">php_sdl.h</file> - <file role="src">php_soap.h</file> - <file role="src">php_soap.h</file> - <file role="src">php_xml.c</file> - <file role="src">php_xml.h</file> - <file role="src">soap.c</file> - <file role="src">soap.dsp</file> - </dir> - </filelist> -</package> - diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c deleted file mode 100644 index d48bccc918..0000000000 --- a/ext/soap/php_encoding.c +++ /dev/null @@ -1,1125 +0,0 @@ -#include <time.h> - -#include "php_soap.h" - -encode defaultEncoding[] = { - {{UNKNOWN_TYPE, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}, - - {{IS_NULL, "null", "null", NULL}, to_zval_null, to_xml_null}, - {{IS_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, - {{IS_LONG, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{IS_DOUBLE, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{IS_BOOL, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, - {{IS_CONSTANT, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, - {{IS_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_array, guess_array_map}, - {{IS_CONSTANT_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_array, to_xml_array}, - {{IS_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_object, to_xml_object}, - - {{XSD_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string}, - {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_datetime}, - {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_time}, - {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_date}, - {{XSD_GYEARMONTH, XSD_GYEARMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gyearmonth}, - {{XSD_GYEAR, XSD_GYEAR_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gyear}, - {{XSD_GMONTHDAY, XSD_GMONTHDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gmonthday}, - {{XSD_GDAY, XSD_GDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gday}, - {{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gmonth}, - {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_stringl}, - {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_stringl}, - - {{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - - {{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL}, to_zval_map, to_xml_map}, - - {{SOAP_ENC_OBJECT, SOAP_ENC_OBJECT_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_object, to_xml_object}, - {{SOAP_ENC_ARRAY, SOAP_ENC_ARRAY_STRING, SOAP_ENC_NAMESPACE, NULL}, to_zval_array, to_xml_array}, - - //support some of the 1999 data types - {{XSD_STRING, XSD_STRING_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string}, - {{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_bool, to_xml_bool}, - {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_string}, - {{XSD_LONG, XSD_LONG_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long}, - {{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_string}, - {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string}, - - {{END_KNOWN_TYPES, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert} - -//TODO: finish off encoding -/* -#define XSD_DURATION 107 -#define XSD_DURATION_STRING "duration" -#define XSD_ANYURI 118 -#define XSD_ANYURI_STRING "anyURI" -#define XSD_QNAME 119 -#define XSD_QNAME_STRING "QName" -#define XSD_NOTATION 120 -#define XSD_NOTATION_STRING "NOTATION" -*/ - -/* -#define XSD_NORMALIZEDSTRING 121 -#define XSD_NORMALIZEDSTRING_STRING "normalizedString" -#define XSD_TOKEN 122 -#define XSD_TOKEN_STRING "token" -#define XSD_LANGUAGE 123 -#define XSD_LANGUAGE_STRING "language" -#define XSD_NMTOKEN 124 -#define XSD_NMTOKEN_STRING "NMTOKEN" -#define XSD_NAME 124 -#define XSD_NAME_STRING "Name" -#define XSD_NCNAME 125 -#define XSD_NCNAME_STRING "NCName" -#define XSD_ID 126 -#define XSD_ID_STRING "ID" -#define XSD_IDREF 127 -#define XSD_IDREF_STRING "IDREF" -#define XSD_IDREFS 127 -#define XSD_IDREFS_STRING "IDREFS" -#define XSD_ENTITY 128 -#define XSD_ENTITY_STRING "ENTITY" -#define XSD_ENTITYS 129 -#define XSD_ENTITYS_STRING "ENTITYS" -#define XSD_INTEGER 130 -#define XSD_INTEGER_STRING "integer" -#define XSD_NONPOSITIVEINTEGER 131 -#define XSD_NONPOSITIVEINTEGER_STRING "nonPositiveInteger" -#define XSD_NEGATIVEINTEGER 132 -#define XSD_NEGATIVEINTEGER_STRING "negativeInteger" -#define XSD_NONNEGATIVEINTEGER 137 -#define XSD_NONNEGATIVEINTEGER_STRING "nonNegativeInteger" -#define XSD_UNSIGNEDLONG 138 -#define XSD_UNSIGNEDLONG_STRING "unsignedLong" -#define XSD_UNSIGNEDINT 139 -#define XSD_UNSIGNEDINT_STRING "unsignedInt" -#define XSD_UNSIGNEDSHORT 140 -#define XSD_UNSIGNEDSHORT_STRING "unsignedShort" -#define XSD_UNSIGNEDBYTE 141 -#define XSD_UNSIGNEDBYTE_STRING "unsignedByte" -#define XSD_POSITIVEINTEGER 142 -#define XSD_POSITIVEINTEGER_STRING "positiveInteger" -*/ -}; - -xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style) -{ - xmlNodePtr node; - - if(encode->to_xml_before) - data = encode->to_xml_before(encode->details, data); - if(encode->to_xml) - node = encode->to_xml(encode->details, data, style); - if(encode->to_xml_after) - node = encode->to_xml_after(encode->details, node, style); - - return node; -} - -zval *master_to_zval(encodePtr encode, xmlNodePtr data) -{ - zval *ret; - - data = check_and_resolve_href(data); - if(encode->to_zval_before) - data = encode->to_zval_before(encode->details, data, 0); - if(encode->to_zval) - ret = encode->to_zval(encode->details, data); - if(encode->to_zval_after) - ret = encode->to_zval_after(encode->details, ret); - - return ret; -} - -#ifdef HAVE_PHP_DOMXML -zval *to_xml_before_user(encodeType type, zval *data) -{ - TSRMLS_FETCH(); - - if(type.map->map_functions.to_xml_before) - { - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_xml_before, data, 1, &data TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_xml_before"); - } - return data; -} - -xmlNodePtr to_xml_user(encodeType type, zval *data, int style) -{ - zval *ret, **addr; - xmlNodePtr node; - TSRMLS_FETCH(); - - if(type.map->map_functions.to_xml) - { - MAKE_STD_ZVAL(ret); - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_xml, ret, 1, &data TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_xml"); - - if(Z_TYPE_P(ret) != IS_OBJECT) - php_error(E_ERROR, "Error serializing object from to_xml_user"); - - if(zend_hash_index_find(Z_OBJPROP_P(ret), 1, (void **)&addr) == SUCCESS) - { - node = (xmlNodePtr)Z_LVAL_PP(addr); - node = xmlCopyNode(node, 1); - set_ns_and_type(node, type); - } - zval_ptr_dtor(&ret); - } - return node; -} - -xmlNodePtr to_xml_after_user(encodeType type, xmlNodePtr node, int style) -{ - zval *ret, *param, **addr; - int found; - TSRMLS_FETCH(); - - if(type.map->map_functions.to_xml_after) - { - MAKE_STD_ZVAL(ret); - MAKE_STD_ZVAL(param); - param = php_domobject_new(node, &found, NULL TSRMLS_CC); - - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_xml_after, ret, 1, ¶m TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_xml_after"); - if(zend_hash_index_find(Z_OBJPROP_P(ret), 1, (void **)&addr) == SUCCESS) - { - node = (xmlNodePtr)Z_LVAL_PP(addr); - set_ns_and_type(node, type); - } - zval_ptr_dtor(&ret); - zval_ptr_dtor(¶m); - } - return node; -} - -xmlNodePtr to_zval_before_user(encodeType type, xmlNodePtr node, int style) -{ - zval *ret, *param, **addr; - int found; - TSRMLS_FETCH(); - - if(type.map->map_functions.to_zval_before) - { - MAKE_STD_ZVAL(ret); - MAKE_STD_ZVAL(param); - param = php_domobject_new(node, &found, NULL TSRMLS_CC); - - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_zval_before, ret, 1, ¶m TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_zval_before"); - if(zend_hash_index_find(Z_OBJPROP_P(ret), 1, (void **)&addr) == SUCCESS) - { - node = (xmlNodePtr)Z_LVAL_PP(addr); - set_ns_and_type(node, type); - } - zval_ptr_dtor(&ret); - zval_ptr_dtor(¶m); - } - return node; -} - -zval *to_zval_user(encodeType type, xmlNodePtr node) -{ - zval *ret, *param; - int found; - TSRMLS_FETCH(); - - if(type.map->map_functions.to_zval) - { - MAKE_STD_ZVAL(ret); - MAKE_STD_ZVAL(param); - param = php_domobject_new(node, &found, NULL TSRMLS_CC); - - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_zval, ret, 1, ¶m TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_zval"); - zval_ptr_dtor(¶m); - } - return ret; -} - -zval *to_zval_after_user(encodeType type, zval *data) -{ - TSRMLS_FETCH(); - - if(type.map->map_functions.to_zval_after) - { - if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_zval_after, data, 1, &data TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling to_xml_before"); - } - return data; -} -#endif - -//TODO: get rid of "bogus".. ither by passing in the already created xmlnode or passing in the node name -//String encode/decode -zval *to_zval_string(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - if(data && data->children) - ZVAL_STRING(ret, data->children->content, 1); - return ret; -} - -zval *to_zval_stringl(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - if(data && data->children) - ZVAL_STRINGL(ret, data->children->content, xmlStrlen(data->children->content), 1); - return ret; -} - -xmlNodePtr to_xml_string(encodeType type, zval *data, int style) -{ - xmlNodePtr ret; - char *str; - int new_len; - - ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_string(data); - str = php_escape_html_entities(Z_STRVAL_P(data), Z_STRLEN_P(data), &new_len, 0, 0, NULL); - xmlNodeSetContentLen(ret, str, new_len); - - if(style == SOAP_ENCODED) - set_ns_and_type(ret, type); - return ret; -} - -xmlNodePtr to_xml_stringl(encodeType type, zval *data, int style) -{ - xmlNodePtr ret; - - ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_string(data); - xmlNodeSetContentLen(ret, estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data)), Z_STRLEN_P(data)); - - if(style == SOAP_ENCODED) - set_ns_and_type(ret, type); - return ret; -} - -zval *to_zval_double(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - ZVAL_DOUBLE(ret, atof(data->children->content)); - return ret; -} - -zval *to_zval_long(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - ZVAL_LONG(ret, atol(data->children->content)); - return ret; -} - -xmlNodePtr to_xml_long(encodeType type, zval *data, int style) -{ - xmlNodePtr ret; - - ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_long(data); - convert_to_string(data); - xmlNodeSetContentLen(ret, Z_STRVAL_P(data), Z_STRLEN_P(data)); - - if(style == SOAP_ENCODED) - set_ns_and_type(ret, type); - return ret; -} - -zval *to_zval_bool(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - if(stricmp(data->children->content,"true") == 0 || - stricmp(data->children->content,"t") == 0 || - strcmp(data->children->content,"1") == 0) - { - ZVAL_BOOL(ret, 1); - } - else - { - ZVAL_BOOL(ret, 0); - } - return ret; -} - -xmlNodePtr to_xml_bool(encodeType type, zval *data, int style) -{ - xmlNodePtr ret; - - ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - convert_to_boolean(data); - if(data->value.lval == 1) - xmlNodeSetContent(ret, "1"); - else - xmlNodeSetContent(ret, "0"); - - if(style == SOAP_ENCODED) - set_ns_and_type(ret, type); - return ret; -} - -//Null encode/decode -zval *to_zval_null(encodeType type, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - ZVAL_NULL(ret); - return ret; -} - -xmlNodePtr to_xml_null(encodeType type, zval *data, int style) -{ - xmlNodePtr ret; - - ret = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, ret); - - if(style == SOAP_ENCODED) - xmlSetProp(ret, "xsi:null", "1"); - return ret; -} - -//Struct encode/decode -zval *to_zval_object(encodeType type, xmlNodePtr data) -{ - zval *ret; - xmlNodePtr trav; - encodePtr enc; - TSRMLS_FETCH(); - - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - object_init(ret); - trav = data->children; - - enc = get_conversion(UNKNOWN_TYPE); - do - { - if(trav->type == XML_ELEMENT_NODE) - { - zval *tmpVal; - - tmpVal = master_to_zval(enc, trav); - add_property_zval(ret, (char *)trav->name, tmpVal); - } - } - while(trav = trav->next); - - return ret; -} - -xmlNodePtr to_xml_object(encodeType type, zval *data, int style) -{ - xmlNodePtr xmlParam; - HashTable *prop; - int i; - TSRMLS_FETCH(); - - //Special handling of class SoapVar - if(data && Z_TYPE_P(data) == IS_OBJECT && !strcmp(Z_OBJCE_P(data)->name, soap_var_class_entry.name)) - { - zval **ztype, **zdata, **zns, **zstype, **zname, **znamens; - encodePtr enc; - - if(zend_hash_find(Z_OBJPROP_P(data), "enc_type", sizeof("enc_type"), (void **)&ztype) == FAILURE) - php_error(E_ERROR, "error encoding SoapVar"); - if(zend_hash_find(Z_OBJPROP_P(data), "enc_value", sizeof("enc_value"), (void **)&zdata) == FAILURE) - php_error(E_ERROR, "error encoding SoapVar"); - - enc = get_conversion(Z_LVAL_P(*ztype)); - xmlParam = master_to_xml(enc, *zdata, style); - - if(zend_hash_find(Z_OBJPROP_P(data), "enc_stype", sizeof("enc_stype"), (void **)&zstype) == SUCCESS) - { - if(zend_hash_find(Z_OBJPROP_P(data), "enc_ns", sizeof("enc_ns"), (void **)&zns) == SUCCESS) - set_ns_and_type_ex(xmlParam, Z_STRVAL_PP(zns), Z_STRVAL_PP(zstype)); - else - set_ns_and_type_ex(xmlParam, NULL, Z_STRVAL_PP(zstype)); - } - - if(zend_hash_find(Z_OBJPROP_P(data), "enc_name", sizeof("enc_name"), (void **)&zname) == SUCCESS) - xmlNodeSetName(xmlParam, Z_STRVAL_PP(zname)); - if(zend_hash_find(Z_OBJPROP_P(data), "enc_namens", sizeof("enc_namens"), (void **)&znamens) == SUCCESS) - { - smart_str *ns; - xmlNsPtr nsp; - - ns = encode_new_ns(); - nsp = xmlNewNs(xmlParam, Z_STRVAL_PP(znamens), ns->c); - xmlSetNs(xmlParam, nsp); - smart_str_free(ns); - efree(ns); - } - } - else - { - xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); - - if(Z_TYPE_P(data) == IS_OBJECT) - { - prop = Z_OBJPROP_P(data); - i = zend_hash_num_elements(prop); - zend_hash_internal_pointer_reset(prop); - - for(;i > 0;i--) - { - xmlNodePtr property; - encodePtr enc; - zval **zprop; - char *str_key; - - zend_hash_get_current_key(prop, &str_key, NULL, FALSE); - zend_hash_get_current_data(prop, (void **)&zprop); - - enc = get_conversion((*zprop)->type); - property = master_to_xml(enc, (*zprop), style); - - xmlNodeSetName(property, str_key); - xmlAddChild(xmlParam, property); - zend_hash_move_forward(prop); - } - } - - if(style == SOAP_ENCODED) - set_ns_and_type(xmlParam, type); - } - return xmlParam; -} - -//Array encode/decode -xmlNodePtr guess_array_map(encodeType type, zval *data, int style) -{ - encodePtr enc = NULL; - TSRMLS_FETCH(); - - if(data && Z_TYPE_P(data) == IS_ARRAY) - { - if(zend_hash_num_elements(Z_ARRVAL_P(data)) > 0) - { - if(is_map(data)) - enc = get_conversion(APACHE_MAP); - else - enc = get_conversion(SOAP_ENC_ARRAY); - } - } - if(!enc) - enc = get_conversion(IS_NULL); - - return master_to_xml(enc, data, style); -} - -xmlNodePtr to_xml_array(encodeType type, zval *data, int style) -{ - smart_str array_type_and_size = {0}, array_type = {0}; - int i; - xmlNodePtr xmlParam; - TSRMLS_FETCH(); - - xmlParam = xmlNewNode(NULL,"BOGUS"); - - FIND_ZVAL_NULL(data, xmlParam); - - if(Z_TYPE_P(data) == IS_ARRAY) - { - i = zend_hash_num_elements(Z_ARRVAL_P(data)); - - if(style == SOAP_ENCODED) - { - get_array_type(data, &array_type); - smart_str_append(&array_type_and_size, &array_type); - smart_str_appendc(&array_type_and_size, '['); - smart_str_append_long(&array_type_and_size, i); - smart_str_appendc(&array_type_and_size, ']'); - smart_str_0(&array_type_and_size); - - xmlSetProp(xmlParam, "SOAP-ENC:arrayType", array_type_and_size.c); - - smart_str_free(&array_type_and_size); - smart_str_free(&array_type); - } - - zend_hash_internal_pointer_reset(data->value.ht); - for(;i > 0;i--) - { - xmlNodePtr xparam; - zval **zdata; - encodePtr enc; - zend_hash_get_current_data(data->value.ht, (void **)&zdata); - - enc = get_conversion((*zdata)->type); - xparam = master_to_xml(enc, (*zdata), style); - - if(style == SOAP_LITERAL) - xmlNodeSetName(xparam, enc->details.type_str); - else - xmlNodeSetName(xparam, "val"); - - xmlAddChild(xmlParam, xparam); - zend_hash_move_forward(data->value.ht); - } - } - if(style == SOAP_ENCODED) - set_ns_and_type(xmlParam, type); - return xmlParam; -} - -zval *to_zval_array(encodeType type, xmlNodePtr data) -{ - zval *ret; - xmlNodePtr trav; - encodePtr enc; - TSRMLS_FETCH(); - - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - array_init(ret); - trav = data->children; - - enc = get_conversion(UNKNOWN_TYPE); - while(trav) - { - if(trav->type == XML_ELEMENT_NODE) - { - zval *tmpVal; - tmpVal = master_to_zval(enc, trav); - zend_hash_next_index_insert(Z_ARRVAL_P(ret), &tmpVal, sizeof(zval *), NULL); - } - trav = trav->next; - } - - return ret; -} - -//Map encode/decode -xmlNodePtr to_xml_map(encodeType type, zval *data, int style) -{ - xmlNodePtr xmlParam; - int i; - TSRMLS_FETCH(); - - xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); - - if(Z_TYPE_P(data) == IS_ARRAY) - { - i = zend_hash_num_elements(Z_ARRVAL_P(data)); - //TODO: Register namespace...??? - xmlSetProp(xmlParam, "xmlns:apache", "http://xml.apache.org/xml-soap"); - zend_hash_internal_pointer_reset(data->value.ht); - for(;i > 0;i--) - { - xmlNodePtr xparam, item; - xmlNodePtr key; - zval **temp_data; - char *key_val; - int int_val; - encodePtr enc; - - zend_hash_get_current_data(data->value.ht, (void **)&temp_data); - if(Z_TYPE_PP(temp_data) != IS_NULL) - { - item = xmlNewNode(NULL, "item"); - key = xmlNewNode(NULL, "key"); - if(zend_hash_get_current_key(data->value.ht, &key_val, (long *)&int_val, FALSE) == HASH_KEY_IS_STRING) - { - if(style == SOAP_ENCODED) - xmlSetProp(key, "xsi:type", "xsd:string"); - xmlNodeSetContent(key, key_val); - } - else - { - smart_str tmp = {0}; - smart_str_append_long(&tmp, int_val); - smart_str_0(&tmp); - - if(style == SOAP_ENCODED) - xmlSetProp(key, "xsi:type", "xsd:int"); - xmlNodeSetContentLen(key, tmp.c, tmp.len); - - smart_str_free(&tmp); - } - - - enc = get_conversion((*temp_data)->type); - xparam = master_to_xml(enc, (*temp_data), style); - - xmlNodeSetName(xparam, "value"); - xmlAddChild(item, key); - xmlAddChild(item, xparam); - xmlAddChild(xmlParam, item); - } - zend_hash_move_forward(data->value.ht); - } - } - if(style == SOAP_ENCODED) - set_ns_and_type(xmlParam, type); - - return xmlParam; -} - -zval *to_zval_map(encodeType type, xmlNodePtr data) -{ - zval *ret, *key, *value; - xmlNodePtr trav, item, xmlKey, xmlValue; - encodePtr enc; - TSRMLS_FETCH(); - - MAKE_STD_ZVAL(ret); - FIND_XML_NULL(data, ret); - - array_init(ret); - trav = data->children; - - enc = get_conversion(UNKNOWN_TYPE); - trav = data->children; - FOREACHNODE(trav, "item", item) - { - xmlKey = get_node(item->children, "key"); - if(!xmlKey) - php_error(E_ERROR, "Error encoding apache map, missing key"); - - xmlValue = get_node(item->children, "value"); - if(!xmlKey) - php_error(E_ERROR, "Error encoding apache map, missing value"); - - key = master_to_zval(enc, xmlKey); - value = master_to_zval(enc, xmlValue); - - if(Z_TYPE_P(key) == IS_STRING) - zend_hash_update(Z_ARRVAL_P(ret), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); - else if(Z_TYPE_P(key) == IS_LONG) - zend_hash_index_update(Z_ARRVAL_P(ret), Z_LVAL_P(key), &value, sizeof(zval *), NULL); - else - php_error(E_ERROR, "Error encoding apache map, only Strings or Longs are allowd as keys"); - } - ENDFOREACH(trav); - - return ret; -} - -//Unknown encode/decode -xmlNodePtr guess_xml_convert(encodeType type, zval *data, int style) -{ - encodePtr enc; - TSRMLS_FETCH(); - - if(data) - enc = get_conversion(data->type); - else - enc = get_conversion(IS_NULL); - return master_to_xml(enc, data, style); -} - -zval *guess_zval_convert(encodeType type, xmlNodePtr data) -{ - encodePtr enc = NULL; - xmlAttrPtr tmpattr; - TSRMLS_FETCH(); - - data = check_and_resolve_href(data); - - if(data == NULL || data->children == NULL) - enc = get_conversion(IS_NULL); - else - { - tmpattr = get_attribute(data->properties,"type"); - if(tmpattr != NULL) - { - enc = get_conversion_from_type(data, tmpattr->children->content); - // if(enc == NULL) - // php_error(E_ERROR, "Error (Don't know how to encode/decode \"%s\")", tmpattr->children->content); - } - - if(enc == NULL) - { - //Didn't have a type, totally guess here - //Logic: has children = IS_OBJECT else IS_STRING - xmlNodePtr trav; - - if(get_attribute(data->properties, "arrayType")) - enc = get_conversion(SOAP_ENC_ARRAY); - else - { - enc = get_conversion(XSD_STRING); - trav = data->children; - do - { - if(trav->type == XML_ELEMENT_NODE) - { - enc = get_conversion(SOAP_ENC_OBJECT); - break; - } - } - while(trav = trav->next); - } - } - } - return master_to_zval(enc, data); -} - -//Time encode/decode -xmlNodePtr to_xml_datetime_ex(encodeType type, zval *data, char *format, int style) -{ - //logic hacked from ext/standard/datetime.c - struct tm *ta, tmbuf; - time_t timestamp; - int max_reallocs = 5; - size_t buf_len=64, real_len; - char *buf; - xmlNodePtr xmlParam; - - xmlParam = xmlNewNode(NULL, "BOGUS"); - FIND_ZVAL_NULL(data, xmlParam); - - timestamp = Z_LVAL_P(data); - - time(×tamp); - ta = php_localtime_r(×tamp, &tmbuf); - - buf = (char *) emalloc(buf_len); - while ((real_len = strftime(buf, buf_len, format, ta)) == buf_len || real_len == 0) - { - buf_len *= 2; - buf = (char *) erealloc(buf, buf_len); - if(!--max_reallocs) break; - } - - xmlNodeSetContent(xmlParam, buf); - efree(buf); - - if(style == SOAP_ENCODED) - set_ns_and_type(xmlParam, type); - return xmlParam; -} - -xmlNodePtr to_xml_datetime(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%Y-%m-%dT%H:%M:%S", style); -} - -xmlNodePtr to_xml_time(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%H:%M:%S", style); -} - -xmlNodePtr to_xml_date(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%Y-%m-%d", style); -} - -xmlNodePtr to_xml_gyearmonth(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%Y-%m", style); -} - -xmlNodePtr to_xml_gyear(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%Y", style); -} - -xmlNodePtr to_xml_gmonthday(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "--%m-%d", style); -} - -xmlNodePtr to_xml_gday(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%d", style); -} - -xmlNodePtr to_xml_gmonth(encodeType type, zval *data, int style) -{ - return to_xml_datetime_ex(type, data, "%m", style); -} - -void set_ns_and_type(xmlNodePtr node, encodeType type) -{ - set_ns_and_type_ex(node, type.ns, type.type_str); -} - -void set_ns_and_type_ex(xmlNodePtr node, char *ns, char *type) -{ - if(ns != NULL) - { - char *sprefix; - smart_str *prefix; - smart_str xmlns = {0}, nstype = {0}; - - TSRMLS_FETCH(); - - if(zend_hash_find(SOAP_GLOBAL(defEncNs), ns, strlen(ns) + 1, (void **)&sprefix) == FAILURE) - { - prefix = encode_new_ns(); - smart_str_appendl(&xmlns, "xmlns:", 6); - smart_str_append(&xmlns, prefix); - smart_str_0(&xmlns); - - xmlSetProp(node, xmlns.c, ns); - } - else - { - prefix = emalloc(sizeof(smart_str)); - memset(prefix, 0, sizeof(smart_str)); - smart_str_appends(prefix, sprefix); - } - - smart_str_append(&nstype, prefix); - smart_str_appendc(&nstype, ':'); - smart_str_appends(&nstype, type); - smart_str_0(&nstype); - xmlSetProp(node, "xsi:type", nstype.c); - smart_str_free(&nstype); - smart_str_free(&xmlns); - smart_str_free(prefix); - efree(prefix); - } - else - xmlSetProp(node, "xsi:type", type); -} - -smart_str *encode_new_ns() -{ - int num; - smart_str *ns = emalloc(sizeof(smart_str)); - - TSRMLS_FETCH(); - - memset(ns, 0, sizeof(smart_str)); - num = ++SOAP_GLOBAL(cur_uniq_ns); - smart_str_appendl(ns, "ns", 2); - smart_str_append_long(ns, num); - smart_str_0(ns); - return ns; -} - -void encode_reset_ns() -{ - TSRMLS_FETCH(); - SOAP_GLOBAL(cur_uniq_ns) = 0; -} - -encodePtr get_conversion_ex(HashTable *encoding, int encode) -{ - encodePtr *enc; - TSRMLS_FETCH(); - - if(zend_hash_index_find(encoding, encode, (void **)&enc) == FAILURE) - php_error(E_ERROR, "Cannot find encoding"); - - if(SOAP_GLOBAL(overrides)) - { - smart_str nscat = {0}; - - smart_str_appendl(&nscat, (*enc)->details.ns, strlen((*enc)->details.ns)); - smart_str_appendc(&nscat, ':'); - smart_str_appendl(&nscat, (*enc)->details.type_str, strlen((*enc)->details.type_str)); - smart_str_0(&nscat); - - zend_hash_find(SOAP_GLOBAL(overrides), nscat.c, nscat.len + 1, (void **)&enc); - smart_str_free(&nscat); - } - - return *enc; -} - -encodePtr get_conversion_from_href_type_ex(HashTable *encoding, char *type, int len) -{ - encodePtr *enc = NULL; - - if(encoding == NULL) - return NULL; - - if(zend_hash_find(encoding, type, len + 1, (void **)&enc) == FAILURE) - return NULL; - - return (*enc); -} - -encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, char *type) -{ - encodePtr *enc = NULL; - xmlNsPtr nsptr; - char *ns, *cptype; - smart_str nscat = {0}; - - if(encoding == NULL) - return NULL; - - parse_namespace(type, &cptype, &ns); - nsptr = xmlSearchNs(node->doc, node, ns); - if(nsptr != NULL) - { - smart_str_appends(&nscat, nsptr->href); - smart_str_appendc(&nscat, ':'); - smart_str_appends(&nscat, cptype); - smart_str_0(&nscat); - - if(zend_hash_find(encoding, nscat.c, nscat.len + 1, (void **)&enc) == FAILURE) - { - if(zend_hash_find(encoding, type, strlen(type) + 1, (void **)&enc) == FAILURE) - enc = NULL; - } - smart_str_free(&nscat); - } - else - { - if(zend_hash_find(encoding, type, strlen(type) + 1, (void **)&enc) == FAILURE) - enc = NULL; - } - - if(cptype) efree(cptype); - if(ns) efree(ns); - if(enc == NULL) - return NULL; - else - return (*enc); -} - -int is_map(zval *array) -{ - int i, count = zend_hash_num_elements(Z_ARRVAL_P(array)); - for(i = 0;i < count;i++) - { - if(zend_hash_get_current_key_type(Z_ARRVAL_P(array)) == HASH_KEY_IS_STRING) - return TRUE; - zend_hash_move_forward(Z_ARRVAL_P(array)); - } - return FALSE; -} - -void get_array_type(zval *array, smart_str *type) -{ - HashTable *ht = array->value.ht; - int i, count, cur_type, prev_type, different; - char *name = NULL; - zval **tmp; - TSRMLS_FETCH(); - - if(!array || Z_TYPE_P(array) != IS_ARRAY) - smart_str_appendl(type, "xsd:ur-type", 11); - - different = FALSE; - cur_type = prev_type = 0; - count = zend_hash_num_elements(ht); - - zend_hash_internal_pointer_reset(ht); - for(i = 0;i < count;i++) - { - zend_hash_get_current_data(ht, (void **)&tmp); - - if(Z_TYPE_PP(tmp) == IS_OBJECT && !strcmp(Z_OBJCE_PP(tmp)->name, soap_var_class_entry.name)) - { - zval **ztype; - - if(zend_hash_find(Z_OBJPROP_PP(tmp), "enc_type", sizeof("enc_type"), (void **)&ztype) == FAILURE) - php_error(E_ERROR, "error encoding SoapVar"); - cur_type = Z_LVAL_P(*ztype); - } - else if(Z_TYPE_PP(tmp) == IS_ARRAY && is_map(*tmp)) - cur_type = APACHE_MAP; - else - cur_type = Z_TYPE_PP(tmp); - - if(i > 0) - { - if(cur_type != prev_type) - { - different = TRUE; - break; - } - } - - prev_type = cur_type; - zend_hash_move_forward(ht); - } - - if(different) - smart_str_appendl(type, "xsd:ur-type", 11); - else - { - encodePtr enc; - char *prefix; - - enc = get_conversion(cur_type); - - if(enc->details.ns != NULL) - { - if(zend_hash_find(SOAP_GLOBAL(defEncNs), enc->details.ns, strlen(enc->details.ns) + 1, (void **)&prefix) == FAILURE) - php_error(E_ERROR, "fix me"); - - smart_str_appendl(type, prefix, strlen(prefix)); - smart_str_appendc(type, ':'); - smart_str_appendl(type, enc->details.type_str, strlen(enc->details.type_str)); - smart_str_0(type); - } - else - smart_str_appendl(type, enc->details.type_str, strlen(enc->details.type_str)); - } -} - - -smart_str *build_soap_action(zval *this_ptr, char *soapaction) -{ - zval **uri; - smart_str *tmp; - - tmp = emalloc(sizeof(smart_str)); - memset(tmp, 0, sizeof(smart_str)); - - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "uri", sizeof("uri"), (void *)&uri) == FAILURE) - php_error(E_ERROR, "Error finding uri"); - - smart_str_appendl(tmp, Z_STRVAL_PP(uri), Z_STRLEN_PP(uri)); - smart_str_appends(tmp, "#"); - smart_str_appendl(tmp, soapaction, strlen(soapaction)); - smart_str_0(tmp); - - return tmp; -} - -void delete_encoder(void *encode) -{ - encodePtr t = *((encodePtr*)encode); - if(t->details.ns) - free(t->details.ns); - if(t->details.type_str) - free(t->details.type_str); - if(t->details.map) - delete_mapping(t->details.map); - free(t); -} - diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h deleted file mode 100644 index 0fe9559973..0000000000 --- a/ext/soap/php_encoding.h +++ /dev/null @@ -1,256 +0,0 @@ -#ifndef PHP_ENCODING_H -#define PHP_ENCODING_H - -#define XSD_1999_NAMESPACE "http://www.w3.org/1999/XMLSchema" -#define XSD_1999_TIMEINSTANT 401 -#define XSD_1999_TIMEINSTANT_STRING "timeInstant" - -#define XSD_NAMESPACE "http://www.w3.org/2001/XMLSchema" -#define XSD_NS_PREFIX "xsd" -#define XSD_STRING 101 -#define XSD_STRING_STRING "string" -#define XSD_BOOLEAN 103 -#define XSD_BOOLEAN_STRING "boolean" -#define XSD_DECIMAL 104 -#define XSD_DECIMAL_STRING "decimal" -#define XSD_FLOAT 105 -#define XSD_FLOAT_STRING "float" -#define XSD_DOUBLE 106 -#define XSD_DOUBLE_STRING "double" -#define XSD_DURATION 107 -#define XSD_DURATION_STRING "duration" -#define XSD_DATETIME 108 -#define XSD_DATETIME_STRING "dateTime" -#define XSD_TIME 109 -#define XSD_TIME_STRING "time" -#define XSD_DATE 110 -#define XSD_DATE_STRING "date" -#define XSD_GYEARMONTH 111 -#define XSD_GYEARMONTH_STRING "gYearMonth" -#define XSD_GYEAR 112 -#define XSD_GYEAR_STRING "gYear" -#define XSD_GMONTHDAY 113 -#define XSD_GMONTHDAY_STRING "gMonthDay" -#define XSD_GDAY 114 -#define XSD_GDAY_STRING "gDay" -#define XSD_GMONTH 115 -#define XSD_GMONTH_STRING "gMonth" -#define XSD_HEXBINARY 116 -#define XSD_HEXBINARY_STRING "hexBinary" -#define XSD_BASE64BINARY 117 -#define XSD_BASE64BINARY_STRING "base64Binary" -#define XSD_ANYURI 118 -#define XSD_ANYURI_STRING "anyURI" -#define XSD_QNAME 119 -#define XSD_QNAME_STRING "QName" -#define XSD_NOTATION 120 -#define XSD_NOTATION_STRING "NOTATION" -#define XSD_NORMALIZEDSTRING 121 -#define XSD_NORMALIZEDSTRING_STRING "normalizedString" -#define XSD_TOKEN 122 -#define XSD_TOKEN_STRING "token" -#define XSD_LANGUAGE 123 -#define XSD_LANGUAGE_STRING "language" -#define XSD_NMTOKEN 124 -#define XSD_NMTOKEN_STRING "NMTOKEN" -#define XSD_NAME 124 -#define XSD_NAME_STRING "Name" -#define XSD_NCNAME 125 -#define XSD_NCNAME_STRING "NCName" -#define XSD_ID 126 -#define XSD_ID_STRING "ID" -#define XSD_IDREF 127 -#define XSD_IDREF_STRING "IDREF" -#define XSD_IDREFS 127 -#define XSD_IDREFS_STRING "IDREFS" -#define XSD_ENTITY 128 -#define XSD_ENTITY_STRING "ENTITY" -#define XSD_ENTITYS 129 -#define XSD_ENTITYS_STRING "ENTITYS" -#define XSD_INTEGER 130 -#define XSD_INTEGER_STRING "integer" -#define XSD_NONPOSITIVEINTEGER 131 -#define XSD_NONPOSITIVEINTEGER_STRING "nonPositiveInteger" -#define XSD_NEGATIVEINTEGER 132 -#define XSD_NEGATIVEINTEGER_STRING "negativeInteger" -#define XSD_LONG 133 -#define XSD_LONG_STRING "long" -#define XSD_INT 134 -#define XSD_INT_STRING "int" -#define XSD_SHORT 135 -#define XSD_SHORT_STRING "short" -#define XSD_BYTE 136 -#define XSD_BYTE_STRING "byte" -#define XSD_NONNEGATIVEINTEGER 137 -#define XSD_NONNEGATIVEINTEGER_STRING "nonNegativeInteger" -#define XSD_UNSIGNEDLONG 138 -#define XSD_UNSIGNEDLONG_STRING "unsignedLong" -#define XSD_UNSIGNEDINT 139 -#define XSD_UNSIGNEDINT_STRING "unsignedInt" -#define XSD_UNSIGNEDSHORT 140 -#define XSD_UNSIGNEDSHORT_STRING "unsignedShort" -#define XSD_UNSIGNEDBYTE 141 -#define XSD_UNSIGNEDBYTE_STRING "unsignedByte" -#define XSD_POSITIVEINTEGER 142 -#define XSD_POSITIVEINTEGER_STRING "positiveInteger" - -#define APACHE_NAMESPACE "http://xml.apache.org/xml-soap" -#define APACHE_NS_PREFIX "apache" -#define APACHE_MAP 200 -#define APACHE_MAP_STRING "Map" - -#define SOAP_ENC_NAMESPACE "http://schemas.xmlsoap.org/soap/encoding/" -#define SOAP_ENC_NS_PREFIX "SOAP-ENC" -#define SOAP_ENC_ARRAY 300 -#define SOAP_ENC_ARRAY_STRING "Array" -#define SOAP_ENC_OBJECT 301 -#define SOAP_ENC_OBJECT_STRING "Struct" - -#define SCHEMA_NAMESPACE "http://www.w3.org/2001/XMLSchema" -#define SCHEMA_NS_PREFIX "s" - -#define WSDL_NAMESPACE "http://schemas.xmlsoap.org/wsdl/" -#define WSDL_NS_PREFIX "wsdl" - -#define WSDL_SOAP_NAMESPACE "http://schemas.xmlsoap.org/wsdl/soap/" -#define WSDL_SOAP_NS_PREFIX "wsdlSoap" - -#define WSDL_HTTP_NAMESPACE "http://schemas.xmlsoap.org/wsdl/http/" -#define WSDL_HTTP_NS_PREFIX "http" - -#define WSDL_HTTP_TRANSPORT "http://schemas.xmlsoap.org/soap/http" - -#define UNKNOWN_TYPE 999998 -#define END_KNOWN_TYPES 999999 - -struct _encodeType -{ - int type; - char *type_str; - char *ns; - sdlTypePtr sdl_type; - soapMappingPtr map; -}; - -struct _encode -{ - encodeType details; - zval *(*to_zval)(encodeType type, xmlNodePtr data); - xmlNodePtr (*to_xml)(encodeType type, zval *data, int style); - - xmlNodePtr (*to_zval_before)(encodeType type, xmlNodePtr data, int style); - zval *(*to_zval_after)(encodeType type, zval *data); - - zval *(*to_xml_before)(encodeType type, zval *data); - xmlNodePtr (*to_xml_after)(encodeType type, xmlNodePtr data, int style); -}; - -smart_str *build_soap_action(zval *this_ptr, char *soapaction); - -// Master functions all encode/decode should be called thur these functions -xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style); -zval *master_to_zval(encodePtr encode, xmlNodePtr data); - -#ifdef HAVE_PHP_DOMXML -//user defined mapping -zval *to_xml_before_user(encodeType type, zval *data); -xmlNodePtr to_xml_user(encodeType type, zval *data, int style); -xmlNodePtr to_xml_after_user(encodeType type, xmlNodePtr node, int style); -xmlNodePtr to_zval_before_user(encodeType type, xmlNodePtr node, int style); -zval *to_zval_user(encodeType type, xmlNodePtr node); -zval *to_zval_after_user(encodeType type, zval *data); -#endif - -//zval type decode -zval *to_zval_double(encodeType type, xmlNodePtr data); -zval *to_zval_long(encodeType type, xmlNodePtr data); -zval *to_zval_bool(encodeType type, xmlNodePtr data); -zval *to_zval_object(encodeType type, xmlNodePtr data); -zval *to_zval_string(encodeType type, xmlNodePtr data); -zval *to_zval_array(encodeType type, xmlNodePtr data); -zval *to_zval_map(encodeType type, xmlNodePtr data); -zval *to_zval_null(encodeType type, xmlNodePtr data); -zval *guess_zval_convert(encodeType type, xmlNodePtr data); - -xmlNodePtr to_xml_long(encodeType type, zval *data, int style); -xmlNodePtr to_xml_bool(encodeType type, zval *data, int style); - -//String encode -xmlNodePtr to_xml_string(encodeType type, zval *data, int style); -xmlNodePtr to_xml_stringl(encodeType type, zval *data, int style); - -//Null encode -xmlNodePtr to_xml_null(encodeType type, zval *data, int style); - -//Struct encode -xmlNodePtr to_xml_object(encodeType type, zval *data, int style); - -//Array encode -xmlNodePtr guess_array_map(encodeType type, zval *data, int style); -xmlNodePtr to_xml_array(encodeType type, zval *data, int style); -xmlNodePtr to_xml_map(encodeType type, zval *data, int style); - -//Try and guess for non-wsdl clients and servers -xmlNodePtr guess_xml_convert(encodeType type, zval *data, int style); - -//Datetime encode/decode -xmlNodePtr to_xml_datetime_ex(encodeType type, zval *data, char *format, int style); -xmlNodePtr to_xml_datetime(encodeType type, zval *data, int style); -xmlNodePtr to_xml_time(encodeType type, zval *data, int style); -xmlNodePtr to_xml_date(encodeType type, zval *data, int style); -xmlNodePtr to_xml_gyearmonth(encodeType type, zval *data, int style); -xmlNodePtr to_xml_gyear(encodeType type, zval *data, int style); -xmlNodePtr to_xml_gmonthday(encodeType type, zval *data, int style); -xmlNodePtr to_xml_gday(encodeType type, zval *data, int style); -xmlNodePtr to_xml_gmonth(encodeType type, zval *data, int style); - -#define get_conversion(e) get_conversion_ex(SOAP_GLOBAL(defEncIndex), e) -#define get_conversion_from_type(n, t) get_conversion_from_type_ex(SOAP_GLOBAL(defEnc), n, t) -#define get_conversion_from_href_type(t) get_conversion_from_href_type_ex(SOAP_GLOBAL(defEnc), t, strlen(t)) - -void encode_reset_ns(); -smart_str *encode_new_ns(); - -void set_ns_and_type(xmlNodePtr node, encodeType type); -void set_ns_and_type_ex(xmlNodePtr node, char *ns, char *type); -encodePtr get_conversion_ex(HashTable *encoding, int encode); -encodePtr get_conversion_from_type_ex(HashTable *encoding, xmlNodePtr node, char *type); -encodePtr get_conversion_from_href_type_ex(HashTable *encoding, char *type, int len); - -int is_map(zval *array); -void get_array_type(zval *array, smart_str *out_type); - -void delete_encoder(void *handle); - -extern encode defaultEncoding[]; - -#define FIND_XML_NULL(xml,zval) \ - { \ - xmlAttrPtr null; \ - if(!xml || !xml->children) \ - { \ - ZVAL_NULL(zval); \ - return zval; \ - } \ - if(xml->properties) \ - { \ - null = get_attribute(xml->properties, "null"); \ - if(null) \ - { \ - ZVAL_NULL(zval); \ - return zval; \ - } \ - } \ - } - -#define FIND_ZVAL_NULL(zval, xml) \ -{ \ - if(!zval) \ - { \ - xmlSetProp(xml, "xsi:null", "1"); \ - return xml; \ - } \ -} - - -#endif diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c deleted file mode 100644 index 38243dbb93..0000000000 --- a/ext/soap/php_http.c +++ /dev/null @@ -1,494 +0,0 @@ -#include "php_soap.h" - -void send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *function_name, char *soapaction) -{ - xmlChar *buf; - char *soap_headers; - int buf_size,err,ret; - sdlPtr sdl; - php_url *phpurl = NULL; - SOAP_STREAM stream; - zval **trace; - - TSRMLS_FETCH(); - - FETCH_THIS_SOCKET(stream); - FETCH_THIS_URL(phpurl); - FETCH_THIS_SDL(sdl); - - xmlDocDumpMemory(doc, &buf, &buf_size); - - if(!buf) - php_error(E_ERROR, "Error build soap request"); - - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "trace", sizeof("trace"), (void **) &trace) == SUCCESS - && Z_LVAL_PP(trace) > 0) - add_property_stringl(this_ptr, "__last_request", buf, buf_size, 1); - - if(!stream) - { - char *url; - - if(!sdl) - { - zval **location; - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "location", sizeof("location"),(void **) &location) == FAILURE) - php_error(E_ERROR, "Error could not find location"); - url = Z_STRVAL_PP(location); - } - else - { - sdlBindingPtr binding; - FETCH_THIS_PORT(binding); - url = binding->location; - } - - phpurl = php_url_parse(url); - -#ifdef PHP_STREAMS - stream = php_stream_sock_open_host(phpurl->host, (unsigned short)(phpurl->port == 0 ? 80 : phpurl->port), SOCK_STREAM, 0, 0); -#else - stream = get_socket(phpurl->host, (phpurl->port == 0 ? 80 : phpurl->port), 10); -#endif - if(stream) - { - ret = zend_list_insert((void *)stream, le_http_socket); - add_property_resource(this_ptr, "httpsocket", ret); - zend_list_addref(ret); - - ret = zend_list_insert(phpurl, le_url); - add_property_resource(this_ptr, "httpurl", ret); - zend_list_addref(ret); - } - else - php_error(E_ERROR,"Could not connect to host"); - //php_url_free(phpurl); - } - - if(stream) - { - zval **cookies; - char *header = "POST %s HTTP/1.1\r\nConnection: close\r\nAccept: text/html; text/xml; text/plain\r\nUser-Agent: PHP SOAP 0.1\r\nHost: %s\r\nContent-Type: text/xml\r\nContent-Length: %d\r\nSOAPAction: \"%s\"\r\n"; - int size = strlen(header) + strlen(phpurl->host) + strlen(phpurl->path) + 10; - - // TODO: Add authication - if(sdl != NULL) - { - // TODO: need to grab soap action from wsdl.... - soap_headers = emalloc(size + strlen(soapaction)); - sprintf(soap_headers, header, phpurl->path, phpurl->host, buf_size, soapaction); - } - else - { - soap_headers = emalloc(size + strlen(soapaction)); - sprintf(soap_headers, header, phpurl->path, phpurl->host, buf_size, soapaction); - } - -#ifdef PHP_STREAMS - err = php_stream_write(stream, soap_headers, strlen(soap_headers)); -#else - err = send(stream, soap_headers, strlen(soap_headers), 0); -#endif - if(err != (int)strlen(soap_headers)) - php_error(E_ERROR,"Failed Sending HTTP Headers"); - - // Send cookies along with request - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies", sizeof("_cookies"), (void **)&cookies) == SUCCESS) - { - smart_str cookie_str = {0}; - zval **data; - char *key; - int index, i; - - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(cookies)); - for(i = 0;i < (int)Z_ARRVAL_PP(cookies)->nNumOfElements;i++) - { - zend_hash_get_current_data(Z_ARRVAL_PP(cookies), (void **)&data); - zend_hash_get_current_key(Z_ARRVAL_PP(cookies), &key, (long *)&index, FALSE); - - smart_str_appendl(&cookie_str, "Cookie: ", 8); - smart_str_appendl(&cookie_str, key, strlen(key)); - smart_str_appendc(&cookie_str, '='); - smart_str_appendl(&cookie_str, Z_STRVAL_PP(data), Z_STRLEN_PP(data)); - smart_str_appendc(&cookie_str, ';'); - zend_hash_move_forward(Z_ARRVAL_PP(cookies)); - } - smart_str_appendl(&cookie_str, "\r\n", 2); - smart_str_0(&cookie_str); - -#ifdef PHP_STREAMS - err = php_stream_write(stream, cookie_str.c, cookie_str.len); -#else - err = send(stream, cookie_str.c, cookie_str.len,0); -#endif - if(err != (int)cookie_str.len) - php_error(E_ERROR,"Failed Sending HTTP Headers"); - - smart_str_free(&cookie_str); - } - -#ifdef PHP_STREAMS - err = php_stream_write(stream, "\r\n", 2); -#else - err = send(stream, "\r\n", 2, 0); -#endif - if(err != 2) - php_error(E_ERROR,"Failed Sending HTTP Headers"); - - -#ifdef PHP_STREAMS - err = php_stream_write(stream, buf, buf_size); -#else - err = send(stream, buf, buf_size, 0); -#endif - if(err != (int)strlen(buf)) - php_error(E_ERROR,"Failed Sending HTTP Content"); - - efree(soap_headers); - } - xmlFree(buf); -} - -void get_http_soap_response(zval *this_ptr, char **buffer, int *buffer_len) -{ - char *http_headers, *http_body, *content_type, *http_version, http_status[4], *cookie_itt; - int http_header_size, http_body_size, http_close; - sdlPtr sdl; - zval **socket_ref; - SOAP_STREAM stream; - zval **trace; - - TSRMLS_FETCH(); - - FETCH_THIS_SDL(sdl); - - if(FIND_SOCKET_PROPERTY(this_ptr, socket_ref) != FAILURE) - { - FETCH_SOCKET_RES(stream, socket_ref); - } - - if(!get_http_headers(stream, &http_headers, &http_header_size)) - php_error(E_ERROR, "Error Fetching http headers"); - - //Check to see what HTTP status was sent - http_version = get_http_header_value(http_headers,"HTTP/"); - if(http_version) - { - char *tmp; - - tmp = strstr(http_version," "); - - if(tmp != NULL) - { - tmp++; - strncpy(http_status,tmp,4); - http_status[3] = '\0'; - } - - /* - Try and process any respsone that is xml might contain fault code - - Maybe try and test for some of the 300's 400's specfics but not - right now. - - if(strcmp(http_status,"200")) - { - zval *err; - char *http_err; - - MAKE_STD_ZVAL(err); - ZVAL_STRING(err, http_body, 1); - http_err = emalloc(strlen("HTTP request failed ()") + 4); - sprintf(http_err, "HTTP request failed (%s)", http_status); - add_soap_fault(thisObj, "SOAP-ENV:Client", http_err, NULL, err); - efree(http_err); - return; - }*/ - - //Try and get headers again - if(!strcmp(http_status, "100")) - { - if(!get_http_headers(stream, &http_headers, &http_header_size)) - php_error(E_ERROR, "Error Fetching http headers"); - } - - efree(http_version); - } - - - if(!get_http_body(stream, http_headers, &http_body, &http_body_size)) - php_error(E_ERROR, "Error Fetching http body"); - - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "trace", sizeof("trace"), (void **) &trace) == SUCCESS - && Z_LVAL_PP(trace) > 0) - add_property_stringl(this_ptr, "__last_response", http_body, http_body_size, 1); - - // Close every time right now till i can spend more time on it - // it works.. it's just slower?? - //See if the server requested a close - http_close = TRUE; - /* - connection = get_http_header_value(http_headers,"Connection: "); - if(connection) - { - if(!strcmp(connection, "Keep-Alive")) - http_close = FALSE; - efree(connection); - } - else - { - if(!strncmp(http_version,"1.1", 3)) - http_close = FALSE; - } - */ - - if(http_close) - { -#ifdef PHP_STREAMS - php_stream_close(stream); -#else - SOCK_CLOSE(stream); -#endif - zend_list_delete(Z_RESVAL_PP(socket_ref)); - zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", strlen("httpsocket") + 1); - } - - //Check and see if the server even sent a xml document - content_type = get_http_header_value(http_headers,"Content-Type: "); - if(content_type) - { - char *pos = NULL; - int cmplen; - pos = strstr(content_type,";"); - if(pos != NULL) - cmplen = pos - content_type; - else - cmplen = strlen(content_type); - - if(strncmp(content_type, "text/xml", cmplen)) - { - if(strncmp(http_body, "<?xml", 5)) - { - zval *err; - MAKE_STD_ZVAL(err); - ZVAL_STRINGL(err, http_body, http_body_size, 1); - add_soap_fault(this_ptr, "SOAP-ENV:Client", "Didn't recieve an xml document", NULL, err); - efree(content_type); - return; - } - } - efree(content_type); - } - - //Grab and send back every cookie - //Not going to worry about Path: because - //we shouldn't be changing urls so path dont - //matter too much - cookie_itt = strstr(http_headers,"Set-Cookie: "); - while(cookie_itt) - { - char *end_pos, *cookie; - char *eqpos, *sempos; - smart_str name = {0}, value = {0}; - zval **cookies, *z_cookie; - - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "_cookies", sizeof("_cookies"), (void **)&cookies) == FAILURE) - { - zval *tmp_cookies; - MAKE_STD_ZVAL(tmp_cookies); - array_init(tmp_cookies); - zend_hash_update(Z_OBJPROP_P(this_ptr), "_cookies", sizeof("_cookies"), &tmp_cookies, sizeof(zval *), (void **)&cookies); - } - - end_pos = strstr(cookie_itt,"\r\n"); - cookie = get_http_header_value(cookie_itt,"Set-Cookie: "); - - eqpos = strstr(cookie, "="); - sempos = strstr(cookie, ";"); - - smart_str_appendl(&name, cookie, eqpos - cookie); - smart_str_0(&name); - - smart_str_appendl(&value, eqpos + 1, sempos - (eqpos + 1)); - smart_str_0(&value); - - MAKE_STD_ZVAL(z_cookie); - ZVAL_STRINGL(z_cookie, value.c, value.len, 1); - - zend_hash_update(Z_ARRVAL_PP(cookies), name.c, name.len + 1, &z_cookie, sizeof(zval *), NULL); - - cookie_itt = strstr(cookie_itt + sizeof("Set-Cookie: "), "Set-Cookie: "); - - smart_str_free(&value); - smart_str_free(&name); - efree(cookie); - cookie_itt = FALSE; - } - - *buffer = http_body; - *buffer_len = http_body_size; - efree(http_headers); -} - -char *get_http_header_value(char *headers, char *type) -{ - char *tmp = NULL,*var = NULL; - int size; - - tmp = strstr(headers, type); - if(tmp != NULL) - { - tmp += strlen(type); - size = strstr(tmp, "\r\n") - tmp; - var = emalloc(size + 1); - strncpy(var, tmp, size); - var[size] = '\0'; - } - return var; -} - -int get_http_body(SOAP_STREAM stream, char *headers, char **response, int *out_size) -{ - char *trans_enc, *content_length, *http_buf; - int http_buf_size = 0; - TSRMLS_FETCH(); - - trans_enc = get_http_header_value(headers, "Transfer-Encoding: "); - content_length = get_http_header_value(headers, "Content-Length: "); - - //this is temp... - // netscape enterprise server sends in lowercase??? - if(content_length == NULL) - content_length = get_http_header_value(headers, "Content-length: "); - - if(trans_enc && !strcmp(trans_enc, "chunked")) - { - int cur = 0, size = 0, buf_size = 0, len_size; - char done, chunk_size[10]; - - done = FALSE; - http_buf = emalloc(1); - while(!done) - { - cur = 0; - while(!(chunk_size[cur - 2] == '\r' && chunk_size[cur - 1] == '\n')) -#ifdef PHP_STREAMS - chunk_size[cur++] = php_stream_getc(stream); -#else - chunk_size[cur++] = php_sock_fgetc(stream); -#endif - if(sscanf(chunk_size,"%x",&buf_size) != -1) - { - http_buf = erealloc(http_buf,http_buf_size + buf_size); - len_size = 0; - while(http_buf_size < buf_size) - { -#ifdef PHP_STREAMS - len_size += php_stream_read(stream, &http_buf[http_buf_size], buf_size - len_size); -#else - len_size += php_sock_fread(&http_buf[http_buf_size], buf_size - len_size, stream); -#endif - http_buf_size += len_size; - } -#ifdef PHP_STREAMS - php_stream_getc(stream);php_stream_getc(stream); -#else - //Eat up '\r' '\n' - php_sock_fgetc(stream);php_sock_fgetc(stream); -#endif - } - if(buf_size == 0) - done = TRUE; - } - efree(trans_enc); - } - else if(content_length) - { - int size; - size = atoi(content_length); - http_buf = emalloc(size + 1); - - while(http_buf_size < size) -#ifdef PHP_STREAMS - http_buf_size += php_stream_read(stream, &http_buf[http_buf_size], size - http_buf_size); -#else - http_buf_size += php_sock_fread(&http_buf[http_buf_size], size - http_buf_size, stream); -#endif - http_buf[size] = '\0'; - efree(content_length); - } - else - php_error(E_ERROR,"Don't know how to read http body, No Content-Length or chunked data"); - - (*response) = http_buf; - (*out_size) = http_buf_size; - return TRUE; -} - -int get_http_headers(SOAP_STREAM stream, char **response, int *out_size) -{ - int done; - char chr; - smart_str tmp_response = {0}; - TSRMLS_FETCH(); - - done = FALSE; - - while(!done) - { -#ifdef PHP_STREAMS - chr = php_stream_getc(stream); -#else - chr = php_sock_fgetc(stream); -#endif - if(chr != EOF) - { - smart_str_appendc(&tmp_response, chr); - if(tmp_response.c[tmp_response.len - 2] == '\r' && tmp_response.c[tmp_response.len - 1] == '\n' && - tmp_response.c[tmp_response.len - 4] == '\r' && tmp_response.c[tmp_response.len - 3] == '\n') - { - smart_str_0(&tmp_response); - done = TRUE; - } - } - else - return FALSE; - } - (*response) = tmp_response.c; - (*out_size) = tmp_response.len; - return TRUE; -} - -#ifndef PHP_STREAMS -SOCKET get_socket(char* host,int portno,int time) -{ - SOCKET socketd = -1; - struct sockaddr_in server; - struct timeval timeout; - - memset(&server, 0, sizeof(server)); - socketd = socket(AF_INET,SOCK_STREAM,0); - if (socketd == SOCK_ERR) { - if(socketd > 0) - SOCK_CLOSE(socketd); - return FALSE; - } - server.sin_family = AF_INET; - - if(php_lookup_hostname(host,&server.sin_addr)) { - if(socketd > 0) - SOCK_CLOSE(socketd); - return FALSE; - } - server.sin_port = htons((unsigned short)portno); - timeout.tv_sec = time; - timeout.tv_usec = 0; - if (php_connect_nonb(socketd, (struct sockaddr *)&server, sizeof(struct sockaddr_in), &timeout) == SOCK_CONN_ERR) { - if(socketd > 0) - SOCK_CLOSE(socketd); - return FALSE; - } - - return socketd; -} -#endif diff --git a/ext/soap/php_http.h b/ext/soap/php_http.h deleted file mode 100644 index 4e4fff7f4d..0000000000 --- a/ext/soap/php_http.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef PHP_HTTP_H -#define PHP_HTTP_H - -void send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *function_name, char *soapaction); -void get_http_soap_response(zval *this_ptr, char **buffer, int *buffer_len); - -char *get_http_header_value(char *headers, char *type); -int get_http_body(SOAP_STREAM socketd, char *headers, char **response, int *out_size); -int get_http_headers(SOAP_STREAM socketd,char **response, int *out_size); - -#ifndef PHP_STREAMS -#ifndef ZEND_WIN32 -# ifndef closesocket -# define closesocket close -# endif -#endif - -#ifndef SOCK_CLOSE -# define SOCK_CLOSE(s) shutdown(s, 0); closesocket(s) -#endif - -SOCKET get_socket(char* host,int portno,int timeout); -#endif - -#endif diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c deleted file mode 100644 index 9a05e5ed97..0000000000 --- a/ext/soap/php_packet_soap.c +++ /dev/null @@ -1,138 +0,0 @@ -#include "php_soap.h" - -int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval ***ret, int *num_params) -{ - xmlDocPtr response; - xmlNodePtr trav, trav2, env, body, resp, cur, fault; - zval **tmp_ret; - TSRMLS_FETCH(); - - response = xmlParseMemory(buffer, buffer_size); - xmlCleanupParser(); - - (*num_params) = 0; - - trav = response->children; - FOREACHNODE(trav,"Envelope",env) - { - trav2 = env->children; - FOREACHNODE(trav2,"Body",body) - { - fault = get_node(body->children,"Fault"); - if(fault != NULL) - { - char *faultcode = NULL, *faultstring = NULL, *faultactor = NULL; - zval *details = NULL; - xmlNodePtr tmp; - - tmp = get_node(fault->children,"faultcode"); - if(tmp != NULL && tmp->children != NULL) - faultcode = tmp->children->content; - - tmp = get_node(fault->children,"faultstring"); - if(tmp != NULL && tmp->children != NULL) - faultstring = tmp->children->content; - - tmp = get_node(fault->children,"faultactor"); - if(tmp != NULL && tmp->children != NULL) - faultactor = tmp->children->content; - - tmp = get_node(fault->children,"detail"); - if(tmp != NULL) - { - encodePtr enc; - enc = get_conversion(UNKNOWN_TYPE); - details = enc->to_zval(enc->details, tmp); - } - - add_soap_fault(this_ptr, faultcode, faultstring, faultactor, details); - } - else - { - resp = body->children; - if(fn != NULL) - { - sdlParamPtr *h_param, param = NULL; - xmlNodePtr val = NULL; - encodePtr enc; - char *name, *ns; - - if(fn->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes; - - zend_hash_internal_pointer_reset(fn->responseParameters); - if(zend_hash_get_current_data(fn->responseParameters, (void **)&h_param) != SUCCESS) - php_error(E_ERROR, "Can't find response parameter \"%s\"", param->paramName); - - param = (*h_param); - if(fnb->style == SOAP_DOCUMENT) - { - name = (*h_param)->encode->details.type_str; - ns = (*h_param)->encode->details.ns; - } - else - { - name = fn->responseName; - /* ns = ? */ - } - - cur = get_node_ex(resp, name, ns); - /* TODO: produce warning invalid ns */ - if(!cur) - cur = get_node(resp, name); - - if(!cur) - php_error(E_ERROR, "Can't find response data"); - - - if(fnb->style == SOAP_DOCUMENT) - val = cur; - else - val = get_node(cur->children, param->paramName); - - if(!val) - php_error(E_ERROR, "Can't find response data"); - - tmp_ret = emalloc(sizeof(zval **)); - if(param != NULL) - enc = param->encode; - else - enc = get_conversion(UNKNOWN_TYPE); - - tmp_ret[0] = master_to_zval(enc, val); - (*ret) = tmp_ret; - (*num_params) = 1; - } - } - else - { - cur = resp; - while(cur && cur->type != XML_ELEMENT_NODE) - cur = cur->next; - if(cur != NULL) - { - xmlNodePtr val; - val = cur->children; - while(val && val->type != XML_ELEMENT_NODE) - val = val->next; - - if(val != NULL) - { - encodePtr enc; - enc = get_conversion(UNKNOWN_TYPE); - tmp_ret = emalloc(sizeof(zval **)); - tmp_ret[0] = master_to_zval(enc, val); - (*ret) = tmp_ret; - (*num_params) = 1; - } - } - } - } - } - ENDFOREACH(trav2); - } - ENDFOREACH(trav); - xmlFreeDoc(response); - return TRUE; -} diff --git a/ext/soap/php_packet_soap.h b/ext/soap/php_packet_soap.h deleted file mode 100644 index 0d094269da..0000000000 --- a/ext/soap/php_packet_soap.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef PHP_PACKET_SOAP_H -#define PHP_PACKET_SOAP_H - -int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval ***ret, int *num_params); - -#endif
\ No newline at end of file diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c deleted file mode 100644 index 10e88716e0..0000000000 --- a/ext/soap/php_schema.c +++ /dev/null @@ -1,1076 +0,0 @@ -#include "php_soap.h" -/* -2.6.1 xsi:type -2.6.2 xsi:nil -2.6.3 xsi:schemaLocation, xsi:noNamespaceSchemaLocation -*/ - -/* -<schema - attributeFormDefault = (qualified | unqualified) : unqualified - blockDefault = (#all | List of (extension | restriction | substitution)) : '' - elementFormDefault = (qualified | unqualified) : unqualified - finalDefault = (#all | List of (extension | restriction)) : '' - id = ID - targetNamespace = anyURI - version = token - xml:lang = language - {any attributes with non-schema namespace . . .}> - Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*) -</schema> -*/ -int load_schema(sdlPtr *sdl,xmlNodePtr schema) -{ - xmlNodePtr trav, element, compType, simpleType, attribute; - xmlAttrPtr tns; - - if(!(*sdl)->types) - { - (*sdl)->types = malloc(sizeof(HashTable)); - zend_hash_init((*sdl)->types, 0, NULL, delete_type, 1); - } - - tns = get_attribute(schema->properties, "targetNamespace"); - - trav = schema->children; - FOREACHNODE(trav,"complexType",compType) - { - schema_complexType(sdl, tns, compType, NULL); - } - ENDFOREACH(trav); - - trav = schema->children; - FOREACHNODE(trav,"simpleType",simpleType) - { - schema_simpleType(sdl, tns, simpleType, NULL); - } - ENDFOREACH(trav); - - trav = schema->children; - FOREACHNODE(trav,"element",element) - { - schema_element(sdl, tns, element, NULL); - } - ENDFOREACH(trav); - - trav = schema->children; - FOREACHNODE(trav, "attribute", attribute) - { - schema_attribute(sdl, tns, attribute, NULL); - } - ENDFOREACH(trav); - return FALSE; -} -/* -<simpleType - final = (#all | (list | union | restriction)) - id = ID - name = NCName - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (restriction | list | union)) -</simpleType> -*/ -int schema_simpleType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr simpleType, sdlTypePtr cur_type) -{ - xmlNodePtr content; - xmlAttrPtr name, ns; - - ns = get_attribute(simpleType->properties, "targetNamespace"); - if(ns == NULL) - ns = tsn; - - name = get_attribute(simpleType->properties, "name"); - if(name != NULL) - { - HashTable *ht; - smart_str key = {0}; - sdlTypePtr newType, *ptr; - - newType = malloc(sizeof(sdlType)); - memset(newType, 0, sizeof(sdlType)); - newType->name = strdup(name->children->content); - newType->namens = strdup(ns->children->content); - - if(cur_type == NULL) - { - ht = (*sdl)->types; - smart_str_appends(&key, newType->namens); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, newType->name); - smart_str_0(&key); - } - else - { - if(cur_type->elements == NULL) - { - cur_type->elements = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->elements, 0, NULL, delete_type, 1); - } - ht = cur_type->elements; - smart_str_appends(&key, cur_type->name); - } - - zend_hash_add(ht, key.c, key.len + 1, &newType, sizeof(sdlTypePtr), (void **)&ptr); - cur_type = (*ptr); - smart_str_free(&key); - } - - content = get_node(simpleType->children, "restriction"); - if(content != NULL) - { - schema_restriction_simpleType(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(simpleType->children, "list"); - if(content != NULL) - { - schema_list(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(simpleType->children, "union"); - if(content != NULL) - { - schema_union(sdl, tsn, content, cur_type); - return TRUE; - } - - return FALSE; -} - -/* -<list - id = ID - itemType = QName - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (simpleType?)) -</list> -*/ -int schema_list(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr listType, sdlTypePtr cur_type) -{ - return TRUE; -} - -/* -<union - id = ID - memberTypes = List of QName - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (simpleType*)) -</union> -*/ -int schema_union(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr unionType, sdlTypePtr cur_type) -{ - return TRUE; -} - -/* -<simpleContent - id = ID - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (restriction | extension)) -</simpleContent> -*/ -int schema_simpleContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr simpCompType, sdlTypePtr cur_type) -{ - xmlNodePtr content; - - content = get_node(simpCompType->children, "restriction"); - if(content == NULL) - { - schema_restriction_simpleContent(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(simpCompType->children, "extension"); - if(content == NULL) - { - //schema_extension(sdl, tsn, content, cur_type); - php_error(E_ERROR, "Error parsing schema (doesn't support extensions on simpleContent)"); - return TRUE; - } - - php_error(E_ERROR, "Error parsing schema (simpleContent)"); - return FALSE; -} - -/* -<restriction - base = QName - id = ID - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?)) -</restriction> -*/ -int schema_restriction_simpleType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type) -{ - xmlNodePtr content, trav; - xmlAttrPtr base; - - content = get_node(restType->children, "simpleType"); - if(content != NULL) - { - schema_simpleType(sdl, tsn, content, cur_type); - return TRUE; - } - - base = get_attribute(restType->properties, "base"); - if(base != NULL) - { - //cur_type->base = estrdup(base->children->content); - } - - if(cur_type->restrictions == NULL) - { - cur_type->restrictions = malloc(sizeof(sdlRestrictions)); - memset(cur_type->restrictions, 0, sizeof(sdlRestrictions)); - } - - trav = restType->children; - do - { - if(trav->type == XML_ELEMENT_NODE) - { - if(!strcmp(trav->name, "minExclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->minExclusive); - else if(!strcmp(trav->name, "minInclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->minInclusive); - else if(!strcmp(trav->name, "maxExclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxExclusive); - else if(!strcmp(trav->name, "maxInclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxInclusive); - else if(!strcmp(trav->name, "totalDigits")) - schema_restriction_var_int(trav, &cur_type->restrictions->totalDigits); - else if(!strcmp(trav->name, "fractionDigits")) - schema_restriction_var_int(trav, &cur_type->restrictions->fractionDigits); - else if(!strcmp(trav->name, "length")) - schema_restriction_var_int(trav, &cur_type->restrictions->length); - else if(!strcmp(trav->name, "minLength")) - schema_restriction_var_int(trav, &cur_type->restrictions->minLength); - else if(!strcmp(trav->name, "maxLength")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxLength); - else if(!strcmp(trav->name, "whiteSpace")) - schema_restriction_var_char(trav, &cur_type->restrictions->whiteSpace); - else if(!strcmp(trav->name, "pattern")) - schema_restriction_var_char(trav, &cur_type->restrictions->pattern); - else if(!strcmp(trav->name, "enumeration")) - { - sdlRestrictionCharPtr enumval = NULL; - - schema_restriction_var_char(trav, &enumval); - if(cur_type->restrictions->enumeration == NULL) - { - cur_type->restrictions->enumeration = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->restrictions->enumeration, 0, NULL, delete_schema_restriction_var_char, 1); - } - zend_hash_next_index_insert(cur_type->restrictions->enumeration, &enumval, sizeof(sdlRestrictionCharPtr), NULL); - } - } - }while(trav = trav->next); - - return TRUE; -} - -/* -<restriction - base = QName - id = ID - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)) -</restriction> -*/ -int schema_restriction_complexContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type) -{ - xmlAttrPtr base; - xmlNodePtr trav; - - base = get_attribute(restType->properties, "base"); - if(base != NULL) - { - char *type, *ns; - xmlNsPtr nsptr; - - parse_namespace(base->children->content, &type, &ns); - nsptr = xmlSearchNs(restType->doc, restType, ns); - if(nsptr != NULL) - { - cur_type->encode = get_encoder((*sdl), (char *)nsptr->href, type); - } - if(type) efree(type); - if(ns) efree(ns); - } - - trav = restType->children; - do - { - if(trav->type == XML_ELEMENT_NODE) - { - if(!strcmp(trav->name, "group")) - { - schema_group(sdl, tsn, trav, cur_type); - return TRUE; - } - else if(!strcmp(trav->name, "all")) - { - schema_all(sdl, tsn, trav, cur_type); - return TRUE; - } - else if(!strcmp(trav->name, "choice")) - { - schema_choice(sdl, tsn, trav, cur_type); - return TRUE; - } - else if(!strcmp(trav->name, "sequence")) - { - schema_sequence(sdl, tsn, trav, cur_type); - return TRUE; - } - else if(!strcmp(trav->name, "attribute")) - { - schema_attribute(sdl, tsn, trav, cur_type); - } - } - }while(trav = trav->next); - - return TRUE; -} - -/* -<restriction - base = QName - id = ID - {any attributes with non-schema Namespace . . .}> - Content: (annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)) -</restriction> -*/ -int schema_restriction_simpleContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type) -{ - xmlNodePtr content, trav; - xmlAttrPtr base; - - base = get_attribute(restType->properties, "base"); - if(base != NULL) - cur_type->encode = get_encoder_from_prefix((*sdl), restType, base->children->content); - - content = get_node(restType->children, "simpleType"); - if(content != NULL) - { - schema_simpleType(sdl, tsn, content, cur_type); - return TRUE; - } - - if(cur_type->restrictions == NULL) - cur_type->restrictions = malloc(sizeof(sdlRestrictions)); - - trav = restType->children; - do - { - if(trav->type == XML_ELEMENT_NODE) - { - if(!strcmp(trav->name, "minExclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->minExclusive); - else if(!strcmp(trav->name, "minInclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->minInclusive); - else if(!strcmp(trav->name, "maxExclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxExclusive); - else if(!strcmp(trav->name, "maxInclusive")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxInclusive); - else if(!strcmp(trav->name, "totalDigits")) - schema_restriction_var_int(trav, &cur_type->restrictions->totalDigits); - else if(!strcmp(trav->name, "fractionDigits")) - schema_restriction_var_int(trav, &cur_type->restrictions->fractionDigits); - else if(!strcmp(trav->name, "length")) - schema_restriction_var_int(trav, &cur_type->restrictions->length); - else if(!strcmp(trav->name, "minLength")) - schema_restriction_var_int(trav, &cur_type->restrictions->minLength); - else if(!strcmp(trav->name, "maxLength")) - schema_restriction_var_int(trav, &cur_type->restrictions->maxLength); - else if(!strcmp(trav->name, "whiteSpace")) - schema_restriction_var_char(trav, &cur_type->restrictions->whiteSpace); - else if(!strcmp(trav->name, "pattern")) - schema_restriction_var_char(trav, &cur_type->restrictions->pattern); - else if(!strcmp(trav->name, "enumeration")) - { - sdlRestrictionCharPtr enumval = NULL; - - schema_restriction_var_char(trav, &enumval); - if(cur_type->restrictions->enumeration == NULL) - { - cur_type->restrictions->enumeration = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->restrictions->enumeration, 0, NULL, delete_schema_restriction_var_char, 1); - } - zend_hash_next_index_insert(cur_type->restrictions->enumeration, &enumval, sizeof(sdlRestrictionCharPtr), NULL); - } - } - }while(trav = trav->next); - - return TRUE; -} - -int schema_restriction_var_int(xmlNodePtr val, sdlRestrictionIntPtr *valptr) -{ - xmlAttrPtr fixed, value, id; - - if((*valptr) == NULL) - (*valptr) = malloc(sizeof(sdlRestrictionInt)); - - fixed = get_attribute(val->properties, "fixed"); - (*valptr)->fixed = FALSE; - if(fixed != NULL) - { - if(!strcmp(fixed->children->content, "true") || - !strcmp(fixed->children->content, "1")) - (*valptr)->fixed = TRUE; - } - - id = get_attribute(val->properties, "id"); - if(id != NULL) - (*valptr)->id = strdup(id->children->content); - - value = get_attribute(val->properties, "value"); - if(value == NULL) - php_error(E_ERROR, "Error parsing wsdl schema \"missing value for minExclusive\""); - - (*valptr)->value = atoi(value->children->content); - - return TRUE; -} - -void delete_restriction_var_int(void *rvi) -{ - sdlRestrictionIntPtr ptr = *((sdlRestrictionIntPtr*)rvi); - if(ptr->id); - free(ptr->id); - free(ptr); -} - -int schema_restriction_var_char(xmlNodePtr val, sdlRestrictionCharPtr *valptr) -{ - xmlAttrPtr fixed, value, id; - - if((*valptr) == NULL) - (*valptr) = malloc(sizeof(sdlRestrictionChar)); - - fixed = get_attribute(val->properties, "fixed"); - (*valptr)->fixed = FALSE; - if(fixed != NULL) - { - if(!strcmp(fixed->children->content, "true") || - !strcmp(fixed->children->content, "1")) - (*valptr)->fixed = TRUE; - } - - id = get_attribute(val->properties, "id"); - if(id != NULL) - (*valptr)->id = strdup(id->children->content); - - value = get_attribute(val->properties, "value"); - if(value == NULL) - php_error(E_ERROR, "Error parsing wsdl schema \"missing value restriction\""); - - (*valptr)->value = strdup(value->children->content); - return TRUE; -} - -void delete_schema_restriction_var_char(void *srvc) -{ - sdlRestrictionCharPtr ptr = *((sdlRestrictionCharPtr*)srvc); - if(ptr->id) - free(ptr->id); - if(ptr->value) - free(ptr->value); - free(ptr); -} - -/* -From simpleContent (not supported): -<extension - base = QName - id = ID - {any attributes with non-schema namespace . . .}> - Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?)) -</extension> - -From complexContent: -<extension - base = QName - id = ID - {any attributes with non-schema namespace . . .}> - Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))) -</extension> -*/ -int schema_extension(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr extType, sdlTypePtr cur_type) -{ - xmlNodePtr content; - xmlAttrPtr base; - - base = get_attribute(extType->properties, "base"); - - content = get_node(extType->children, "group"); - if(content != NULL) - { - schema_group(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(extType->children, "all"); - if(content != NULL) - { - schema_all(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(extType->children, "choice"); - if(content != NULL) - { - schema_choice(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(extType->children, "sequence"); - if(content != NULL) - { - schema_sequence(sdl, tsn, content, cur_type); - return TRUE; - } - return FALSE; -} - -/* -<all - id = ID - maxOccurs = 1 : 1 - minOccurs = (0 | 1) : 1 - {any attributes with non-schema namespace . . .}> - Content: (annotation?, element*) -</all> -*/ -int schema_all(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr all, sdlTypePtr cur_type) -{ - xmlNodePtr element, trav; - - trav = all->children; - FOREACHNODE(trav, "element", element) - { - schema_element(sdl, tsn, element, cur_type); - } - ENDFOREACH(trav); - return TRUE; -} - -/* -<group - name = NCName> - Content: (annotation?, (all | choice | sequence)) -</group> -*/ -int schema_group(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr groupType, sdlTypePtr cur_type) -{ - xmlNodePtr content; - xmlAttrPtr name; - - name = get_attribute(groupType->properties, "name"); - if(name != NULL) - { - - } - - content = get_node(groupType->children, "all"); - if(content != NULL) - { - schema_all(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(groupType->children, "choice"); - if(content != NULL) - { - schema_choice(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(groupType->children, "sequence"); - if(content != NULL) - { - schema_sequence(sdl, tsn, content, cur_type); - return TRUE; - } - return FALSE; -} -/* -<choice - id = ID - maxOccurs = (nonNegativeInteger | unbounded) : 1 - minOccurs = nonNegativeInteger : 1 - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (element | group | choice | sequence | any)*) -</choice> -*/ -int schema_choice(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr choiceType, sdlTypePtr cur_type) -{ - xmlNodePtr trav, data; - - //cur_type->property_type = CHOICE; - - trav = choiceType->children; - FOREACHNODE(trav, "element", data) - { - schema_element(sdl, tsn, data, cur_type); - } - ENDFOREACH(trav); - - trav = choiceType->children; - FOREACHNODE(trav, "group", data) - { - schema_group(sdl, tsn, data, cur_type); - } - ENDFOREACH(trav); - - trav = choiceType->children; - FOREACHNODE(trav, "choice", data) - { - schema_choice(sdl, tsn, data, cur_type); - } - ENDFOREACH(trav); - - trav = choiceType->children; - FOREACHNODE(trav, "sequence", data) - { - schema_sequence(sdl, tsn, data, cur_type); - } - ENDFOREACH(trav); - - trav = choiceType->children; - FOREACHNODE(trav, "any", data) - { - schema_any(sdl, tsn, data, cur_type); - } - ENDFOREACH(trav); - - return TRUE; -} - -/* -<sequence - id = ID - maxOccurs = (nonNegativeInteger | unbounded) : 1 - minOccurs = nonNegativeInteger : 1 - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (element | group | choice | sequence | any)*) -</sequence> -*/ -int schema_sequence(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr seqType, sdlTypePtr cur_type) -{ - xmlNodePtr trav; - - trav = seqType->children; - do - { - if(trav->type == XML_ELEMENT_NODE) - { - if(!strcmp(trav->name, "element")) - { - schema_element(sdl, tsn, trav, cur_type); - } - else if(!strcmp(trav->name, "group")) - { - schema_group(sdl, tsn, trav, cur_type); - } - else if(!strcmp(trav->name, "choice")) - { - schema_choice(sdl, tsn, trav, cur_type); - } - else if(!strcmp(trav->name, "sequence")) - { - schema_sequence(sdl, tsn, trav, cur_type); - } - else if(!strcmp(trav->name, "any")) - { - schema_any(sdl, tsn, trav, cur_type); - } - } - } - while(trav = trav->next); - - return TRUE; -} - -int schema_any(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr extType, sdlTypePtr cur_type) -{ - return TRUE; -} - -/* -<complexContent - id = ID - mixed = boolean - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (restriction | extension)) -</complexContent> -*/ -int schema_complexContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compCont, sdlTypePtr cur_type) -{ - xmlNodePtr content; - - content = get_node(compCont->children, "restriction"); - if(content != NULL) - { - schema_restriction_complexContent(sdl, tsn, content, cur_type); - return TRUE; - } - - return TRUE; -} - -/* -<complexType - abstract = boolean : false - block = (#all | List of (extension | restriction)) - final = (#all | List of (extension | restriction)) - id = ID - mixed = boolean : false - name = NCName - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))) -</complexType> -*/ -int schema_complexType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compType, sdlTypePtr cur_type) -{ - xmlNodePtr content; - xmlAttrPtr attrs, name, ns; - - attrs = compType->properties; - ns = get_attribute(attrs, "targetNamespace"); - if(ns == NULL) - ns = tsn; - - name = get_attribute(attrs, "name"); - if(name) - { - HashTable *ht; - sdlTypePtr newType, *ptr; - smart_str key = {0}; - - newType = malloc(sizeof(sdlType)); - memset(newType, 0, sizeof(sdlType)); - newType->name = strdup(name->children->content); - newType->namens = strdup(ns->children->content); - - if(cur_type == NULL) - { - ht = (*sdl)->types; - smart_str_appends(&key, newType->namens); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, newType->name); - smart_str_0(&key); - } - else - { - if(cur_type->elements == NULL) - { - cur_type->elements = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->elements, 0, NULL, delete_type, 1); - } - ht = cur_type->elements; - smart_str_appends(&key, newType->name); - } - - zend_hash_add(ht, key.c, key.len + 1, &newType, sizeof(sdlTypePtr), (void **)&ptr); - cur_type = (*ptr); - create_encoder((*sdl), cur_type, ns->children->content, name->children->content); - smart_str_free(&key); - } - - content = get_node(compType->children, "simpleContent"); - if(content != NULL) - { - schema_simpleContent(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(compType->children, "complexContent"); - if(content != NULL) - { - schema_complexContent(sdl, tsn, content, cur_type); - return TRUE; - } - - //(group | all | choice | sequence) - content = get_node(compType->children, "group"); - if(content != NULL) - { - schema_group(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(compType->children, "all"); - if(content != NULL) - { - schema_all(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(compType->children, "choice"); - if(content != NULL) - { - schema_choice(sdl, tsn, content, cur_type); - return TRUE; - } - - content = get_node(compType->children, "sequence"); - if(content != NULL) - schema_sequence(sdl, tsn, content, cur_type); - - return TRUE; -} -/* -<element - abstract = boolean : false - block = (#all | List of (extension | restriction | substitution)) - default = string - final = (#all | List of (extension | restriction)) - fixed = string - form = (qualified | unqualified) - id = ID - maxOccurs = (nonNegativeInteger | unbounded) : 1 - minOccurs = nonNegativeInteger : 1 - name = NCName - nillable = boolean : false - ref = QName - substitutionGroup = QName - type = QName - {any attributes with non-schema namespace . . .}> - Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*)) -</element> -*/ -int schema_element(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr element, sdlTypePtr cur_type) -{ - xmlNodePtr content; - xmlAttrPtr attrs, curattr, name, ns; - TSRMLS_FETCH(); - - attrs = element->properties; - ns = get_attribute(attrs, "targetNamespace"); - if(ns == NULL) - ns = tsn; - - name = get_attribute(attrs, "name"); - if(!name) - name = get_attribute(attrs, "ref"); - if(name) - { - HashTable *addHash; - sdlTypePtr newType, *tmp; - smart_str key = {0}; - - newType = malloc(sizeof(sdlType)); - - memset(newType, 0, sizeof(sdlType)); - newType->name = strdup(name->children->content); - newType->namens = strdup(tsn->children->content); - newType->nullable = FALSE; - newType->min_occurs = 1; - newType->max_occurs = 1; - - if(cur_type == NULL) - { - addHash = (*sdl)->types; - smart_str_appends(&key, newType->namens); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, newType->name); - } - else - { - if(cur_type->elements == NULL) - { - cur_type->elements = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->elements, 0, NULL, delete_type, 1); - } - addHash = cur_type->elements; - smart_str_appends(&key, newType->name); - } - - smart_str_0(&key); - zend_hash_add(addHash, key.c, key.len + 1, &newType, sizeof(sdlTypePtr), (void **)&tmp); - cur_type = (*tmp); - create_encoder((*sdl), cur_type, ns->children->content, name->children->content); - smart_str_free(&key); - } - - curattr = get_attribute(attrs, "maxOccurs"); - if(curattr) - { - if(!strcmp(curattr->children->content, "unbounded")) - cur_type->max_occurs = -1; - else - cur_type->max_occurs = atoi(curattr->children->content); - } - - curattr = get_attribute(attrs, "minOccurs"); - if(curattr) - cur_type->min_occurs = atoi(curattr->children->content); - - //nillable = boolean : false - attrs = element->properties; - curattr = get_attribute(attrs, "nillable"); - if(curattr) - { - if(!stricmp(curattr->children->content, "true") || - !stricmp(curattr->children->content, "1")) - cur_type->nullable = TRUE; - else - cur_type->nullable = FALSE; - } - else - cur_type->nullable = FALSE; - - //type = QName - curattr = get_attribute(attrs, "type"); - if(!curattr) - curattr = name; - if(curattr) - { - char *cptype, *str_ns; - xmlNsPtr nsptr; - - parse_namespace(curattr->children->content, &cptype, &str_ns); - if(str_ns) - nsptr = xmlSearchNs(element->doc, element, str_ns); - else - nsptr = xmlSearchNsByHref(element->doc, element, ns->children->content); - - cur_type->encode = get_create_encoder((*sdl), cur_type, (char *)nsptr->href, (char *)cptype); - if(str_ns) efree(str_ns); - if(cptype) efree(cptype); - } - - if(cur_type->max_occurs == -1 || cur_type->max_occurs > 1) - cur_type->encode = get_conversion(SOAP_ENC_ARRAY); - - content = get_node(element->children, "simpleType"); - if(content) - schema_simpleType(sdl, tsn, content, cur_type); - - content = get_node(element->children, "complexType"); - if(content) - schema_complexType(sdl, tsn, content, cur_type); - - return FALSE; -} - -/* -<attribute - default = string - fixed = string - form = (qualified | unqualified) - id = ID - name = NCName - ref = QName - type = QName - use = (optional | prohibited | required) : optional - {any attributes with non-schema namespace . . .}> - Content: (annotation?, (simpleType?)) -</attribute> -*/ -int schema_attribute(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr attrType, sdlTypePtr cur_type) -{ - xmlAttrPtr attr; - sdlAttributePtr newAttr; - xmlAttrPtr trav; - smart_str key = {0}; - - newAttr = malloc(sizeof(sdlAttribute)); - memset(newAttr, 0, sizeof(sdlAttribute)); - - if(cur_type->attributes == NULL) - { - cur_type->attributes = malloc(sizeof(HashTable)); - zend_hash_init(cur_type->attributes, 0, NULL, delete_attribute, 1); - } - - trav = attrType->properties; - FOREACHATTRNODE(trav, NULL, attr) - { - if(attr_is_equal_ex(trav, "default", SCHEMA_NAMESPACE)) - newAttr->def = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "fixed", SCHEMA_NAMESPACE)) - newAttr->fixed = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "form", SCHEMA_NAMESPACE)) - newAttr->form = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "id", SCHEMA_NAMESPACE)) - newAttr->id = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "name", SCHEMA_NAMESPACE)) - newAttr->name = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "ref", SCHEMA_NAMESPACE)) - newAttr->ref= strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "type", SCHEMA_NAMESPACE)) - newAttr->type = strdup(attr->children->content); - else if(attr_is_equal_ex(trav, "use", SCHEMA_NAMESPACE)) - newAttr->use = strdup(attr->children->content); - else - { - xmlNsPtr nsPtr = attr_find_ns(trav); - - if(strcmp(nsPtr->href, SCHEMA_NAMESPACE)) - { - smart_str key2 = {0}; - - if(!newAttr->extraAttributes) - { - newAttr->extraAttributes = malloc(sizeof(HashTable)); - zend_hash_init(newAttr->extraAttributes, 0, NULL, NULL, 1); - } - - smart_str_appends(&key2, nsPtr->href); - smart_str_appendc(&key2, ':'); - smart_str_appends(&key2, trav->name); - smart_str_0(&key2); - zend_hash_add(newAttr->extraAttributes, key2.c, key2.len + 1, &trav, sizeof(xmlAttrPtr), NULL); - smart_str_free(&key2); - } - } - } - ENDFOREACH(trav); - - - if(newAttr->ref || newAttr->name) - { - xmlNsPtr ns; - - if(newAttr->ref) - { - char *value, *prefix = NULL; - - parse_namespace(newAttr->ref, &value, &prefix); - ns = xmlSearchNs(attrType->doc, attrType, prefix); - smart_str_appends(&key, ns->href); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, value); - - if(value) - efree(value); - if(prefix) - efree(prefix); - } - else - { - ns = node_find_ns(attrType); - smart_str_appends(&key, ns->href); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, newAttr->name); - } - - - if(ns) - { - smart_str_0(&key); - zend_hash_add(cur_type->attributes, key.c, key.len + 1, &newAttr, sizeof(sdlAttributePtr), NULL); - smart_str_free(&key); - return TRUE; - } - } - - zend_hash_next_index_insert(cur_type->attributes, &newAttr, sizeof(sdlAttributePtr), NULL); - return TRUE; -}
\ No newline at end of file diff --git a/ext/soap/php_schema.h b/ext/soap/php_schema.h deleted file mode 100644 index c43a221608..0000000000 --- a/ext/soap/php_schema.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef PHP_SCHEMA_H -#define PHP_SCHEMA_H - -int load_schema(sdlPtr *sdl,xmlNodePtr schema); -int schema_simpleType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr simpleType, sdlTypePtr cur_type); -int schema_complexType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compType, sdlTypePtr cur_type); -int schema_sequence(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr seqType, sdlTypePtr cur_type); -int schema_list(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr listType, sdlTypePtr cur_type); -int schema_union(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr unionType, sdlTypePtr cur_type); -int schema_simpleContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr simpCompType, sdlTypePtr cur_type); -int schema_restriction_simpleType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type); -int schema_restriction_simpleContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type); -int schema_restriction_complexContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr restType, sdlTypePtr cur_type); -int schema_extension(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr extType, sdlTypePtr cur_type); -int schema_all(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr extType, sdlTypePtr cur_type); -int schema_group(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr groupType, sdlTypePtr cur_type); -int schema_choice(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr choiceType, sdlTypePtr cur_type); -int schema_element(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr element, sdlTypePtr cur_type); -int schema_attribute(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr attrType, sdlTypePtr cur_type); -int schema_any(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr extType, sdlTypePtr cur_type); - -int schema_restriction_var_int(xmlNodePtr val, sdlRestrictionIntPtr *valptr); -void delete_restriction_var_int(void *rvi); - -int schema_restriction_var_char(xmlNodePtr val, sdlRestrictionCharPtr *valptr); -void delete_schema_restriction_var_char(void *srvc); - -#endif diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c deleted file mode 100644 index 9a9ce59dff..0000000000 --- a/ext/soap/php_sdl.c +++ /dev/null @@ -1,1126 +0,0 @@ -#include "php_soap.h" - -encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, char *type) -{ - encodePtr enc = NULL; - TSRMLS_FETCH(); - - enc = get_conversion_from_type(data, type); - if(enc == NULL && sdl) - enc = get_conversion_from_type_ex(sdl->encoders, data, type); - if(enc == NULL) - enc = get_conversion(UNKNOWN_TYPE); - - return enc; -} - -encodePtr get_encoder(sdlPtr sdl, char *ns, char *type) -{ - encodePtr enc = NULL; - char *nscat; - TSRMLS_FETCH(); - - nscat = emalloc(strlen(ns) + strlen(type) + 2); - sprintf(nscat, "%s:%s", ns, type); - - enc = get_encoder_ex(sdl, nscat); - - efree(nscat); - return enc; -} - -encodePtr get_encoder_ex(sdlPtr sdl, char *nscat) -{ - encodePtr enc = NULL; - TSRMLS_FETCH(); - - enc = get_conversion_from_href_type(nscat); - if(enc == NULL && sdl) - enc = get_conversion_from_href_type_ex(sdl->encoders, nscat, strlen(nscat)); - if(enc == NULL) - enc = get_conversion(UNKNOWN_TYPE); - return enc; -} - -encodePtr get_create_encoder(sdlPtr sdl, sdlTypePtr cur_type, char *ns, char *type) -{ - encodePtr enc = NULL; - smart_str nscat = {0}; - TSRMLS_FETCH(); - - smart_str_appends(&nscat, ns); - smart_str_appendc(&nscat, ':'); - smart_str_appends(&nscat, type); - smart_str_0(&nscat); - - enc = get_conversion_from_href_type(nscat.c); - if(enc == NULL) - enc = get_conversion_from_href_type_ex(sdl->encoders, nscat.c, nscat.len); - if(enc == NULL) - enc = create_encoder(sdl, cur_type, ns, type); - - smart_str_free(&nscat); - return enc; -} - -encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, char *ns, char *type) -{ - smart_str nscat = {0}; - encodePtr enc; - - enc = malloc(sizeof(encode)); - memset(enc, 0, sizeof(encode)); - - smart_str_appends(&nscat, ns); - smart_str_appendc(&nscat, ':'); - smart_str_appends(&nscat, type); - smart_str_0(&nscat); - - enc->details.ns = strdup(ns); - enc->details.type_str = strdup(type); - enc->details.sdl_type = cur_type; - enc->to_xml = sdl_guess_convert_xml; - enc->to_zval = sdl_guess_convert_zval; - - if(sdl->encoders == NULL) - { - sdl->encoders = malloc(sizeof(HashTable)); - zend_hash_init(sdl->encoders, 0, NULL, delete_encoder, 1); - } - zend_hash_add(sdl->encoders, nscat.c, nscat.len + 1, &enc, sizeof(encodePtr), NULL); - smart_str_free(&nscat); - return enc; -} - -zval *sdl_guess_convert_zval(encodeType enc, xmlNodePtr data) -{ - sdlTypePtr type; - zval *ret; - - type = enc.sdl_type; - - if(type->encode) - { - if(type->encode->details.type == IS_ARRAY || - type->encode->details.type == SOAP_ENC_ARRAY) - ret = to_zval_array(enc, data); - else - ret = master_to_zval(type->encode, data); - } - else if(zend_hash_num_elements(type->elements) == 1) - { - sdlTypePtr *t; - zend_hash_internal_pointer_reset(type->elements); - if(zend_hash_get_current_data(type->elements, (void **)&t) != FAILURE && - (*t)->max_occurs != 1) - ret = to_zval_array(enc, data); - } - if(ret) - return ret; - else - return guess_zval_convert(enc, data); -} - -xmlNodePtr sdl_guess_convert_xml(encodeType enc, zval *data, int style) -{ - sdlTypePtr type; - xmlNodePtr ret = NULL; - - type = enc.sdl_type; - - if(type->encode) - { - if(type->encode->details.type == IS_ARRAY || - type->encode->details.type == SOAP_ENC_ARRAY) - ret = sdl_to_xml_array(type, data, style); - else - ret = master_to_xml(type->encode, data, style); - } - else if(type->elements) - { - sdlTypePtr *t; - if(zend_hash_num_elements(type->elements) == 1) - { - zend_hash_internal_pointer_reset(type->elements); - if(zend_hash_get_current_data(type->elements, (void **)&t) != FAILURE && - (*t)->max_occurs != 1) - ret = sdl_to_xml_array((*t), data, style); - } - if(!ret) - ret = sdl_to_xml_object(type, data, style); - } - else - ret = guess_xml_convert(enc, data, style); - - //set_ns_and_type(ret, enc); - return ret; -} - -xmlNodePtr sdl_to_xml_object(sdlTypePtr type, zval *data, int style) -{ - xmlNodePtr ret; - sdlTypePtr *t, tmp; - - ret = xmlNewNode(NULL, "BOGUS"); - - zend_hash_internal_pointer_reset(type->elements); - while(zend_hash_get_current_data(type->elements, (void **)&t) != FAILURE) - { - zval **prop; - tmp = *t; - if(zend_hash_find(Z_OBJPROP_P(data), tmp->name, strlen(tmp->name) + 1, (void **)&prop) == FAILURE) - { - if(tmp->nullable == FALSE) - php_error(E_ERROR, "Error encoding object to xml missing property \"%s\"", tmp->name); - } - else - { - xmlNodePtr newNode; - - newNode = master_to_xml(tmp->encode, (*prop), style); - xmlNodeSetName(newNode, tmp->name); - xmlAddChild(ret, newNode); - } - zend_hash_move_forward(type->elements); - } - - return ret; -} - -xmlNodePtr sdl_to_xml_array(sdlTypePtr type, zval *data, int style) -{ - smart_str array_type_and_size = {0}, array_type = {0}; - int i; - xmlNodePtr xmlParam; - TSRMLS_FETCH(); - - xmlParam = xmlNewNode(NULL,"BOGUS"); - - FIND_ZVAL_NULL(data, xmlParam); - - if(Z_TYPE_P(data) == IS_ARRAY) - { - sdlAttributePtr *arrayType; - i = zend_hash_num_elements(Z_ARRVAL_P(data)); - - if(style == SOAP_ENCODED) - { - if(type->attributes && - zend_hash_find(type->attributes, SOAP_ENC_NAMESPACE":arrayType", - sizeof(SOAP_ENC_NAMESPACE":arrayType"), - (void **)&arrayType) == SUCCESS) - { - xmlAttrPtr *wsdl; - if(zend_hash_find((*arrayType)->extraAttributes, WSDL_NAMESPACE":arrayType", sizeof(WSDL_NAMESPACE":arrayType"), (void **)&wsdl) == SUCCESS) - { - char *ns = NULL, *value; - smart_str *prefix = encode_new_ns(); - smart_str smart_ns = {0}; - xmlNsPtr myNs; - - parse_namespace((*wsdl)->children->content, &value, &ns); - myNs = xmlSearchNs((*wsdl)->doc, (*wsdl)->parent, ns); - - smart_str_appendl(&smart_ns, "xmlns:", sizeof("xmlns:") - 1); - smart_str_appendl(&smart_ns, prefix->c, prefix->len); - smart_str_0(&smart_ns); - - xmlSetProp(xmlParam, smart_ns.c, myNs->href); - smart_str_appends(&array_type_and_size, prefix->c); - smart_str_appendc(&array_type_and_size, ':'); - smart_str_appends(&array_type_and_size, value); - smart_str_0(&array_type_and_size); - } - } - else - { - smart_str_appends(&array_type_and_size, type->name); - smart_str_appendc(&array_type_and_size, '['); - smart_str_append_long(&array_type_and_size, i); - smart_str_appendc(&array_type_and_size, ']'); - smart_str_0(&array_type_and_size); - } - xmlSetProp(xmlParam, SOAP_ENC_NS_PREFIX":arrayType", array_type_and_size.c); - - smart_str_free(&array_type_and_size); - smart_str_free(&array_type); - } - - zend_hash_internal_pointer_reset(data->value.ht); - for(;i > 0;i--) - { - xmlNodePtr xparam; - zval **zdata; - encodePtr enc; - zend_hash_get_current_data(data->value.ht, (void **)&zdata); - - enc = get_conversion((*zdata)->type); - xparam = master_to_xml(enc, (*zdata), style); - - xmlNodeSetName(xparam, type->name); - xmlAddChild(xmlParam, xparam); - zend_hash_move_forward(data->value.ht); - } - } - - if(style == SOAP_ENCODED) - set_ns_and_type_ex(xmlParam, type->namens, type->name); - return xmlParam; -} - -zval *sdl_convert_zval(encodeType enc, xmlNodePtr data) -{ - zval *ret; - MAKE_STD_ZVAL(ret); - ZVAL_STRING(ret, "blah", 1); - - return ret; -} - -/* -zval *sdl_convert_zval(xmlNodePtr data, sdlTypePtr type) -{ - found = zend_hash_find(EG(class_table), class_name, class_name_len + 1, (void **)&ce); - if(found != FAILURE) - { - service->type = SOAP_CLASS; - service->soap_class.ce = ce; - } -} -//this function will take a zval and apply all attributes of sldTypePtr -zval *sdl_convert_zval_to_zval(zval *data, sdlTypePtr type) -{ -} -*/ - -sdlPtr get_sdl(char *uri) -{ - sdlPtr tmp, *hndl; - TSRMLS_FETCH(); - - tmp = NULL; - hndl = NULL; - if(zend_hash_find(SOAP_GLOBAL(sdls), uri, strlen(uri), (void **)&hndl) == FAILURE) - { - tmp = load_wsdl(uri, NULL); - zend_hash_add(SOAP_GLOBAL(sdls), uri, strlen(uri), &tmp, sizeof(sdlPtr), NULL); - } - else - tmp = *hndl; - - return tmp; -} - -sdlBindingPtr get_binding_from_type(sdlPtr sdl, int type) -{ - sdlBindingPtr *binding; - - for(zend_hash_internal_pointer_reset(sdl->bindings); - zend_hash_get_current_data(sdl->bindings, (void **) &binding) == SUCCESS; - zend_hash_move_forward(sdl->bindings)) - { - if((*binding)->bindingType == type) - return *binding; - } - return NULL; -} - -sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns) -{ - sdlBindingPtr binding = NULL; - smart_str key = {0}; - - smart_str_appends(&key, ns); - smart_str_appendc(&key, ':'); - smart_str_appends(&key, name); - - zend_hash_find(sdl->bindings, key.c, key.len, (void **)&binding); - - smart_str_free(&key); - return binding; -} - -int load_php_sdl() -{ -/* xmlNodePtr rootElement; - xmlNodePtr services; - - SOAP_SERVER_GLOBAL_VARS(); - SOAP_SERVER_GLOBAL(availableServices) = xmlParseFile(servicesFile); - rootElement = SOAP_SERVER_GLOBAL(availableServices)->children; - services = rootElement->children; - - do - { - if(IS_ELEMENT_TYPE(services,PHP_SOAPSERVER_SERVICE)) - { - phpSoapServicePtr newService; - xmlNodePtr attrib, trav; - HashTable *fn = NULL; - HashTable *include = NULL; - HashTable *cl = NULL; - - //Init New Service - newService = emalloc(sizeof(phpSoapService)); - newService->serviceNode = services; - newService->started = FALSE; - - fn = newService->functions = emalloc(sizeof(HashTable)); - include = newService->include_files = emalloc(sizeof(HashTable)); - zend_hash_init(fn, 0, NULL, free_function, 0); - zend_hash_init(include, 0, NULL, ZVAL_PTR_DTOR, 0); - - attrib = services->properties; - trav = attrib; - //Get Attributes of Service - do - { - if(IS_ATTRIBUTE_TYPE(trav,PHP_SOAPSERVER_SERVICE_NAME)) - { - char* name = ATTRIBUTE_VALUE(trav); - - //Assign Service Vals - ALLOC_INIT_ZVAL(newService->serviceName); - ZVAL_STRING(newService->serviceName,name,1); - } - - if(IS_ATTRIBUTE_TYPE(trav,PHP_SOAPSERVER_SERVICE_STARTED)) - { - char* started = ATTRIBUTE_VALUE(trav); - - //Assign Service Vals - if(!stricmp(started,"true")) - newService->started = TRUE; - } - } - while(trav = trav->next); - - //Get ChildNodes of Service - trav = services->children; - do - { - //Include Files - if(IS_ELEMENT_TYPE(trav,PHP_SOAPSERVER_SERVICE_INCLUDE_FILE)) - { - xmlNodePtr trav1 = trav->properties; - do - { - if(IS_ATTRIBUTE_TYPE(trav1,PHP_SOAPSERVER_SERVICE_INCLUDE_FILE_NAME)) - { - char* name = ATTRIBUTE_VALUE(trav1); - zval* z_name; - ALLOC_INIT_ZVAL(z_name); - ZVAL_STRING(z_name,name,1); - zend_hash_next_index_insert(include,&z_name,sizeof(zval),NULL); - } - } - while(trav1 = trav1->next); - } - - //Functions - if(IS_ELEMENT_TYPE(trav,PHP_SOAPSERVER_SERVICE_FUNCTION)) - { - phpSoapServiceFunctionPtr function; - xmlNodePtr trav1; - HashTable *par = NULL; - - function = emalloc(sizeof(phpSoapServiceFunction)); - function->functionNode = trav; - - par = function->functionParams = emalloc(sizeof(HashTable)); - zend_hash_init(par, 0, NULL, free_param, 0); - - trav1 = trav->properties; - - do - { - if(IS_ATTRIBUTE_TYPE(trav1,PHP_SOAPSERVER_SERVICE_FUNCTION_NAME)) - { - char* name = ATTRIBUTE_VALUE(trav1); - ALLOC_INIT_ZVAL(function->functionName); - ZVAL_STRING(function->functionName,name,1); - } - } - while(trav1 = trav1->next); - - trav1 = trav->children; - do - { - if(IS_ELEMENT_TYPE(trav1,PHP_SOAPSERVER_SERVICE_FUNCTION_PARAM)) - { - phpSoapServiceParamPtr param; - xmlNodePtr trav2; - - param = emalloc(sizeof(phpSoapServiceParam)); - param->paramNode = trav1; - - trav2 = trav1->properties; - - do - { - if(IS_ATTRIBUTE_TYPE(trav2,PHP_SOAPSERVER_SERVICE_FUNCTION_PARAM_NAME)) - { - char* name = ATTRIBUTE_VALUE(trav2); - ALLOC_INIT_ZVAL(param->paramName); - ZVAL_STRING(param->paramName,name,1); - } - else if(IS_ATTRIBUTE_TYPE(trav2,PHP_SOAPSERVER_SERVICE_FUNCTION_PARAM_TYPE)) - { - char* type = ATTRIBUTE_VALUE(trav2); - ALLOC_INIT_ZVAL(param->paramType); - ZVAL_STRING(param->paramType,type,1); - } - else if(IS_ATTRIBUTE_TYPE(trav2,PHP_SOAPSERVER_SERVICE_FUNCTION_PARAM_POSITION)) - { - char* val = ATTRIBUTE_VALUE(trav2); - ALLOC_INIT_ZVAL(param->paramName); - ZVAL_LONG(param->paramName,atoi(val)); - } - } - while(trav2 = trav2->next); - zend_hash_add(par,Z_STRVAL_P(param->paramName),Z_STRLEN_P(param->paramName),param,sizeof(phpSoapServiceParam),NULL); - } - } - while(trav1 = trav1->next); - zend_hash_add(fn,Z_STRVAL_P(function->functionName),Z_STRLEN_P(function->functionName),function,sizeof(phpSoapServiceFunction),NULL); - } - - //Classes - if(IS_ELEMENT_TYPE(trav,PHP_SOAPSERVER_SERVICE_CLASS)) - { - xmlNodePtr att, func; - att = trav->properties; - - if(fn == NULL) - { - fn = newService->functions = emalloc(sizeof(HashTable)); - zend_hash_init(fn, 0, NULL, ZVAL_PTR_DTOR, 0); - } - - } - - }while(trav = trav->next); - - zend_hash_add(SOAP_SERVER_GLOBAL(services),Z_STRVAL_P(newService->serviceName),Z_STRLEN_P(newService->serviceName),newService,sizeof(phpSoapService),NULL); - } - } - while(services = services->next); -*/ - return TRUE; -} - -int write_php_sdl() -{ - return TRUE; -} - -sdlPtr load_wsdl(char *struri, sdlPtr parent) -{ - xmlDocPtr wsdl; - xmlNodePtr root, definitions, types, binding, schema, service, import; - xmlNodePtr trav, trav2, trav3; - xmlAttrPtr targetNamespace; - sdlPtr tmpsdl; - TSRMLS_FETCH(); - - if(!parent) - { - tmpsdl = malloc(sizeof(sdl)); - memset(tmpsdl, 0, sizeof(sdl)); - tmpsdl->source = strdup(struri); - } - else - tmpsdl = parent; - - wsdl = xmlParseFile(struri); - xmlCleanupParser(); - - if(!wsdl) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Could't load"); - - tmpsdl->doc = wsdl; - root = wsdl->children; - definitions = get_node(root, "definitions"); - if(!definitions) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Could't find definitions"); - - targetNamespace = get_attribute(definitions->properties, "targetNamespace"); - if(targetNamespace) - tmpsdl->target_ns = strdup(targetNamespace->children->content); - - types = get_node(definitions->children, "types"); - if(types) - { - trav = types->children; - FOREACHNODE(trav, "schema", schema) - { - load_schema(&tmpsdl, schema); - } - ENDFOREACH(trav); - } - - trav = definitions->children; - FOREACHNODE(trav, "import", import) - { - xmlAttrPtr tmp = get_attribute(import->properties, "location"); - if(tmp) - load_wsdl(tmp->children->content, tmpsdl); - } - ENDFOREACH(trav); - - service = get_node(definitions->children, "service"); - if(service != NULL) - { - xmlAttrPtr name; - xmlNodePtr trav, port; - - name = get_attribute(service->properties, "name"); - if(!name) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No name associated with service"); - - trav = service->children; - FOREACHNODE(trav, "port", port) - { - xmlAttrPtr type, name, bindingAttr, location; - xmlNodePtr portType, operation; - xmlNodePtr address; - char *ns, *ctype; - sdlBindingPtr tmpbinding; - - tmpbinding = malloc(sizeof(sdlBinding)); - memset(tmpbinding, 0, sizeof(sdlBinding)); - - name = get_attribute(port->properties, "name"); - if(!name) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No name associated with port"); - - bindingAttr = get_attribute(port->properties, "binding"); - if(bindingAttr == NULL) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No binding associated with port"); - - //find address and figure out binding type - address = get_node(port->children, "address"); - if(!address) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No address associated with port"); - - location = get_attribute(address->properties, "location"); - if(!location) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No location associated with port"); - - tmpbinding->location = strdup(location->children->content); - - if(address->ns && !strcmp(address->ns->href, WSDL_SOAP_NAMESPACE)) - tmpbinding->bindingType = BINDING_SOAP; - else if(address->ns && !strcmp(address->ns->href, WSDL_HTTP_NAMESPACE)) - tmpbinding->bindingType = BINDING_HTTP; - - parse_namespace(bindingAttr->children->content, &ctype, &ns); - binding = get_node_with_attribute(definitions->children, "binding", "name", ctype); - if(ns) efree(ns); if(ctype) efree(ctype); - - if(!binding) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No binding"); - - if(tmpbinding->bindingType == BINDING_SOAP) - { - sdlSoapBindingPtr soapBinding; - xmlNodePtr soapBindingNode; - xmlAttrPtr tmp; - - soapBinding = malloc(sizeof(sdlSoapBinding)); - memset(soapBinding, 0, sizeof(sdlSoapBinding)); - - soapBindingNode = get_node_ex(binding->children, "binding", WSDL_SOAP_NAMESPACE); - if(soapBindingNode) - { - tmp = get_attribute(soapBindingNode->properties, "style"); - if(tmp && !strcmp(tmp->children->content, "document")) - soapBinding->style = SOAP_DOCUMENT; - else - soapBinding->style = SOAP_RPC; - - tmp = get_attribute(soapBindingNode->properties, "transport"); - if(tmp) - { - if(strcmp(tmp->children->content, WSDL_HTTP_TRANSPORT)) - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: PHP-SOAP doesn't support transport '%s'", tmp->children->content); - - soapBinding->transport = strdup(tmp->children->content); - } - tmpbinding->bindingAttributes = (void *)soapBinding; - } - } - - name = get_attribute(binding->properties, "name"); - if(name == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"name\" attribute for \"binding\")"); - - tmpbinding->name = strdup(name->children->content); - - type = get_attribute(binding->properties, "type"); - if(type == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"type\" attribute for \"binding\")"); - - parse_namespace(type->children->content, &ctype, &ns); - portType = get_node_with_attribute(definitions->children, "portType", "name", ctype); - if(portType == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"portType\" with name \"%s\")", name->children->content); - if(ctype) efree(ctype); if(ns) efree(ns); - - trav2 = binding->children; - FOREACHNODE(trav2, "operation", operation) - { - sdlFunctionPtr function; - xmlNodePtr input, output, fault, portTypeOperation, portTypeInput, msgInput, msgOutput; - xmlAttrPtr op_name, paramOrder; - - op_name = get_attribute(operation->properties, "name"); - if(op_name == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"name\" attribute for \"operation\")"); - - portTypeOperation = get_node_with_attribute(portType->children, "operation", "name", op_name->children->content); - if(portTypeOperation == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"portType/operation\" with name \"%s\")", op_name->children->content); - - function = malloc(sizeof(sdlFunction)); - function->functionName = strdup(op_name->children->content); - function->requestParameters = NULL; - function->responseParameters = NULL; - function->responseName = NULL; - function->bindingAttributes = NULL; - function->bindingType = tmpbinding->bindingType; - - if(tmpbinding->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr soapFunctionBinding; - sdlSoapBindingPtr soapBinding; - xmlNodePtr soapOperation; - xmlAttrPtr tmp; - - soapFunctionBinding = malloc(sizeof(sdlSoapBindingFunction)); - memset(soapFunctionBinding, 0, sizeof(sdlSoapBindingFunction)); - soapBinding = (sdlSoapBindingPtr)tmpbinding->bindingAttributes; - soapFunctionBinding->style = soapBinding->style; - - soapOperation = get_node_ex(operation->children, "operation", WSDL_SOAP_NAMESPACE); - if(soapOperation) - { - tmp = get_attribute(soapOperation->properties, "soapAction"); - if(tmp) - soapFunctionBinding->soapAction = strdup(tmp->children->content); - - tmp = get_attribute(soapOperation->properties, "style"); - if(tmp && !strcmp(tmp->children->content, "rpc")) - soapFunctionBinding->style = SOAP_RPC; - else if(!soapBinding->style) - soapFunctionBinding->style = SOAP_DOCUMENT; - } - - function->bindingAttributes = (void *)soapFunctionBinding; - } - - input = get_node(operation->children, "input"); - if(input != NULL) - { - xmlAttrPtr message; - xmlNodePtr part; - char *ns, *ctype; - - portTypeInput = get_node(portTypeOperation->children, "input"); - message = get_attribute(portTypeInput->properties, "message"); - if(message == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing name for \"input\" of \"%s\")", op_name->children->content); - - function->requestName = strdup(function->functionName); - function->requestParameters = malloc(sizeof(HashTable)); - zend_hash_init(function->requestParameters, 0, NULL, delete_paramater, 1); - - parse_namespace(message->children->content, &ctype, &ns); - msgInput = get_node_with_attribute(definitions->children, "message", "name", ctype); - if(msgInput == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"message\" with name \"%s\")", message->children->content); - if(ctype) efree(ctype); if(ns) efree(ns); - - if(tmpbinding->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr soapFunctionBinding = function->bindingAttributes; - xmlNodePtr body; - xmlAttrPtr tmp; - - body = get_node_ex(input->children, "body", WSDL_SOAP_NAMESPACE); - if(body) - { - tmp = get_attribute(body->properties, "use"); - if(tmp && !strcmp(tmp->children->content, "literal")) - soapFunctionBinding->input.use = SOAP_LITERAL; - else - soapFunctionBinding->input.use = SOAP_ENCODED; - - tmp = get_attribute(body->properties, "namespace"); - if(tmp) - soapFunctionBinding->input.ns = strdup(tmp->children->content); - - tmp = get_attribute(body->properties, "parts"); - if(tmp) - soapFunctionBinding->input.parts = strdup(tmp->children->content); - - tmp = get_attribute(body->properties, "encodingStyle"); - if(tmp) - soapFunctionBinding->input.encodingStyle = strdup(tmp->children->content); - } - } - - trav3 = msgInput->children; - FOREACHNODE(trav3, "part", part) - { - xmlAttrPtr element, type, name; - sdlParamPtr param; - - param = malloc(sizeof(sdlParam)); - param->order = 0; - - name = get_attribute(part->properties, "name"); - if(name == NULL) - php_error(E_ERROR, "Error parsing wsdl (No name associated with part \"%s\")", msgInput->name); - - param->paramName = strdup(name->children->content); - - element = get_attribute(part->properties, "element"); - if(element != NULL) - param->encode = get_encoder_from_prefix(tmpsdl, part, element->children->content); - - type = get_attribute(part->properties, "type"); - if(type != NULL) - param->encode = get_encoder_from_prefix(tmpsdl, part, type->children->content); - - zend_hash_next_index_insert(function->requestParameters, ¶m, sizeof(sdlParamPtr), NULL); - } - ENDFOREACH(trav3); - } - - paramOrder = get_attribute(portTypeOperation->properties, "parameterOrder"); - if(paramOrder) - { - - } - - output = get_node(portTypeOperation->children, "output"); - if(output != NULL) - { - xmlAttrPtr message; - xmlNodePtr part; - char *ns, *ctype; - - - function->responseName = malloc(strlen(function->functionName) + strlen("Response") + 1); - sprintf(function->responseName, "%sResponse\0", function->functionName); - function->responseParameters = malloc(sizeof(HashTable)); - zend_hash_init(function->responseParameters, 0, NULL, delete_paramater, 1); - - message = get_attribute(output->properties, "message"); - if(message == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing name for \"output\" of \"%s\")", op_name->children->content); - - parse_namespace(message->children->content, &ctype, &ns); - msgOutput = get_node_with_attribute(definitions->children, "message", "name", ctype); - if(msgOutput == NULL) - php_error(E_ERROR, "Error parsing wsdl (Missing \"message\" with name \"%s\")", message->children->content); - if(ctype) efree(ctype); if(ns) efree(ns); - - if(tmpbinding->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr soapFunctionBinding = function->bindingAttributes; - xmlNodePtr body; - xmlAttrPtr tmp; - - body = get_node_ex(output->children, "body", WSDL_SOAP_NAMESPACE); - if(body) - { - tmp = get_attribute(body->properties, "use"); - if(tmp && !strcmp(tmp->children->content, "literal")) - soapFunctionBinding->output.use = SOAP_LITERAL; - else - soapFunctionBinding->output.use = SOAP_ENCODED; - - tmp = get_attribute(body->properties, "namespace"); - if(tmp) - soapFunctionBinding->output.ns = strdup(tmp->children->content); - - tmp = get_attribute(body->properties, "parts"); - if(tmp) - soapFunctionBinding->output.parts = strdup(tmp->children->content); - - tmp = get_attribute(body->properties, "encodingStyle"); - if(tmp) - soapFunctionBinding->output.encodingStyle = strdup(tmp->children->content); - } - } - - trav3 = msgOutput->children; - FOREACHNODE(trav3, "part", part) - { - sdlParamPtr param; - xmlAttrPtr element, type, name; - - param = malloc(sizeof(sdlParam)); - param->order = 0; - - name = get_attribute(part->properties, "name"); - if(name == NULL) - php_error(E_ERROR, "Error parsing wsdl (No name associated with part \"%s\")", msgOutput->name); - - param->paramName = strdup(name->children->content); - - element = get_attribute(part->properties, "element"); - if(element) - param->encode = get_encoder_from_prefix(tmpsdl, part, element->children->content); - - type = get_attribute(part->properties, "type"); - if(type) - param->encode = get_encoder_from_prefix(tmpsdl, part, type->children->content); - - zend_hash_next_index_insert(function->responseParameters, ¶m, sizeof(sdlParamPtr), NULL); - } - ENDFOREACH(trav3); - } - - fault = get_node(operation->children, "fault"); - if(!fault) - { - } - - if(!tmpbinding->functions) - { - tmpbinding->functions = malloc(sizeof(HashTable)); - zend_hash_init(tmpbinding->functions, 0, NULL, delete_function, 1); - } - - zend_hash_add(tmpbinding->functions, php_strtolower(function->functionName, strlen(function->functionName)), strlen(function->functionName), &function, sizeof(sdlFunctionPtr), NULL); - } - ENDFOREACH(trav2); - - if(!tmpsdl->bindings) - { - tmpsdl->bindings = malloc(sizeof(HashTable)); - zend_hash_init(tmpsdl->bindings, 0, NULL, delete_binding, 1); - } - - zend_hash_add(tmpsdl->bindings, tmpbinding->name, strlen(tmpbinding->name), &tmpbinding, sizeof(sdlBindingPtr), NULL); - } - ENDFOREACH(trav); - - } - else - php_error(E_ERROR, "Error parsing wsdl (\"Couldn't bind to service\")"); - - return tmpsdl; -} - -int write_wsdl() -{ - return TRUE; -} - -int write_ms_sdl() -{ - return TRUE; -} - -int load_ms_sdl(char *struri,int force_load) -{ -/* Commenting this out. Does anyone need it? - - if(get_sdl(struri) == NULL || force_load) - { - SOAP_TLS_VARS(); - xmlDocPtr sdl = xmlParseFile(struri); - xmlNodePtr schema,trav,trav2,req,res,paramOrd,reqRes,address,serviceAdd,service,soap,serviceDesc,root = sdl->children; - xmlAttrPtr tmpattr,uri; - char *add,*functionName,*soapAction,*request,*response,*parameterOrder,*value,*namespace; - SDLPtr sdlPtr; - SoapFunctionPtr tmpFunction; - zval *tempZval; - serviceDesc = get_node(root,"serviceDescription"); - soap = get_node(serviceDesc->children,"soap"); - trav = soap->children; - sdlPtr = emalloc(sizeof(SDL)); - - ALLOC_INIT_ZVAL(sdlPtr->sdlUri); - ZVAL_STRING(sdlPtr->sdlUri,struri,1); - - FOREACHNODE(trav,"service",service) - { - sdlPtr->soapFunctions = emalloc(sizeof(HashTable)); - sdlPtr->addresses = emalloc(sizeof(HashTable)); - zend_hash_init(sdlPtr->soapFunctions, 0, NULL, delete_function, 0); - zend_hash_init(sdlPtr->addresses, 0, NULL, ZVAL_PTR_DTOR, 0); - - serviceAdd = get_node(service->children,"addresses"); - trav2 = serviceAdd->children; - ALLOC_INIT_ZVAL(tempZval); - FOREACHNODE(trav2,"address",address) - { - uri = get_attribute(address->properties,"uri"); - add = uri->children->content; - ZVAL_STRING(tempZval,add,1); - zend_hash_next_index_insert(sdlPtr->addresses,tempZval,sizeof(zval),NULL); - } - ENDFOREACH(trav2); - trav2 = service->children; - FOREACHNODE(trav2,"requestResponse",reqRes) - { - tmpFunction = emalloc(sizeof(SoapFunction)); - - tmpattr = get_attribute(reqRes->properties,"name"); - functionName = tmpattr->children->content; - ALLOC_INIT_ZVAL(tmpFunction->functionName); - ZVAL_STRING(tmpFunction->functionName,functionName,1); - - tmpattr = get_attribute(reqRes->properties,"soapAction"); - soapAction = tmpattr->children->content; - ALLOC_INIT_ZVAL(tmpFunction->soapAction); - ZVAL_STRING(tmpFunction->soapAction,soapAction,1); - - //Request - req = get_node(reqRes->children,"request"); - tmpattr = get_attribute(req->properties,"ref"); - if(tmpattr != NULL) - { - request = tmpattr->children->content; - parse_namespace(request,&value,&namespace); - ALLOC_INIT_ZVAL(tmpFunction->requestName); - ZVAL_STRING(tmpFunction->requestName,value,1); - tmpFunction->requestParameters = emalloc(sizeof(HashTable)); - zend_hash_init(tmpFunction->requestParameters, 0, NULL, delete_paramater, 0); - efree(value); - efree(namespace); - } - - //Response - res = get_node(reqRes->children,"response"); - tmpattr = get_attribute(res->properties,"ref"); - if(tmpattr != NULL) - { - response = tmpattr->children->content; - parse_namespace(response,&value,&namespace); - ALLOC_INIT_ZVAL(tmpFunction->responseName); - ZVAL_STRING(tmpFunction->responseName,value,1); - tmpFunction->responseParameters = emalloc(sizeof(HashTable)); - zend_hash_init(tmpFunction->responseParameters, 0, NULL, delete_paramater, 0); - efree(value); - efree(namespace); - } - - //Parameters - paramOrd = get_node(reqRes->children,"parameterorder"); - if(paramOrd != NULL) - { - zval *space,*array,**strval; - int count,i; - ALLOC_INIT_ZVAL(space); - ZVAL_STRING(space," ",0); - parameterOrder = paramOrd->children->content; - ZVAL_STRING(tempZval,parameterOrder,1); - ALLOC_INIT_ZVAL(array); - array_init(array); - - //Split on space - php_explode(space, tempZval, array, -1); - zend_hash_internal_pointer_reset(array->value.ht); - count = zend_hash_num_elements(array->value.ht); - - for(i = 0;i < count;i++) - { - SoapParamPtr param; - param = emalloc(sizeof(SoapParam)); - param->order = i+1; - param->type = NULL; - zend_hash_get_current_data(array->value.ht,(void **)&strval); - ALLOC_INIT_ZVAL(param->paramName); - ZVAL_STRING(param->paramName,Z_STRVAL_PP(strval),1); - zend_hash_next_index_insert(tmpFunction->requestParameters,param,sizeof(SoapParam),NULL); - zend_hash_move_forward(array->value.ht); - } - } - zend_hash_add(sdlPtr->soapFunctions,(char *)php_strtolower(functionName,strlen(functionName)),strlen(functionName),tmpFunction,sizeof(SoapFunction),NULL); - } - ENDFOREACH(trav2); - } - ENDFOREACH(trav); - - trav = serviceDesc->children; - FOREACHNODE(trav,"schema",schema) - { - load_schema(&sdlPtr, schema); - } - ENDFOREACH(trav); - sdlPtr->have_sdl = 1; - map_types_to_functions(sdlPtr); - zend_hash_add(SOAP_GLOBAL(SDLs),struri,strlen(struri),sdlPtr,sizeof(SDL),NULL); - }*/ - return FALSE; -} - -void delete_type(void *data) -{ - sdlTypePtr type = *((sdlTypePtr*)data); - if(type->name) - free(type->name); - if(type->namens) - free(type->namens); - if(type->elements) - { - zend_hash_destroy(type->elements); - free(type->elements); - } - if(type->attributes) - { - zend_hash_destroy(type->attributes); - free(type->attributes); - } - if(type->restrictions) - { - delete_restriction_var_int(&type->restrictions->minExclusive); - delete_restriction_var_int(&type->restrictions->minInclusive); - delete_restriction_var_int(&type->restrictions->maxExclusive); - delete_restriction_var_int(&type->restrictions->maxInclusive); - delete_restriction_var_int(&type->restrictions->totalDigits); - delete_restriction_var_int(&type->restrictions->fractionDigits); - delete_restriction_var_int(&type->restrictions->length); - delete_restriction_var_int(&type->restrictions->minLength); - delete_restriction_var_int(&type->restrictions->maxLength); - delete_schema_restriction_var_char(&type->restrictions->whiteSpace); - delete_schema_restriction_var_char(&type->restrictions->pattern); - zend_hash_destroy(type->restrictions->enumeration); - free(type->restrictions->enumeration); - free(type->restrictions); - } - free(type); -} - -void delete_attribute(void *attribute) -{ - sdlAttributePtr attr = *((sdlAttributePtr*)attribute); - - if(attr->def) - free(attr->def); - if(attr->fixed) - free(attr->fixed); - if(attr->form) - free(attr->form); - if(attr->id) - free(attr->id); - if(attr->name) - free(attr->name); - if(attr->ref) - free(attr->ref); - if(attr->type) - free(attr->type); - if(attr->use) - free(attr->use); - if(attr->extraAttributes) - { - zend_hash_destroy(attr->extraAttributes); - free(attr->extraAttributes); - } -} diff --git a/ext/soap/php_sdl.h b/ext/soap/php_sdl.h deleted file mode 100644 index b061b4aded..0000000000 --- a/ext/soap/php_sdl.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef PHP_SDL_H -#define PHP_SDL_H - -#define XSD_WHITESPACE_COLLAPSE 1 -#define XSD_WHITESPACE_PRESERVE 1 -#define XSD_WHITESPACE_REPLACE 1 - -#define BINDING_SOAP 1 -#define BINDING_HTTP 2 - -#define SOAP_RPC 1 -#define SOAP_DOCUMENT 2 - -#define SOAP_ENCODED 1 -#define SOAP_LITERAL 2 - -struct _sdl -{ - xmlDocPtr doc; //pointer to the parsed xml file - HashTable *types; //array of sdlTypesPtr - HashTable *encoders; //array of encodePtr - HashTable *bindings; //array of sdlBindings (key'd by name) - char *target_ns; - char *source; -}; - -struct _sdlBinding -{ - char *name; - HashTable *functions; - char *location; - int bindingType; - void *bindingAttributes; -}; - -//Soap Binding Specfic stuff -struct _sdlSoapBinding -{ - char *transport; - int style; -}; - -struct _sdlSoapBindingFunctionBody -{ - char *ns; - int use; - char *parts; //not implemented yet - char *encodingStyle; //not implemented yet -}; - -struct _sdlSoapBindingFunction -{ - char *soapAction; - int style; - - sdlSoapBindingFunctionBody input; - sdlSoapBindingFunctionBody output; - sdlSoapBindingFunctionBody falut; -}; - -//HTTP Binding Specfic stuff -/*********** not implemented yet ************ -struct _sdlHttpBinding -{ - int holder; -}; -*********************************************/ - -struct _sdlRestrictionInt -{ - int value; - char fixed; - char *id; -}; - -struct _sdlRestrictionChar -{ - char *value; - char fixed; - char *id; -}; - -struct _sdlRestrictions -{ - HashTable *enumeration; //array of sdlRestrictionCharPtr - sdlRestrictionIntPtr minExclusive; - sdlRestrictionIntPtr minInclusive; - sdlRestrictionIntPtr maxExclusive; - sdlRestrictionIntPtr maxInclusive; - sdlRestrictionIntPtr totalDigits; - sdlRestrictionIntPtr fractionDigits; - sdlRestrictionIntPtr length; - sdlRestrictionIntPtr minLength; - sdlRestrictionIntPtr maxLength; - sdlRestrictionCharPtr whiteSpace; - sdlRestrictionCharPtr pattern; -}; - -struct _sdlType -{ - char *name; - char *namens; - int nullable; - int min_occurs; - int max_occurs; - HashTable *elements; //array of sdlTypePtr - HashTable *attributes; //array of sdlAttributePtr - sdlRestrictionsPtr restrictions; - encodePtr encode; -}; - -struct _sdlParam -{ - int order; - encodePtr encode; - char *paramName; -}; - -struct _sdlFunction -{ - char *functionName; - char *requestName; - char *responseName; - HashTable *requestParameters; //array of sdlParamPtr - HashTable *responseParameters; //array of sdlParamPtr (this should only be one) - int bindingType; - void *bindingAttributes; -}; - -struct _sdlAttribute -{ - char *def; - char *fixed; - char *form; - char *id; - char *name; - char *ref; - char *type; - char *use; - HashTable *extraAttributes; //array of xmlNodePtr -}; - -sdlPtr get_sdl(char *uri); -sdlPtr load_wsdl(char *struri, sdlPtr parent); -int load_sdl(char *struri, int force_load); -int load_ms_sdl(char *struri, int force_load); - -encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr data, char *type); -encodePtr get_encoder(sdlPtr sdl, char *ns, char *type); -encodePtr get_encoder_ex(sdlPtr sdl, char *nscat); -encodePtr get_create_encoder(sdlPtr sdl, sdlTypePtr cur_type, char *ns, char *type); -encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, char *ns, char *type); - -sdlBindingPtr get_binding_from_type(sdlPtr sdl, int type); -sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns); - -xmlNodePtr sdl_guess_convert_xml(encodeType enc, zval* data, int style); -zval *sdl_guess_convert_zval(encodeType enc, xmlNodePtr data); - -xmlNodePtr sdl_to_xml_array(sdlTypePtr type, zval *data, int style); -xmlNodePtr sdl_to_xml_object(sdlTypePtr type, zval *data, int style); - -void delete_type(void *type); -void delete_attribute(void *attribute); -#endif - - diff --git a/ext/soap/php_soap.dsp b/ext/soap/php_soap.dsp deleted file mode 100644 index a80142d6c3..0000000000 --- a/ext/soap/php_soap.dsp +++ /dev/null @@ -1,148 +0,0 @@ -# Microsoft Developer Studio Project File - Name="php_soap" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=php_soap - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "php_soap.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "php_soap.mak" CFG="php_soap - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "php_soap - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "php_soap - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "php_soap - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_SOAP_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /I "..\..\..\libxml2-2.4.12\include" /I "..\..\bind" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_SOAP_EXPORTSWS" /D "PHP_SOAP_EXPORTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "ZTS" /D ZEND_DEBUG=0 /D "COMPILE_DL_SOAP" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib libxml2.lib wsock32.lib resolv.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS\php_soap.dll" /libpath:"..\..\\" /libpath:"..\..\..\libxml2-2.4.12\lib" /libpath:"..\..\Release_TS"
-
-!ELSEIF "$(CFG)" == "php_soap - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP_SOAP_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /I "..\..\..\libxml2-2.4.12\include" /I "..\..\bind" /D "WS" /D "_MBCS" /D "_USRDLL" /D "PHP_SOAP_EXPORTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "ZTS" /D ZEND_DEBUG=1 /D "COMPILE_DL_SOAP" /FR"Release_TS/" /Fp"Release_TS/gd.pch" /YX /Fo"Release_TS/" /Fd"Release_TS/" /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib libxml2.lib wsock32.lib resolv.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS\php_soap.dll" /implib:"Release_TS/php_gd.lib" /pdbtype:sept /libpath:"..\..\\" /libpath:"..\..\..\libxml2-2.4.12\lib" /libpath:"..\..\Debug_TS"
-# SUBTRACT LINK32 /pdb:none /incremental:no
-
-!ENDIF
-
-# Begin Target
-
-# Name "php_soap - Win32 Release"
-# Name "php_soap - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\php_encoding.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_http.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_schema.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_sdl.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_xml.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\soap.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\php_encoding.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_http.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_schema.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_sdl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_soap.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_xml.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h deleted file mode 100644 index 301a594a3a..0000000000 --- a/ext/soap/php_soap.h +++ /dev/null @@ -1,418 +0,0 @@ -#ifndef PHP_SOAP_H -#define PHP_SOAP_H - -#include "php.h" -#include "php_globals.h" -#include "ext/standard/info.h" -#include "ext/standard/php_standard.h" -#include "ext/session/php_session.h" -#include "ext/standard/php_smart_str.h" -#include "php_ini.h" -#include "SAPI.h" -#include <libxml/parser.h> -#include <libxml/xpath.h> - -#ifdef HAVE_PHP_DOMXML -# include "ext/domxml/php_domxml.h" -#endif - -// PHP_STREAMS were introduced php-4.2.0.. i think -// Make this part of configure -#ifdef STREAMS_DC -# define PHP_STREAMS -#endif - -#ifdef PHP_WIN32 -# ifdef PHP_STREAMS -# define SOAP_STREAM php_stream * -# else -# define SOAP_STREAM SOCKET -# endif -#else -# ifdef PHP_STREAMS -# define SOAP_STREAM php_stream * -# else -# define SOCKET unsigned int -# define SOAP_STREAM SOCKET -# endif -# define TRUE 1 -# define FALSE 0 -# define stricmp strcasecmp -#endif - -typedef struct _encodeType encodeType, *encodeTypePtr; -typedef struct _encode encode, *encodePtr; - -typedef struct _sdl sdl, *sdlPtr; -typedef struct _sdlRestrictionInt sdlRestrictionInt, *sdlRestrictionIntPtr; -typedef struct _sdlRestrictionChar sdlRestrictionChar, *sdlRestrictionCharPtr; -typedef struct _sdlRestrictions sdlRestrictions, *sdlRestrictionsPtr; -typedef struct _sdlType sdlType, *sdlTypePtr; -typedef struct _sdlParam sdlParam, *sdlParamPtr; -typedef struct _sdlFunction sdlFunction, *sdlFunctionPtr; -typedef struct _sdlAttribute sdlAttribute, *sdlAttributePtr; -typedef struct _sdlBinding sdlBinding, *sdlBindingPtr; -typedef struct _sdlSoapBinding sdlSoapBinding, *sdlSoapBindingPtr; -typedef struct _sdlSoapBindingFunction sdlSoapBindingFunction, *sdlSoapBindingFunctionPtr; -typedef struct _sdlSoapBindingFunctionBody sdlSoapBindingFunctionBody, *sdlSoapBindingFunctionBodyPtr; - -typedef struct _soapMapping soapMapping, *soapMappingPtr; -typedef struct _soapService soapService, *soapServicePtr; - -#include "php_xml.h" -#include "php_encoding.h" -#include "php_sdl.h" -#include "php_schema.h" -#include "php_http.h" -#include "php_packet_soap.h" - -extern int le_sdl; -extern int le_http_socket; -extern int le_url; -extern int le_service; - - -struct _soapHeaderHandler -{ - char *ns; - int type; - - struct _function_handler - { - char *functionName; - char *type; - } function_handler; - - struct _class_handler - { - zend_class_entry *ce; - } class_handler; -}; - -struct _soapMapping -{ - char *ns; - char *ctype; - int type; - - struct _map_functions - { - zval *to_xml_before; - zval *to_xml; - zval *to_xml_after; - zval *to_zval_before; - zval *to_zval; - zval *to_zval_after; - } map_functions; - - struct _map_class - { - int type; - zend_class_entry *ce; - } map_class; -}; - -struct _soapService -{ - sdlPtr sdl; - - struct _soap_functions - { - HashTable *ft; - int functions_all; - } soap_functions; - - struct _soap_class - { - zend_class_entry *ce; - zval **argv; - int argc; - int persistance; - } soap_class; - - HashTable *mapping; - int type; - int enabled; - char *uri; -}; - -#define SOAP_CLASS 1 -#define SOAP_FUNCTIONS 2 -#define SOAP_FUNCTIONS_ALL 999 - -#define SOAP_MAP_FUNCTION 1 -#define SOAP_MAP_CLASS 2 - -#define SOAP_PERSISTENCE_SESSION 1 -#define SOAP_PERSISTENCE_REQUEST 2 - -ZEND_BEGIN_MODULE_GLOBALS(soap) - HashTable *defEncNs; - HashTable *defEncPrefix; - HashTable *defEnc; - HashTable *defEncIndex; - HashTable *sdls; - HashTable *services; - HashTable *overrides; - int cur_uniq_ns; -ZEND_END_MODULE_GLOBALS(soap) - -ZEND_EXTERN_MODULE_GLOBALS(soap); - -#ifdef ZTS -# define SOAP_GLOBAL(v) TSRMG(soap_globals_id, zend_soap_globals *, v) -#else -# define SOAP_GLOBAL(v) (soap_globals.v) -#endif - -#define PHP_SOAP_SERVER_CLASSNAME "soapserver" -#define PHP_SOAP_CLASSNAME "soapobject" -#define PHP_SOAP_VAR_CLASSNAME "soapvar" -#define PHP_SOAP_FAULT_CLASSNAME "soapfault" -#define PHP_SOAP_PARAM_CLASSNAME "soapparam" - - -extern zend_module_entry soap_module_entry; -#define soap_module_ptr & soap_module_entry - -PHP_MINIT_FUNCTION(soap); -PHP_MSHUTDOWN_FUNCTION(soap); -PHP_MINFO_FUNCTION(soap); - -//Registry Functions -//TODO: this! -PHP_FUNCTION(load_sdl); -PHP_FUNCTION(unload_sdl); -PHP_FUNCTION(unload_all_sdls); -PHP_FUNCTION(get_available_sdls); -PHP_FUNCTION(get_available_functions); -PHP_FUNCTION(get_function_parameters); -PHP_FUNCTION(soap_encode_to_xml); -PHP_FUNCTION(soap_encode_to_zval); - - -//Server Functions -PHP_FUNCTION(soapserver); -PHP_FUNCTION(setclass); -PHP_FUNCTION(addfunction); -PHP_FUNCTION(getfunctions); -PHP_FUNCTION(handle); -PHP_FUNCTION(setpersistence); -PHP_FUNCTION(bind); -#ifdef HAVE_PHP_DOMXML -PHP_FUNCTION(map); -#endif - -//Client Functions -PHP_FUNCTION(soapobject); -PHP_FUNCTION(__use); -PHP_FUNCTION(__style); -PHP_FUNCTION(__isfault); -PHP_FUNCTION(__getfault); -PHP_FUNCTION(__call); -PHP_FUNCTION(__parse); -PHP_FUNCTION(__generate); -PHP_FUNCTION(__trace); -PHP_FUNCTION(__getfunctions); -PHP_FUNCTION(__gettypes); -PHP_FUNCTION(__getlastresponse); -PHP_FUNCTION(__getlastrequest); -PHP_FUNCTION(__headerclass); -PHP_FUNCTION(__headerfunction); - -//SoapVar Functions -PHP_FUNCTION(soapvar); - -//SoapFault Functions -PHP_FUNCTION(soapfault); - -//SoapParam Functions -PHP_FUNCTION(soapparam); - - -#define DECLARE_TRACE(file) \ - FILE *trace_fp; \ - char *trace_file = file; - -#define TRACE(place) \ - trace_fp = fopen(trace_file, "a+"); \ - fwrite(place, strlen(place), 1, trace_fp); \ - fclose(trace_fp); - -extern zend_class_entry soap_var_class_entry; - -PS_SERIALIZER_FUNCS(soap); - -void clear_soap_fault(zval *obj); -void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail); -void add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail); - -sdlParamPtr get_param(sdlFunctionPtr function, char *param_name, int index, int); -sdlFunctionPtr get_function(sdlBindingPtr sdl, char *function_name); - -void delete_sdl(void *handle); -void delete_binding(void *binding); -void delete_sdl_soap_binding_function_body(sdlSoapBindingFunctionBody body); -void delete_function(void *function); -void delete_paramater(void *paramater); -void delete_service(void *service); -void delete_http_socket(void *handle); -void delete_url(void *handle); -void delete_mapping(void *data); - -void soap_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference); -zval soap_get_property_handler(zend_property_reference *property_reference); -int soap_set_property_handler(zend_property_reference *property_reference, zval *value); -void soap_destructor(void *jobject); - -void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name, int *num_params, zval **parameters[]); -xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name,char *uri,zval *ret); -xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count); -xmlNodePtr seralize_parameter(sdlParamPtr param,zval *param_val,int index,char *name, int style); -xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style); -zval *desearlize_zval(sdlPtr sdl, xmlNodePtr data, sdlParamPtr param); - -void soap_error_handler(int error_num, const char *error_filename, const uint error_lineno, const char *format, va_list args); -int my_call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, int param_count, zval *params[] TSRMLS_DC); - -#define phpext_soap_ptr soap_module_ptr - -#define HTTP_RAW_POST_DATA "HTTP_RAW_POST_DATA" - -#define SOAP_SERVER_BEGIN_CODE() \ - zend_error_cb = soap_error_handler - -#define SOAP_SERVER_END_CODE() \ - zend_error_cb = old_handler - - -#define FOREACHATTRNODE(n,c,i) \ - do \ - { \ - if(n == NULL) \ - break; \ - if(c) \ - i = get_attribute(n,c); \ - else \ - i = n; \ - if(i != NULL) \ - { \ - n = i; - -#define FOREACHNODE(n,c,i) \ - do \ - { \ - if(n == NULL) \ - break; \ - if(c) \ - i = get_node(n,c); \ - else \ - i = n; \ - if(i != NULL) \ - { \ - n = i; - -#define ENDFOREACH(n) \ - } \ - } while(n = n->next); - -#define ZERO_PARAM() \ - if(ZEND_NUM_ARGS() != 0) \ - WRONG_PARAM_COUNT; - -#define ONE_PARAM(p) \ - if(ZEND_NUM_ARGS() != 1 || getParameters(ht, 1, &p) == FAILURE) \ - WRONG_PARAM_COUNT; - -#define TWO_PARAM(p,p1) \ - if(ZEND_NUM_ARGS() != 1 || getParameters(ht, 2, &p, &p1) == FAILURE) \ - WRONG_PARAM_COUNT; - -#define THREE_PARAM(p,p1,p2) \ - if(ZEND_NUM_ARGS() != 1 || getParameters(ht, 3, &p, &p1, &p2) == FAILURE) \ - WRONG_PARAM_COUNT; - -#define FETCH_THIS_PORT(ss) \ - { \ - zval *__thisObj; zval *__port; sdlBindingPtr *__tmp; \ - GET_THIS_OBJECT(__thisObj) \ - if(FIND_PORT_PROPERTY(__thisObj, __port) == FAILURE) { \ - ss = NULL; \ - php_error(E_ERROR, "Error could find current port"); \ - } \ - __tmp = (sdlBindingPtr*)Z_LVAL_P(__port); \ - ss = *__tmp; \ - } - -#define FIND_PORT_PROPERTY(ss,tmp) zend_hash_find(ss->value.obj.properties, "port", sizeof("port"), (void **)&tmp) - -#define FETCH_THIS_SDL(ss) \ - { \ - zval *__thisObj,**__tmp; \ - GET_THIS_OBJECT(__thisObj) \ - if(FIND_SDL_PROPERTY(__thisObj,__tmp) != FAILURE) \ - { \ - FETCH_SDL_RES(ss,__tmp); \ - } \ - else \ - ss = NULL; \ - } - -#define FIND_SDL_PROPERTY(ss,tmp) zend_hash_find(ss->value.obj.properties, "sdl", sizeof("sdl"), (void **)&tmp) -#define FETCH_SDL_RES(ss,tmp) ss = (sdlPtr) zend_fetch_resource(tmp TSRMLS_CC, -1, "sdl", NULL, 1, le_sdl) - -#define FETCH_THIS_SERVICE(ss) \ - { \ - zval *__thisObj,**__tmp; \ - GET_THIS_OBJECT(__thisObj) \ - if(FIND_SERVICE_PROPERTY(__thisObj,__tmp) != FAILURE) \ - { \ - FETCH_SERVICE_RES(ss,__tmp); \ - } \ - else \ - ss = NULL; \ - } - -#define FIND_SERVICE_PROPERTY(ss,tmp) zend_hash_find(ss->value.obj.properties, "service", sizeof("service"), (void **)&tmp) -#define FETCH_SERVICE_RES(ss,tmp) ss = (soapServicePtr) zend_fetch_resource(tmp TSRMLS_CC, -1, "service", NULL, 1, le_service) - -#define FETCH_THIS_URL(ss) \ - { \ - zval *__thisObj,**__tmp; \ - GET_THIS_OBJECT(__thisObj) \ - if(FIND_URL_PROPERTY(__thisObj,__tmp) != FAILURE) \ - { \ - FETCH_URL_RES(ss,__tmp); \ - } \ - else \ - ss = NULL; \ - } - -#define FIND_URL_PROPERTY(ss,tmp) zend_hash_find(ss->value.obj.properties, "httpurl", sizeof("httpurl"), (void **)&tmp) -#define FETCH_URL_RES(ss,tmp) ss = (php_url *) zend_fetch_resource(tmp TSRMLS_CC, -1, "httpurl", NULL, 1, le_url) - -#define FETCH_THIS_SOCKET(ss) \ - { \ - zval *__thisObj,**__tmp; \ - GET_THIS_OBJECT(__thisObj) \ - if(FIND_SOCKET_PROPERTY(__thisObj,__tmp) != FAILURE) \ - { \ - FETCH_SOCKET_RES(ss,__tmp); \ - } \ - else \ - ss = NULL; \ - } - -#define FIND_SOCKET_PROPERTY(ss,tmp) zend_hash_find(ss->value.obj.properties, "httpsocket", sizeof("httpsocket"), (void **)&tmp) -#define FETCH_SOCKET_RES(ss,tmp) ss = (SOAP_STREAM)zend_fetch_resource(tmp TSRMLS_CC, -1, "httpsocket", NULL, 1, le_http_socket) - -#define GET_THIS_OBJECT(o) \ - o = getThis(); \ - if (!o) \ - { \ - php_error(E_WARNING, "Cannot Get Class Info"); \ - return; \ - } - - -#endif diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c deleted file mode 100644 index e3505e2890..0000000000 --- a/ext/soap/php_xml.c +++ /dev/null @@ -1,214 +0,0 @@ -#include "php_soap.h" - -xmlNsPtr attr_find_ns(xmlAttrPtr node) -{ - if(node->ns) - return node->ns; - else if(node->parent->ns) - return node->parent->ns; - else - return xmlSearchNs(node->doc, node->parent, NULL); -} - -xmlNsPtr node_find_ns(xmlNodePtr node) -{ - if(node->ns) - return node->ns; - else - return xmlSearchNs(node->doc, node, NULL); -} - -int attr_is_equal_ex(xmlAttrPtr node, char *name, char *ns) -{ - if(!strcmp(node->name, name)) - { - if(ns) - { - xmlNsPtr nsPtr; - if(node->ns) - nsPtr = node->ns; - else if(node->parent->ns) - nsPtr = node->parent->ns; - else - nsPtr = xmlSearchNs(node->doc, node->parent, NULL); - if(!strcmp(nsPtr->href, ns)) - return TRUE; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -int node_is_equal_ex(xmlNodePtr node, char *name, char *ns) -{ - if(!strcmp(node->name, name)) - { - if(ns) - { - xmlNsPtr nsPtr; - if(node->ns) - nsPtr = node->ns; - else - nsPtr = xmlSearchNs(node->doc, node, NULL); - if(!strcmp(nsPtr->href, ns)) - return TRUE; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -xmlAttrPtr get_attribute_ex(xmlAttrPtr node, char *name, char *ns) -{ - xmlAttrPtr trav = node; - if(node == NULL) return NULL; - do { - if(attr_is_equal_ex(trav, name, ns)) - return trav; - } while(trav = trav->next); - return NULL; -} - -xmlNodePtr get_node_ex(xmlNodePtr node, char *name, char *ns) -{ - xmlNodePtr trav = node; - if(node == NULL) return NULL; - do { - if(node_is_equal_ex(trav, name, ns)) - return trav; - } while(trav = trav->next); - return NULL; -} - -xmlNodePtr get_node_recurisve_ex(xmlNodePtr node, char *name, char *ns) -{ - xmlNodePtr trav = node; - if(node == NULL) return NULL; - do - { - if(node_is_equal_ex(trav, name, ns)) - return trav; - else - { - if(node->children != NULL) - { - xmlNodePtr tmp; - tmp = get_node_recurisve_ex(node->children, name, ns); - if(tmp) - return tmp; - } - } - } while(trav = trav->next); - return NULL; -} - -xmlNodePtr get_node_with_attribute_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns) -{ - xmlNodePtr trav = node, cur = NULL; - xmlAttrPtr attr; - - if(node == NULL) return NULL; - do - { - if(name != NULL) - { - cur = get_node_ex(trav, name, name_ns); - if(!cur) - return cur; - } - else - cur = trav; - - attr = get_attribute_ex(cur->properties, attribute, attr_ns); - if(attr != NULL && strcmp(attr->children->content, value) == 0) - return cur; - else - { - if(cur->children != NULL) - { - xmlNodePtr tmp; - tmp = get_node_with_attribute_ex(cur->children, name, name_ns, attribute, value, attr_ns); - if(tmp) - return tmp; - } - } - }while(trav = trav->next); - return NULL; -} - -xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns) -{ - xmlNodePtr trav = node, cur; - xmlAttrPtr attr; - - if(node == NULL) return NULL; - do - { - if(name != NULL) - { - cur = get_node_recurisve_ex(trav, name, name_ns); - if(!cur) - return cur; - } - else - cur = trav; - - attr = get_attribute_ex(cur->properties, attribute, attr_ns); - if(attr != NULL && strcmp(attr->children->content, value) == 0) - return cur; - else - { - if(cur->children != NULL) - { - xmlNodePtr tmp; - tmp = get_node_with_attribute_recursive_ex(cur->children, name, name_ns, attribute, value, attr_ns); - if(tmp) - return tmp; - } - } - }while(trav = trav->next); - return NULL; -} - -xmlNodePtr check_and_resolve_href(xmlNodePtr data) -{ - xmlAttrPtr href; - xmlNodePtr ret = data; - - if(!data || !data->properties) - return ret; - - href = get_attribute(data->properties, "href"); - if(href) - { - // Internal href try and find node - if(href->children->content[0] == '#') - { - ret = get_node_with_attribute_recursive(data->doc->children, NULL, "id", &href->children->content[1]); - } - // External href....? - } - - return ret; -} - -int parse_namespace(char *inval, char **value, char **namespace) -{ - char *found = strchr(inval, ':'); - - if(found != NULL) - { - (*namespace) = estrndup(inval, found - inval); - (*value) = estrdup(++found); - } - else - { - (*value) = estrdup(inval); - (*namespace) = NULL; - } - - return FALSE; -} - diff --git a/ext/soap/php_xml.h b/ext/soap/php_xml.h deleted file mode 100644 index d17caba007..0000000000 --- a/ext/soap/php_xml.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef PHP_SOAP_XML_H -#define PHP_SOAP_XML_H - -#define get_attribute(node, name) get_attribute_ex(node, name, NULL) -#define get_node(node, name) get_node_ex(node, name, NULL) -#define get_node_recursive(node, name) get_node_recursive_ex(node, name, NULL) -#define get_node_with_attribute(node, name, attr, val) get_node_with_attribute_ex(node, name, NULL, attr, val, NULL) -#define get_node_with_attribute_recursive(node, name, attr, val) get_node_with_attribute_recursive_ex(node, name, NULL, attr, val, NULL) -#define attr_is_equal(node, name) attr_is_equal_ex(node, name, NULL) - -xmlNsPtr attr_find_ns(xmlAttrPtr node); -xmlNsPtr node_find_ns(xmlNodePtr node); -int attr_is_equal_ex(xmlAttrPtr node, char *name, char *ns); -int node_is_equal_ex(xmlNodePtr node, char *name, char *ns); -xmlAttrPtr get_attribute_ex(xmlAttrPtr node,char *name, char *ns); -xmlNodePtr get_node_ex(xmlNodePtr node,char *name, char *ns); -xmlNodePtr get_node_recurisve_ex(xmlNodePtr node,char *name, char *ns); -xmlNodePtr get_node_with_attribute_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns); -xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns); -int parse_namespace(char *inval,char **value,char **namespace); -xmlNodePtr check_and_resolve_href(xmlNodePtr data); - -#endif diff --git a/ext/soap/soap.c b/ext/soap/soap.c deleted file mode 100644 index c67171c5a9..0000000000 --- a/ext/soap/soap.c +++ /dev/null @@ -1,2268 +0,0 @@ -#include "php_soap.h" - -int le_sdl = 0; -int le_http_socket = 0; -int le_url = 0; -int le_service = 0; - -// Local functions -static void function_to_string(sdlFunctionPtr function, smart_str *buf); -static void type_to_string(sdlTypePtr type, smart_str *buf, int level); - -static zend_class_entry soap_class_entry; -static zend_class_entry soap_server_class_entry; -static zend_class_entry soap_fault_class_entry; -zend_class_entry soap_var_class_entry; -zend_class_entry soap_param_class_entry; - -ZEND_DECLARE_MODULE_GLOBALS(soap); - -static void (*old_handler)(int, const char *, const uint, const char*, va_list); - -static zend_function_entry soap_functions[] = { -#ifdef HAVE_PHP_DOMXML - PHP_FE(soap_encode_to_xml, NULL) - PHP_FE(soap_encode_to_zval, NULL) -#endif - {NULL, NULL, NULL} -}; - -static zend_function_entry soap_fault_functions[] = { - PHP_FE(soapfault, NULL) - {NULL, NULL, NULL} -}; - -static zend_function_entry soap_server_functions[] = { - PHP_FE(soapserver,NULL) - PHP_FE(setpersistence,NULL) - PHP_FE(setclass,NULL) - PHP_FE(addfunction,NULL) - PHP_FE(getfunctions,NULL) - PHP_FE(handle,NULL) - PHP_FE(bind,NULL) -#ifdef HAVE_PHP_DOMXML - PHP_FE(map, NULL) -#endif - {NULL, NULL, NULL} -}; - -static zend_function_entry soap_client_functions[] = { - PHP_FE(soapobject, NULL) - PHP_FE(__isfault, NULL) - PHP_FE(__getfault, NULL) - PHP_FE(__use, NULL) - PHP_FE(__style, NULL) - PHP_FE(__call, NULL) - PHP_FE(__parse, NULL) - PHP_FE(__generate, NULL) - PHP_FE(__trace, NULL) - PHP_FE(__headerclass, NULL) - PHP_FE(__headerfunction, NULL) - PHP_FE(__getlastrequest, NULL) - PHP_FE(__getlastresponse, NULL) - PHP_FE(__getfunctions, NULL) - PHP_FE(__gettypes, NULL) - {NULL, NULL, NULL} -}; - -static zend_function_entry soap_var_functions[] = { - PHP_FE(soapvar, NULL) - {NULL, NULL, NULL} -}; - -static zend_function_entry soap_param_functions[] = { - PHP_FE(soapparam, NULL) - {NULL, NULL, NULL} -}; - -zend_module_entry soap_module_entry = { -#ifdef STANDARD_MODULE_HEADER - STANDARD_MODULE_HEADER, -#endif - "soap", - soap_functions, - PHP_MINIT(soap), - PHP_MSHUTDOWN(soap), - NULL, - NULL, - PHP_MINFO(soap), -#ifdef STANDARD_MODULE_HEADER - NO_VERSION_YET, -#endif - STANDARD_MODULE_PROPERTIES, -}; - -#ifdef COMPILE_DL_SOAP -ZEND_GET_MODULE(soap) -#endif - -static void php_soap_init_globals(zend_soap_globals *soap_globals) -{ - int i; - long enc; - - soap_globals->sdls = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->sdls, 0, NULL, delete_sdl, 1); - - soap_globals->services = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->services, 0, NULL, delete_service, 1); - - soap_globals->defEnc = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->defEnc, 0, NULL, NULL, 1); - - soap_globals->defEncIndex = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->defEncIndex, 0, NULL, NULL, 1); - - soap_globals->defEncNs = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->defEncNs, 0, NULL, NULL, 1); - - soap_globals->defEncPrefix = malloc(sizeof(HashTable)); - zend_hash_init(soap_globals->defEncPrefix, 0, NULL, NULL, 1); - - soap_globals->overrides = NULL; - - i = 0; - do - { - enc = (long)&defaultEncoding[i]; - - //If has a ns and a str_type then index it - if(defaultEncoding[i].details.type_str) - { - if(defaultEncoding[i].details.ns != NULL) - { - char *ns_type; - ns_type = emalloc(strlen(defaultEncoding[i].details.ns) + strlen(defaultEncoding[i].details.type_str) + 2); - sprintf(ns_type, "%s:%s", defaultEncoding[i].details.ns, defaultEncoding[i].details.type_str); - zend_hash_add(soap_globals->defEnc, ns_type, strlen(ns_type) + 1, &enc, sizeof(encodePtr), NULL); - efree(ns_type); - } - else - { - zend_hash_add(soap_globals->defEnc, defaultEncoding[i].details.type_str, strlen(defaultEncoding[i].details.type_str) + 1, &enc, sizeof(encodePtr), NULL); - } - } - //Index everything by number - zend_hash_index_update(soap_globals->defEncIndex, defaultEncoding[i].details.type, &enc, sizeof(encodePtr), NULL); - i++; - } - while(defaultEncoding[i].details.type != END_KNOWN_TYPES); - - //hash by namespace - zend_hash_add(soap_globals->defEncNs, XSD_1999_NAMESPACE, sizeof(XSD_1999_NAMESPACE), XSD_NS_PREFIX, sizeof(XSD_NS_PREFIX), NULL); - zend_hash_add(soap_globals->defEncNs, XSD_NAMESPACE, sizeof(XSD_NAMESPACE), XSD_NS_PREFIX, sizeof(XSD_NS_PREFIX), NULL); - zend_hash_add(soap_globals->defEncNs, APACHE_NAMESPACE, sizeof(APACHE_NAMESPACE), APACHE_NS_PREFIX, sizeof(APACHE_NS_PREFIX), NULL); - zend_hash_add(soap_globals->defEncNs, SOAP_ENC_NAMESPACE, sizeof(SOAP_ENC_NAMESPACE), SOAP_ENC_NS_PREFIX, sizeof(SOAP_ENC_NS_PREFIX), NULL); - //and by prefix - zend_hash_add(soap_globals->defEncPrefix, XSD_NS_PREFIX, sizeof(XSD_NS_PREFIX), XSD_NAMESPACE, sizeof(XSD_NAMESPACE), NULL); - zend_hash_add(soap_globals->defEncPrefix, APACHE_NS_PREFIX, sizeof(APACHE_NS_PREFIX), APACHE_NAMESPACE, sizeof(APACHE_NAMESPACE), NULL); - zend_hash_add(soap_globals->defEncPrefix, SOAP_ENC_NS_PREFIX, sizeof(SOAP_ENC_NS_PREFIX), SOAP_ENC_NAMESPACE, sizeof(SOAP_ENC_NAMESPACE), NULL); - -} - -static void php_soap_del_globals(zend_soap_globals *soap_globals) -{ -/* zend_hash_destroy(soap_globals->sdls); - zend_hash_destroy(soap_globals->services); - zend_hash_destroy(soap_globals->defEnc); - zend_hash_destroy(soap_globals->defEncIndex); - zend_hash_destroy(soap_globals->defEncNs);*/ -} - -PHP_MSHUTDOWN_FUNCTION(soap) -{ - zend_hash_destroy(SOAP_GLOBAL(sdls)); - zend_hash_destroy(SOAP_GLOBAL(services)); - zend_hash_destroy(SOAP_GLOBAL(defEnc)); - zend_hash_destroy(SOAP_GLOBAL(defEncIndex)); - zend_hash_destroy(SOAP_GLOBAL(defEncNs)); - zend_hash_destroy(SOAP_GLOBAL(defEncPrefix)); - return SUCCESS; -} - -PHP_MINIT_FUNCTION(soap) -{ - //TODO: add ini entry for always use soap errors - ZEND_INIT_MODULE_GLOBALS(soap, php_soap_init_globals, php_soap_del_globals); - - //Register SoapObject class - INIT_OVERLOADED_CLASS_ENTRY(soap_class_entry, PHP_SOAP_CLASSNAME, soap_client_functions, soap_call_function_handler, NULL, NULL); - zend_register_internal_class(&soap_class_entry TSRMLS_CC); - - //Register SoapVar class - INIT_CLASS_ENTRY(soap_var_class_entry, PHP_SOAP_VAR_CLASSNAME, soap_var_functions); - zend_register_internal_class(&soap_var_class_entry TSRMLS_CC); - - //Register SoapServer class - INIT_CLASS_ENTRY(soap_server_class_entry, PHP_SOAP_SERVER_CLASSNAME, soap_server_functions); - zend_register_internal_class(&soap_server_class_entry TSRMLS_CC); - - //Register SoapFault class - INIT_CLASS_ENTRY(soap_fault_class_entry, PHP_SOAP_FAULT_CLASSNAME, soap_fault_functions); - zend_register_internal_class(&soap_fault_class_entry TSRMLS_CC); - - //Register SoapParam class - INIT_CLASS_ENTRY(soap_param_class_entry, PHP_SOAP_PARAM_CLASSNAME, soap_param_functions); - zend_register_internal_class(&soap_param_class_entry TSRMLS_CC); - - le_sdl = register_list_destructors(NULL, NULL); - le_http_socket = register_list_destructors(delete_http_socket, NULL); - le_url = register_list_destructors(delete_url, NULL); - le_service = register_list_destructors(delete_service, NULL); - - REGISTER_LONG_CONSTANT("SOAP_PERSISTENCE_SESSION", SOAP_PERSISTENCE_SESSION, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_PERSISTENCE_REQUEST", SOAP_PERSISTENCE_REQUEST, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_FUNCTIONS_ALL", SOAP_FUNCTIONS_ALL, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("SOAP_ENCODED", SOAP_ENCODED, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_LITERAL", SOAP_LITERAL, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("SOAP_RPC", SOAP_RPC, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_DOCUMENT", SOAP_DOCUMENT, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("XSD_1999_TIMEINSTANT", XSD_1999_TIMEINSTANT, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("UNKNOWN_TYPE", UNKNOWN_TYPE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_ENC_OBJECT", SOAP_ENC_OBJECT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SOAP_ENC_ARRAY", SOAP_ENC_ARRAY, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("XSD_STRING", XSD_STRING, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_BOOLEAN", XSD_BOOLEAN, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_DECIMAL", XSD_DECIMAL, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_FLOAT", XSD_FLOAT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_DOUBLE", XSD_DOUBLE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_DURATION", XSD_DURATION, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_DATETIME", XSD_DATETIME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_TIME", XSD_TIME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_DATE", XSD_DATE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_GYEARMONTH", XSD_GYEARMONTH, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_GYEAR", XSD_GYEAR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_GMONTHDAY", XSD_GMONTHDAY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_GDAY", XSD_GDAY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_GMONTH", XSD_GMONTH, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_HEXBINARY", XSD_HEXBINARY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_BASE64BINARY", XSD_BASE64BINARY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_ANYURI", XSD_ANYURI, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_QNAME", XSD_QNAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NOTATION", XSD_NOTATION, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NORMALIZEDSTRING", XSD_NORMALIZEDSTRING, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_TOKEN", XSD_TOKEN, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_LANGUAGE", XSD_LANGUAGE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NMTOKEN", XSD_NMTOKEN, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NAME", XSD_NAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NCNAME", XSD_NCNAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_ID", XSD_ID, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_IDREF", XSD_IDREF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_IDREFS", XSD_IDREFS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_ENTITY", XSD_ENTITY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_ENTITYS", XSD_ENTITYS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_INTEGER", XSD_INTEGER, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NONPOSITIVEINTEGER", XSD_NONPOSITIVEINTEGER, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NEGATIVEINTEGER", XSD_NEGATIVEINTEGER, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_LONG", XSD_LONG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_INT", XSD_INT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_SHORT", XSD_SHORT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_BYTE", XSD_BYTE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_NONNEGATIVEINTEGER", XSD_NONNEGATIVEINTEGER, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_UNSIGNEDLONG", XSD_UNSIGNEDLONG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_UNSIGNEDINT", XSD_UNSIGNEDINT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_UNSIGNEDSHORT", XSD_UNSIGNEDSHORT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_UNSIGNEDBYTE", XSD_UNSIGNEDBYTE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("XSD_POSITIVEINTEGER", XSD_POSITIVEINTEGER, CONST_CS | CONST_PERSISTENT); - - old_handler = zend_error_cb; - -#if HAVE_PHP_SESSION - php_session_register_serializer("soap", PS_SERIALIZER_ENCODE_NAME(soap), PS_SERIALIZER_DECODE_NAME(soap)); -#endif - - return SUCCESS; -} - -#if HAVE_PHP_SESSION -PS_SERIALIZER_ENCODE_FUNC(soap) -{ -/* - char *key; \ - uint key_length; \ - ulong num_key; \ - zval **struc; - - wddx_packet *packet; - PS_ENCODE_VARS; - - packet = php_wddx_constructor(); - if (!packet) - return FAILURE; - - php_wddx_packet_start(packet, NULL, 0); - php_wddx_add_chunk_static(packet, WDDX_STRUCT_S); - - PS_ENCODE_LOOP( - - php_wddx_serialize_var(packet, *struc, key, key_length); - ); - - php_wddx_add_chunk_static(packet, WDDX_STRUCT_E); - php_wddx_packet_end(packet); - *newstr = php_wddx_gather(packet); - php_wddx_destructor(packet); - - if (newlen) - *newlen = strlen(*newstr); -*/ - return SUCCESS; -} - -PS_SERIALIZER_DECODE_FUNC(soap) -{ -/* zval *retval; - zval **ent; - char *key; - uint key_length; - char tmp[128]; - ulong idx; - int hash_type; - int ret; - - if (vallen == 0) - return SUCCESS; - - MAKE_STD_ZVAL(retval); - - if ((ret = php_wddx_deserialize_ex((char *)val, vallen, retval)) == SUCCESS) { - - for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(retval)); - zend_hash_get_current_data(Z_ARRVAL_P(retval), (void **) &ent) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(retval))) { - hash_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(retval), &key, &key_length, &idx, 0, NULL); - - switch (hash_type) { - case HASH_KEY_IS_LONG: - sprintf(tmp, "%ld", idx); - key = tmp; - case HASH_KEY_IS_STRING: - php_set_session_var(key, key_length-1, *ent, NULL TSRMLS_CC); - PS_ADD_VAR(key); - } - } - } - - zval_ptr_dtor(&retval); -*/ - return TRUE; -} -#endif - - -PHP_MINFO_FUNCTION(soap) -{ - php_info_print_table_start(); - php_info_print_table_row(2, "Soap Client", "enabled"); - php_info_print_table_row(2, "Soap Server", "enabled"); -#if HAVE_PHP_SESSION - php_info_print_table_row(2, "Soap Serializer", "enabled"); -#endif - php_info_print_table_end(); -} - -#ifdef HAVE_PHP_DOMXML -PHP_FUNCTION(soap_encode_to_xml) -{ - zval *pzval, *ret; - encodePtr enc; - char *name; - int found, name_len; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &name, &name_len, &pzval) == FAILURE) - php_error(E_ERROR, "wrong number of parameters to soap_encode_to_xml"); - - enc = get_conversion(Z_TYPE_P(pzval)); - ret = php_domobject_new(seralize_zval(pzval, NULL, name, SOAP_ENCODED), &found, NULL TSRMLS_CC); - *return_value = *ret; - zval_copy_ctor(return_value); - zval_ptr_dtor(&ret); -} - -PHP_FUNCTION(soap_encode_to_zval) -{ - zval *dom, **addr, *ret; - xmlNodePtr node; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &dom) == FAILURE) - php_error(E_ERROR, "wrong number of parameters to soap_encode_to_zval"); - - if(zend_hash_index_find(Z_OBJPROP_P(dom), 1, (void **)&addr) == FAILURE) - php_error(E_ERROR, "Cannot find domaddress to parameter passed to soap_encode_to_zval"); - - node = (xmlNodePtr)Z_LVAL_PP(addr); - ret = master_to_zval(get_conversion(UNKNOWN_TYPE), node); - *return_value = *ret; -} -#endif - -//SoapParam functions -PHP_FUNCTION(soapparam) -{ - zval *thisObj, *data; - char *name; - int name_length; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &data, &name, &name_length) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapParam constructor"); - - GET_THIS_OBJECT(thisObj); - - zval_add_ref(&data); - add_property_stringl(thisObj, "param_name", name, name_length, 1); - add_property_zval(thisObj, "param_data", data); -} - -//SoapFault functions -PHP_FUNCTION(soapfault) -{ - char *fault_string = NULL, *fault_code = NULL, *fault_actor = NULL; - int fault_string_len, fault_code_len, fault_actor_len; - zval *thisObj, *details = NULL; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|zs", &fault_string, &fault_string_len, - &fault_code, &fault_code_len, &details, &fault_actor, &fault_actor_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapFault constructor"); - - GET_THIS_OBJECT(thisObj); - - if(details) - zval_add_ref(&details); - set_soap_fault(thisObj, fault_code, fault_string, fault_actor, details); -} - -//SoapVar functions -PHP_FUNCTION(soapvar) -{ - zval *data, *thisObj, *type; - char *stype = NULL, *ns = NULL, *name = NULL, *namens = NULL; - int stype_len, ns_len, name_len, namens_len; - - GET_THIS_OBJECT(thisObj); - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!z|ssss", &data, &type, &stype, &stype_len, &ns, &ns_len, &name, &name_len, &namens, &namens_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapVal constructor"); - - zval_add_ref(&data); - if(Z_TYPE_P(type) == IS_NULL) - add_property_long(thisObj, "enc_type", UNKNOWN_TYPE); - else - { - if(zend_hash_index_exists(SOAP_GLOBAL(defEncIndex), Z_LVAL_P(type))) - add_property_long(thisObj, "enc_type", Z_LVAL_P(type)); - else - php_error(E_ERROR, "Cannot find encoding for SoapVar"); - } - - add_property_zval(thisObj, "enc_value", data); - - if(stype && strlen(stype) > 0) - add_property_stringl(thisObj, "enc_stype", stype, stype_len, 1); - if(ns && strlen(ns) > 0) - add_property_stringl(thisObj, "enc_ns", ns, ns_len, 1); - if(name && strlen(name) > 0) - add_property_stringl(thisObj, "enc_name", name, name_len, 1); - if(namens && strlen(namens) > 0) - add_property_stringl(thisObj, "enc_namens", namens, namens_len, 1); -} - -//SoapServer functions -PHP_FUNCTION(soapserver) -{ - zval *thisObj; - soapServicePtr service; - char *uri; - int ret, uri_len; - - SOAP_SERVER_BEGIN_CODE(); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &uri, &uri_len) == FAILURE) - php_error(E_ERROR, "Wrong number of parameters to SoapServer constructor"); - - GET_THIS_OBJECT(thisObj); - - service = emalloc(sizeof(soapService)); - memset(service, 0, sizeof(soapService)); - - service->uri = estrndup(uri, uri_len); - service->type = SOAP_FUNCTIONS; - service->soap_functions.functions_all = FALSE; - service->soap_functions.ft = emalloc(sizeof(HashTable)); - zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0); - - ret = zend_list_insert(service, le_service); - add_property_resource(thisObj, "service", ret); - zend_list_addref(ret); - - SOAP_SERVER_END_CODE(); -} - -#define NULL_OR_STRING(zval) \ - (!zval || Z_TYPE_P(zval) == IS_NULL || Z_TYPE_P(zval) == IS_STRING) - -#define IS_VALID_FUNCTION(zval) \ - (zval && Z_TYPE_P(zval) != IS_NULL) - -#ifdef HAVE_PHP_DOMXML -PHP_FUNCTION(map) -{ - char *type, *class_name; - zval *to_xml_before = NULL, *to_xml = NULL, *to_xml_after = NULL, - *to_zval_before = NULL, *to_zval = NULL, *to_zval_after = NULL; - int type_len, class_name_len; - char *ns, *ctype; - soapServicePtr service; - - SOAP_SERVER_BEGIN_CODE(); - - if(zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "sz|zzzzz", - &type, &type_len, &to_xml_before, &to_xml, &to_xml_after, &to_zval_before, &to_zval, - &to_zval_after) == SUCCESS && NULL_OR_STRING(to_xml_before) && NULL_OR_STRING(to_xml) && - NULL_OR_STRING(to_xml_after) && NULL_OR_STRING(to_zval_before) && NULL_OR_STRING(to_zval) && - NULL_OR_STRING(to_zval_after)) - { - soapMappingPtr map; - encodePtr enc, new_enc; - smart_str resloved_ns = {0}; - - FETCH_THIS_SERVICE(service); - - new_enc = malloc(sizeof(encode)); - memset(new_enc, 0, sizeof(encode)); - - ctype = strrchr(type, ':'); - if(ctype) { - smart_str_appendl(&resloved_ns, type, ctype - type); - smart_str_0(&resloved_ns); - ctype++; - } else { - ns = NULL; - } - - if(ns) - { - if(zend_hash_find(SOAP_GLOBAL(defEncPrefix), resloved_ns.c, resloved_ns.len + 1, &ns) == SUCCESS) - { - enc = get_encoder(service->sdl, ns, ctype); - smart_str_free(&resloved_ns); - smart_str_appendl(&resloved_ns, ns, strlen(ns)); - smart_str_appendc(&resloved_ns, ':'); - smart_str_appendl(&resloved_ns, ctype, strlen(ctype)); - smart_str_0(&resloved_ns); - type = resloved_ns.c; - type_len = resloved_ns.len; - } - else - enc = get_encoder_ex(service->sdl, type); - } - else - enc = get_encoder_ex(service->sdl, type); - - new_enc->details.type = enc->details.type; - new_enc->details.ns = strdup(enc->details.ns); - new_enc->details.type_str = strdup(enc->details.type_str); - new_enc->details.sdl_type = enc->details.sdl_type; - new_enc->to_xml = enc->to_xml; - new_enc->to_zval = enc->to_zval; - new_enc->to_xml_before = enc->to_xml_before; - new_enc->to_zval_before = enc->to_zval_before; - new_enc->to_xml_after = enc->to_xml_after; - new_enc->to_zval_after = enc->to_zval_after; - - map = emalloc(sizeof(soapMapping)); - memset(map, 0, sizeof(soapMapping)); - - map->type = SOAP_MAP_FUNCTION; - if(IS_VALID_FUNCTION(to_xml_before)) - { - zval_add_ref(&to_xml_before); - map->map_functions.to_xml_before = to_xml_before; - new_enc->to_xml_before = to_xml_before_user; - } - if(IS_VALID_FUNCTION(to_xml)) - { - zval_add_ref(&to_xml); - map->map_functions.to_xml = to_xml; - new_enc->to_xml = to_xml_user; - } - if(IS_VALID_FUNCTION(to_xml_after)) - { - zval_add_ref(&to_xml_after); - map->map_functions.to_xml_after = to_xml_after; - new_enc->to_xml_after = to_xml_after_user; - } - if(IS_VALID_FUNCTION(to_zval_before)) - { - zval_add_ref(&to_zval_before); - map->map_functions.to_zval_before = to_zval_before; - new_enc->to_zval_before = to_zval_before_user; - } - if(IS_VALID_FUNCTION(to_zval)) - { - zval_add_ref(&to_zval); - map->map_functions.to_zval = to_zval; - new_enc->to_zval = to_zval_user; - } - if(IS_VALID_FUNCTION(to_zval_after)) - { - zval_add_ref(&to_zval_after); - map->map_functions.to_zval_after = to_zval_after; - new_enc->to_zval_after = to_zval_after_user; - } - - new_enc->details.map = map; - - if(!service->mapping) - { - service->mapping = emalloc(sizeof(HashTable)); - zend_hash_init(service->mapping, 0, NULL, delete_encoder, 0); - } - zend_hash_update(service->mapping, type, type_len + 1, &new_enc, sizeof(encodePtr), NULL); - smart_str_free(&resloved_ns); - } - else if(zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &type, &type_len, &class_name, &class_name_len, &type) == SUCCESS) - { - } - else - php_error(E_ERROR, "Wrong number of parameters to SoapServer->map"); -} -#endif - -PHP_FUNCTION(bind) -{ - char *wsdl; - int wsdl_len; - soapServicePtr service; - - SOAP_SERVER_BEGIN_CODE(); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &wsdl, &wsdl_len) == FAILURE) - php_error(E_ERROR, "Wrong number of parameters to SoapServer->bind"); - - FETCH_THIS_SERVICE(service); - service->sdl = get_sdl(wsdl); - - SOAP_SERVER_END_CODE(); -} - -PHP_FUNCTION(setpersistence) -{ - soapServicePtr service; - int value; - - SOAP_SERVER_BEGIN_CODE(); - FETCH_THIS_SERVICE(service); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) != FAILURE) - { - if(service->type == SOAP_CLASS) - { - if(value == SOAP_PERSISTENCE_SESSION || - value == SOAP_PERSISTENCE_REQUEST) - service->soap_class.persistance = value; - else - php_error(E_ERROR, "Tried to set persistence with bogus value (%ld)", value); - } - else - php_error(E_ERROR, "Tried to set persistence when you are using you SOAP SERVER in function mode, no persistence needed"); - } - - SOAP_SERVER_END_CODE(); -} - -PHP_FUNCTION(setclass) -{ - soapServicePtr service; - zend_class_entry *ce; - char *class_name = NULL; - int found, argc; - zval ***argv; - - SOAP_SERVER_BEGIN_CODE(); - - FETCH_THIS_SERVICE(service); - - argc = ZEND_NUM_ARGS(); - argv = emalloc(argc * sizeof(zval **)); - - if (argc < 1 || zend_get_parameters_array_ex(argc, argv) == FAILURE) - { - efree(argv); - WRONG_PARAM_COUNT; - } - - if(Z_TYPE_PP(argv[0]) == IS_STRING) - { - class_name = estrdup(Z_STRVAL_PP(argv[0])); - - found = zend_hash_find(EG(class_table), php_strtolower(class_name, Z_STRLEN_PP(argv[0])), Z_STRLEN_PP(argv[0]) + 1, (void **)&ce); - efree(class_name); - if(found != FAILURE) - { - service->type = SOAP_CLASS; - service->soap_class.ce = ce; - service->soap_class.persistance = SOAP_PERSISTENCE_REQUEST; - service->soap_class.argc = argc - 1; - if(service->soap_class.argc > 0) - { - int i; - service->soap_class.argv = emalloc(sizeof(zval) * service->soap_class.argc); - for(i = 0;i < service->soap_class.argc;i++) - { - service->soap_class.argv[i] = *(argv[i + 1]); - zval_add_ref(&service->soap_class.argv[i]); - } - } - } - else - php_error(E_ERROR, "Tried to set a non existant class (%s)", Z_STRVAL_PP(argv[0])); - } - else - php_error(E_ERROR, "You must pass in a string to setclass"); - - efree(argv); - SOAP_SERVER_END_CODE(); -} - -PHP_FUNCTION(getfunctions) -{ - soapServicePtr service; - - SOAP_SERVER_BEGIN_CODE(); - - FETCH_THIS_SERVICE(service); - - array_init(return_value); - if(service->type == SOAP_CLASS) - { - zend_function *f; - zend_hash_internal_pointer_reset(&service->soap_class.ce->function_table); - while(zend_hash_get_current_data(&service->soap_class.ce->function_table, (void **)&f) != FAILURE) - { - add_next_index_string(return_value, f->common.function_name, 1); - zend_hash_move_forward(&service->soap_class.ce->function_table); - } - } - else if(service->soap_functions.functions_all == TRUE) - { - zend_function *f; - zend_hash_internal_pointer_reset(EG(function_table)); - while(zend_hash_get_current_data(EG(function_table), (void **)&f) != FAILURE) - { - add_next_index_string(return_value, f->common.function_name, 1); - zend_hash_move_forward(EG(function_table)); - } - } - else if(service->soap_functions.ft != NULL) - zend_hash_copy(Z_ARRVAL_P(return_value), service->soap_functions.ft, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); - - SOAP_SERVER_END_CODE(); -} - -PHP_FUNCTION(addfunction) -{ - soapServicePtr service; - zval *function_name, *function_copy; - - SOAP_SERVER_BEGIN_CODE(); - - FETCH_THIS_SERVICE(service); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &function_name) == FAILURE) - php_error(E_ERROR, "Invalid parameters passed to addfunction"); - - if(function_name->type == IS_ARRAY) - { - if(service->type == SOAP_FUNCTIONS) - { - zval **tmp_function, *function_copy; - - if(service->soap_functions.ft == NULL) - { - service->soap_functions.ft = emalloc(sizeof(HashTable)); - zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0); - } - - zend_hash_internal_pointer_reset(Z_ARRVAL_P(function_name)); - while(zend_hash_get_current_data(Z_ARRVAL_P(function_name), (void **)&tmp_function) != FAILURE) - { - if(Z_TYPE_PP(tmp_function) != IS_STRING) - php_error(E_ERROR, "Tried to add a function that isn't a string"); - - MAKE_STD_ZVAL(function_copy); - *function_copy = *(*tmp_function); - zval_copy_ctor(function_copy); - - php_strtolower(Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy)); - - if(zend_hash_exists(EG(function_table), Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy) + 1) == FALSE) - php_error(E_ERROR, "Tried to add a non existant function (\"%s\")", Z_STRVAL_PP(tmp_function)); - - zend_hash_update(service->soap_functions.ft, Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy) + 1, &function_copy, sizeof(zval *), NULL); - zend_hash_move_forward(Z_ARRVAL_P(function_name)); - } - } - } - else if(function_name->type == IS_STRING) - { - MAKE_STD_ZVAL(function_copy); - *function_copy = *function_name; - zval_copy_ctor(function_copy); - - php_strtolower(Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy)); - - if(zend_hash_exists(EG(function_table), Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy) + 1) == FALSE) - php_error(E_ERROR, "Tried to add a non existant function (\"%s\")", Z_STRVAL_P(function_name)); - if(service->soap_functions.ft == NULL) - { - service->soap_functions.functions_all = FALSE; - service->soap_functions.ft = emalloc(sizeof(HashTable)); - zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0); - } - - zend_hash_update(service->soap_functions.ft, Z_STRVAL_P(function_copy), Z_STRLEN_P(function_copy) + 1, &function_copy, sizeof(zval *), NULL); - } - else if(function_name->type == IS_LONG) - { - if(Z_LVAL_P(function_name) == SOAP_FUNCTIONS_ALL) - { - if(service->soap_functions.ft != NULL) - { - zend_hash_destroy(service->soap_functions.ft); - efree(service->soap_functions.ft); - service->soap_functions.ft = NULL; - } - service->soap_functions.functions_all = TRUE; - } - else - php_error(E_ERROR, "Invalid value passed to addfunction (%ld)", Z_LVAL_P(function_name)); - } - - SOAP_SERVER_END_CODE(); -} - -PHP_FUNCTION(handle) -{ - soapServicePtr service; - xmlDocPtr doc_request, doc_return; - zval function_name, **params, **raw_post, *soap_obj, retval, **server_vars; - char *fn_name, cont_len[30], *response_name; - int num_params = 0, size, i, call_status; - xmlChar *buf; - HashTable *function_table; - - FETCH_THIS_SERVICE(service); - - SOAP_SERVER_BEGIN_CODE(); - ZERO_PARAM(); - - INIT_ZVAL(retval); - - if(zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **)&server_vars) == SUCCESS) - { - zval **req_method, **query_string; - if(zend_hash_find(Z_ARRVAL_PP(server_vars), "REQUEST_METHOD", sizeof("REQUEST_METHOD"), (void **)&req_method) == SUCCESS) - { - if(!strcmp(Z_STRVAL_PP(req_method), "GET") && zend_hash_find(Z_ARRVAL_PP(server_vars), "QUERY_STRING", sizeof("QUERY_STRING"), (void **)&query_string) == SUCCESS) - { - if(!strcmp(Z_STRVAL_PP(query_string), "WSDL")) - { - if(service->sdl) - { - zval readfile, readfile_ret, *param; - - INIT_ZVAL(readfile); - INIT_ZVAL(readfile_ret); - MAKE_STD_ZVAL(param); - - sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1); - ZVAL_STRING(param, service->sdl->source, 1); - ZVAL_STRING(&readfile, "readfile", 1); - if(call_user_function(EG(function_table), NULL, &readfile, &readfile_ret, 1, ¶m TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Couldn't find WSDL"); - - zval_ptr_dtor(¶m); - zval_dtor(&readfile); - zval_dtor(&readfile_ret); - SOAP_SERVER_END_CODE(); - return; - } - } - } - } - } - -//Turn on output buffering... we don't want people print in their methods -//#if PHP_API_VERSION <= 20010901 -// if(php_start_ob_buffer(NULL, 0 TSRMLS_CC) != SUCCESS) -//#else - if(php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC) != SUCCESS) -//#endif - php_error(E_ERROR,"ob_start failed"); - - if (zend_hash_find(&EG(symbol_table), HTTP_RAW_POST_DATA, sizeof(HTTP_RAW_POST_DATA), (void **) &raw_post)!=FAILURE - && ((*raw_post)->type==IS_STRING)) - { - doc_request = xmlParseMemory(Z_STRVAL_PP(raw_post),Z_STRLEN_PP(raw_post)); - xmlCleanupParser(); - - deseralize_function_call(service->sdl, doc_request, &function_name, &num_params, ¶ms); - xmlFreeDoc(doc_request); - - fn_name = estrndup(Z_STRVAL(function_name),Z_STRLEN(function_name)); - response_name = emalloc(Z_STRLEN(function_name) + strlen("Response") + 1); - sprintf(response_name,"%sResponse\0",fn_name); - - if(service->type == SOAP_CLASS) - { - soap_obj = NULL; - //If persistent then set soap_obj from from the previous created session (if available) - if(service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) - { - zval **tmp_soap; - - //Try and call session regiser for our dummy session object - //The only reason that i use call_user_function is that - //their isn't a way to start the session from an extension - //so calling session_register will both register the var - //and start the session - { - zval *bogus_session_name, session_register, sess_retval; - - INIT_ZVAL(session_register); - INIT_ZVAL(sess_retval); - - if(!zend_ini_long("register_globals", sizeof("register_globals"), 0)) - php_error(E_ERROR, "PHP-SOAP requires 'register_globals' to be on when using persistent objects please check your php.ini file"); - - MAKE_STD_ZVAL(bogus_session_name); - - ZVAL_STRING(bogus_session_name, "_bogus_session_name", 1); - ZVAL_STRING(&session_register, "session_register", 1); - - if(call_user_function(EG(function_table), NULL, &session_register, &sess_retval, 1, &bogus_session_name TSRMLS_CC) == FAILURE) - php_error(E_ERROR,"session_register failed"); - - zval_ptr_dtor(&bogus_session_name); - zval_dtor(&session_register); - zval_dtor(&sess_retval); - } - - //Find the soap object and assign - if(zend_hash_find(&EG(symbol_table), "_bogus_session_name", sizeof("_bogus_session_name"), (void **) &tmp_soap) == SUCCESS) - soap_obj = *tmp_soap; - } - - //If new session or something wierd happned - if(soap_obj == NULL) - { - zval *tmp_soap; - MAKE_STD_ZVAL(tmp_soap); - object_init_ex(tmp_soap, service->soap_class.ce); - - //Call constructor - if(zend_hash_exists(&Z_OBJCE_P(tmp_soap)->function_table, service->soap_class.ce->name, strlen(service->soap_class.ce->name) + 1)) - { - zval c_ret, constructor; - - INIT_ZVAL(c_ret); - INIT_ZVAL(constructor); - - ZVAL_STRING(&constructor, service->soap_class.ce->name, 1); - if(call_user_function(NULL, &tmp_soap, &constructor, &c_ret, service->soap_class.argc, service->soap_class.argv TSRMLS_CC) == FAILURE) - php_error(E_ERROR, "Error calling constructor"); - zval_dtor(&constructor); - zval_dtor(&c_ret); - } - - //If session then update session hash with new object - if(service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) - { - zval **tmp_soap_pp; - if(zend_hash_update(&EG(symbol_table), "_bogus_session_name", sizeof("_bogus_session_name"), &tmp_soap, sizeof(zval *), (void **)&tmp_soap_pp) == SUCCESS) - soap_obj = *tmp_soap_pp; - } - else - soap_obj = tmp_soap; - } - function_table = &(soap_obj->value.obj.ce->function_table); - } - else - { - if(service->soap_functions.functions_all == TRUE) - function_table = EG(function_table); - else - function_table = service->soap_functions.ft; - } - - doc_return = NULL; - if(zend_hash_exists(function_table, php_strtolower(Z_STRVAL(function_name), Z_STRLEN(function_name)), Z_STRLEN(function_name) + 1)) - { - if(service->type == SOAP_CLASS) - { - call_status = call_user_function(NULL, &soap_obj, &function_name, &retval, num_params, params TSRMLS_CC); - if(service->soap_class.persistance != SOAP_PERSISTENCE_SESSION) - zval_ptr_dtor(&soap_obj); - } - else - call_status = call_user_function(EG(function_table), NULL, &function_name, &retval, num_params, params TSRMLS_CC); - } - else - php_error(E_ERROR, "Function (%s) doesn't exist", Z_STRVAL(function_name)); - - if(call_status == SUCCESS) - { - sdlFunctionPtr function; - function = get_function(get_binding_from_type(service->sdl, BINDING_SOAP), Z_STRVAL(function_name)); - SOAP_GLOBAL(overrides) = service->mapping; - doc_return = seralize_response_call(function, response_name, service->uri, &retval); - SOAP_GLOBAL(overrides) = NULL; - } - else - php_error(E_ERROR, "Function (%s) call failed", Z_STRVAL(function_name)); - - //Flush buffer - php_end_ob_buffer(0, 0 TSRMLS_CC); - - //xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); - xmlDocDumpMemory(doc_return, &buf, &size); - - if(size == 0) - php_error(E_ERROR, "Dump memory failed"); - - sprintf(cont_len, "Content-Length: %d\0", size); - sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1); - sapi_add_header(cont_len, strlen(cont_len) + 1, 1); - - //Free Memory - if(num_params > 0) - { - for(i = 0; i < num_params;i++) - zval_ptr_dtor(¶ms[i]); - efree(params); - } - - zval_dtor(&function_name); - xmlFreeDoc(doc_return); - efree(response_name); - efree(fn_name); - - php_write(buf, size TSRMLS_CC); - xmlFree(buf); - } - else - { - if(!zend_ini_long("always_populate_raw_post_data", sizeof("always_populate_raw_post_data"), 0)) - php_error(E_ERROR, "PHP-SOAP requires 'always_populate_raw_post_data' to be on please check your php.ini file"); - - php_error(E_ERROR, "Couln't find HTTP_RAW_POST_DATA"); - } - - zval_dtor(&retval); - SOAP_SERVER_END_CODE(); -} - -void soap_error_handler(int error_num, const char *error_filename, const uint error_lineno, const char *format, va_list args) -{ - char buffer[1024]; - int buffer_len; - TSRMLS_FETCH(); - - buffer_len = vsnprintf(buffer, sizeof(buffer)-1, format, args); - buffer[sizeof(buffer)-1]=0; - if(buffer_len > sizeof(buffer) - 1 || buffer_len < 0) { - buffer_len = sizeof(buffer) - 1; - } - - //Trap all errors - //What do do with these warnings - // E_WARNING, E_NOTICE, E_CORE_WARNING, E_COMPILE_WARNING, E_USER_WARNING, E_USER_NOTICE - if(error_num == E_USER_ERROR || error_num == E_COMPILE_ERROR || error_num == E_CORE_ERROR || - error_num == E_ERROR || error_num == E_PARSE) - { - zval outbuf, outbuflen, ret; - xmlChar *buf, cont_len[30]; - int size; - xmlDocPtr doc_return; - - INIT_ZVAL(outbuf); - INIT_ZVAL(outbuflen); - INIT_ZVAL(ret); - - //Get output buffer and send as fault detials - if(php_ob_get_length(&outbuflen TSRMLS_CC) != FAILURE && Z_LVAL(outbuflen) != 0) - php_ob_get_buffer(&outbuf TSRMLS_CC); - php_end_ob_buffer(0, 0 TSRMLS_CC); - - set_soap_fault(&ret, "SOAP-ENV:Server", buffer, NULL, &outbuf); - doc_return = seralize_response_call(NULL, NULL, NULL, &ret); - - //Build and send our headers + http 500 status - //xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); - xmlDocDumpMemory(doc_return, &buf, &size); - sprintf(cont_len,"Content-Length: %d\0", size); - sapi_add_header(cont_len, strlen(cont_len) + 1, 1); - sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1); - - // Want to return HTTP 500 but apache wants to over write - // our fault code with their own handling... Figure this out later - // sapi_add_header("HTTP/1.1 500 Internal Service Error", sizeof("HTTP/1.1 500 Internal Service Error"), 1); - php_write(buf, size TSRMLS_CC); - - xmlFreeDoc(doc_return); - xmlFree(buf); - - zval_dtor(&outbuf); - zval_dtor(&outbuflen); - zval_dtor(&ret); - - zend_bailout(); - } -} - -// SoapObject functions -PHP_FUNCTION(soapobject) -{ - char *location, *uri = NULL; - int location_len, uri_len = 0; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &location, &location_len, &uri, &uri_len) == SUCCESS) - { - if(uri) - { - // if two parameters assume 'proxy' and 'uri' - add_property_stringl(thisObj, "location", location, location_len, 1); - add_property_stringl(thisObj, "uri", uri, uri_len, 1); - } - else - { - // if one parameter assume 'wsdl' - sdlPtr sdl; - int ret; - - sdl = get_sdl(location); - ret = zend_list_insert(sdl, le_sdl); - - add_property_resource(thisObj, "sdl", ret); - add_property_resource(thisObj, "port", (long)get_binding_from_type(sdl, BINDING_SOAP)); - zend_list_addref(ret); - } - } -} - -PHP_FUNCTION(__headerclass) -{ - char *classname, *ns; - int classname_len, ns_len; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &classname, &classname_len, &ns, &ns_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__headerclass"); -} - -PHP_FUNCTION(__headerfunction) -{ - char *functionname, *headername, *ns; - int functionname_len, *headername_len, ns_len; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &functionname, &functionname_len, &headername, - &headername_len, &ns, &ns_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__headerfunction"); -} - -PHP_FUNCTION(__use) -{ - int use; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &use) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__use"); - - if(use == SOAP_DOCUMENT || use == SOAP_LITERAL) - { - add_property_long(thisObj, "use", use); - RETURN_TRUE; - } - RETURN_FALSE; -} - -PHP_FUNCTION(__style) -{ - int style; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &style)) - php_error(E_ERROR, "Invalid arguments to SoapObject->__style"); - - if(style == SOAP_RPC || style == SOAP_DOCUMENT) - { - add_property_long(thisObj, "style", style); - RETURN_TRUE; - } - RETURN_FALSE; -} - -PHP_FUNCTION(__trace) -{ - int level; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &level)) - php_error(E_ERROR, "Invalid arguments to SoapObject->__trace"); - - add_property_long(thisObj, "trace", level); - RETURN_TRUE; -} - -PHP_FUNCTION(__generate) -{ - char *function, *soap_action, *uri; - int function_len, soap_action_len, uri_len, i = 0; - zval *args; - zval **real_args; - zval **param; - xmlDocPtr request = NULL; - int arg_count; - xmlChar *buf; - int size; - sdlPtr sdl; - - FETCH_THIS_SDL(sdl); - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|ss", - &function, &function_len, &args, &soap_action, &soap_action_len, &uri, &uri_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__call"); - - arg_count = zend_hash_num_elements(Z_ARRVAL_P(args)); - - real_args = emalloc(sizeof(zval *) * arg_count); - for(zend_hash_internal_pointer_reset(Z_ARRVAL_P(args)); - zend_hash_get_current_data(Z_ARRVAL_P(args), (void **) ¶m) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(args))) - { - zval_add_ref(param); - real_args[i++] = *param; - } - - - if(sdl) - { - sdlBindingPtr binding; - sdlFunctionPtr sdlFunction; - FETCH_THIS_PORT(binding); - - php_strtolower(function, function_len); - sdlFunction = get_function(binding, function); - request = seralize_function_call(this_ptr, sdlFunction, NULL, uri, real_args, arg_count); - } - else - { - request = seralize_function_call(this_ptr, NULL, function, uri, real_args, arg_count); - } - - xmlDocDumpMemory(request, &buf, &size); - ZVAL_STRINGL(return_value, buf, size, 1); - xmlFree(buf); -} - -PHP_FUNCTION(__parse) -{ - char *message, *function; - int message_len, function_len; - int num_params; - zval **ret_params; - sdlPtr sdl; - sdlFunctionPtr fn; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &message, &message_len, &function, &function_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__parse"); - - FETCH_THIS_SDL(sdl); - - if(sdl != NULL) - { - sdlBindingPtr binding; - - FETCH_THIS_PORT(binding); - fn = get_function(binding, function); - if(fn != NULL) - parse_packet_soap(getThis(), message, message_len, fn, NULL, &ret_params, &num_params); - } - else - parse_packet_soap(getThis(), message, message_len, NULL, function, &ret_params, &num_params); - - if(num_params > 0) - { - *return_value = *ret_params[0]; - zval_add_ref(&return_value); - efree(ret_params); - } - else - ZVAL_NULL(return_value) -} - -PHP_FUNCTION(__call) -{ - char *function, *soap_action, *uri; - int function_len, soap_action_len, uri_len, i = 0; - zval *args; - zval **real_args; - zval **param; - xmlDocPtr request = NULL; - int num_params, arg_count; - zval **ret_params; - char *buffer; - int len; - - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|ss", - &function, &function_len, &args, &soap_action, &soap_action_len, &uri, &uri_len) == FAILURE) - php_error(E_ERROR, "Invalid arguments to SoapObject->__call"); - - arg_count = zend_hash_num_elements(Z_ARRVAL_P(args)); - - real_args = emalloc(sizeof(zval *) * arg_count); - for(zend_hash_internal_pointer_reset(Z_ARRVAL_P(args)); - zend_hash_get_current_data(Z_ARRVAL_P(args), (void **) ¶m) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(args))) - { - zval_add_ref(param); - real_args[i++] = *param; - } - - request = seralize_function_call(this_ptr, NULL, function, uri, real_args, arg_count); - send_http_soap_request(getThis(), request, function, soap_action); - xmlFreeDoc(request); - - get_http_soap_response(getThis(), &buffer, &len); - parse_packet_soap(getThis(), buffer, len, NULL, function, &ret_params, &num_params); - efree(buffer); - - if(num_params > 0) - { - *return_value = *ret_params[0]; - zval_add_ref(&return_value); - efree(ret_params); - } - else - ZVAL_NULL(return_value) -} - -PHP_FUNCTION(__isfault) -{ - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - if(zend_hash_exists(Z_OBJPROP_P(thisObj), "__soap_fault", sizeof("__soap_fault"))) - RETURN_TRUE - else - RETURN_FALSE -} - -PHP_FUNCTION(__getfault) -{ - zval *thisObj; - zval **tmp; - - GET_THIS_OBJECT(thisObj); - - if(zend_hash_find(Z_OBJPROP_P(thisObj), "__soap_fault", sizeof("__soap_fault"), (void **)&tmp) == SUCCESS) - { - *return_value = *(*tmp); - zval_copy_ctor(return_value); - return; - } - RETURN_NULL(); -} - -PHP_FUNCTION(__getfunctions) -{ - sdlPtr sdl; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - FETCH_THIS_SDL(sdl); - - if(sdl) - { - smart_str buf = {0}; - sdlFunctionPtr *function; - sdlBindingPtr binding; - - FETCH_THIS_PORT(binding); - - array_init(return_value); - zend_hash_internal_pointer_reset(binding->functions); - while(zend_hash_get_current_data(binding->functions, (void **)&function) != FAILURE) - { - function_to_string((*function), &buf); - add_next_index_stringl(return_value, buf.c, buf.len, 1); - zend_hash_move_forward(binding->functions); - smart_str_free(&buf); - } - } -} - -PHP_FUNCTION(__gettypes) -{ - sdlPtr sdl; - zval *thisObj; - - GET_THIS_OBJECT(thisObj); - - FETCH_THIS_SDL(sdl); - - if(sdl) - { - sdlTypePtr *type; - smart_str buf = {0}; - - array_init(return_value); - if(sdl->types) - { - zend_hash_internal_pointer_reset(sdl->types); - while(zend_hash_get_current_data(sdl->types, (void **)&type) != FAILURE) - { - type_to_string((*type), &buf, 0); - add_next_index_stringl(return_value, buf.c, buf.len, 1); - zend_hash_move_forward(sdl->types); - smart_str_free(&buf); - } - } - } -} - -PHP_FUNCTION(__getlastrequest) -{ - zval *thisObj; - zval **tmp; - - GET_THIS_OBJECT(thisObj); - - if(zend_hash_find(Z_OBJPROP_P(thisObj), "__last_request", sizeof("__last_request"), (void **)&tmp) == SUCCESS) - { - *return_value = *(*tmp); - zval_copy_ctor(return_value); - return; - } - RETURN_NULL(); -} - -PHP_FUNCTION(__getlastresponse) -{ - zval *thisObj; - zval **tmp; - - GET_THIS_OBJECT(thisObj); - - if(zend_hash_find(Z_OBJPROP_P(thisObj), "__last_response", sizeof("__last_response"), (void **)&tmp) == SUCCESS) - { - *return_value = *(*tmp); - zval_copy_ctor(return_value); - return; - } - RETURN_NULL(); -} - -void soap_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference) -{ - pval *object = property_reference->object; - zend_overloaded_element *function_name = (zend_overloaded_element *)property_reference->elements_list->tail->data; - zval *thisObj; - char *function = Z_STRVAL(function_name->element); - zend_function *builtin_function; - - GET_THIS_OBJECT(thisObj); - - //Find if the function being called is already defined... - // ( IMHO: zend should handle this functionality ) - if(zend_hash_find(&Z_OBJCE_P(thisObj)->function_table, function, Z_STRLEN(function_name->element) + 1, (void **) &builtin_function) == SUCCESS) - { - builtin_function->internal_function.handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - } - else - { - zval **arguments = (zval **) emalloc(sizeof(zval *) * ZEND_NUM_ARGS()); - int arg_count = ZEND_NUM_ARGS(); - xmlDocPtr request = NULL; - sdlPtr sdl; - sdlFunctionPtr fn; - - zend_get_parameters_array(ht, arg_count, arguments); - - FETCH_THIS_SDL(sdl); - - clear_soap_fault(thisObj); - - if(sdl != NULL) - { - sdlBindingPtr binding; - - FETCH_THIS_PORT(binding); - fn = get_function(binding, function); - if(fn != NULL) - { - int num_params; - zval **ret_params; - char *buffer; - char *ns; - int len; - - if(binding->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes; - request = seralize_function_call(this_ptr, fn, NULL, fnb->input.ns, arguments, arg_count); - send_http_soap_request(getThis(), request, fn->functionName, fnb->soapAction); - } - else - { - request = seralize_function_call(this_ptr, fn, NULL, sdl->target_ns, arguments, arg_count); - send_http_soap_request(getThis(), request, fn->functionName, NULL); - } - - xmlFreeDoc(request); - - get_http_soap_response(getThis(), &buffer, &len); - parse_packet_soap(getThis(), buffer, len, fn, NULL, &ret_params, &num_params); - efree(buffer); - - if(num_params > 0) - { - *return_value = *ret_params[0]; - zval_add_ref(&return_value); - efree(ret_params); - } - else - ZVAL_NULL(return_value); - } - else - { - php_error(E_WARNING,"Function (\"%s\") not is not a valid method for this service", function); - } - } - else - { - int num_params; - zval **ret_params; - zval **uri; - smart_str *action; - char *buffer; - int len; - - if(zend_hash_find(Z_OBJPROP_P(thisObj), "uri", sizeof("uri"), (void *)&uri) == FAILURE) - php_error(E_ERROR, "Error finding uri in soap_call_function_handler"); - - request = seralize_function_call(this_ptr, NULL, function, Z_STRVAL_PP(uri), arguments, arg_count); - action = build_soap_action(thisObj, function); - send_http_soap_request(getThis(), request, function, action->c); - - smart_str_free(action); - xmlFreeDoc(request); - - get_http_soap_response(getThis(), &buffer, &len); - parse_packet_soap(getThis(), buffer, len, NULL, function, &ret_params, &num_params); - efree(buffer); - - if(num_params > 0) - { - *return_value = *ret_params[0]; - zval_add_ref(&return_value); - efree(ret_params); - } - else - ZVAL_NULL(return_value); - } - efree(arguments); - } - - zval_dtor(&function_name->element); -} - -void clear_soap_fault(zval *obj) -{ - if(obj != NULL && obj->type == IS_OBJECT) - zend_hash_del(obj->value.obj.properties, "__soap_fault", sizeof("__soap_fault")); -} - -void add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail) -{ - zval *fault; - MAKE_STD_ZVAL(fault); - set_soap_fault(fault, fault_string, fault_code, fault_actor, fault_detail); - add_property_zval(obj, "__soap_fault", fault); -} - -void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail) -{ - TSRMLS_FETCH(); - - if(Z_TYPE_P(obj) != IS_OBJECT) - object_init_ex(obj, &soap_fault_class_entry); - - if(fault_string != NULL) - add_property_string(obj, "faultstring", fault_string, 1); - - if(fault_code != NULL) - add_property_string(obj, "faultcode", fault_code, 1); - - if(fault_actor != NULL) - add_property_string(obj, "faultactor", fault_actor, 1); - - if(fault_detail != NULL) - { - zval_add_ref(&fault_detail); - add_property_zval(obj, "detail", fault_detail); - } -} - -void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name, int *num_params, zval ***parameters) -{ - xmlNodePtr trav,trav2,trav3,trav4,env,body; - int cur_param = 0,num_of_params = 0; - TSRMLS_FETCH(); - - trav = request->children; - FOREACHNODE(trav,"Envelope",env) - { - trav2 = env->children; - FOREACHNODE(trav2,"Body",body) - { - trav3 = body->children; - do - { - // TODO: make 'strict' (use th sdl defnintions) - if(trav3->type == XML_ELEMENT_NODE) - { - zval tmp_function_name, **tmp_parameters; - sdlFunctionPtr function; - sdlBindingPtr binding = get_binding_from_type(sdl, BINDING_SOAP); - - INIT_ZVAL(tmp_function_name); - ZVAL_STRING(&tmp_function_name, (char *)trav3->name, 1); - - (*function_name) = tmp_function_name; - - function = get_function(binding, php_strtolower((char *)trav3->name, strlen(trav3->name))); - if(sdl != NULL && function == NULL) - php_error(E_ERROR, "Error function \"%s\" doesn't exists for this service \"%s\"", trav3->name, binding->location); - - if(trav3->children) - { - trav4 = trav3->children; - if(function == NULL) - { - do - { - if(trav4->type == XML_ELEMENT_NODE) - num_of_params++; - - }while(trav4 = trav4->next); - } - else - num_of_params = zend_hash_num_elements(function->requestParameters); - - tmp_parameters = emalloc(num_of_params * sizeof(zval *)); - trav4 = trav3->children; - do - { - if(trav4->type == XML_ELEMENT_NODE) - { - encodePtr enc; - sdlParamPtr *param = NULL; - - if(function != NULL && zend_hash_index_find(function->requestParameters, cur_param, (void **)¶m) == FAILURE) - php_error(E_ERROR, "Error cannot find parameter"); - if(param == NULL) - enc = get_conversion(UNKNOWN_TYPE); - else - enc = (*param)->encode; - - tmp_parameters[cur_param] = master_to_zval(enc, trav4); - cur_param++; - } - - }while(trav4 = trav4->next); - } - (*parameters) = tmp_parameters; - (*num_params) = num_of_params; - break; - } - }while(trav3 = trav3->next); - - } - ENDFOREACH(trav2); - } - ENDFOREACH(trav); -} - -xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name, char *uri, zval *ret) -{ - xmlDoc *doc; - xmlNode *envelope,*body,*method, *param; - xmlNs *ns; - sdlParamPtr parameter = NULL; - smart_str *gen_ns; - - encode_reset_ns(); - - doc = xmlNewDoc("1.0"); - doc->charset = XML_CHAR_ENCODING_UTF8; - doc->encoding = xmlStrdup((xmlChar*)"UTF-8"); - doc->children = xmlNewDocNode(doc, NULL, "SOAP-ENV:Envelope", NULL); - envelope = doc->children; - - xmlSetProp(envelope, "SOAP-ENV:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"); - xmlSetProp(envelope, "xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"); - xmlSetProp(envelope, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); - xmlSetProp(envelope, "xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); - xmlSetProp(envelope, "xmlns:" APACHE_NS_PREFIX , APACHE_NAMESPACE); - - ns = xmlNewNs(envelope,"http://schemas.xmlsoap.org/soap/envelope/","SOAP-ENV"); - body = xmlNewChild(envelope, ns, "Body", NULL); - - if(Z_TYPE_P(ret) == IS_OBJECT && - Z_OBJCE_P(ret)->refcount == soap_fault_class_entry.refcount) - { - param = seralize_zval(ret, NULL, "SOAP-ENV:Fault", SOAP_ENCODED); - xmlAddChild(body, param); - } - else - { - gen_ns = encode_new_ns(); - ns = xmlNewNs(envelope, uri, gen_ns->c); - - if(function != NULL) - method = xmlNewChild(body, ns, function->responseName , NULL); - else - method = xmlNewChild(body, ns, function_name, NULL); - - if(uri) - ns = xmlNewNs(method, uri, NULL); - - parameter = get_param(function, NULL, 0, TRUE); - - if(Z_TYPE_P(ret) == IS_OBJECT && - Z_OBJCE_P(ret)->refcount == soap_param_class_entry.refcount) - { - zval **ret_name; - zval **ret_data; - - if(zend_hash_find(Z_OBJPROP_P(ret), "param_name", sizeof("param_name"), (void **)&ret_name) == SUCCESS && - zend_hash_find(Z_OBJPROP_P(ret), "param_data", sizeof("param_data"), (void **)&ret_data) == SUCCESS) - param = seralize_parameter(parameter, *ret_data, 0, Z_STRVAL_PP(ret_name), SOAP_ENCODED); - else - param = seralize_parameter(parameter, ret, 0, "return", SOAP_ENCODED); - } - else - param = seralize_parameter(parameter, ret, 0, "return", SOAP_ENCODED); - - xmlAddChild(method,param); - } - - return doc; -} - -xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count) -{ - xmlDoc *doc; - xmlNode *envelope, *body, *method; - xmlNs *ns, *tmpns; - zval **zstyle, **zuse; - int i, style, use; - smart_str *gen_ns; - - encode_reset_ns(); - - doc = xmlNewDoc("1.0"); - doc->encoding = xmlStrdup((xmlChar*)"UTF-8"); - doc->charset = XML_CHAR_ENCODING_UTF8; - envelope = xmlNewDocNode(doc, NULL, "SOAP-ENV:Envelope", NULL); - xmlDocSetRootElement(doc, envelope); - xmlSetProp(envelope, "SOAP-ENV:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"); - xmlSetProp(envelope, "xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"); - xmlSetProp(envelope, "xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); - xmlSetProp(envelope, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); - - ns = xmlNewNs(envelope, "http://schemas.xmlsoap.org/soap/envelope/", "SOAP-ENV"); - body = xmlNewChild(envelope, ns, "Body", NULL); - - gen_ns = encode_new_ns(); - - if(function) - { - if(function->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)function->bindingAttributes; - - style = fnb->style; - use = fnb->input.use; - if(style == SOAP_RPC) - { - ns = xmlNewNs(body, fnb->input.ns, gen_ns->c); - method = xmlNewChild(body, ns, function->requestName , NULL); - } - } - } - else - { - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "style", sizeof("style"), (void **)&zstyle) == SUCCESS) - style = Z_LVAL_PP(zstyle); - else - style = SOAP_RPC; - - if(style == SOAP_RPC) - { - ns = xmlNewNs(body, uri, gen_ns->c); - method = xmlNewChild(body, ns, function_name, NULL); - } - - if(zend_hash_find(Z_OBJPROP_P(this_ptr), "use", sizeof("use"), (void **)&zuse) == SUCCESS) - use = Z_LVAL_PP(zuse); - else - use = SOAP_ENCODED; - } - - for(i = 0;i < arg_count;i++) - { - xmlNodePtr param; - sdlParamPtr parameter = get_param(function, NULL, i, FALSE); - - if(Z_TYPE_P(arguments[i]) == IS_OBJECT && - Z_OBJCE_P(arguments[i])->refcount == soap_param_class_entry.refcount) - { - zval **ret_name; - zval **ret_data; - - if(zend_hash_find(Z_OBJPROP_P(arguments[i]), "param_name", sizeof("param_name"), (void **)&ret_name) == SUCCESS && - zend_hash_find(Z_OBJPROP_P(arguments[i]), "param_data", sizeof("param_data"), (void **)&ret_data) == SUCCESS) - param = seralize_parameter(parameter, *ret_data, i, Z_STRVAL_PP(ret_name), use); - else - param = seralize_parameter(parameter, arguments[i], i, NULL, use); - } - else - param = seralize_parameter(parameter, arguments[i], i, NULL, use); - - if(style == SOAP_RPC) - xmlAddChild(method, param); - else if(style == SOAP_DOCUMENT) - { - if(function && function->bindingType == BINDING_SOAP) - { - sdlParamPtr *sparam; - - if(zend_hash_index_find(function->requestParameters, 0, (void **)&sparam) == SUCCESS) - { - ns = xmlNewNs(param, (*sparam)->encode->details.ns, gen_ns->c); - xmlNodeSetName(param, (*sparam)->encode->details.type_str); - xmlSetNs(param, ns); - } - } - xmlAddChild(body, param); - } - } - smart_str_free(gen_ns); - - return doc; -} - -xmlNodePtr seralize_parameter(sdlParamPtr param, zval *param_val, int index, char *name, int style) -{ - int type = 0; - char *paramName; - xmlNodePtr xmlParam; - - if(param != NULL && param->paramName != NULL) - paramName = estrdup(param->paramName); - else - { - if(name == NULL) - { - paramName = emalloc(10); - sprintf(paramName,"param%d",index); - } - else - paramName = estrdup(name); - } - - xmlParam = seralize_zval(param_val, param, paramName, style); - - efree(paramName); - - return xmlParam; -} - -zval *desearlize_zval(sdlPtr sdl, xmlNodePtr data, sdlParamPtr param) -{ - encodePtr enc; - TSRMLS_FETCH(); - - if(param != NULL) - enc = param->encode; - else - enc = get_conversion(UNKNOWN_TYPE); - - return enc->to_zval(enc->details, data); -} - -xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style) -{ - xmlNodePtr xmlParam; - encodePtr enc; - TSRMLS_FETCH(); - - if(param != NULL) - enc = param->encode; - else - enc = get_conversion(val->type); - - xmlParam = master_to_xml(enc, val, style); - if(!strcmp(xmlParam->name, "BOGUS")) - xmlNodeSetName(xmlParam, paramName); - - return xmlParam; -} - -sdlParamPtr get_param(sdlFunctionPtr function, char *param_name, int index, int response) -{ - sdlParamPtr *tmp = NULL; - HashTable *h; - - if(function == NULL) - return NULL; - - if(response == FALSE) - h = function->requestParameters; - else - h = function->responseParameters; - - if (function != NULL && (param_name == NULL || zend_hash_find(h, param_name, strlen(param_name), (void **)&tmp) == FAILURE)) - { - if(index != -1) - if(zend_hash_index_find(h, index, (void **)&tmp) != FAILURE) - return (*tmp); - } - else - return (*tmp); - - return NULL; -} - -sdlFunctionPtr get_function(sdlBindingPtr sdl, char *function_name) -{ - sdlFunctionPtr *tmp; - if(sdl != NULL) - if(zend_hash_find(sdl->functions, function_name, strlen(function_name), (void **)&tmp) != FAILURE) - return (*tmp); - return NULL; -} - -static void function_to_string(sdlFunctionPtr function, smart_str *buf) -{ - int i = 0; - - if(function->responseParameters) - { - sdlParamPtr *param; - param = function->responseParameters->pListHead->pData; - smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); - smart_str_appendc(buf, ' '); - } - else - smart_str_appendl(buf, "void ", 5); - - smart_str_appendl(buf, function->functionName, strlen(function->functionName)); - - smart_str_appendc(buf, '('); - if(function->requestParameters) - { - sdlParamPtr *param; - - i = 0; - zend_hash_internal_pointer_reset(function->requestParameters); - while(zend_hash_get_current_data(function->requestParameters, (void **)¶m) != FAILURE) - { - smart_str_appendl(buf, (*param)->encode->details.type_str, strlen((*param)->encode->details.type_str)); - smart_str_appendc(buf, ' '); - smart_str_appendc(buf, '$'); - smart_str_appendl(buf, (*param)->paramName, strlen((*param)->paramName)); - if(zend_hash_num_elements(function->requestParameters) > i + 1) - smart_str_appendl(buf, ", ", 2); - zend_hash_move_forward(function->requestParameters); - i++; - } - } - smart_str_appendc(buf, ')'); -} - -static void type_to_string(sdlTypePtr type, smart_str *buf, int level) -{ - int i; - smart_str spaces = {0}; - - for(i = 0;i < level;i++) - smart_str_appendc(&spaces, ' '); - - smart_str_appendl(buf, spaces.c, spaces.len); - if(type->elements) - { - sdlTypePtr *t_type; - - smart_str_appendl(buf, "struct ", 7); - smart_str_appendl(buf, type->name, strlen(type->name)); - smart_str_appendc(buf, '\n'); - smart_str_appendl(buf, spaces.c, spaces.len); - smart_str_appendl(buf, "{\n", 2); - - zend_hash_internal_pointer_reset(type->elements); - level++; - while(zend_hash_get_current_data(type->elements, (void **)&t_type) != FAILURE) - { - type_to_string((*t_type), buf, level); - zend_hash_move_forward(type->elements); - } - - smart_str_appendl(buf, spaces.c, spaces.len); - smart_str_appendl(buf, "}\n", 2); - } - else - { - smart_str_appendl(buf, type->encode->details.type_str, strlen(type->encode->details.type_str)); - smart_str_appendc(buf, ' '); - smart_str_appendl(buf, type->name, strlen(type->name)); - smart_str_appendl(buf, ";\n", 2); - } -} - -//Deletes -void delete_sdl(void *handle) -{ - sdlPtr tmp = *((sdlPtr*)handle); - - xmlFreeDoc(tmp->doc); - if(tmp->source) - free(tmp->source); - if(tmp->target_ns) - free(tmp->target_ns); - if(tmp->encoders) - { - zend_hash_destroy(tmp->encoders); - free(tmp->encoders); - } - if(tmp->types) - { - zend_hash_destroy(tmp->types); - free(tmp->types); - } - if(tmp->bindings) - { - zend_hash_destroy(tmp->bindings); - free(tmp->bindings); - } - free(tmp); -} - -void delete_http_socket(void *handle) -{ - SOAP_STREAM stream = (SOAP_STREAM)handle; -#ifdef PHP_STREAMS - TSRMLS_FETCH(); - php_stream_close(stream); -#else - SOCK_CLOSE(stream); -#endif -} - -void delete_url(void *handle) -{ - php_url_free((php_url*)handle); -} - -void delete_service(void *data) -{ - soapServicePtr service = (soapServicePtr)data; - - if(service->soap_functions.ft) - { - zend_hash_destroy(service->soap_functions.ft); - efree(service->soap_functions.ft); - } - - if(service->mapping) - { - zend_hash_destroy(service->mapping); - efree(service->mapping); - } - - if(service->soap_class.argc) - { - int i; - for(i = 0; i < service->soap_class.argc;i++) - zval_ptr_dtor(&service->soap_class.argv[i]); - efree(service->soap_class.argv); - } - - efree(service->uri); - efree(service); -} - -void delete_binding(void *data) -{ - sdlBindingPtr binding = *((sdlBindingPtr*)data); - - if(binding->functions) - { - zend_hash_destroy(binding->functions); - free(binding->functions); - } - - if(binding->location) - free(binding->location); - if(binding->name) - free(binding->name); - - if(binding->bindingType == BINDING_SOAP) - { - sdlSoapBindingPtr soapBind = binding->bindingAttributes; - free(soapBind->transport); - } -} - -void delete_function(void *data) -{ - sdlFunctionPtr function = *((sdlFunctionPtr*)data); - - if(function->functionName) - free(function->functionName); - if(function->requestName) - free(function->requestName); - if(function->responseName) - free(function->responseName); - - if(function->requestParameters) - { - zend_hash_destroy(function->requestParameters); - free(function->requestParameters); - } - if(function->responseParameters) - { - zend_hash_destroy(function->responseParameters); - free(function->responseParameters); - } - - if(function->bindingType == BINDING_SOAP) - { - sdlSoapBindingFunctionPtr soapFunction = function->bindingAttributes; - if(soapFunction->soapAction) - free(soapFunction->soapAction); - delete_sdl_soap_binding_function_body(soapFunction->input); - delete_sdl_soap_binding_function_body(soapFunction->output); - delete_sdl_soap_binding_function_body(soapFunction->falut); - } -} - -void delete_sdl_soap_binding_function_body(sdlSoapBindingFunctionBody body) -{ - if(body.ns) - free(body.ns); - if(body.parts) - free(body.parts); - if(body.encodingStyle) - free(body.encodingStyle); -} - -void delete_paramater(void *data) -{ - sdlParamPtr param = *((sdlParamPtr*)data); - if(param->paramName) - free(param->paramName); - free(param); -} - -void delete_mapping(void *data) -{ - soapMappingPtr map = (soapMappingPtr)data; - - if(map->ns) - efree(map->ns); - if(map->ctype) - efree(map->ctype); - - if(map->type == SOAP_MAP_FUNCTION) - { - if(map->map_functions.to_xml_before) - zval_ptr_dtor(&map->map_functions.to_xml_before); - if(map->map_functions.to_xml) - zval_ptr_dtor(&map->map_functions.to_xml); - if(map->map_functions.to_xml_after) - zval_ptr_dtor(&map->map_functions.to_xml_after); - - if(map->map_functions.to_zval_before) - zval_ptr_dtor(&map->map_functions.to_zval_before); - if(map->map_functions.to_zval) - zval_ptr_dtor(&map->map_functions.to_zval); - if(map->map_functions.to_zval_after) - zval_ptr_dtor(&map->map_functions.to_zval_after); - } - efree(map); -} - -// Should not need -int my_call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, int param_count, zval *params[] TSRMLS_DC) -{ - if(call_user_function(function_table, object_pp, function_name, retval_ptr, param_count, params TSRMLS_CC) == FAILURE) - { - if(Z_OBJCE_PP(object_pp)->handle_function_call != NULL) - { - zend_overloaded_element overloaded_element; - zend_property_reference property_reference; - zend_function_state function_state; - zend_function_state *original_function_state_ptr; - int i; - - overloaded_element.element = *function_name; - overloaded_element.type = OE_IS_METHOD; - - function_state.function = (zend_function *) emalloc(sizeof(zend_function)); - function_state.function->type = ZEND_OVERLOADED_FUNCTION; - function_state.function->common.arg_types = NULL; - function_state.function->overloaded_function.function_name = Z_STRVAL_P(function_name); - - property_reference.object = *object_pp; - property_reference.type = BP_VAR_NA; - property_reference.elements_list = (zend_llist *)emalloc(sizeof(zend_llist)); - zend_llist_init(property_reference.elements_list, sizeof(zend_overloaded_element), NULL, 0); - zend_llist_add_element(property_reference.elements_list, &overloaded_element); - - //Build argument stack - for(i = 0;i < param_count;i++) - zend_ptr_stack_push(&EG(argument_stack), params[i]); - zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *)param_count, NULL); - - original_function_state_ptr = EG(function_state_ptr); - EG(function_state_ptr) = &function_state; - Z_OBJCE_PP(object_pp)->handle_function_call(param_count, retval_ptr, *object_pp, 1 TSRMLS_CC, &property_reference); - EG(function_state_ptr) = original_function_state_ptr; - - zend_llist_destroy(property_reference.elements_list); - efree(property_reference.elements_list); - efree(function_state.function); - - zend_ptr_stack_clear_multiple(TSRMLS_C); - return SUCCESS; - } - } - return FAILURE; -}
\ No newline at end of file diff --git a/ext/standard/file.c b/ext/standard/file.c index 80de164ab8..15c2e902c4 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1991,8 +1991,14 @@ PHP_FUNCTION(fgetcsv) while(isspace((int) *bptr) && (*bptr!=delimiter)) bptr++; /* 2. Read field, leaving bptr pointing at start of next field */ if (enclosure && *bptr == enclosure) { + bptr++; /* move on to first character in field */ + + /* Check if there is an end to the enclosure */ + if (!strchr(bptr, enclosure)) { + continue; + } + /* 2A. handle enclosure delimited field */ - bptr++; /* move on to first character in field */ while (*bptr) { if (*bptr == enclosure) { /* handle the enclosure */ diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 457c5bf83d..185909492b 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -375,12 +375,20 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) zend_error(E_WARNING, "'unserialize_callback_func' (%s) hasn't defined the class it was called for", user_func->value.str.val); incomplete_class = 1; ce = PHP_IC_ENTRY; - } else + } else { +#ifdef ZEND_ENGINE_2 + ce = *(zend_class_entry **)ce; /* Bad hack, TBF! */ +#endif efree(class_name); + } } } - } else + } else { +#ifdef ZEND_ENGINE_2 + ce = *(zend_class_entry **)ce; /* Bad hack, TBF! */ +#endif efree(class_name); + } *p = YYCURSOR; elements = object_common1(UNSERIALIZE_PASSTHRU, ce); diff --git a/main/php_realpath.c b/main/php_realpath.c deleted file mode 100644 index 8c7cef5f86..0000000000 --- a/main/php_realpath.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP version 4.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Sander Steffann (sander@steffann.nl) | - +----------------------------------------------------------------------+ - */ - -#include "php.h" - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <sys/stat.h> - -#ifndef MAXSYMLINKS -#define MAXSYMLINKS 32 -#endif - -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) -#endif - -char *php_realpath(char *path, char resolved_path[]); - -#ifdef PHP_WIN32 -#define IS_SLASH(p) ((p) == '/' || (p) == '\\') -#else -#define IS_SLASH(p) ((p) == '/') -#endif - -char *php_realpath(char *path, char resolved_path []) { - char path_construction[MAXPATHLEN]; /* We build the result in here */ - char *writepos; /* Position to write next char */ - - char path_copy[MAXPATHLEN]; /* A work-copy of the path */ - char *workpos; /* working position in *path */ - -#if !defined(PHP_WIN32) - char buf[MAXPATHLEN]; /* Buffer for readlink */ - int linklength; /* The result from readlink */ -#endif - int linkcount = 0; /* Count symlinks to avoid loops */ - - struct stat filestat; /* result from stat */ - -#ifdef PHP_WIN32 - char *temppos; /* position while counting '.' */ - int dotcount; /* number of '.' */ - int t; /* counter */ -#endif - - /* Set the work-position to the beginning of the given path */ - strcpy(path_copy, path); - workpos = path_copy; - -#ifdef PHP_WIN32 - /* Find out where we start - Windows version */ - if (IS_SLASH(*workpos)) { - /* We start at the root of the current drive */ - /* Get the current directory */ - if (V_GETCWD(path_construction, MAXPATHLEN-1) == NULL) { - /* Unable to get cwd */ - resolved_path[0] = 0; - return NULL; - } - /* We only need the first three chars (for example "C:\") */ - path_construction[3] = 0; - workpos++; - } else if (workpos[1] == ':') { - /* A drive-letter is specified, copy it */ - strncpy(path_construction, path, 2); - strcat(path_construction, "\\"); - workpos++; - workpos++; - } else { - /* Use the current directory */ - if (V_GETCWD(path_construction, MAXPATHLEN-1) == NULL) { - /* Unable to get cwd */ - resolved_path[0] = 0; - return NULL; - } - strcat(path_construction, "\\"); - } -#else - /* Find out where we start - Unix version */ - if (*workpos == '/') { - /* We start at the root */ - strcpy(path_construction, "/"); - workpos++; - } else { - /* Use the current directory */ - if (V_GETCWD(path_construction, MAXPATHLEN-1) == NULL) { - /* Unable to get cwd */ - resolved_path[0] = 0; - return NULL; - } - strcat(path_construction, "/"); - } -#endif - - /* Set the next-char-position */ - writepos = &path_construction[strlen(path_construction)]; - - /* Go to the end, then stop */ - while(*workpos != 0) { - /* Strip (back)slashes */ - while(IS_SLASH(*workpos)) workpos++; - -#ifdef PHP_WIN32 - /* reset dotcount */ - dotcount = 0; - - /* Look for .. */ - if ((workpos[0] == '.') && (workpos[1] != 0)) { - /* Windows accepts \...\ as \..\..\, \....\ as \..\..\..\, etc */ - /* At least Win98 does */ - - temppos = workpos; - while(*temppos++ == '.') { - dotcount++; - if (!IS_SLASH(*temppos) && (*temppos != 0) && (*temppos != '.')) { - /* This is not a /../ component, but a filename that starts with '.' */ - dotcount = 0; - } - } - - /* Go back dotcount-1 times */ - for (t=0 ; t<(dotcount-1) ; t++) { - workpos++; /* move to next '.' */ - - /* Can we still go back? */ - if ((writepos-3) <= path_construction) return NULL; - - /* Go back */ - writepos--; /* move to '\' */ - writepos--; - while(!IS_SLASH(*writepos)) writepos--; /* skip until previous '\\' */ - } - workpos++; - } - - /* No special case */ - if (dotcount == 0) { - /* Append */ - while(!IS_SLASH(*workpos) && (*workpos != 0)) { - *writepos++ = *workpos++; - } - } - - /* Just one '.', go to next element */ - if (dotcount == 1) { - while(!IS_SLASH(*workpos) && (*workpos != 0)) { - *workpos++; - } - - /* Avoid double \ in the result */ - writepos--; - } - - /* If it was a directory, append a slash */ - if (IS_SLASH(*workpos)) { - *writepos++ = *workpos++; - } - *writepos = 0; -#else /* defined(PHP_WIN32) */ - /* Look for .. */ - if ((workpos[0] == '.') && (workpos[1] != 0)) { - if ((workpos[1] == '.') && ((workpos[2] == '/') || (workpos[2] == 0))) { - /* One directory back */ - /* Set pointers to right position */ - workpos++; /* move to second '.' */ - workpos++; /* move to '/' */ - - /* Only apply .. if not in root */ - if ((writepos-1) > path_construction) { - writepos--; /* move to '/' */ - while(*--writepos != '/') ; /* skip until previous '/' */ - } - } else { - if (workpos[1] == '/') { - /* Found a /./ skip it */ - workpos++; /* move to '/' */ - - /* Avoid double / in the result */ - writepos--; - } else { - /* No special case, the name just started with a . */ - /* Append */ - while((*workpos != '/') && (*workpos != 0)) { - *writepos++ = *workpos++; - } - } - } - } else { - /* No special case */ - /* Append */ - while((*workpos != '/') && (*workpos != 0)) { - *writepos++ = *workpos++; - } - } - -#if HAVE_SYMLINK - /* We are going to use path_construction, so close it */ - *writepos = 0; - - /* Check the current location to see if it is a symlink */ - if((linklength = readlink(path_construction, buf, MAXPATHLEN)) != -1) { - /* Check linkcount */ - if (linkcount > MAXSYMLINKS) return NULL; - - /* Count this symlink */ - linkcount++; - - /* Set end of buf */ - buf[linklength] = 0; - - /* Check for overflow */ - if ((strlen(workpos) + strlen(buf) + 1) >= MAXPATHLEN) return NULL; - - /* Remove the symlink-component wrom path_construction */ - writepos--; /* move to '/' */ - while(*--writepos != '/') ; /* skip until previous '/' */ - *++writepos = 0; /* end of string after '/' */ - - /* If the symlink starts with a '/', empty path_construction */ - if (*buf == '/') { - *path_construction = 0; - writepos = path_construction; - } - - /* Insert symlink into path_copy */ - strcat(buf, workpos); - strcpy(path_copy, buf); - workpos = path_copy; - } -#endif /* HAVE_SYMLINK */ - - /* If it was a directory, append a slash */ - if (*workpos == '/') { - *writepos++ = *workpos++; - } - *writepos = 0; -#endif /* defined(PHP_WIN32) */ - } - - /* Check if the resolved path is a directory */ - if (V_STAT(path_construction, &filestat) != 0) { - if (errno != ENOENT) return NULL; - } else { - if (S_ISDIR(filestat.st_mode)) { - /* It's a directory, append a / if needed */ - if (*(writepos-1) != '/') { - /* Check for overflow */ - if ((strlen(workpos) + 2) >= MAXPATHLEN) { - return NULL; - } - *writepos++ = '/'; - *writepos = 0; - } - } - } - - strcpy(resolved_path, path_construction); - return resolved_path; -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/makedist.ZendEngine2 b/makedist.ZendEngine2 index 25cbf3ac8d..3a15639c9c 100755 --- a/makedist.ZendEngine2 +++ b/makedist.ZendEngine2 @@ -46,9 +46,9 @@ IFS="$old_IFS" PHPROOT=:pserver:cvsread@cvs.php.net:/repository ZENDROOT=:pserver:cvsread@cvs.php.net:/repository -PHPMOD=php4 -ZENDMOD=ZendEngine2 -TSRMMOD=TSRM +PHPMOD=php4-ze2 +#ZENDMOD=ZendEngine2 +#TSRMMOD=TSRM LT_TARGETS='ltconfig ltmain.sh config.guess config.sub' if echo '\c' | grep -s c >/dev/null 2>&1 @@ -96,10 +96,10 @@ echo "" cd $DIR || exit 5 # Export Zend -$ECHO_N "makedist: exporting tag '$CVSTAG' from '$ZENDMOD'...$ECHO_C" -cvs -z 9 -d $ZENDROOT -Q export -r $CVSTAG $ZENDMOD || exit 4 -mv ZendEngine2 Zend -echo "" +#$ECHO_N "makedist: exporting tag '$CVSTAG' from '$ZENDMOD'...$ECHO_C" +#cvs -z 9 -d $ZENDROOT -Q export -r $CVSTAG $ZENDMOD || exit 4 +#mv ZendEngine2 Zend +#echo "" # Export TSRM #$ECHO_N "makedist: exporting tag '$CVSTAG' from '$TSRMMOD'...$ECHO_C" diff --git a/strtok_r.c b/strtok_r.c deleted file mode 100644 index fea43bdead..0000000000 --- a/strtok_r.c +++ /dev/null @@ -1,113 +0,0 @@ -#include "php.h" - -#ifndef HAVE_STRTOK_R - -/* - * Copyright (c) 1998 Softweyr LLC. All rights reserved. - * - * strtok_r, from Berkeley strtok - * Oct 13, 1998 by Wes Peters <wes@softweyr.com> - * - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notices, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notices, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * - * This product includes software developed by Softweyr LLC, the - * University of California, Berkeley, and its contributors. - * - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTWEYR LLC, THE - * REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stddef.h> -#include <string.h> - -char * -strtok_r(char *s, const char *delim, char **last) -{ - char *spanp; - int c, sc; - char *tok; - - if (s == NULL && (s = *last) == NULL) - { - return NULL; - } - - /* - * Skip (span) leading delimiters (s += strspn(s, delim), sort of). - */ -cont: - c = *s++; - for (spanp = (char *)delim; (sc = *spanp++) != 0; ) - { - if (c == sc) - { - goto cont; - } - } - - if (c == 0) /* no non-delimiter characters */ - { - *last = NULL; - return NULL; - } - tok = s - 1; - - /* - * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). - * Note that delim must have one NUL; we stop if we see that, too. - */ - for (;;) - { - c = *s++; - spanp = (char *)delim; - do - { - if ((sc = *spanp++) == c) - { - if (c == 0) - { - s = NULL; - } - else - { - char *w = s - 1; - *w = '\0'; - } - *last = s; - return tok; - } - } - while (sc != 0); - } - /* NOTREACHED */ -} - -#endif |