Compare commits

...
90 changed files with 0 additions and 15872 deletions

No files matched your search

-103
View File
@@ -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
-56
View File
@@ -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
View File
Whitespace-only changes.
-8
View File
@@ -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
-39
View File
@@ -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
-33
View File
@@ -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
-18
View File
@@ -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 ");
}
}
}
-25
View File
@@ -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
{
}
?>
-102
View File
@@ -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>&nbsp;</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>
-796
View File
@@ -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 "&nbsp;&nbsp;Actor=".($hi[1]?'Target':'Not Target')."<br>\n";
echo "&nbsp;&nbsp;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";
}
}
?>
-636
View File
@@ -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>&nbsp;</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>
-54
View File
@@ -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";
?>
-45
View File
@@ -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;
-16
View File
@@ -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>
-85
View File
@@ -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);
-70
View File
@@ -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
View File
@@ -1 +0,0 @@
<?php phpinfo(); ?>
-18
View File
@@ -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>
-13
View File
@@ -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>
-35
View File
@@ -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-->";
?>
-184
View File
@@ -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);
?>
-87
View File
@@ -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);
?>
-41
View File
@@ -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);
?>
-258
View File
@@ -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!&lt;g&gt;</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;
?>
-81
View File
@@ -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;
}
?>
-17
View File
@@ -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>
-17
View File
@@ -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 -->";
?>
-59
View File
@@ -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
-256
View File
@@ -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
-456
View File
@@ -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;
}
-11
View File
@@ -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
-141
View File
@@ -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;
}
-6
View File
@@ -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
-28
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
-167
View File
@@ -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
-148
View File
@@ -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
-416
View File
@@ -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
-242
View File
@@ -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;
}
-28
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
-2
View File
@@ -1,2 +0,0 @@
SPL
Marcus Boerger
View File
Whitespace-only changes.
-26
View File
@@ -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
-4
View File
@@ -1,4 +0,0 @@
This is the ToDo of ext/spl:
Implement the classes/interfaces from the .inc files in
directory examples.
-10
View File
@@ -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
-9
View File
@@ -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);
}
-7
View File
@@ -1,7 +0,0 @@
<?php
function __autoload($classname) {
require_once(dirname($_SERVER['PATH_TRANSLATED']).'/'.strtolower($classname).'.inc');
}
?>
-81
View File
@@ -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;
}
}
?>
-98
View File
@@ -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);
}
?>
-40
View File
@@ -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";
}
?>
-83
View File
@@ -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;
}
}
?>
-26
View File
@@ -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);
}
}
?>
-10
View File
@@ -1,10 +0,0 @@
<?php
class DirectoryTree extends RecursiveIteratorIterator
{
function __construct($path) {
parent::__construct(new DirectoryFilterDots($path));
}
}
?>
-33
View File
@@ -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);
}
}
?>
-97
View File
@@ -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
}
}
?>
-41
View File
@@ -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";
?>
-78
View File
@@ -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";
}
?>
-106
View File
@@ -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
}
}
?>
-72
View File
@@ -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;
}
}
?>
-25
View File
@@ -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());
}
}
?>
-9
View File
@@ -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;
}
}
?>
-21
View File
@@ -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;
}
}
?>
-29
View File
@@ -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++;
}
}*/
}
?>
-34
View File
@@ -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";
}
?>
-75
View File
@@ -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
-->
-191
View File
@@ -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
*/
-71
View File
@@ -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
View File
@@ -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();
}
?>
-512
View File
@@ -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
*/
-39
View File
@@ -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
*/
-793
View File
@@ -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
*/
-48
View File
@@ -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
*/
-67
View File
@@ -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
*/
-70
View File
@@ -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
*/
-150
View File
@@ -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
*/
-88
View File
@@ -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
-92
View File
@@ -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
*/
-3
View File
@@ -1,3 +0,0 @@
<IfModule mod_autoindex.c>
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.php
</IfModule>
-138
View File
@@ -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
-88
View File
@@ -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
-285
View File
@@ -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:
*/