mirror of
https://github.com/bdnugget/php-src.git
synced 2026-11-11 19:20:50 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3259a1302 |
No files matched your search
-103
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,56 +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 -DLINK_SIZE=2 -DPOSIX_MALLOC_THRESHOLD=10 -I@ext_srcdir@/pcrelib)
|
||||
PHP_ADD_BUILD_DIR($ext_builddir/pcrelib)
|
||||
AC_DEFINE(HAVE_BUNDLED_PCRE, 1, [ ])
|
||||
else
|
||||
for i in $PHP_PCRE_REGEX $PHP_PCRE_REGEX/include $PHP_PCRE_REGEX/include/pcre; do
|
||||
test -f $i/pcre.h && PCRE_INCDIR=$i
|
||||
done
|
||||
|
||||
if test -z "$PCRE_INCDIR"; then
|
||||
AC_MSG_ERROR([Could not find pcre.h in $PHP_PCRE_REGEX])
|
||||
fi
|
||||
|
||||
for j in $PHP_PCRE_REGEX $PHP_PCRE_REGEX/lib; do
|
||||
test -f $j/libpcre.a -o -f $j/libpcre.$SHLIB_SUFFIX_NAME && PCRE_LIBDIR=$j
|
||||
done
|
||||
|
||||
if test -z "$PCRE_LIBDIR" ; then
|
||||
AC_MSG_ERROR([Could not find libpcre.(a|$SHLIB_SUFFIX_NAME) 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
|
||||
|
||||
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 -DLINK_SIZE=2 -DPOSIX_MALLOC_THRESHOLD=10)
|
||||
fi
|
||||
PHP_SUBST(PCRE_SHARED_LIBADD)
|
||||
fi
|
||||
Whitespace-only changes.
@@ -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
|
||||
@@ -1,39 +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....
|
||||
|
||||
|
||||
- brad
|
||||
@@ -1,33 +0,0 @@
|
||||
dnl $Id$
|
||||
dnl config.m4 for extension soap
|
||||
|
||||
PHP_ARG_ENABLE(soap, whether to enable soap support,
|
||||
[ --enable-soap[=DIR] Enable soap support. DIR is libxml2
|
||||
library directory.])
|
||||
|
||||
if test "$PHP_SOAP" != "no"; then
|
||||
if test "$PHP_SOAP" = "yes"; then
|
||||
for i in /usr/local /usr; do
|
||||
if test -d "$i/include/libxml2/libxml"; then
|
||||
XML2_INCDIR=$i/include/libxml2
|
||||
XML2_LIBDIR=$i/lib
|
||||
fi
|
||||
done
|
||||
else
|
||||
if test -d "$PHP_SOAP/include/libxml2/libxml"; then
|
||||
XML2_INCDIR=$PHP_SOAP/include/libxml2
|
||||
XML2_LIBDIR=$PHP_SOAP/lib
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -z "$XML2_INCDIR"; then
|
||||
AC_MSG_ERROR(Cannot find libxml2 header. Please specify correct libxml2 installation path)
|
||||
fi
|
||||
|
||||
AC_DEFINE(HAVE_PHP_SOAP,1,[Whether you have soap module])
|
||||
|
||||
PHP_ADD_INCLUDE($XML2_INCDIR)
|
||||
PHP_ADD_LIBRARY_WITH_PATH(xml2,$XML2_LIBDIR,SOAP_SHARED_LIBADD)
|
||||
PHP_NEW_EXTENSION(soap, soap.c php_encoding.c php_http.c php_packet_soap.c php_schema.c php_sdl.c php_xml.c, $ext_shared)
|
||||
PHP_SUBST(SOAP_SHARED_LIBADD)
|
||||
fi
|
||||
@@ -1,18 +0,0 @@
|
||||
// $Id$
|
||||
// vim:ft=javascript
|
||||
|
||||
ARG_ENABLE("soap", "SOAP support", "no");
|
||||
|
||||
if (PHP_SOAP != "no" && PHP_LIBXML == "yes") {
|
||||
if (PHP_VERSION > 4) {
|
||||
WARNING('soap does not yet compile with php >= 5');
|
||||
} else {
|
||||
EXTENSION('soap', 'soap.c php_encoding.c php_http.c php_packet_soap.c php_schema.c php_sdl.c php_xml.c');
|
||||
AC_DEFINE('HAVE_PHP_SOAP', 1);
|
||||
|
||||
if (!PHP_SOAP_SHARED) {
|
||||
ADD_FLAG('CFLAGS_SOAP', "/D LIBXML_STATIC ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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
|
||||
{
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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>
|
||||
@@ -1,796 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,636 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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;
|
||||
|
||||
|
||||
?>
|
||||
@@ -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-2003 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>
|
||||
@@ -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-2003 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";
|
||||
|
||||
?>
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -1 +0,0 @@
|
||||
<?php phpinfo(); ?>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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-->";
|
||||
?>
|
||||
@@ -1,184 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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);
|
||||
?>
|
||||
@@ -1,87 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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);
|
||||
|
||||
?>
|
||||
@@ -1,41 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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);
|
||||
|
||||
?>
|
||||
@@ -1,258 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2003 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;
|
||||
?>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -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>
|
||||
@@ -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 -->";
|
||||
?>
|
||||
@@ -1,59 +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>ext_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.in</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">php_soap.dsp</file>
|
||||
</dir>
|
||||
</filelist>
|
||||
</package>
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -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 TSRMLS_DC);
|
||||
|
||||
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
|
||||
@@ -1,456 +0,0 @@
|
||||
#include "php_soap.h"
|
||||
|
||||
void send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *function_name, char *soapaction TSRMLS_DC)
|
||||
{
|
||||
xmlChar *buf;
|
||||
char *soap_headers;
|
||||
int buf_size,err,ret;
|
||||
sdlPtr sdl;
|
||||
php_url *phpurl = NULL;
|
||||
php_stream *stream;
|
||||
zval **trace;
|
||||
|
||||
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;
|
||||
int use_ssl;
|
||||
|
||||
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);
|
||||
if (phpurl == NULL) {
|
||||
php_error(E_ERROR, "Unable to parse URL \"%s\"", url);
|
||||
}
|
||||
|
||||
use_ssl = strcmp(phpurl->scheme, "https") == 0;
|
||||
#if !HAVE_OPENSSL_EXT
|
||||
if (use_ssl) {
|
||||
php_error(E_ERROR, "SSL support not available in this build");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (phpurl->port == 0) {
|
||||
phpurl->port = use_ssl ? 443 : 80;
|
||||
}
|
||||
|
||||
stream = php_stream_sock_open_host(phpurl->host, (unsigned short)phpurl->port, SOCK_STREAM, NULL, NULL);
|
||||
|
||||
if(stream)
|
||||
{
|
||||
|
||||
#if HAVE_OPENSSL_EXT
|
||||
/* fire up SSL, if requested */
|
||||
if (use_ssl) {
|
||||
if (FAILURE == php_stream_sock_ssl_activate(stream, 1)) {
|
||||
php_error(E_ERROR, "SSL Connection attempt failed");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
add_property_resource(this_ptr, "httpsocket", php_stream_get_resource_id(stream));
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
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 authentication */
|
||||
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);
|
||||
}
|
||||
|
||||
err = php_stream_write(stream, soap_headers, strlen(soap_headers));
|
||||
|
||||
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);
|
||||
|
||||
err = php_stream_write(stream, cookie_str.c, cookie_str.len);
|
||||
|
||||
if(err != (int)cookie_str.len)
|
||||
php_error(E_ERROR,"Failed Sending HTTP Headers");
|
||||
|
||||
smart_str_free(&cookie_str);
|
||||
}
|
||||
|
||||
err = php_stream_write(stream, "\r\n", 2);
|
||||
|
||||
if(err != 2)
|
||||
php_error(E_ERROR,"Failed Sending HTTP Headers");
|
||||
|
||||
|
||||
err = php_stream_write(stream, buf, buf_size);
|
||||
|
||||
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 TSRMLS_DC)
|
||||
{
|
||||
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;
|
||||
php_stream *stream;
|
||||
zval **trace;
|
||||
|
||||
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 TSRMLS_CC))
|
||||
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 TSRMLS_CC);
|
||||
efree(http_err);
|
||||
return;
|
||||
}*/
|
||||
|
||||
/* Try and get headers again */
|
||||
if(!strcmp(http_status, "100"))
|
||||
{
|
||||
if(!get_http_headers(stream, &http_headers, &http_header_size TSRMLS_CC))
|
||||
php_error(E_ERROR, "Error Fetching http headers");
|
||||
}
|
||||
|
||||
efree(http_version);
|
||||
}
|
||||
|
||||
if(!get_http_body(stream, http_headers, &http_body, &http_body_size TSRMLS_CC))
|
||||
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) {
|
||||
php_stream_close(stream);
|
||||
zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", sizeof("httpsocket"));
|
||||
}
|
||||
|
||||
/* 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 TSRMLS_CC);
|
||||
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 *pos, *tmp = NULL;
|
||||
int typelen, headerslen;
|
||||
|
||||
typelen = strlen(type);
|
||||
headerslen = strlen(headers);
|
||||
|
||||
/* header `titles' can be lower case, or any case combination, according
|
||||
* to the various RFC's. */
|
||||
pos = headers;
|
||||
do {
|
||||
/* start of buffer or start of line */
|
||||
if (strncasecmp(pos, type, typelen) == 0) {
|
||||
char *eol;
|
||||
|
||||
/* match */
|
||||
tmp = pos + typelen;
|
||||
eol = strstr(tmp, "\r\n");
|
||||
if (eol == NULL) {
|
||||
eol = headers + headerslen;
|
||||
}
|
||||
return estrndup(tmp, eol - tmp);
|
||||
}
|
||||
|
||||
/* find next line */
|
||||
pos = strstr(pos, "\r\n");
|
||||
if (pos)
|
||||
pos += 2;
|
||||
|
||||
} while (pos);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int get_http_body(php_stream *stream, char *headers, char **response, int *out_size TSRMLS_DC)
|
||||
{
|
||||
char *trans_enc, *content_length, *http_buf = NULL;
|
||||
int http_buf_size = 0;
|
||||
|
||||
trans_enc = get_http_header_value(headers, "Transfer-Encoding: ");
|
||||
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 = NULL;
|
||||
|
||||
while (!done) {
|
||||
php_stream_gets(stream, chunk_size, sizeof(chunk_size));
|
||||
|
||||
if (sscanf(chunk_size, "%x", &buf_size) != -1) {
|
||||
http_buf = erealloc(http_buf, http_buf_size + buf_size + 1);
|
||||
len_size = 0;
|
||||
|
||||
while (http_buf_size < buf_size) {
|
||||
len_size += php_stream_read(stream, http_buf + http_buf_size, buf_size - len_size);
|
||||
http_buf_size += len_size;
|
||||
}
|
||||
|
||||
/* Eat up '\r' '\n' */
|
||||
php_stream_getc(stream);php_stream_getc(stream);
|
||||
}
|
||||
if (buf_size == 0) {
|
||||
done = TRUE;
|
||||
}
|
||||
}
|
||||
efree(trans_enc);
|
||||
|
||||
if (http_buf == NULL) {
|
||||
http_buf = estrndup("", 1);
|
||||
http_buf_size = 1;
|
||||
} else {
|
||||
http_buf[http_buf_size] = '\0';
|
||||
}
|
||||
|
||||
} else if (content_length) {
|
||||
int size;
|
||||
size = atoi(content_length);
|
||||
http_buf = emalloc(size + 1);
|
||||
|
||||
while(http_buf_size < size) {
|
||||
http_buf_size += php_stream_read(stream, http_buf + http_buf_size, size - http_buf_size);
|
||||
}
|
||||
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(php_stream *stream, char **response, int *out_size TSRMLS_DC)
|
||||
{
|
||||
int done = FALSE;
|
||||
char chr;
|
||||
smart_str tmp_response = {0};
|
||||
char headerbuf[8192];
|
||||
|
||||
while(!done)
|
||||
{
|
||||
if (!php_stream_gets(stream, headerbuf, sizeof(headerbuf))) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcmp(headerbuf, "\r\n") == 0) {
|
||||
/* empty line marks end of headers */
|
||||
done = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* add header to collection */
|
||||
smart_str_appends(&tmp_response, headerbuf);
|
||||
}
|
||||
smart_str_0(&tmp_response);
|
||||
(*response) = tmp_response.c;
|
||||
(*out_size) = tmp_response.len;
|
||||
return done;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +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 TSRMLS_DC);
|
||||
void get_http_soap_response(zval *this_ptr, char **buffer, int *buffer_len TSRMLS_DC);
|
||||
|
||||
char *get_http_header_value(char *headers, char *type);
|
||||
int get_http_body(php_stream *socketd, char *headers, char **response, int *out_size TSRMLS_DC);
|
||||
int get_http_headers(php_stream *socketd,char **response, int *out_size TSRMLS_DC);
|
||||
|
||||
#endif
|
||||
@@ -1,141 +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 TSRMLS_DC)
|
||||
{
|
||||
xmlDocPtr response;
|
||||
xmlNodePtr trav, trav2, env, body, resp, cur, fault;
|
||||
zval **tmp_ret;
|
||||
|
||||
response = xmlParseMemory(buffer, buffer_size);
|
||||
xmlCleanupParser();
|
||||
|
||||
if (!response) {
|
||||
php_error(E_ERROR, "looks like we got no XML document");
|
||||
}
|
||||
|
||||
(*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 TSRMLS_CC);
|
||||
}
|
||||
else
|
||||
{
|
||||
resp = body->children;
|
||||
if(fn != NULL)
|
||||
{
|
||||
sdlParamPtr *h_param, param = NULL;
|
||||
xmlNodePtr val = NULL;
|
||||
encodePtr enc;
|
||||
char *name, *ns = NULL;
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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 TSRMLS_DC);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large.
Load diff
@@ -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
|
||||
-1139
File diff suppressed because it is too large.
Load diff
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -1,416 +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
|
||||
|
||||
#ifndef PHP_HAVE_STREAMS
|
||||
# error You lose - must be compiled against PHP 4.3.0 or later
|
||||
#endif
|
||||
|
||||
#ifndef PHP_WIN32
|
||||
# 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)
|
||||
#ifdef PHP_WIN32
|
||||
#define PHP_SOAP_API __declspec(dllexport)
|
||||
#else
|
||||
#define PHP_SOAP_API
|
||||
#endif
|
||||
#ifdef ZTS
|
||||
#include "TSRM.h"
|
||||
#endif
|
||||
|
||||
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 TSRMLS_DC);
|
||||
void add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail TSRMLS_DC);
|
||||
|
||||
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[] TSRMLS_DC);
|
||||
xmlDocPtr seralize_response_call(sdlFunctionPtr function, char *function_name,char *uri,zval *ret TSRMLS_DC);
|
||||
xmlDocPtr seralize_function_call(zval *this_ptr, sdlFunctionPtr function, char *function_name, char *uri, zval **arguments, int arg_count TSRMLS_DC);
|
||||
xmlNodePtr seralize_parameter(sdlParamPtr param,zval *param_val,int index,char *name, int style TSRMLS_DC);
|
||||
xmlNodePtr seralize_zval(zval *val, sdlParamPtr param, char *paramName, int style TSRMLS_DC);
|
||||
zval *desearlize_zval(sdlPtr sdl, xmlNodePtr data, sdlParamPtr param TSRMLS_DC);
|
||||
|
||||
void soap_error_handler(int error_num, const char *error_filename, const uint error_lineno, const char *format, va_list args);
|
||||
#ifndef ZEND_ENGINE_2
|
||||
int my_call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, int param_count, zval *params[] TSRMLS_DC);
|
||||
#endif
|
||||
|
||||
#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(Z_OBJPROP_P(ss), "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(Z_OBJPROP_P(ss), "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(Z_OBJPROP_P(ss), "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(Z_OBJPROP_P(ss), "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(Z_OBJPROP_P(ss), "httpsocket", sizeof("httpsocket"), (void **)&tmp)
|
||||
#define FETCH_SOCKET_RES(ss,tmp) php_stream_from_zval_no_verify(ss,tmp)
|
||||
|
||||
#define GET_THIS_OBJECT(o) \
|
||||
o = getThis(); \
|
||||
if (!o) \
|
||||
{ \
|
||||
php_error(E_WARNING, "Cannot Get Class Info"); \
|
||||
return; \
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,242 +0,0 @@
|
||||
#include "php_soap.h"
|
||||
|
||||
/* Channel libxml file io layer through the PHP streams subsystem.
|
||||
* This allows use of ftps:// and https:// urls */
|
||||
|
||||
int php_stream_xmlIO_match_wrapper(const char *filename)
|
||||
{
|
||||
TSRMLS_FETCH();
|
||||
return php_stream_locate_url_wrapper(filename, NULL, STREAM_LOCATE_WRAPPERS_ONLY TSRMLS_CC) ? 1 : 0;
|
||||
|
||||
}
|
||||
|
||||
void *php_stream_xmlIO_open_wrapper(const char *filename)
|
||||
{
|
||||
TSRMLS_FETCH();
|
||||
return php_stream_open_wrapper(filename, "rb", ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
|
||||
}
|
||||
|
||||
int php_stream_xmlIO_read(void *context, char *buffer, int len)
|
||||
{
|
||||
TSRMLS_FETCH();
|
||||
return php_stream_read((php_stream*)context, buffer, len);
|
||||
}
|
||||
|
||||
int php_stream_xmlIO_close(void *context)
|
||||
{
|
||||
TSRMLS_FETCH();
|
||||
return php_stream_close((php_stream*)context);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -1,28 +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);
|
||||
|
||||
int php_stream_xmlIO_match_wrapper(const char *filename);
|
||||
void *php_stream_xmlIO_open_wrapper(const char *filename);
|
||||
int php_stream_xmlIO_read(void *context, char *buffer, int len);
|
||||
int php_stream_xmlIO_close(void *context);
|
||||
|
||||
#endif
|
||||
-2309
File diff suppressed because it is too large.
Load diff
@@ -1,2 +0,0 @@
|
||||
SPL
|
||||
Marcus Boerger
|
||||
Whitespace-only changes.
@@ -1,26 +0,0 @@
|
||||
This is an extension that aims to implement some efficient data access
|
||||
interfaces and classes. You'll find the classes documented using php
|
||||
code in the file spl.php or in the corresponding .inc file in the examples
|
||||
subdirectory. Based on the internal implementations or the files in the
|
||||
examples subdirectory there are also some .php files to experiment with.
|
||||
|
||||
The .inc files are not included automatically because the are sooner or
|
||||
later intergrated into the extension. That means that you either need to
|
||||
put the code of examples/autoload into your autoprepend file or that you
|
||||
have to point your ini setting auto_prepend_file to this file.
|
||||
|
||||
1) Iterators
|
||||
|
||||
SPL offers some advanced iterator algorythmns:
|
||||
|
||||
interface RecursiveIterator implements Iterator
|
||||
class RecursiveIteratorIterator implements Iterator
|
||||
abstract class FilterIterator implements Iterator
|
||||
class ParentIterator extends FilterIterator implements RecursiveIterator
|
||||
|
||||
2) Directories
|
||||
|
||||
SPL offers two advanced directory classes.
|
||||
|
||||
class DirectoryIterator implements Iterator
|
||||
class RecursiveDirectoryIterator extends DirectoryIterator implements RecursiveIterator
|
||||
@@ -1,4 +0,0 @@
|
||||
This is the ToDo of ext/spl:
|
||||
|
||||
Implement the classes/interfaces from the .inc files in
|
||||
directory examples.
|
||||
@@ -1,10 +0,0 @@
|
||||
dnl $Id$
|
||||
dnl config.m4 for extension SPL
|
||||
|
||||
PHP_ARG_ENABLE(spl, enable SPL suppport,
|
||||
[ --disable-spl Enable Standard PHP Library], yes)
|
||||
|
||||
if test "$PHP_SPL" != "no"; then
|
||||
AC_DEFINE(HAVE_SPL, 1, [Whether you want SPL (Standard Php Library) support])
|
||||
PHP_NEW_EXTENSION(spl, php_spl.c spl_functions.c spl_engine.c spl_iterators.c spl_array.c spl_directory.c, $ext_shared)
|
||||
fi
|
||||
@@ -1,9 +0,0 @@
|
||||
// $Id$
|
||||
// vim:ft=javascript
|
||||
|
||||
ARG_ENABLE("spl", "SPL (Standard PHP Library) support", "no");
|
||||
|
||||
if (PHP_SPL != "no") {
|
||||
EXTENSION("spl", "php_spl.c spl_functions.c spl_engine.c spl_iterators.c spl_array.c spl_directory.c");
|
||||
AC_DEFINE('HAVE_SPL', 1);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
function __autoload($classname) {
|
||||
require_once(dirname($_SERVER['PATH_TRANSLATED']).'/'.strtolower($classname).'.inc');
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,81 +0,0 @@
|
||||
<?php
|
||||
|
||||
define('CIT_CALL_TOSTRING', 1);
|
||||
define('CIT_CATCH_GET_CHILD', 2);
|
||||
|
||||
class CachingIterator
|
||||
{
|
||||
protected $it;
|
||||
protected $current;
|
||||
protected $key;
|
||||
protected $more;
|
||||
protected $strValue;
|
||||
protected $getStrVal;
|
||||
|
||||
function __construct(Iterator $it, $flags = CIT_CALL_TOSTRING)
|
||||
{
|
||||
$this->it = $it;
|
||||
$this->flags = $flags & (CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD);
|
||||
}
|
||||
|
||||
function rewind()
|
||||
{
|
||||
$this->it->rewind();
|
||||
$this->next();
|
||||
}
|
||||
|
||||
function next()
|
||||
{
|
||||
if ($this->more = $this->it->hasMore()) {
|
||||
$this->current = $this->it->current();
|
||||
$this->key = $this->it->key();
|
||||
if ($this->flags & CIT_CALL_TOSTRING) {
|
||||
if (is_object($this->current)) {
|
||||
$this->strValue = $this->current->__toString();
|
||||
} else {
|
||||
$this->strValue = (string)$this->current;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->current = NULL;
|
||||
$this->key = NULL;
|
||||
$this->strValue = NULL;
|
||||
}
|
||||
$this->it->next();
|
||||
}
|
||||
|
||||
function hasMore()
|
||||
{
|
||||
return $this->more;
|
||||
}
|
||||
|
||||
function hasNext()
|
||||
{
|
||||
return $this->it->hasMore();
|
||||
}
|
||||
|
||||
function current()
|
||||
{
|
||||
return $this->current;
|
||||
}
|
||||
|
||||
function key()
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
function __call($func, $params)
|
||||
{
|
||||
return call_user_func_array(array($this->it, $func), $params);
|
||||
}
|
||||
|
||||
function __toString()
|
||||
{
|
||||
if (!$this->flags & CIT_CALL_TOSTRING) {
|
||||
throw new exception('CachingIterator does not fetch string value (see CachingIterator::__construct)');
|
||||
}
|
||||
return $this->strValue;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
|
||||
class CachingRecursiveIterator extends CachingIterator implements RecursiveIterator
|
||||
{
|
||||
protected $hasChildren;
|
||||
protected $getChildren;
|
||||
protected $catch_get_child;
|
||||
|
||||
function __construct(RecursiveIterator $it, $flags = CIT_CALL_TOSTRING)
|
||||
{
|
||||
parent::__construct($it, $flags);
|
||||
}
|
||||
|
||||
function next()
|
||||
{
|
||||
if ($this->hasChildren = $this->it->hasChildren()) {
|
||||
try {
|
||||
//$this->getChildren = new CachingRecursiveIterator($this->it->getChildren(), $this->flags);
|
||||
// workaround memleaks...
|
||||
$child = $this->it->getChildren();
|
||||
$this->getChildren = new CachingRecursiveIterator($child, $this->flags);
|
||||
}
|
||||
catch(Exception $e) {
|
||||
if (!$this->flags & CIT_CATCH_GET_CHILD) {
|
||||
throw $e;
|
||||
}
|
||||
$this->hasChildren = false;
|
||||
$this->getChildren = NULL;
|
||||
}
|
||||
} else {
|
||||
$this->getChildren = NULL;
|
||||
}
|
||||
parent::next();
|
||||
}
|
||||
|
||||
function hasChildren()
|
||||
{
|
||||
return $this->hasChildren;
|
||||
}
|
||||
|
||||
function getChildren()
|
||||
{
|
||||
return $this->getChildren;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,98 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** dba array utility
|
||||
*
|
||||
* Usage php dba_array.php <file> <handler> <key> [<value>]
|
||||
*
|
||||
* If <value> is specified then <key> is set to <value> in <file>.
|
||||
* Else the value of <key> is printed only.
|
||||
*
|
||||
* Note: configure with --enable-dba
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
if ($argc < 4) {
|
||||
echo <<<EOF
|
||||
Usage: php ${_SERVER['PHP_SELF']} <file> <handler> <key> [<value>]
|
||||
|
||||
If <value> is specified then <key> is set to <value> in <file>.
|
||||
Else the value of <key> is printed only.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
class DbaArray implements ArrayAccess {
|
||||
private $db;
|
||||
|
||||
function __construct($file, $handler)
|
||||
{
|
||||
$this->db = dba_popen($file, "c", $handler);
|
||||
if (!$this->db) {
|
||||
throw new exception("Databse could not be opened");
|
||||
}
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
dba_close($this->db);
|
||||
}
|
||||
|
||||
function get($name)
|
||||
{
|
||||
$data = dba_fetch($name, $this->db);
|
||||
if($data) {
|
||||
if (ini_get('magic_quotes_runtime')) {
|
||||
$data = stripslashes($data);
|
||||
}
|
||||
//return unserialize($data);
|
||||
return $data;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
function set($name, $value)
|
||||
{
|
||||
//dba_replace($name, serialize($value), $this->db);
|
||||
dba_replace($name, $value, $this->db);
|
||||
return $value;
|
||||
}
|
||||
|
||||
function exists($name)
|
||||
{
|
||||
return dba_exists($name, $this->db);
|
||||
}
|
||||
|
||||
function del($name)
|
||||
{
|
||||
return dba_delete($name, $this->db);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($argc > 2) {
|
||||
$dba = new DbaArray($argv[1], $argv[2]);
|
||||
if ($dba && $argc > 3) {
|
||||
if ($argc > 4) {
|
||||
$dba[$argv[3]] = $argv[4];
|
||||
}
|
||||
var_dump(array('Index' => $argv[3], 'Value' => $dba[$argv[3]]));
|
||||
}
|
||||
unset($dba);
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "Not enough parameters\n";
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
catch (exception $err) {
|
||||
var_dump($err);
|
||||
exit(1);
|
||||
}
|
||||
?>
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** dba dump utility
|
||||
*
|
||||
* Usage: php dba_dump.php <file> <handler> [<regex>]
|
||||
*
|
||||
* Show all groups in the ini file specified by <file>.
|
||||
* The regular expression <regex> is used to filter the by setting name.
|
||||
*
|
||||
* Note: configure with --enable-dba
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
if ($argc < 3) {
|
||||
echo <<<EOF
|
||||
Usage: php ${_SERVER['PHP_SELF']} <file> <handler> [<regex>]
|
||||
|
||||
Show all groups in the ini file specified by <file>.
|
||||
The regular expression <regex> is used to filter the by setting name.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once("dba_reader.inc");
|
||||
require_once("key_filter.inc");
|
||||
|
||||
$db = new DbaReader($argv[1], $argv[2]);
|
||||
|
||||
if ($argc>3) {
|
||||
$db = new keyFilter($db, $argv[3]);
|
||||
}
|
||||
|
||||
foreach($db as $key => $val) {
|
||||
echo "'$key' => '$val'\n";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,83 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @brief This implements a Dba Iterator.
|
||||
* @author Marcus Boerger
|
||||
* @version 1.0
|
||||
*/
|
||||
class DbaReader implements Iterator
|
||||
{
|
||||
|
||||
private $db = NULL;
|
||||
private $key = false;
|
||||
private $val = false;
|
||||
|
||||
/**
|
||||
* Open database $file with $handler in read only mode.
|
||||
*
|
||||
* @param file Database file to open.
|
||||
* @param handler Handler to use for database access.
|
||||
*/
|
||||
function __construct($file, $handler) {
|
||||
$this->db = dba_open($file, 'r', $handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close database.
|
||||
*/
|
||||
function __destruct() {
|
||||
if ($this->db) {
|
||||
dba_close($this->db);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewind to first element.
|
||||
*/
|
||||
function rewind() {
|
||||
if ($this->db) {
|
||||
$this->key = dba_firstkey($this->db);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Current data.
|
||||
*/
|
||||
function current() {
|
||||
return $this->val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to next element.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
if ($this->db) {
|
||||
$this->key = dba_nextkey($this->db);
|
||||
if ($this->key !== false) {
|
||||
$this->val = dba_fetch($this->key, $this->db);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Whether more elements are available.
|
||||
*/
|
||||
function hasMore() {
|
||||
if ($this->db && $this->key !== false) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Current key.
|
||||
*/
|
||||
function key() {
|
||||
return $this->key;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
class DirectoryFilterDots extends FilterIterator implements RecursiveIterator
|
||||
{
|
||||
function __construct($path) {
|
||||
parent::__construct(new DirectoryIterator($path));
|
||||
}
|
||||
|
||||
function accept() {
|
||||
return !$this->it->isDot();
|
||||
}
|
||||
|
||||
function hasChildren() {
|
||||
return $this->it->hasChildren();
|
||||
}
|
||||
|
||||
function getChildren() {
|
||||
return new DirectoryFilterDots($this->it->getPathname());
|
||||
}
|
||||
|
||||
function key() {
|
||||
return $this->it->getPathname();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
class DirectoryGraphIterator extends DirectoryTreeIterator
|
||||
{
|
||||
function __construct($path)
|
||||
{
|
||||
RecursiveIteratorIterator::__construct(new CachingRecursiveIterator(new ParentIterator(new RecursiveDirectoryIterator($path)), CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD), 1);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
class DirectoryTree extends RecursiveIteratorIterator
|
||||
{
|
||||
function __construct($path) {
|
||||
parent::__construct(new DirectoryFilterDots($path));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** tree view example
|
||||
*
|
||||
* Usage: php directorytree.php <path> [<start> [<count>]]
|
||||
*
|
||||
* Simply specify the path to tree with parameter <path>.
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
if ($argc < 2) {
|
||||
echo <<<EOF
|
||||
Usage: php ${_SERVER['PHP_SELF']} <path>
|
||||
|
||||
Displays a graphical directory tree for the given <path>.
|
||||
|
||||
<path> The directory for which to generate the directory tree graph.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$length = $argc > 3 ? $argv[3] : -1;
|
||||
|
||||
echo $argv[1]."\n";
|
||||
foreach(new LimitIterator(new DirectoryTreeIterator($argv[1]), @$argv[2], $length) as $file) {
|
||||
//foreach(new DirectoryTreeIterator($argv[1]) as $file) {
|
||||
echo $file . "\n";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
class DirectoryTreeIterator extends RecursiveIteratorIterator
|
||||
{
|
||||
function __construct($path)
|
||||
{
|
||||
parent::__construct(new CachingRecursiveIterator(new RecursiveDirectoryIterator($path), CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD), 1);
|
||||
}
|
||||
|
||||
function current()
|
||||
{
|
||||
$tree = '';
|
||||
for ($l=0; $l < $this->getDepth(); $l++) {
|
||||
$tree .= $this->getSubIterator($l)->hasNext() ? '| ' : ' ';
|
||||
}
|
||||
return $tree . ($this->getSubIterator($l)->hasNext() ? '|-' : '\-')
|
||||
. $this->getSubIterator($l)->__toString();
|
||||
}
|
||||
|
||||
function __call($func, $params)
|
||||
{
|
||||
return call_user_func_array(array($this->getSubIterator(), $func), $params);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,97 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @brief Regular expression filter for string iterators
|
||||
* @author Marcus Boerger
|
||||
* @version 1.0
|
||||
*
|
||||
* Instances of this class act as a filter around iterators. In other words
|
||||
* you can put an iterator into the constructor and the instance will only
|
||||
* return selected (accepted) elements.
|
||||
*/
|
||||
abstract class FilterIterator implements Iterator
|
||||
{
|
||||
protected $it;
|
||||
|
||||
/**
|
||||
* Constructs a filter around an iterator whose elemnts are strings.
|
||||
* If the given iterator is of type spl_sequence then its rewind()
|
||||
* method is called.
|
||||
*
|
||||
* @param it Object that implements at least spl_forward
|
||||
*/
|
||||
function __construct(Iterator $it) {
|
||||
$this->it = $it;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewind the inner iterator.
|
||||
*/
|
||||
function rewind() {
|
||||
$this->it->rewind();
|
||||
$this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Accept function to decide whether an element of the inner iterator
|
||||
* should be accessible through the Filteriterator.
|
||||
*
|
||||
* @return whether or not to expose the current element of the inner
|
||||
* iterator.
|
||||
*/
|
||||
abstract function accept();
|
||||
|
||||
/**
|
||||
* Fetch next element and store it.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch() {
|
||||
while ($this->it->hasMore()) {
|
||||
if ($this->accept()) {
|
||||
return;
|
||||
}
|
||||
$this->it->next();
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to next element
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
$this->it->next();
|
||||
$this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Whether more elements are available
|
||||
*/
|
||||
function hasMore() {
|
||||
return $this->it->hasMore();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current key
|
||||
*/
|
||||
function key() {
|
||||
return $this->it->key();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current value
|
||||
*/
|
||||
function current() {
|
||||
return $this->it->current();
|
||||
}
|
||||
|
||||
/**
|
||||
* hidden __clone
|
||||
*/
|
||||
protected function __clone() {
|
||||
// disallow clone
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,41 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** Find a specific file by name.
|
||||
*
|
||||
* Usage: php findfile.php <path> <name>
|
||||
*
|
||||
* <path> Path to search in.
|
||||
* <name> Filename to look for.
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
if ($argc < 3) {
|
||||
echo <<<EOF
|
||||
Usage: php findfile.php <file> <name>
|
||||
|
||||
Find a specific file by name.
|
||||
|
||||
<path> Path to search in.
|
||||
<name> Filename to look for.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
class FindFile extends FilterIterator
|
||||
{
|
||||
protected $file;
|
||||
|
||||
function __construct($path, $file) {
|
||||
$this->file = $file;
|
||||
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
|
||||
}
|
||||
function accept() {
|
||||
return !strcmp($this->it->current(), $this->file);
|
||||
}
|
||||
}
|
||||
|
||||
foreach(new FindFile($argv[1], $argv[2]) as $pathname => $file) echo "$pathname\n";
|
||||
?>
|
||||
@@ -1,78 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** List groups within an ini file
|
||||
*
|
||||
* Usage: php dba_dump.php <file> [<regex>]
|
||||
*
|
||||
* Show all groups in the ini file specified by <file>.
|
||||
* The regular expression <regex> is used to filter the result.
|
||||
*
|
||||
* Note: configure with --enable-dba
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
if ($argc < 2) {
|
||||
echo <<<EOF
|
||||
Usage: php dba_dump.php <file> [<regex>]
|
||||
|
||||
Show all groups in the ini file specified by <file>.
|
||||
The regular expression <regex> is used to filter the result.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once("dba_reader.inc");
|
||||
require_once("key_filter.inc");
|
||||
|
||||
/**
|
||||
* @brief Class to iterate all groups within an ini file.
|
||||
* @author Marcus Boerger
|
||||
* @version 1.0
|
||||
*
|
||||
* Using this class you can iterator over all groups of a ini file.
|
||||
*
|
||||
* This class uses a 'is-a' relation to key_filter in contrast to a 'has-a'
|
||||
* relation. Doing so both current() and key() methods must be overwritten.
|
||||
* If it would use a 'has-a' relation there would be much more to type...
|
||||
* but for puritists that would allow correctness in so far as then no
|
||||
* key() would be needed.
|
||||
*/
|
||||
class ini_groups extends key_filter
|
||||
{
|
||||
/**
|
||||
* Construct an ini file group iterator from a filename.
|
||||
*
|
||||
* @param file Ini file to open.
|
||||
*/
|
||||
function __construct($file) {
|
||||
parent::__construct(new dba_reader($file, 'inifile'), '^\[.*\]$');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current group.
|
||||
*/
|
||||
function current() {
|
||||
return substr(parent::key(),1,-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current group.
|
||||
*/
|
||||
function key() {
|
||||
return substr(parent::key(),1,-1);
|
||||
}
|
||||
}
|
||||
|
||||
$it = new ini_groups($argv[1]);
|
||||
if ($argc>2) {
|
||||
$it = new key_filter($it, $argv[2]);
|
||||
}
|
||||
|
||||
foreach($it as $group) {
|
||||
echo "$group\n";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,106 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @brief Regular expression filter for string iterators
|
||||
* @author Marcus Boerger
|
||||
* @version 1.0
|
||||
*
|
||||
* Instances of this class act as a filter around iterators whose elements
|
||||
* are strings. In other words you can put an iterator into the constructor
|
||||
* and the instance will only return elements which match the given regular
|
||||
* expression.
|
||||
*/
|
||||
class KeyFilter implements Iterator
|
||||
{
|
||||
protected $it;
|
||||
protected $regex;
|
||||
protected $key;
|
||||
protected $curr;
|
||||
|
||||
/**
|
||||
* Constructs a filter around an iterator whose elemnts are strings.
|
||||
* If the given iterator is of type spl_sequence then its rewind()
|
||||
* method is called.
|
||||
*
|
||||
* @param it Object that implements at least spl_forward
|
||||
* @patam regex Regular expression used as a filter.
|
||||
*/
|
||||
function __construct(Iterator $it, $regex) {
|
||||
$this->it = $it;
|
||||
$this->regex = $regex;
|
||||
$this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewind input iterator
|
||||
*/
|
||||
function rewind() {
|
||||
$this->it->rewind();
|
||||
}
|
||||
|
||||
/**
|
||||
* Destruct the iterator.
|
||||
*/
|
||||
function __destruct() {
|
||||
unset($this->it);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch next element and store it.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch() {
|
||||
$this->key = false;
|
||||
$this->curr = false;
|
||||
while ($this->it->hasMore()) {
|
||||
$key = $this->it->key();
|
||||
if (ereg($this->regex, $key)) {
|
||||
$this->key = $key;
|
||||
$this->curr = $this->it->current();
|
||||
return;
|
||||
}
|
||||
$this->it->next();
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to next element
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
$this->it->next();
|
||||
$this->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Whether more elements are available
|
||||
*/
|
||||
function hasMore() {
|
||||
return $this->key !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current key
|
||||
*/
|
||||
function key() {
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The current value
|
||||
*/
|
||||
function current() {
|
||||
return $this->curr;
|
||||
}
|
||||
|
||||
/**
|
||||
* hidden __clone
|
||||
*/
|
||||
protected function __clone() {
|
||||
// disallow clone
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,72 +0,0 @@
|
||||
<?php
|
||||
|
||||
class LimitIterator implements Iterator
|
||||
{
|
||||
protected $it;
|
||||
protected $offset;
|
||||
protected $count;
|
||||
private $pos;
|
||||
|
||||
// count === NULL means all
|
||||
function __construct(Iterator $it, $offset = 0, $count = -1)
|
||||
{
|
||||
if ($offset < 0) {
|
||||
throw new exception('Parameter offset must be > 0');
|
||||
}
|
||||
if ($count < 0 && $count != -1) {
|
||||
throw new exception('Parameter count must either be -1 or a value greater than or equal to 0');
|
||||
}
|
||||
$this->it = $it;
|
||||
$this->offset = $offset;
|
||||
$this->count = $count;
|
||||
$this->pos = 0;
|
||||
}
|
||||
|
||||
function seek($position) {
|
||||
if ($position < $this->offset) {
|
||||
throw new exception('Cannot seek to '.$position.' which is below offset '.$this->offset);
|
||||
}
|
||||
if ($position > $this->offset + $this->count && $this->count != -1) {
|
||||
throw new exception('Cannot seek to '.$position.' which is behind offset '.$this->offset.' plus count '.$this->count);
|
||||
}
|
||||
if ($this->it instanceof SeekableIterator) {
|
||||
$this->it->seek($position);
|
||||
$this->pos = $position;
|
||||
} else {
|
||||
while($this->pos < $position && $this->it->hasMore()) {
|
||||
$this->next();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function rewind()
|
||||
{
|
||||
$this->it->rewind();
|
||||
$this->pos = 0;
|
||||
$this->seek($this->offset);
|
||||
}
|
||||
|
||||
function hasMore() {
|
||||
return ($this->count == -1 || $this->pos < $this->offset + $this->count)
|
||||
&& $this->it->hasMore();
|
||||
}
|
||||
|
||||
function key() {
|
||||
return $this->it->key();
|
||||
}
|
||||
|
||||
function current() {
|
||||
return $this->it->current();
|
||||
}
|
||||
|
||||
function next() {
|
||||
$this->it->next();
|
||||
$this->pos++;
|
||||
}
|
||||
|
||||
function getPosition() {
|
||||
return $this->pos;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
class ParentIterator extends FilterIterator implements RecursiveIterator
|
||||
{
|
||||
function __construct(RecursiveIterator $it)
|
||||
{
|
||||
parent::__construct($it);
|
||||
}
|
||||
function accept()
|
||||
{
|
||||
return $this->it->hasChildren();
|
||||
}
|
||||
|
||||
function hasChildren()
|
||||
{
|
||||
return $this->it->hasChildren();
|
||||
}
|
||||
|
||||
function getChildren()
|
||||
{
|
||||
return new ParentIterator($this->it->getChildren());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
interface RecursiveIterator implements Iterator
|
||||
{
|
||||
function hasChildren();
|
||||
function getChildren();
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,101 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @brief Iterates through recursive iterators
|
||||
* @author Marcus Boerger
|
||||
* @version 1.0
|
||||
*
|
||||
*/
|
||||
class RecursiveIteratorIterator implements Iterator
|
||||
{
|
||||
protected $ait = array();
|
||||
protected $count = 0;
|
||||
|
||||
function __construct(RecursiveIterator $it)
|
||||
{
|
||||
$this->ait[0] = $it;
|
||||
}
|
||||
|
||||
|
||||
function rewind()
|
||||
{
|
||||
while ($this->count) {
|
||||
unset($this->ait[$this->count--]);
|
||||
}
|
||||
$this->ait[0]->rewind();
|
||||
$this->ait[0]->recursed = false;
|
||||
}
|
||||
|
||||
function hasMore()
|
||||
{
|
||||
$count = $this->count;
|
||||
while ($count) {
|
||||
$it = $this->ait[$count];
|
||||
if ($it->hasMore()) {
|
||||
return true;
|
||||
}
|
||||
$count--;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function key()
|
||||
{
|
||||
$it = $this->ait[$this->count];
|
||||
return $it->key();
|
||||
}
|
||||
|
||||
function current()
|
||||
{
|
||||
$it = $this->ait[$this->count];
|
||||
return $it->current();
|
||||
}
|
||||
|
||||
function next()
|
||||
{
|
||||
while ($this->count) {
|
||||
$it = $this->ait[$this->count];
|
||||
if ($it->hasMore()) {
|
||||
if (!$it->recursed && $it->hasChildren()) {
|
||||
$it->recursed = true;
|
||||
$sub = $it->getChildren();
|
||||
$sub->recursed = false;
|
||||
$sub->rewind();
|
||||
if ($sub->hasMore()) {
|
||||
$this->ait[++$this->count] = $sub;
|
||||
if (!$sub instanceof RecursiveIterator)) {
|
||||
throw new Exception(get_class($sub).'::getChildren() must return an object that implements RecursiveIterator');
|
||||
}
|
||||
return;
|
||||
}
|
||||
unset($sub);
|
||||
}
|
||||
$it->next();
|
||||
$it->recursed = false;
|
||||
if ($it->hasMore()) {
|
||||
return;
|
||||
}
|
||||
$it->recursed = false;
|
||||
}
|
||||
if ($this->count) {
|
||||
unset($this->ait[$this->count--]);
|
||||
$it = $this->ait[$this->count];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getSubIterator($level = NULL)
|
||||
{
|
||||
if (is_null($level)) {
|
||||
$level = $this->count;
|
||||
}
|
||||
return @$this->ait[$level];
|
||||
}
|
||||
|
||||
function getDepth()
|
||||
{
|
||||
return $this->level;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
abstract class SearchIterator extends FilterIterator
|
||||
{
|
||||
private $done = false;
|
||||
|
||||
function rewind() {
|
||||
parent::rewind();
|
||||
$this->done = false;
|
||||
}
|
||||
|
||||
function hasMore() {
|
||||
return !$this->done && parent::hasMore();
|
||||
}
|
||||
|
||||
function next() {
|
||||
$this->done = true;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** \brief seekable iterator
|
||||
*
|
||||
* Turns a normal iterator ino a seekable iterator. When there is a way
|
||||
* to seek on an iterator LimitIterator can use this to efficiently rewind
|
||||
* to offset.
|
||||
*/
|
||||
interface SeekableIterator implements Iterator
|
||||
{
|
||||
/** Seek to an absolute position
|
||||
*
|
||||
* \param $index position to seek to
|
||||
* \return void
|
||||
*
|
||||
* \note The method should throw an exception if it is not possible to
|
||||
* seek to the given position.
|
||||
*/
|
||||
function seek($index);
|
||||
/* $this->rewind();
|
||||
$position = 0;
|
||||
while($position < $index && $this->hasMore()) {
|
||||
$this->next();
|
||||
$position++;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,34 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** tree view example
|
||||
*
|
||||
* Usage: php tree.php <path>
|
||||
*
|
||||
* Simply specify the path to tree with parameter <path>.
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
// The following line only operates on classes which are converted to c already.
|
||||
// But does not generate a graphical output.
|
||||
//foreach(new RecursiveIteratorIterator(new ParentIterator(new RecursiveDirectoryIterator($argv[1])), 1) as $file) {
|
||||
|
||||
if ($argc < 2) {
|
||||
echo <<<EOF
|
||||
Usage: php ${_SERVER['PHP_SELF']} <path>
|
||||
|
||||
Displays a graphical tree for the given <path>.
|
||||
|
||||
<path> The directory for which to generate the tree graph.
|
||||
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
echo $argv[1]."\n";
|
||||
foreach(new DirectoryGraphIterator($argv[1]) as $file) {
|
||||
echo $file . "\n";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
||||
<!DOCTYPE package SYSTEM "../pear/package.dtd">
|
||||
<package>
|
||||
<name>SPL</name>
|
||||
<summary>Standard PHP Library</summary>
|
||||
<maintainers>
|
||||
<maintainer>
|
||||
<user>helly</user>
|
||||
<name>Marcus Boerger</name>
|
||||
<email>helly@php.net</email>
|
||||
<role>lead</role>
|
||||
</maintainer>
|
||||
</maintainers>
|
||||
<description>
|
||||
SPL is a collection of interfaces and classes that are meant to solve
|
||||
standard problems.
|
||||
</description>
|
||||
<license>PHP</license>
|
||||
<release>
|
||||
<state>stable</state>
|
||||
<version>0.1-dev</version>
|
||||
<date>TBA</date>
|
||||
<filelist>
|
||||
<file role="src" name="config.m4"/>
|
||||
<file role="src" name="php_spl.c"/>
|
||||
<file role="src" name="php_spl.h"/>
|
||||
<file role="src" name="spl_array.c"/>
|
||||
<file role="src" name="spl_array.h"/>
|
||||
<file role="src" name="spl_directory.c"/>
|
||||
<file role="src" name="spl_directory.h"/>
|
||||
<file role="src" name="spl_engine.c"/>
|
||||
<file role="src" name="spl_engine.h"/>
|
||||
<file role="src" name="spl_functions.c"/>
|
||||
<file role="src" name="spl_functions.h"/>
|
||||
<file role="src" name="spl_iterators.c"/>
|
||||
<file role="src" name="spl_iterators.h"/>
|
||||
<file role="doc" name="CREDITS"/>
|
||||
<file role="doc" name="README"/>
|
||||
<file role="doc" name="TODO"/>
|
||||
<file role="doc" name="spl.php"/>
|
||||
<file role="test" name="tests/array_iterator.phpt"/>
|
||||
<file role="test" name="tests/array_object.phpt"/>
|
||||
<dir name="examples">
|
||||
<file role="doc" name="autoload.inc"/>
|
||||
<file role="doc" name="cachingiterator.inc"/>
|
||||
<file role="doc" name="cachingrecursiveiterator.inc"/>
|
||||
<file role="doc" name="dba_array.php"/>
|
||||
<file role="doc" name="dba_dump.php"/>
|
||||
<file role="doc" name="dba_reader.inc"/>
|
||||
<file role="doc" name="directoryfilterdots.inc"/>
|
||||
<file role="doc" name="directorygraphiterator.inc"/>
|
||||
<file role="doc" name="directorytree.inc"/>
|
||||
<file role="doc" name="directorytree.php"/>
|
||||
<file role="doc" name="directorytreeiterator.inc"/>
|
||||
<file role="doc" name="findfile.php"/>
|
||||
<file role="doc" name="filteriterator.inc"/>
|
||||
<file role="doc" name="ini_groups.php"/>
|
||||
<file role="doc" name="key_filter.inc"/>
|
||||
<file role="doc" name="limititerator.inc"/>
|
||||
<file role="doc" name="parentiterator.inc"/>
|
||||
<file role="doc" name="recursiveiterator.inc"/>
|
||||
<file role="doc" name="recursiveiteratoriterator.inc"/>
|
||||
<file role="doc" name="searchiterator.inc"/>
|
||||
<file role="doc" name="seekableiterator.inc"/>
|
||||
<file role="doc" name="tree.php"/>
|
||||
</dir>
|
||||
</filelist>
|
||||
<deps>
|
||||
<dep type="php" rel="ge">5.0.0</dep>
|
||||
</deps>
|
||||
</release>
|
||||
</package>
|
||||
<!--
|
||||
vim:et:ts=1:sw=1
|
||||
-->
|
||||
@@ -1,191 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 4 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_spl.h"
|
||||
#include "spl_functions.h"
|
||||
#include "spl_engine.h"
|
||||
#include "spl_array.h"
|
||||
#include "spl_directory.h"
|
||||
#include "spl_iterators.h"
|
||||
|
||||
#ifdef COMPILE_DL_SPL
|
||||
ZEND_GET_MODULE(spl)
|
||||
#endif
|
||||
|
||||
ZEND_DECLARE_MODULE_GLOBALS(spl)
|
||||
|
||||
/* {{{ spl_functions
|
||||
*/
|
||||
function_entry spl_functions[] = {
|
||||
PHP_FE(spl_classes, NULL)
|
||||
PHP_FE(class_parents, NULL)
|
||||
PHP_FE(class_implements, NULL)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_module_entry
|
||||
*/
|
||||
zend_module_entry spl_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"spl",
|
||||
spl_functions,
|
||||
PHP_MINIT(spl),
|
||||
PHP_MSHUTDOWN(spl),
|
||||
PHP_RINIT(spl),
|
||||
PHP_RSHUTDOWN(spl),
|
||||
PHP_MINFO(spl),
|
||||
"0.2",
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_functions_none
|
||||
*/
|
||||
function_entry spl_functions_none[] = {
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_init_globals
|
||||
*/
|
||||
static void spl_init_globals(zend_spl_globals *spl_globals)
|
||||
{
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION(spl)
|
||||
*/
|
||||
PHP_MINIT_FUNCTION(spl)
|
||||
{
|
||||
ZEND_INIT_MODULE_GLOBALS(spl, spl_init_globals, NULL);
|
||||
|
||||
PHP_MINIT(spl_iterators)(INIT_FUNC_ARGS_PASSTHRU);
|
||||
PHP_MINIT(spl_array)(INIT_FUNC_ARGS_PASSTHRU);
|
||||
PHP_MINIT(spl_directory)(INIT_FUNC_ARGS_PASSTHRU);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_RINIT_FUNCTION(spl)
|
||||
*/
|
||||
PHP_RINIT_FUNCTION(spl)
|
||||
{
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_RSHUTDOWN_FUNCTION(spl)
|
||||
*/
|
||||
PHP_RSHUTDOWN_FUNCTION(spl)
|
||||
{
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MSHUTDOWN_FUNCTION(spl)
|
||||
*/
|
||||
PHP_MSHUTDOWN_FUNCTION(spl)
|
||||
{
|
||||
SPL_DEBUG(fprintf(stderr, "%s\n", "Shutting down SPL");)
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINFO(spl)
|
||||
*/
|
||||
PHP_MINFO_FUNCTION(spl)
|
||||
{
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_header(2, "SPL support", "enabled");
|
||||
php_info_print_table_end();
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ class_parents
|
||||
*/
|
||||
PHP_FUNCTION(class_parents)
|
||||
{
|
||||
zval *obj;
|
||||
zend_class_entry *parent_class;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
array_init(return_value);
|
||||
parent_class = Z_OBJCE_P(obj)->parent;
|
||||
while (parent_class) {
|
||||
spl_add_class_name(return_value, parent_class TSRMLS_CC);
|
||||
parent_class = parent_class->parent;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ class_implements
|
||||
*/
|
||||
PHP_FUNCTION(class_implements)
|
||||
{
|
||||
zval *obj;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
array_init(return_value);
|
||||
spl_add_interfaces(return_value, Z_OBJCE_P(obj) TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
#define SPL_ADD_CLASS(class_name) \
|
||||
spl_add_classes(&spl_ce_ ## class_name, return_value TSRMLS_CC)
|
||||
|
||||
/* {{{ spl_classes */
|
||||
PHP_FUNCTION(spl_classes)
|
||||
{
|
||||
array_init(return_value);
|
||||
|
||||
SPL_ADD_CLASS(ArrayObject);
|
||||
SPL_ADD_CLASS(ArrayIterator);
|
||||
SPL_ADD_CLASS(CachingIterator);
|
||||
SPL_ADD_CLASS(CachingRecursiveIterator);
|
||||
SPL_ADD_CLASS(DirectoryIterator);
|
||||
SPL_ADD_CLASS(FilterIterator);
|
||||
SPL_ADD_CLASS(LimitIterator);
|
||||
SPL_ADD_CLASS(ParentIterator);
|
||||
SPL_ADD_CLASS(RecursiveIterator);
|
||||
SPL_ADD_CLASS(RecursiveIteratorIterator);
|
||||
SPL_ADD_CLASS(SeekableIterator);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef PHP_SPL_H
|
||||
#define PHP_SPL_H
|
||||
|
||||
#include "php.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#if 0
|
||||
#define SPL_DEBUG(x) x
|
||||
#else
|
||||
#define SPL_DEBUG(x)
|
||||
#endif
|
||||
|
||||
extern zend_module_entry spl_module_entry;
|
||||
#define phpext_spl_ptr &spl_module_entry
|
||||
|
||||
#if defined(PHP_WIN32) && !defined(COMPILE_DL_SPL)
|
||||
#undef phpext_spl
|
||||
#define phpext_spl NULL
|
||||
#endif
|
||||
|
||||
PHP_MINIT_FUNCTION(spl);
|
||||
PHP_MSHUTDOWN_FUNCTION(spl);
|
||||
PHP_RINIT_FUNCTION(spl);
|
||||
PHP_RSHUTDOWN_FUNCTION(spl);
|
||||
PHP_MINFO_FUNCTION(spl);
|
||||
|
||||
|
||||
ZEND_BEGIN_MODULE_GLOBALS(spl)
|
||||
int dummy;
|
||||
ZEND_END_MODULE_GLOBALS(spl)
|
||||
|
||||
#ifdef ZTS
|
||||
# define SPL_G(v) TSRMG(spl_globals_id, zend_spl_globals *, v)
|
||||
extern int spl_globals_id;
|
||||
#else
|
||||
# define SPL_G(v) (spl_globals.v)
|
||||
extern zend_spl_globals spl_globals;
|
||||
#endif
|
||||
|
||||
PHP_FUNCTION(spl_classes);
|
||||
PHP_FUNCTION(class_parents);
|
||||
PHP_FUNCTION(class_implements);
|
||||
|
||||
#endif /* PHP_SPL_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
-288
@@ -1,288 +0,0 @@
|
||||
<?php
|
||||
|
||||
/** Standard PHP Library
|
||||
*
|
||||
* (c) Marcus Boerger, 2003
|
||||
*/
|
||||
|
||||
/** Abstract base interface that cannot be implemented alone. Instead it
|
||||
* must be implemented by either IteratorAggregate or Iterator.
|
||||
*
|
||||
* \note Internal classes that implement this interface can be used in a
|
||||
* foreach construct and do not need to implement IteratorAggregate or
|
||||
* Iterator.
|
||||
*/
|
||||
interface Traversable {
|
||||
}
|
||||
|
||||
/** Interface to create an external Iterator.
|
||||
*/
|
||||
interface IteratorAggregate implements Traversable {
|
||||
/** Return an Iterator for the implementing object.
|
||||
*/
|
||||
function getIterator();
|
||||
}
|
||||
|
||||
/** Interface for external iterators or objects that can be iterated
|
||||
* themselves internally.
|
||||
*/
|
||||
interface Iterator implements Traversable {
|
||||
/** Rewind the Iterator to the first element.
|
||||
*/
|
||||
function rewind();
|
||||
|
||||
/** Return the current element.
|
||||
*/
|
||||
function current();
|
||||
|
||||
/** Return the key of the current element.
|
||||
*/
|
||||
function key();
|
||||
|
||||
/** Move forward to next element.
|
||||
*/
|
||||
function next();
|
||||
|
||||
/** Check if there is a current element after calls to rewind() or next().
|
||||
*/
|
||||
function hasMore();
|
||||
}
|
||||
|
||||
/** Interface for recursive traversal to be used with
|
||||
* RecursiveIteratorIterator.
|
||||
*/
|
||||
interface RecursiveIterator implements Iterator {
|
||||
/** \return whether current element can be iterated itself.
|
||||
*/
|
||||
function hasChildren();
|
||||
|
||||
/** \return an object that recursively iterates the current element.
|
||||
* This object must implement RecursiveIterator.
|
||||
*/
|
||||
function getChildren();
|
||||
}
|
||||
|
||||
/** Class for recursive traversal. The objects of this class are created by
|
||||
* instances of RecursiveIterator. Elements of those iterators may be
|
||||
* traversable themselves. If so these sub elements are recursed into.
|
||||
*/
|
||||
class RecursiveIteratorIterator implements Iterator {
|
||||
/** Construct an instance form a RecursiveIterator.
|
||||
*
|
||||
* \param $iterator inner root iterator
|
||||
* \param $mode one of
|
||||
* - RIT_LEAVES_ONLY do not return elements that can be recursed.
|
||||
* - RIT_SELF_FIRST show elements before their sub elements.
|
||||
* - RIT_CHILD_FIRST show elements after their sub elements-
|
||||
*
|
||||
* \note If you want to see only those elements which have sub elements then
|
||||
* use a ParentIterator.
|
||||
*/
|
||||
function __construct(RecursiveIterator $iterator, $mode);
|
||||
|
||||
/** \return the level of recursion (>=0).
|
||||
*/
|
||||
function getDepth();
|
||||
|
||||
/** \param $level the level of the sub iterator to return.
|
||||
* \return the current inner sub iterator or the iterator at the
|
||||
* specified $level.
|
||||
*/
|
||||
function getSubIterator([$level]);
|
||||
}
|
||||
|
||||
/** \brief An Array wrapper
|
||||
*
|
||||
* This array wrapper allows to recursively iterate over Arrays and Objects.
|
||||
*
|
||||
* \see ArrayIterator
|
||||
*/
|
||||
class ArrayObject implements IteratorAggregate {
|
||||
|
||||
/** Construct a new array iterator from anything that has a hash table.
|
||||
* That is any Array or Object.
|
||||
*
|
||||
* \param $array the array to use.
|
||||
*/
|
||||
function __construct($array);
|
||||
|
||||
/** Get the iterator which is a ArrayIterator object connected to this
|
||||
* object.
|
||||
*/
|
||||
function getIterator();
|
||||
}
|
||||
|
||||
/** \brief An Array iterator
|
||||
*
|
||||
* This iterator allows to unset and modify values and keys while iterating
|
||||
* over Arrays and Objects.
|
||||
*
|
||||
* To use this class you must instanciate ArrayObject.
|
||||
*/
|
||||
class ArrayIterator implements Iterator {
|
||||
|
||||
/** Construct a new array iterator from anything that has a hash table.
|
||||
* That is any Array or Object.
|
||||
*
|
||||
* \param $array the array to use.
|
||||
*/
|
||||
private function __construct($array);
|
||||
|
||||
/** \copydoc Iterator::rewind
|
||||
*/
|
||||
function rewind();
|
||||
|
||||
/** \copydoc Iterator::current
|
||||
*/
|
||||
function current();
|
||||
|
||||
/** \copydoc Iterator::key
|
||||
*/
|
||||
function key();
|
||||
|
||||
/** \copydoc Iterator::next
|
||||
*/
|
||||
function next();
|
||||
|
||||
/** \copydoc Iterator::hasMore
|
||||
*/
|
||||
function hasMore();
|
||||
}
|
||||
|
||||
/** Iterator that wrapps around another iterator and only returns selected
|
||||
* elements of the inner iterator.
|
||||
*/
|
||||
abstract class FilterIterator implements Iterator {
|
||||
/** Construct an instance form a Iterator.
|
||||
*
|
||||
* \param $iterator inner iterator
|
||||
*/
|
||||
function __construct(Iterator $iterator);
|
||||
|
||||
/** \return whether the current element of the inner iterator should be
|
||||
* used as a current element of this iterator or if it should be skipped.
|
||||
*/
|
||||
abstract function accept();
|
||||
|
||||
/** \copydoc Iterator::rewind
|
||||
*/
|
||||
function rewind();
|
||||
|
||||
/** \copydoc Iterator::current
|
||||
*/
|
||||
function current();
|
||||
|
||||
/** \copydoc Iterator::key
|
||||
*/
|
||||
function key();
|
||||
|
||||
/** \copydoc Iterator::next
|
||||
*/
|
||||
function next();
|
||||
|
||||
/** \copydoc Iterator::hasMore
|
||||
*/
|
||||
function hasMore();
|
||||
}
|
||||
|
||||
/** A recursive iterator that only returns elements that themselves can be
|
||||
* trversed.
|
||||
*/
|
||||
class ParentIterator extends FilterIterator implements RecursiveIterator {
|
||||
/** Construct an instance form a RecursiveIterator.
|
||||
*
|
||||
* \param $iterator inner iterator
|
||||
*/
|
||||
function __construct(RecursiveIterator $iterator);
|
||||
|
||||
/** \copydoc RecursiveIterator::hasChildren
|
||||
*/
|
||||
function hasChildren();
|
||||
|
||||
/** \copydoc RecursiveIterator::getChildren
|
||||
*/
|
||||
function getChildren();
|
||||
|
||||
/** \copydoc Iterator::rewind
|
||||
*/
|
||||
function rewind();
|
||||
|
||||
/** \copydoc Iterator::current
|
||||
*/
|
||||
function current();
|
||||
|
||||
/** \copydoc Iterator::key
|
||||
*/
|
||||
function key();
|
||||
|
||||
/** \copydoc Iterator::next
|
||||
*/
|
||||
function next();
|
||||
|
||||
/** \copydoc Iterator::hasMore
|
||||
*/
|
||||
function hasMore();
|
||||
}
|
||||
|
||||
/** \brief Directory iterator
|
||||
*/
|
||||
class DirectoryIterator implements Iterator {
|
||||
|
||||
/** Construct a directory iterator from a path-string.
|
||||
*
|
||||
* \param $path directory to iterate.
|
||||
*/
|
||||
function __construct($path);
|
||||
|
||||
/** \copydoc Iterator::rewind
|
||||
*/
|
||||
function rewind();
|
||||
|
||||
/** \copydoc Iterator::current
|
||||
*/
|
||||
function current();
|
||||
|
||||
/** \copydoc Iterator::next
|
||||
*/
|
||||
function next();
|
||||
|
||||
/** \copydoc Iterator::hasMore
|
||||
*/
|
||||
function hasMore();
|
||||
|
||||
/** \return The opened path.
|
||||
*/
|
||||
function getPath();
|
||||
|
||||
/** \return The current file name.
|
||||
*/
|
||||
function getFilename();
|
||||
|
||||
/** \return The current entries path and file name.
|
||||
*/
|
||||
function getPathname();
|
||||
|
||||
/** \return Whether the current entry is a directory.
|
||||
*/
|
||||
function isDir();
|
||||
|
||||
/** \return Whether the current entry is either '.' or '..'.
|
||||
*/
|
||||
function isDot();
|
||||
}
|
||||
|
||||
/** \brief recursive directory iterator
|
||||
*/
|
||||
class RecursiveDirectoryIterator extends DirectoryIterator implements RecursiveIterator {
|
||||
|
||||
/** \return whether the current is a directory (not '.' or '..').
|
||||
*/
|
||||
function hasChildren();
|
||||
|
||||
/** \return a RecursiveDirectoryIterator for the current entry.
|
||||
*/
|
||||
function getChildren();
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,512 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "zend_interfaces.h"
|
||||
|
||||
#include "php_spl.h"
|
||||
#include "spl_functions.h"
|
||||
#include "spl_engine.h"
|
||||
#include "spl_array.h"
|
||||
|
||||
|
||||
SPL_METHOD(Array, __construct);
|
||||
SPL_METHOD(Array, getIterator);
|
||||
SPL_METHOD(Array, rewind);
|
||||
SPL_METHOD(Array, current);
|
||||
SPL_METHOD(Array, key);
|
||||
SPL_METHOD(Array, next);
|
||||
SPL_METHOD(Array, hasMore);
|
||||
|
||||
static
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_array___construct, 0)
|
||||
ZEND_ARG_INFO(0, array)
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
static zend_function_entry spl_funcs_ArrayObject[] = {
|
||||
SPL_ME(Array, __construct, arginfo_array___construct, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, getIterator, NULL, ZEND_ACC_PUBLIC)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static zend_function_entry spl_funcs_ArrayIterator[] = {
|
||||
SPL_ME(Array, __construct, arginfo_array___construct, ZEND_ACC_PRIVATE)
|
||||
SPL_ME(Array, rewind, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, current, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, key, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, next, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, hasMore, NULL, ZEND_ACC_PUBLIC)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
zend_object_handlers spl_handler_ArrayObject;
|
||||
zend_class_entry * spl_ce_ArrayObject;
|
||||
|
||||
zend_object_handlers spl_handler_ArrayIterator;
|
||||
zend_class_entry * spl_ce_ArrayIterator;
|
||||
|
||||
typedef struct _spl_array_object {
|
||||
zend_object std;
|
||||
zval *array;
|
||||
HashPosition pos;
|
||||
} spl_array_object;
|
||||
|
||||
/* {{{ spl_array_object_dtor */
|
||||
static void spl_array_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object *)object;
|
||||
|
||||
zend_hash_destroy(intern->std.properties);
|
||||
FREE_HASHTABLE(intern->std.properties);
|
||||
|
||||
zval_ptr_dtor(&intern->array);
|
||||
|
||||
efree(object);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_object_new */
|
||||
static zend_object_value spl_array_object_new_ex(zend_class_entry *class_type, spl_array_object **obj, spl_array_object *orig TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
spl_array_object *intern;
|
||||
zval *tmp;
|
||||
|
||||
intern = emalloc(sizeof(spl_array_object));
|
||||
memset(intern, 0, sizeof(spl_array_object));
|
||||
intern->std.ce = class_type;
|
||||
*obj = intern;
|
||||
|
||||
ALLOC_HASHTABLE(intern->std.properties);
|
||||
zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
|
||||
zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
|
||||
|
||||
if (orig) {
|
||||
intern->array = orig->array;
|
||||
ZVAL_ADDREF(intern->array);
|
||||
} else {
|
||||
MAKE_STD_ZVAL(intern->array);
|
||||
array_init(intern->array);
|
||||
}
|
||||
zend_hash_internal_pointer_reset_ex(HASH_OF(intern->array), &intern->pos);
|
||||
|
||||
retval.handle = zend_objects_store_put(intern, spl_array_object_dtor, NULL TSRMLS_CC);
|
||||
if (class_type == spl_ce_ArrayIterator) {
|
||||
retval.handlers = &spl_handler_ArrayIterator;
|
||||
} else {
|
||||
retval.handlers = &spl_handler_ArrayObject;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_object_new */
|
||||
static zend_object_value spl_array_object_new(zend_class_entry *class_type TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *tmp;
|
||||
return spl_array_object_new_ex(class_type, &tmp, NULL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_object_clone */
|
||||
static zend_object_value spl_array_object_clone(zval *zobject TSRMLS_DC)
|
||||
{
|
||||
zend_object_value new_obj_val;
|
||||
zend_object *old_object;
|
||||
zend_object *new_object;
|
||||
zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
|
||||
spl_array_object *intern;
|
||||
|
||||
old_object = zend_objects_get_address(zobject TSRMLS_CC);
|
||||
new_obj_val = spl_array_object_new_ex(old_object->ce, &intern, (spl_array_object*)old_object TSRMLS_CC);
|
||||
new_object = &intern->std;
|
||||
|
||||
zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC);
|
||||
|
||||
return new_obj_val;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_read_dimension */
|
||||
static zval *spl_array_read_dimension(zval *object, zval *offset TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
zval **retval;
|
||||
long index;
|
||||
|
||||
switch(Z_TYPE_P(offset)) {
|
||||
case IS_STRING:
|
||||
if (zend_symtable_find(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **) &retval) == FAILURE) {
|
||||
zend_error(E_NOTICE,"Undefined index: %s", Z_STRVAL_P(offset));
|
||||
return EG(uninitialized_zval_ptr);
|
||||
} else {
|
||||
return *retval;
|
||||
}
|
||||
case IS_DOUBLE:
|
||||
case IS_RESOURCE:
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
if (offset->type == IS_DOUBLE) {
|
||||
index = (long)Z_DVAL_P(offset);
|
||||
} else {
|
||||
index = Z_LVAL_P(offset);
|
||||
}
|
||||
if (zend_hash_index_find(HASH_OF(intern->array), index, (void **) &retval) == FAILURE) {
|
||||
zend_error(E_NOTICE,"Undefined offset: %ld", Z_LVAL_P(offset));
|
||||
return EG(uninitialized_zval_ptr);
|
||||
} else {
|
||||
return *retval;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
return EG(uninitialized_zval_ptr);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_write_dimension */
|
||||
static void spl_array_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
long index;
|
||||
|
||||
switch(Z_TYPE_P(offset)) {
|
||||
case IS_STRING:
|
||||
zend_symtable_update(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void**)&value, sizeof(void*), NULL);
|
||||
return;
|
||||
case IS_DOUBLE:
|
||||
case IS_RESOURCE:
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
if (offset->type == IS_DOUBLE) {
|
||||
index = (long)Z_DVAL_P(offset);
|
||||
} else {
|
||||
index = Z_LVAL_P(offset);
|
||||
}
|
||||
add_index_zval(intern->array, index, value);
|
||||
return;
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_unset_dimension */
|
||||
static void spl_array_unset_dimension(zval *object, zval *offset TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
long index;
|
||||
|
||||
switch(Z_TYPE_P(offset)) {
|
||||
case IS_STRING:
|
||||
if (zend_symtable_del(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1) == FAILURE) {
|
||||
zend_error(E_NOTICE,"Undefined index: %s", Z_STRVAL_P(offset));
|
||||
}
|
||||
return;
|
||||
case IS_DOUBLE:
|
||||
case IS_RESOURCE:
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
if (offset->type == IS_DOUBLE) {
|
||||
index = (long)Z_DVAL_P(offset);
|
||||
} else {
|
||||
index = Z_LVAL_P(offset);
|
||||
}
|
||||
if (zend_hash_index_del(HASH_OF(intern->array), index) == FAILURE) {
|
||||
zend_error(E_NOTICE,"Undefined offset: %ld", Z_LVAL_P(offset));
|
||||
}
|
||||
return;
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_has_dimension */
|
||||
static int spl_array_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
long index;
|
||||
|
||||
switch(Z_TYPE_P(offset)) {
|
||||
case IS_STRING:
|
||||
return zend_symtable_exists(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
|
||||
case IS_DOUBLE:
|
||||
case IS_RESOURCE:
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
if (offset->type == IS_DOUBLE) {
|
||||
index = (long)Z_DVAL_P(offset);
|
||||
} else {
|
||||
index = Z_LVAL_P(offset);
|
||||
}
|
||||
return zend_hash_index_exists(HASH_OF(intern->array), index);
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_array_get_properties */
|
||||
static HashTable *spl_array_get_properties(zval *object TSRMLS_DC)
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
return HASH_OF(intern->array);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION(spl_array) */
|
||||
PHP_MINIT_FUNCTION(spl_array)
|
||||
{
|
||||
REGISTER_SPL_STD_CLASS_EX(ArrayObject, spl_array_object_new, spl_funcs_ArrayObject);
|
||||
zend_class_implements(spl_ce_ArrayObject TSRMLS_CC, 1, zend_ce_aggregate);
|
||||
memcpy(&spl_handler_ArrayObject, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||
spl_handler_ArrayObject.clone_obj = spl_array_object_clone;
|
||||
spl_handler_ArrayObject.read_dimension = spl_array_read_dimension;
|
||||
spl_handler_ArrayObject.write_dimension = spl_array_write_dimension;
|
||||
spl_handler_ArrayObject.unset_dimension = spl_array_unset_dimension;
|
||||
spl_handler_ArrayObject.has_dimension = spl_array_has_dimension;
|
||||
spl_handler_ArrayObject.get_properties = spl_array_get_properties;
|
||||
|
||||
REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator);
|
||||
zend_class_implements(spl_ce_ArrayIterator TSRMLS_CC, 1, zend_ce_iterator);
|
||||
memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers));
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void ArrayObject::__construct(array|object ar = array())
|
||||
proto void ArrayIterator::__construct(array|object ar = array())
|
||||
Cronstructs a new array iterator from a path. */
|
||||
SPL_METHOD(Array, __construct)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern;
|
||||
zval **array;
|
||||
|
||||
if (ZEND_NUM_ARGS() == 0) {
|
||||
return; /* nothing to do */
|
||||
}
|
||||
/* exceptions do not work yet
|
||||
php_set_error_handling(EH_THROW, zend_exception_get_default() TSRMLS_CC);*/
|
||||
|
||||
if (ZEND_NUM_ARGS() > 1 || zend_get_parameters_ex(1, &array) == FAILURE) {
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
if (!HASH_OF(*array)) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed variable is not an array or object, using empty array instead");
|
||||
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
|
||||
return;
|
||||
}
|
||||
intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
zval_dtor(intern->array);
|
||||
FREE_ZVAL(intern->array);
|
||||
intern->array = *array;
|
||||
ZVAL_ADDREF(intern->array);
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(HASH_OF(intern->array), &intern->pos);
|
||||
|
||||
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto ArrayIterator ArrayObject::getIterator()
|
||||
Create a new iterator from a ArrayObject instance */
|
||||
SPL_METHOD(Array, getIterator)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
spl_array_object *iterator;
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
return_value->type = IS_OBJECT;
|
||||
return_value->value.obj = spl_array_object_new_ex(spl_ce_ArrayIterator, &iterator, intern TSRMLS_CC);
|
||||
return_value->refcount = 1;
|
||||
return_value->is_ref = 1;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_hash_pos_exists */
|
||||
ZEND_API int spl_hash_pos_exists(spl_array_object * intern TSRMLS_DC)
|
||||
{
|
||||
HashTable *ht = HASH_OF(intern->array);
|
||||
Bucket *p;
|
||||
|
||||
/* IS_CONSISTENT(ht);*/
|
||||
|
||||
/* HASH_PROTECT_RECURSION(ht);*/
|
||||
p = ht->pListHead;
|
||||
while (p != NULL) {
|
||||
if (p == intern->pos) {
|
||||
return SUCCESS;
|
||||
}
|
||||
p = p->pListNext;
|
||||
}
|
||||
/* HASH_UNPROTECT_RECURSION(ht); */
|
||||
zend_hash_internal_pointer_reset_ex(HASH_OF(intern->array), &intern->pos);
|
||||
return FAILURE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void ArrayIterator::rewind()
|
||||
Rewind array back to the start */
|
||||
SPL_METHOD(Array, rewind)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(aht, &intern->pos);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed|false ArrayIterator::current()
|
||||
Return current array entry */
|
||||
SPL_METHOD(Array, current)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
zval **entry;
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
if (intern->array->is_ref && spl_hash_pos_exists(intern TSRMLS_CC) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and internal position is no longer valid");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
if (zend_hash_get_current_data_ex(aht, (void **) &entry, &intern->pos) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
*return_value = **entry;
|
||||
zval_copy_ctor(return_value);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed|false ArrayIterator::key()
|
||||
Return current array key */
|
||||
SPL_METHOD(Array, key)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
char *string_key;
|
||||
uint string_length;
|
||||
ulong num_key;
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
if (intern->array->is_ref && spl_hash_pos_exists(intern TSRMLS_CC) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and internal position is no longer valid");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
switch (zend_hash_get_current_key_ex(aht, &string_key, &string_length, &num_key, 0, &intern->pos)) {
|
||||
case HASH_KEY_IS_STRING:
|
||||
RETVAL_STRINGL(string_key, string_length - 1, 1);
|
||||
break;
|
||||
case HASH_KEY_IS_LONG:
|
||||
RETVAL_LONG(num_key);
|
||||
break;
|
||||
case HASH_KEY_NON_EXISTANT:
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void ArrayIterator::next()
|
||||
Move to next entry */
|
||||
SPL_METHOD(Array, next)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
if (intern->array->is_ref && spl_hash_pos_exists(intern TSRMLS_CC) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and internal position is no longer valid");
|
||||
} else {
|
||||
zend_hash_move_forward_ex(aht, &intern->pos);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool ArrayIterator::hasMore()
|
||||
Check whether array contains more entries */
|
||||
SPL_METHOD(Array, hasMore)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
HashTable *aht = HASH_OF(intern->array);
|
||||
|
||||
if (!aht) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array");
|
||||
return;
|
||||
}
|
||||
|
||||
if (intern->pos && intern->array->is_ref && spl_hash_pos_exists(intern TSRMLS_CC) == FAILURE) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and internal position is no longer valid");
|
||||
RETURN_FALSE;
|
||||
} else {
|
||||
RETURN_BOOL(zend_hash_has_more_elements_ex(aht, &intern->pos) == SUCCESS);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef SPL_ARRAY_H
|
||||
#define SPL_ARRAY_H
|
||||
|
||||
#include "php.h"
|
||||
#include "php_spl.h"
|
||||
|
||||
extern zend_class_entry *spl_ce_ArrayObject;
|
||||
extern zend_class_entry *spl_ce_ArrayIterator;
|
||||
|
||||
PHP_MINIT_FUNCTION(spl_array);
|
||||
|
||||
#endif /* SPL_ARRAY_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,793 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 4 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "zend_compile.h"
|
||||
#include "zend_default_classes.h"
|
||||
#include "zend_interfaces.h"
|
||||
|
||||
#include "php_spl.h"
|
||||
#include "spl_functions.h"
|
||||
#include "spl_engine.h"
|
||||
#include "spl_iterators.h"
|
||||
#include "spl_directory.h"
|
||||
|
||||
#include "php.h"
|
||||
#include "fopen_wrappers.h"
|
||||
|
||||
#include "ext/standard/basic_functions.h"
|
||||
#include "ext/standard/php_filestat.h"
|
||||
|
||||
/* declare the class handlers */
|
||||
static zend_object_handlers spl_ce_dir_handlers;
|
||||
|
||||
|
||||
/* decalre the class entry */
|
||||
zend_class_entry *spl_ce_DirectoryIterator;
|
||||
zend_class_entry *spl_ce_RecursiveDirectoryIterator;
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_object_dtor */
|
||||
/* close all resources and the memory allocated for the object */
|
||||
static void spl_ce_dir_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object *)object;
|
||||
|
||||
zend_hash_destroy(intern->std.properties);
|
||||
FREE_HASHTABLE(intern->std.properties);
|
||||
|
||||
if (intern->path) {
|
||||
efree(intern->path);
|
||||
}
|
||||
if (intern->dirp) {
|
||||
php_stream_close(intern->dirp);
|
||||
}
|
||||
if (intern->path_name) {
|
||||
efree(intern->path_name);
|
||||
}
|
||||
efree(object);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_object_new */
|
||||
/* creates the object by
|
||||
- allocating memory
|
||||
- initializing the object members
|
||||
- storing the object
|
||||
- setting it's handlers
|
||||
|
||||
called from
|
||||
- clone
|
||||
- new
|
||||
*/
|
||||
static zend_object_value spl_ce_dir_object_new_ex(zend_class_entry *class_type, spl_ce_dir_object **obj TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
spl_ce_dir_object *intern;
|
||||
zval *tmp;
|
||||
|
||||
intern = emalloc(sizeof(spl_ce_dir_object));
|
||||
memset(intern, 0, sizeof(spl_ce_dir_object));
|
||||
intern->std.ce = class_type;
|
||||
*obj = intern;
|
||||
|
||||
ALLOC_HASHTABLE(intern->std.properties);
|
||||
zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
|
||||
zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
|
||||
|
||||
retval.handle = zend_objects_store_put(intern, spl_ce_dir_object_dtor, NULL TSRMLS_CC);
|
||||
retval.handlers = &spl_ce_dir_handlers;
|
||||
return retval;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_object_new */
|
||||
/* See spl_ce_dir_object_new_ex */
|
||||
static zend_object_value spl_ce_dir_object_new(zend_class_entry *class_type TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_object *tmp;
|
||||
return spl_ce_dir_object_new_ex(class_type, &tmp TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_open */
|
||||
/* open a directory resource */
|
||||
static void spl_ce_dir_open(spl_ce_dir_object* intern, char *path TSRMLS_DC)
|
||||
{
|
||||
intern->dirp = php_stream_opendir(path, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
|
||||
|
||||
intern->path = estrdup(path);
|
||||
intern->index = 0;
|
||||
|
||||
if (intern->dirp == NULL) {
|
||||
/* throw exception: should've been already happened */
|
||||
intern->entry.d_name[0] = '\0';
|
||||
} else {
|
||||
if (!php_stream_readdir(intern->dirp, &intern->entry)) {
|
||||
intern->entry.d_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_ce_dir_object_clone */
|
||||
/* Local zend_object_value creation (on stack)
|
||||
Load the 'other' object
|
||||
Create a new empty object (See spl_ce_dir_object_new_ex)
|
||||
Open the directory
|
||||
Clone other members (properties)
|
||||
*/
|
||||
static zend_object_value spl_ce_dir_object_clone(zval *zobject TSRMLS_DC)
|
||||
{
|
||||
zend_object_value new_obj_val;
|
||||
zend_object *old_object;
|
||||
zend_object *new_object;
|
||||
zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
|
||||
spl_ce_dir_object *intern;
|
||||
|
||||
old_object = zend_objects_get_address(zobject TSRMLS_CC);
|
||||
new_obj_val = spl_ce_dir_object_new_ex(old_object->ce, &intern TSRMLS_CC);
|
||||
new_object = &intern->std;
|
||||
|
||||
spl_ce_dir_open(intern, ((spl_ce_dir_object*)old_object)->path TSRMLS_CC);
|
||||
|
||||
zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC);
|
||||
|
||||
return new_obj_val;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void DirectoryIterator::__construct(string path)
|
||||
Cronstructs a new dir iterator from a path. */
|
||||
/* php_set_error_handling() is used to throw exceptions in case
|
||||
the constructor fails. Here we use this to ensure the object
|
||||
has a valid directory resource.
|
||||
|
||||
When the constructor gets called the object is already created
|
||||
by the engine, so we must only call 'additional' initializations.
|
||||
*/
|
||||
SPL_METHOD(DirectoryIterator, __construct)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern;
|
||||
char *path;
|
||||
long len;
|
||||
|
||||
php_set_error_handling(EH_THROW, zend_exception_get_default() TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &len) == FAILURE) {
|
||||
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
|
||||
return;
|
||||
}
|
||||
|
||||
intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
spl_ce_dir_open(intern, path TSRMLS_CC);
|
||||
|
||||
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void DirectoryIterator::rewind()
|
||||
Rewind dir back to the start */
|
||||
SPL_METHOD(DirectoryIterator, rewind)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
intern->index = 0;
|
||||
if (intern->dirp) {
|
||||
php_stream_rewinddir(intern->dirp);
|
||||
}
|
||||
if (!intern->dirp || !php_stream_readdir(intern->dirp, &intern->entry)) {
|
||||
intern->entry.d_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string DirectoryIterator::key()
|
||||
Return current dir entry */
|
||||
SPL_METHOD(DirectoryIterator, key)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
if (intern->dirp) {
|
||||
RETURN_LONG(intern->index);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto DirectoryIterator DirectoryIterator::current()
|
||||
Return this (needed for Iterator interface) */
|
||||
SPL_METHOD(DirectoryIterator, current)
|
||||
{
|
||||
RETURN_ZVAL(getThis(), 1, 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void DirectoryIterator::next()
|
||||
Move to next entry */
|
||||
SPL_METHOD(DirectoryIterator, next)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
intern->index++;
|
||||
if (!intern->dirp || !php_stream_readdir(intern->dirp, &intern->entry)) {
|
||||
intern->entry.d_name[0] = '\0';
|
||||
}
|
||||
if (intern->path_name) {
|
||||
efree(intern->path_name);
|
||||
intern->path_name = NULL;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string DirectoryIterator::hasMore()
|
||||
Check whether dir contains more entries */
|
||||
SPL_METHOD(DirectoryIterator, hasMore)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
RETURN_BOOL(intern->entry.d_name[0] != '\0');
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string DirectoryIterator::getPath()
|
||||
Return directory path */
|
||||
SPL_METHOD(DirectoryIterator, getPath)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
RETURN_STRING(intern->path, 1);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string DirectoryIterator::getFilename()
|
||||
Return filename of current dir entry */
|
||||
SPL_METHOD(DirectoryIterator, getFilename)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
RETURN_STRING(intern->entry.d_name, 1);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static inline void spl_dir_get_path_name(spl_ce_dir_object *intern)
|
||||
{
|
||||
if (!intern->path_name) {
|
||||
intern->path_name_len = spprintf(&intern->path_name, 0, "%s/%s", intern->path, intern->entry.d_name);
|
||||
}
|
||||
}
|
||||
|
||||
/* {{{ proto string DirectoryIterator::getPathname()
|
||||
Return path and filename of current dir entry */
|
||||
SPL_METHOD(DirectoryIterator, getPathname)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
if (intern->entry.d_name[0]) {
|
||||
spl_dir_get_path_name(intern);
|
||||
RETURN_STRINGL(intern->path_name, intern->path_name_len, 1);
|
||||
} else {
|
||||
RETURN_BOOL(0);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string RecursiveDirectoryIterator::key()
|
||||
Return path and filename of current dir entry */
|
||||
SPL_METHOD(RecursiveDirectoryIterator, key)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
spl_dir_get_path_name(intern);
|
||||
RETURN_STRINGL(intern->path_name, intern->path_name_len, 1);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isDot()
|
||||
Returns true if current entry is '.' or '..' */
|
||||
SPL_METHOD(DirectoryIterator, isDot)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
RETURN_BOOL(!strcmp(intern->entry.d_name, ".") || !strcmp(intern->entry.d_name, ".."));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ FileFunction */
|
||||
#define FileFunction(func_name, func_num) \
|
||||
SPL_METHOD(DirectoryIterator, func_name) \
|
||||
{ \
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(getThis() TSRMLS_CC); \
|
||||
\
|
||||
spl_dir_get_path_name(intern); \
|
||||
php_stat(intern->path_name, intern->path_name_len, func_num, return_value TSRMLS_CC); \
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::filePerms()
|
||||
Get file permissions */
|
||||
FileFunction(getPerms, FS_PERMS)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileInode()
|
||||
Get file inode */
|
||||
FileFunction(getInode, FS_INODE)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileSize()
|
||||
Get file size */
|
||||
FileFunction(getSize, FS_SIZE)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileOwner()
|
||||
Get file owner */
|
||||
FileFunction(getOwner, FS_OWNER)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileGroup()
|
||||
Get file group */
|
||||
FileFunction(getGroup, FS_GROUP)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileATime()
|
||||
Get last access time of file */
|
||||
FileFunction(getATime, FS_ATIME)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileMTime()
|
||||
Get last modification time of file */
|
||||
FileFunction(getMTime, FS_MTIME)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int DirectoryIterator::fileCTime()
|
||||
Get inode modification time of file */
|
||||
FileFunction(getCTime, FS_CTIME)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string DirectoryIterator::fileType()
|
||||
Get file type */
|
||||
FileFunction(getType, FS_TYPE)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isWritable()
|
||||
Returns true if file can be written */
|
||||
FileFunction(isWritable, FS_IS_W)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isReadable()
|
||||
Returns true if file can be read */
|
||||
FileFunction(isReadable, FS_IS_R)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isExecutable()
|
||||
Returns true if file is executable */
|
||||
FileFunction(isExecutable, FS_IS_X)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isFile()
|
||||
Returns true if file is a regular file */
|
||||
FileFunction(isFile, FS_IS_FILE)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isDir()
|
||||
Returns true if file is directory */
|
||||
FileFunction(isDir, FS_IS_DIR)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool DirectoryIterator::isLink()
|
||||
Returns true if file is symbolic link */
|
||||
FileFunction(isLink, FS_IS_LINK)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void RecursiveDirectoryIterator::rewind()
|
||||
Rewind dir back to the start */
|
||||
SPL_METHOD(RecursiveDirectoryIterator, rewind)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
intern->index = 0;
|
||||
if (intern->dirp) {
|
||||
php_stream_rewinddir(intern->dirp);
|
||||
}
|
||||
do {
|
||||
if (!intern->dirp || !php_stream_readdir(intern->dirp, &intern->entry)) {
|
||||
intern->entry.d_name[0] = '\0';
|
||||
}
|
||||
} while (!strcmp(intern->entry.d_name, ".") || !strcmp(intern->entry.d_name, ".."));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void RecursiveDirectoryIterator::next()
|
||||
Move to next entry */
|
||||
SPL_METHOD(RecursiveDirectoryIterator, next)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
intern->index++;
|
||||
do {
|
||||
if (!intern->dirp || !php_stream_readdir(intern->dirp, &intern->entry)) {
|
||||
intern->entry.d_name[0] = '\0';
|
||||
}
|
||||
} while (!strcmp(intern->entry.d_name, ".") || !strcmp(intern->entry.d_name, ".."));
|
||||
if (intern->path_name) {
|
||||
efree(intern->path_name);
|
||||
intern->path_name = NULL;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool RecursiveDirectoryIterator::hasChildren()
|
||||
Returns whether current entry is a directory and not '.' or '..' */
|
||||
SPL_METHOD(RecursiveDirectoryIterator, hasChildren)
|
||||
{
|
||||
zval *object = getThis();
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
if (!strcmp(intern->entry.d_name, ".") || !strcmp(intern->entry.d_name, "..")) {
|
||||
RETURN_BOOL(0);
|
||||
} else {
|
||||
spl_dir_get_path_name(intern);
|
||||
php_stat(intern->path_name, intern->path_name_len, FS_IS_DIR, return_value TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto RecursiveDirectoryIterator DirectoryIterator::getChildren()
|
||||
Returns an iterator fo rthe current entry if it is a directory */
|
||||
SPL_METHOD(RecursiveDirectoryIterator, getChildren)
|
||||
{
|
||||
zval *object = getThis(), zpath;
|
||||
spl_ce_dir_object *intern = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
spl_dir_get_path_name(intern);
|
||||
|
||||
INIT_PZVAL(&zpath);
|
||||
ZVAL_STRINGL(&zpath, intern->path_name, intern->path_name_len, 0);
|
||||
|
||||
spl_instantiate_arg_ex1(spl_ce_RecursiveDirectoryIterator, &return_value, 0, &zpath TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* define an overloaded iterator structure */
|
||||
typedef struct {
|
||||
zend_object_iterator intern;
|
||||
zval *current;
|
||||
spl_ce_dir_object *object;
|
||||
} spl_ce_dir_it;
|
||||
|
||||
/* forward declarations to the iterator handlers */
|
||||
static void spl_ce_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC);
|
||||
static int spl_ce_dir_it_has_more(zend_object_iterator *iter TSRMLS_DC);
|
||||
static void spl_ce_dir_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC);
|
||||
static int spl_ce_dir_it_current_key(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC);
|
||||
static void spl_ce_dir_it_move_forward(zend_object_iterator *iter TSRMLS_DC);
|
||||
static void spl_ce_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC);
|
||||
|
||||
|
||||
/* iterator handler table */
|
||||
zend_object_iterator_funcs spl_ce_dir_it_funcs = {
|
||||
spl_ce_dir_it_dtor,
|
||||
spl_ce_dir_it_has_more,
|
||||
spl_ce_dir_it_current_data,
|
||||
spl_ce_dir_it_current_key,
|
||||
spl_ce_dir_it_move_forward,
|
||||
spl_ce_dir_it_rewind
|
||||
};
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_get_iterator */
|
||||
zend_object_iterator *spl_ce_dir_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = emalloc(sizeof(spl_ce_dir_it));
|
||||
spl_ce_dir_object *dir_object = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
object->refcount++;
|
||||
iterator->intern.data = (void*)object;
|
||||
iterator->intern.funcs = &spl_ce_dir_it_funcs;
|
||||
iterator->current = object;
|
||||
object->refcount++;
|
||||
iterator->object = dir_object;
|
||||
|
||||
return (zend_object_iterator*)iterator;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_dtor */
|
||||
static void spl_ce_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
|
||||
zval_ptr_dtor(&iterator->current);
|
||||
zval_ptr_dtor((zval**)&iterator->intern.data);
|
||||
|
||||
efree(iterator);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_has_more */
|
||||
static int spl_ce_dir_it_has_more(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
return object->entry.d_name[0] != '\0' ? SUCCESS : FAILURE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_current_data */
|
||||
static void spl_ce_dir_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
|
||||
*data = &iterator->current;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_current_key */
|
||||
static int spl_ce_dir_it_current_key(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
*int_key = object->index;
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_move_forward */
|
||||
static void spl_ce_dir_it_move_forward(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
object->index++;
|
||||
if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
|
||||
object->entry.d_name[0] = '\0';
|
||||
}
|
||||
if (object->path_name) {
|
||||
efree(object->path_name);
|
||||
object->path_name = NULL;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_it_rewind */
|
||||
static void spl_ce_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
object->index = 0;
|
||||
if (object->dirp) {
|
||||
php_stream_rewinddir(object->dirp);
|
||||
}
|
||||
if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
|
||||
object->entry.d_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_tree_it_current_key */
|
||||
static int spl_ce_dir_tree_it_current_key(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
spl_dir_get_path_name(object);
|
||||
*str_key_len = object->path_name_len + 1;
|
||||
*str_key = estrndup(object->path_name, object->path_name_len);
|
||||
return HASH_KEY_IS_STRING;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ spl_ce_dir_tree_it_move_forward */
|
||||
static void spl_ce_dir_tree_it_move_forward(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
object->index++;
|
||||
do {
|
||||
if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
|
||||
object->entry.d_name[0] = '\0';
|
||||
}
|
||||
} while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name, ".."));
|
||||
if (object->path_name) {
|
||||
efree(object->path_name);
|
||||
object->path_name = NULL;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_ce_dir_tree_it_rewind */
|
||||
static void spl_ce_dir_tree_it_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = (spl_ce_dir_it *)iter;
|
||||
spl_ce_dir_object *object = iterator->object;
|
||||
|
||||
object->index = 0;
|
||||
if (object->dirp) {
|
||||
php_stream_rewinddir(object->dirp);
|
||||
}
|
||||
do {
|
||||
if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
|
||||
object->entry.d_name[0] = '\0';
|
||||
}
|
||||
} while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name, ".."));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* iterator handler table */
|
||||
zend_object_iterator_funcs spl_ce_dir_tree_it_funcs = {
|
||||
spl_ce_dir_it_dtor,
|
||||
spl_ce_dir_it_has_more,
|
||||
spl_ce_dir_it_current_data,
|
||||
spl_ce_dir_tree_it_current_key,
|
||||
spl_ce_dir_tree_it_move_forward,
|
||||
spl_ce_dir_tree_it_rewind
|
||||
};
|
||||
|
||||
/* {{{ spl_ce_dir_get_iterator */
|
||||
zend_object_iterator *spl_ce_dir_tree_get_iterator(zend_class_entry *ce, zval *object TSRMLS_DC)
|
||||
{
|
||||
spl_ce_dir_it *iterator = emalloc(sizeof(spl_ce_dir_it));
|
||||
spl_ce_dir_object *dir_object = (spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
object->refcount++;
|
||||
iterator->intern.data = (void*)object;
|
||||
iterator->intern.funcs = &spl_ce_dir_tree_it_funcs;
|
||||
iterator->current = object;
|
||||
object->refcount++;
|
||||
iterator->object = dir_object;
|
||||
|
||||
return (zend_object_iterator*)iterator;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_ce_dir_cast */
|
||||
static int spl_ce_dir_cast(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC)
|
||||
{
|
||||
zval free_obj;
|
||||
spl_ce_dir_object *dir_object = (spl_ce_dir_object*)zend_object_store_get_object(readobj TSRMLS_CC);
|
||||
|
||||
if (type ==IS_STRING && *dir_object->entry.d_name) {
|
||||
if (should_free) {
|
||||
free_obj = *writeobj;
|
||||
}
|
||||
ZVAL_STRING(writeobj, dir_object->entry.d_name, 1);
|
||||
if (should_free) {
|
||||
zval_dtor(&free_obj);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* declare method parameters */
|
||||
/* supply a name and default to call by parameter */
|
||||
static
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0)
|
||||
ZEND_ARG_INFO(0, path) /* parameter name */
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
|
||||
/* the method table */
|
||||
/* each method can have its own parameters and visibility */
|
||||
static zend_function_entry spl_ce_dir_class_functions[] = {
|
||||
SPL_ME(DirectoryIterator, __construct, arginfo_dir___construct, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, rewind, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, hasMore, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, key, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, current, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, next, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getPath, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getFilename, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getPathname, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getPerms, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getInode, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getSize, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getOwner, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getGroup, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getATime, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getMTime, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getCTime, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, getType, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isWritable, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isReadable, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isExecutable, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isFile, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isDir, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isLink, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(DirectoryIterator, isDot, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename, NULL, ZEND_ACC_PUBLIC)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static zend_function_entry spl_ce_dir_tree_class_functions[] = {
|
||||
SPL_ME(RecursiveDirectoryIterator, rewind, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(RecursiveDirectoryIterator, next, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(RecursiveDirectoryIterator, key, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(RecursiveDirectoryIterator, hasChildren, NULL, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(RecursiveDirectoryIterator, getChildren, NULL, ZEND_ACC_PUBLIC)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION(spl_directory)
|
||||
*/
|
||||
PHP_MINIT_FUNCTION(spl_directory)
|
||||
{
|
||||
REGISTER_SPL_STD_CLASS_EX(DirectoryIterator, spl_ce_dir_object_new, spl_ce_dir_class_functions);
|
||||
zend_class_implements(spl_ce_DirectoryIterator TSRMLS_CC, 1, zend_ce_iterator);
|
||||
memcpy(&spl_ce_dir_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||
spl_ce_dir_handlers.clone_obj = spl_ce_dir_object_clone;
|
||||
spl_ce_dir_handlers.cast_object = spl_ce_dir_cast;
|
||||
|
||||
spl_ce_DirectoryIterator->get_iterator = spl_ce_dir_get_iterator;
|
||||
|
||||
REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, DirectoryIterator, spl_ce_dir_object_new, spl_ce_dir_tree_class_functions);
|
||||
REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
|
||||
|
||||
spl_ce_RecursiveDirectoryIterator->get_iterator = spl_ce_dir_tree_get_iterator;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef SPL_DIRECTORY_H
|
||||
#define SPL_DIRECTORY_H
|
||||
|
||||
#include "php.h"
|
||||
#include "php_spl.h"
|
||||
|
||||
extern zend_class_entry *spl_ce_DirectoryIterator;
|
||||
|
||||
PHP_MINIT_FUNCTION(spl_directory);
|
||||
|
||||
typedef struct _spl_ce_dir_object {
|
||||
zend_object std;
|
||||
php_stream *dirp;
|
||||
php_stream_dirent entry;
|
||||
char *path;
|
||||
char *path_name;
|
||||
int path_name_len;
|
||||
int index;
|
||||
} spl_ce_dir_object;
|
||||
|
||||
#endif /* SPL_DIRECTORY_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "zend_interfaces.h"
|
||||
|
||||
#include "php_spl.h"
|
||||
#include "spl_functions.h"
|
||||
#include "spl_engine.h"
|
||||
|
||||
#include "spl_array.h"
|
||||
|
||||
/* {{{ spl_instantiate */
|
||||
void spl_instantiate(zend_class_entry *pce, zval **object, int alloc TSRMLS_DC)
|
||||
{
|
||||
if (alloc) {
|
||||
ALLOC_ZVAL(*object);
|
||||
}
|
||||
object_init_ex(*object, pce);
|
||||
(*object)->refcount = 1;
|
||||
(*object)->is_ref = 1; /* check if this can be hold always */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_is_instance_of */
|
||||
int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
/* Ensure everything needed is available before checking for the type.
|
||||
*/
|
||||
zend_class_entry *instance_ce;
|
||||
|
||||
if (obj && (instance_ce = spl_get_class_entry(*obj TSRMLS_CC)) != NULL) {
|
||||
return instanceof_function(instance_ce, ce TSRMLS_CC);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef SPL_ENGINE_H
|
||||
#define SPL_ENGINE_H
|
||||
|
||||
#include "php.h"
|
||||
#include "php_spl.h"
|
||||
#include "zend_interfaces.h"
|
||||
|
||||
/* {{{ zend_class_entry */
|
||||
static inline zend_class_entry *spl_get_class_entry(zval *obj TSRMLS_DC)
|
||||
{
|
||||
if (obj && Z_TYPE_P(obj) == IS_OBJECT && Z_OBJ_HT_P(obj)->get_class_entry) {
|
||||
return Z_OBJ_HT_P(obj)->get_class_entry(obj TSRMLS_CC);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void spl_instantiate(zend_class_entry *pce, zval **object, int alloc TSRMLS_DC);
|
||||
|
||||
/* {{{ spl_instantiate_arg_ex1 */
|
||||
static inline int spl_instantiate_arg_ex1(zend_class_entry *pce, zval **retval, int alloc, zval *arg1 TSRMLS_DC)
|
||||
{
|
||||
spl_instantiate(pce, retval, alloc TSRMLS_CC);
|
||||
|
||||
zend_call_method(retval, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), NULL, 1, arg1, NULL TSRMLS_CC);
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_instantiate_arg_ex2 */
|
||||
static inline int spl_instantiate_arg_ex2(zend_class_entry *pce, zval **retval, int alloc, zval *arg1, zval *arg2 TSRMLS_DC)
|
||||
{
|
||||
spl_instantiate(pce, retval, alloc TSRMLS_CC);
|
||||
|
||||
zend_call_method(retval, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), NULL, 2, arg1, arg2 TSRMLS_CC);
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC);
|
||||
|
||||
#endif /* SPL_ENGINE_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_spl.h"
|
||||
|
||||
/* {{{ spl_destroy_class */
|
||||
void spl_destroy_class(zend_class_entry ** ppce)
|
||||
{
|
||||
SPL_DEBUG(fprintf(stderr, "Destroy(%s): %s\n", (*ppce)->type == ZEND_USER_CLASS ? "user" : "other", (*ppce)->name);)
|
||||
destroy_zend_class(ppce);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_interface */
|
||||
void spl_register_interface(zend_class_entry ** ppce, char * class_name, zend_function_entry *functions TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry ce;
|
||||
|
||||
INIT_CLASS_ENTRY(ce, class_name, functions);
|
||||
ce.name_length = strlen(class_name);
|
||||
*ppce = zend_register_internal_class(&ce TSRMLS_CC);
|
||||
|
||||
/* entries changed by initialize */
|
||||
(*ppce)->ce_flags = ZEND_ACC_ABSTRACT | ZEND_ACC_INTERFACE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_std_class */
|
||||
void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * obj_ctor, function_entry * function_list TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry ce;
|
||||
|
||||
INIT_CLASS_ENTRY(ce, class_name, function_list);
|
||||
ce.name_length = strlen(class_name);
|
||||
*ppce = zend_register_internal_class(&ce TSRMLS_CC);
|
||||
|
||||
/* entries changed by initialize */
|
||||
(*ppce)->create_object = obj_ctor;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_sub_class */
|
||||
void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, void *obj_ctor, function_entry * function_list TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry ce;
|
||||
|
||||
INIT_CLASS_ENTRY(ce, class_name, function_list);
|
||||
ce.name_length = strlen(class_name);
|
||||
*ppce = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC);
|
||||
|
||||
/* entries changed by initialize */
|
||||
(*ppce)->create_object = obj_ctor;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_parent_ce */
|
||||
void spl_register_parent_ce(zend_class_entry * class_entry, zend_class_entry * parent_class TSRMLS_DC)
|
||||
{
|
||||
class_entry->parent = parent_class;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_functions */
|
||||
void spl_register_functions(zend_class_entry * class_entry, function_entry * function_list TSRMLS_DC)
|
||||
{
|
||||
zend_register_functions(class_entry, function_list, &class_entry->function_table, MODULE_PERSISTENT TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_register_property */
|
||||
void spl_register_property( zend_class_entry * class_entry, char *prop_name, zval *prop_val, int prop_flags TSRMLS_DC)
|
||||
{
|
||||
if (!prop_val) {
|
||||
INIT_PZVAL(prop_val);
|
||||
prop_val->type = IS_NULL;
|
||||
}
|
||||
|
||||
zend_declare_property(class_entry, prop_name, strlen(prop_name), prop_val, prop_flags TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_add_class_name */
|
||||
void spl_add_class_name(zval * list, zend_class_entry * pce TSRMLS_DC)
|
||||
{
|
||||
size_t len = strlen(pce->name);
|
||||
zval *tmp;
|
||||
|
||||
if (zend_hash_find(Z_ARRVAL_P(list), pce->name, len+1, (void*)&tmp) == FAILURE) {
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_STRING(tmp, pce->name, 1);
|
||||
zend_hash_add(Z_ARRVAL_P(list), pce->name, len+1, &tmp, sizeof(zval *), NULL);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_add_interfaces */
|
||||
void spl_add_interfaces(zval *list, zend_class_entry * pce TSRMLS_DC)
|
||||
{
|
||||
zend_uint num_interfaces;
|
||||
|
||||
for (num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) {
|
||||
spl_add_class_name(list, pce->interfaces[num_interfaces] TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ spl_add_classes */
|
||||
int spl_add_classes(zend_class_entry ** ppce, zval *list TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry *pce = *ppce;
|
||||
spl_add_class_name(list, pce TSRMLS_CC);
|
||||
spl_add_interfaces(list, pce TSRMLS_CC);
|
||||
while (pce->parent) {
|
||||
pce = pce->parent;
|
||||
spl_add_classes(&pce, list TSRMLS_CC);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef PHP_FUNCTIONS_H
|
||||
#define PHP_FUNCTIONS_H
|
||||
|
||||
#include "php.h"
|
||||
|
||||
typedef zend_object_value (*create_object_func_t)(zend_class_entry *class_type TSRMLS_DC);
|
||||
|
||||
#define REGISTER_SPL_STD_CLASS(class_name, obj_ctor) \
|
||||
spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, NULL TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_STD_CLASS_EX(class_name, obj_ctor, funcs) \
|
||||
spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, funcs TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_SUB_CLASS_EX(class_name, parent_class_name, obj_ctor, funcs) \
|
||||
spl_register_sub_class(&spl_ce_ ## class_name, spl_ce_ ## parent_class_name, # class_name, obj_ctor, funcs TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_INTERFACE(class_name) \
|
||||
spl_register_interface(&spl_ce_ ## class_name, # class_name, spl_funcs_ ## class_name TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_PARENT_CE(class_name, parent_class) \
|
||||
spl_register_parent_ce(spl_ce_ ## class_name, spl_ce_ ## parent_class TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_IMPLEMENTS(class_name, interface_name) \
|
||||
zend_class_implements(spl_ce_ ## class_name TSRMLS_CC, 1, spl_ce_ ## interface_name);
|
||||
|
||||
#define REGISTER_SPL_ITERATOR(class_name) \
|
||||
zend_class_implements(spl_ce_ ## class_name TSRMLS_CC, 1, zend_ce_iterator);
|
||||
|
||||
#define REGISTER_SPL_FUNCTIONS(class_name, function_list) \
|
||||
spl_register_functions(spl_ce_ ## class_name, function_list TSRMLS_CC);
|
||||
|
||||
#define REGISTER_SPL_PROPERTY(class_name, prop_name) \
|
||||
spl_register_property(spl_ce_ ## class_name, prop_name, prop_val, prop_flags TSRMLS_CC);
|
||||
|
||||
void spl_destroy_class(zend_class_entry ** ppce);
|
||||
|
||||
void spl_register_std_class(zend_class_entry ** ppce, char * class_name, create_object_func_t ctor, function_entry * function_list TSRMLS_DC);
|
||||
void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, create_object_func_t ctor, function_entry * function_list TSRMLS_DC);
|
||||
|
||||
void spl_register_interface(zend_class_entry ** ppce, char * class_name, zend_function_entry *functions TSRMLS_DC);
|
||||
|
||||
void spl_register_parent_ce(zend_class_entry * class_entry, zend_class_entry * parent_class TSRMLS_DC);
|
||||
void spl_register_functions(zend_class_entry * class_entry, function_entry * function_list TSRMLS_DC);
|
||||
void spl_register_property( zend_class_entry * class_entry, char *prop_name, zval *prop_val, int prop_flags TSRMLS_DC);
|
||||
|
||||
void spl_add_class_name(zval * list, zend_class_entry * pce TSRMLS_DC);
|
||||
void spl_add_interfaces(zval * list, zend_class_entry * pce TSRMLS_DC);
|
||||
int spl_add_classes(zend_class_entry ** ppce, zval *list TSRMLS_DC);
|
||||
|
||||
#define SPL_ME(class_name, function_name, arg_info, flags) \
|
||||
PHP_ME( spl_ ## class_name, function_name, arg_info, flags)
|
||||
|
||||
#define SPL_ABSTRACT_ME(class_name, function_name, arg_info) \
|
||||
ZEND_ABSTRACT_ME( spl_ ## class_name, function_name, arg_info)
|
||||
|
||||
#define SPL_METHOD(class_name, function_name) \
|
||||
PHP_METHOD(spl_ ## class_name, function_name)
|
||||
|
||||
#define SPL_MA(class_name, function_name, alias_class, alias_function, arg_info, flags) \
|
||||
ZEND_MALIAS(function_name, spl_ ## alias_class, alias_function, arg_info, flags)
|
||||
#endif /* PHP_FUNCTIONS_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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: Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
#ifndef SPL_ITERATORS_H
|
||||
#define SPL_ITERATORS_H
|
||||
|
||||
#include "php.h"
|
||||
#include "php_spl.h"
|
||||
|
||||
extern zend_class_entry *spl_ce_RecursiveIterator;
|
||||
extern zend_class_entry *spl_ce_RecursiveIteratorIterator;
|
||||
extern zend_class_entry *spl_ce_FilterIterator;
|
||||
extern zend_class_entry *spl_ce_ParentIterator;
|
||||
extern zend_class_entry *spl_ce_SeekableIterator;
|
||||
extern zend_class_entry *spl_ce_LimitIterator;
|
||||
extern zend_class_entry *spl_ce_CachingIterator;
|
||||
extern zend_class_entry *spl_ce_CachingRecursiveIterator;
|
||||
|
||||
PHP_MINIT_FUNCTION(spl_iterators);
|
||||
|
||||
typedef enum {
|
||||
DIT_Default = 0,
|
||||
DIT_LimitIterator,
|
||||
DIT_CachingIterator,
|
||||
DIT_CachingRecursiveIterator
|
||||
} dual_it_type;
|
||||
|
||||
enum {
|
||||
/* public */
|
||||
CIT_CALL_TOSTRING = 1,
|
||||
CIT_CATCH_GET_CHILD = 2,
|
||||
CIT_PUBLIC = CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD,
|
||||
/* private */
|
||||
CIT_HAS_MORE = 4,
|
||||
CIT_HAS_CHILDREN = 8
|
||||
};
|
||||
|
||||
typedef struct _spl_dual_it_object {
|
||||
zend_object std;
|
||||
struct {
|
||||
zval *zobject;
|
||||
zend_class_entry *ce;
|
||||
zend_object *object;
|
||||
zend_object_iterator *iterator;
|
||||
} inner;
|
||||
struct {
|
||||
zval *data;
|
||||
char *str_key;
|
||||
uint str_key_len;
|
||||
ulong int_key;
|
||||
int key_type; /* HASH_KEY_IS_STRING or HASH_KEY_IS_LONG */
|
||||
int pos;
|
||||
} current;
|
||||
dual_it_type dit_type;
|
||||
union {
|
||||
struct {
|
||||
int offset;
|
||||
int count;
|
||||
} limit;
|
||||
struct {
|
||||
int flags; /* CIT_HAS_MORE, CIT_CALL_TOSTRING, CIT_CATCH_GET_CHILD */
|
||||
zval *zstr;
|
||||
zval *zchildren;
|
||||
} caching;
|
||||
} u;
|
||||
} spl_dual_it_object;
|
||||
|
||||
#endif /* SPL_ITERATORS_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* End:
|
||||
* vim600: fdm=marker
|
||||
* vim: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,3 +0,0 @@
|
||||
<IfModule mod_autoindex.c>
|
||||
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.php
|
||||
</IfModule>
|
||||
@@ -1,138 +0,0 @@
|
||||
--TEST--
|
||||
SPL: ArrayIterator
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("spl")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
echo "==Normal==\n";
|
||||
|
||||
$arr = array(0=>0, 1=>1, 2=>2);
|
||||
$obj = new ArrayObject($arr);
|
||||
|
||||
foreach($obj as $ak=>$av) {
|
||||
foreach($obj as $bk=>$bv) {
|
||||
if ($ak==0 && $bk==0) {
|
||||
$arr[0] = "modify";
|
||||
}
|
||||
echo "$ak=>$av - $bk=>$bv\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "==UseRef==\n";
|
||||
|
||||
$arr = array(0=>0, 1=>1, 2=>2);
|
||||
$obj = new ArrayObject(&$arr);
|
||||
|
||||
foreach($obj as $ak=>$av) {
|
||||
foreach($obj as $bk=>$bv) {
|
||||
echo "$ak=>$av - $bk=>$bv\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "==Modify==\n";
|
||||
|
||||
$arr = array(0=>0, 1=>1, 2=>2);
|
||||
$obj = new ArrayObject(&$arr);
|
||||
|
||||
foreach($obj as $ak=>$av) {
|
||||
foreach($obj as $bk=>$bv) {
|
||||
if ($ak==0 && $bk==0) {
|
||||
$arr[0] = "modify";
|
||||
}
|
||||
echo "$ak=>$av - $bk=>$bv\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "==Delete==\n";
|
||||
|
||||
$arr = array(0=>0, 1=>1, 2=>2);
|
||||
$obj = new ArrayObject(&$arr);
|
||||
|
||||
foreach($obj as $ak=>$av) {
|
||||
foreach($obj as $bk=>$bv) {
|
||||
if ($ak==1 && $bk==1) {
|
||||
unset($arr[1]);
|
||||
}
|
||||
echo "$ak=>$av - $bk=>$bv\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "==Change==\n";
|
||||
|
||||
$arr = array(0=>0, 1=>1, 2=>2);
|
||||
$obj = new ArrayObject(&$arr);
|
||||
|
||||
foreach($obj as $ak=>$av) {
|
||||
foreach($obj as $bk=>$bv) {
|
||||
if ($ak==1 && $bk==1) {
|
||||
$arr = NULL;
|
||||
}
|
||||
echo "$ak=>$av - $bk=>$bv\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
==Normal==
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 1=>1
|
||||
0=>0 - 2=>2
|
||||
1=>1 - 0=>0
|
||||
1=>1 - 1=>1
|
||||
1=>1 - 2=>2
|
||||
2=>2 - 0=>0
|
||||
2=>2 - 1=>1
|
||||
2=>2 - 2=>2
|
||||
==UseRef==
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 1=>1
|
||||
0=>0 - 2=>2
|
||||
1=>1 - 0=>0
|
||||
1=>1 - 1=>1
|
||||
1=>1 - 2=>2
|
||||
2=>2 - 0=>0
|
||||
2=>2 - 1=>1
|
||||
2=>2 - 2=>2
|
||||
==Modify==
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 1=>1
|
||||
0=>0 - 2=>2
|
||||
1=>1 - 0=>modify
|
||||
1=>1 - 1=>1
|
||||
1=>1 - 2=>2
|
||||
2=>2 - 0=>modify
|
||||
2=>2 - 1=>1
|
||||
2=>2 - 2=>2
|
||||
==Delete==
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 1=>1
|
||||
0=>0 - 2=>2
|
||||
1=>1 - 0=>0
|
||||
1=>1 - 1=>1
|
||||
|
||||
Notice: ArrayIterator::next(): Array was modified outside object and internal position is no longer valid in %sarray_iterator.php on line %d
|
||||
1=>1 - 0=>0
|
||||
1=>1 - 2=>2
|
||||
|
||||
Notice: ArrayIterator::next(): Array was modified outside object and internal position is no longer valid in %sarray_iterator.php on line %d
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 2=>2
|
||||
2=>2 - 0=>0
|
||||
2=>2 - 2=>2
|
||||
==Change==
|
||||
0=>0 - 0=>0
|
||||
0=>0 - 1=>1
|
||||
0=>0 - 2=>2
|
||||
1=>1 - 0=>0
|
||||
1=>1 - 1=>1
|
||||
|
||||
Notice: ArrayIterator::next(): Array was modified outside object and is no longer an array in %sarray_iterator.php on line %d
|
||||
|
||||
Notice: ArrayIterator::hasMore(): Array was modified outside object and is no longer an array in %sarray_iterator.php on line %d
|
||||
|
||||
Notice: ArrayIterator::next(): Array was modified outside object and is no longer an array in %sarray_iterator.php on line %d
|
||||
|
||||
Notice: ArrayIterator::hasMore(): Array was modified outside object and is no longer an array in %sarray_iterator.php on line %d
|
||||
Done
|
||||
@@ -1,88 +0,0 @@
|
||||
--TEST--
|
||||
SPL: ArrayObject
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("spl")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$ar = array(0=>0, 1=>1);
|
||||
$ar = new ArrayObject($ar);
|
||||
|
||||
var_dump($ar);
|
||||
|
||||
$ar[2] = 2;
|
||||
var_dump($ar[2]);
|
||||
var_dump($ar["3"] = 3);
|
||||
|
||||
var_dump(array_merge((array)$ar, array(4=>4, 5=>5)));
|
||||
|
||||
var_dump($ar["a"] = "a");
|
||||
|
||||
var_dump($ar);
|
||||
var_dump($ar[0]);
|
||||
var_dump($ar[6]);
|
||||
var_dump($ar["b"]);
|
||||
|
||||
unset($ar[1]);
|
||||
unset($ar["3"]);
|
||||
unset($ar["a"]);
|
||||
unset($ar[7]);
|
||||
unset($ar["c"]);
|
||||
var_dump($ar);
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
object(ArrayObject)#1 (2) {
|
||||
[0]=>
|
||||
int(0)
|
||||
[1]=>
|
||||
int(1)
|
||||
}
|
||||
int(2)
|
||||
int(3)
|
||||
array(6) {
|
||||
[0]=>
|
||||
int(0)
|
||||
[1]=>
|
||||
int(1)
|
||||
[2]=>
|
||||
&int(2)
|
||||
[3]=>
|
||||
&int(3)
|
||||
[4]=>
|
||||
int(4)
|
||||
[5]=>
|
||||
int(5)
|
||||
}
|
||||
string(1) "a"
|
||||
object(ArrayObject)#1 (5) {
|
||||
[0]=>
|
||||
int(0)
|
||||
[1]=>
|
||||
int(1)
|
||||
[2]=>
|
||||
&int(2)
|
||||
[3]=>
|
||||
&int(3)
|
||||
["a"]=>
|
||||
&string(1) "a"
|
||||
}
|
||||
int(0)
|
||||
|
||||
Notice: Undefined offset: 6 in %sarray_object.php on line %d
|
||||
NULL
|
||||
|
||||
Notice: Undefined index: b in %sarray_object.php on line %d
|
||||
NULL
|
||||
|
||||
Notice: Undefined offset: 7 in %sarray_object.php on line %d
|
||||
|
||||
Notice: Undefined index: c in %sarray_object.php on line %d
|
||||
object(ArrayObject)#1 (2) {
|
||||
[0]=>
|
||||
int(0)
|
||||
[2]=>
|
||||
&int(2)
|
||||
}
|
||||
Done
|
||||
@@ -1,285 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_0.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) |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#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:
|
||||
*/
|
||||
Reference in new issue
Block a user