cvs: php-src /ext/soap php_encoding.c /ext/soap/tests/bugs bug36226-2.phpt bug36226-2.wsdl
| From: | Dmitry Stogov | Date: | Tue, 20 Mar 2007 07:51:47 +0000 |
| Subject: | cvs: php-src /ext/soap php_encoding.c /ext/soap/tests/bugs bug36226-2.phpt bug36226-2.wsdl | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-43595@lists.php.net to get a copy of this message | ||
dmitry Tue Mar 20 07:51:47 2007 UTC
Modified files:
/php-src/ext/soap php_encoding.c
/php-src/ext/soap/tests/bugs bug36226-2.phpt bug36226-2.wsdl
Log:
Fixed bug #36226 (Inconsistent handling when passing nillable arrays)
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_encoding.c?r1=1.154&r2=1.155&diff_format=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.154 php-src/ext/soap/php_encoding.c:1.155 --- php-src/ext/soap/php_encoding.c:1.154 Sun Feb 25 13:24:25 2007 +++ php-src/ext/soap/php_encoding.c Tue Mar 20 07:51:47 2007 @@ -17,7 +17,7 @@ | Dmitry Stogov <dmitry@zend.com> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.154 2007/02/25 13:24:25 dmitry Exp $ */ +/* $Id: php_encoding.c,v 1.155 2007/03/20 07:51:47 dmitry Exp $ */ #include <time.h> @@ -1187,7 +1187,8 @@ add_next_index_zval(array, val); } while ((node = get_node(node->next, model->u.element->name)) != NULL); val = array; - } else if ((SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && + } else if ((Z_TYPE_P(val) != IS_NULL || !model->u.element->nillable) && + (SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && (model->max_occurs == -1 || model->max_occurs > 1)) { zval *array; http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug36226-2.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/soap/tests/bugs/bug36226-2.phpt diff -u /dev/null php-src/ext/soap/tests/bugs/bug36226-2.phpt:1.2 --- /dev/null Tue Mar 20 07:51:47 2007 +++ php-src/ext/soap/tests/bugs/bug36226-2.phpt Tue Mar 20 07:51:47 2007 @@ -0,0 +1,151 @@ +--TEST-- +Bug #36226 (Inconsistent handling when passing nillable arrays) +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- +<?php +$timestamp = "2005-11-08T11:22:07+03:00"; +$wsdl = dirname(__FILE__)."/bug36226-2.wsdl"; + +function PostEvents($x) { + var_dump($x); + exit(); + return $x; +} + +class TestSoapClient extends SoapClient { + function __construct($wsdl, $options) { + parent::__construct($wsdl, $options); + $this->server = new SoapServer($wsdl, $options); + $this->server->addFunction('PostEvents'); + } + + function __doRequest($request, $location, $action, $version) { + echo "$request\n"; + $this->server->handle($request); + return $response; + } +} + +$soapClient = new TestSoapClient($wsdl, + array( + 'trace' => 1, + 'exceptions' => 0, + 'classmap' => array( + 'logOnEvent' => 'LogOnEvent', + 'logOffEvent' => 'LogOffEvent', + 'events' => 'IVREvents' + ), + 'features' => SOAP_SINGLE_ELEMENT_ARRAYS + )); + +$logOnEvent = null; +//$logOnEvent = array(); +$logOffEvents[] = new LogOffEvent(34567, $timestamp, "Smoked"); +//$logOffEvents[] = new LogOffEvent(34568, $timestamp, "SmokeFree"); +$ivrEvents = new IVREvents("1.0", 101, 12345, 'IVR', $logOnEvent, $logOffEvents); +$result = $soapClient->PostEvents($ivrEvents); + +class LogOffEvent { + public $audienceMemberId; + public $timestamp; + public $smokeStatus; + public $callInitiator; + + function __construct($audienceMemberId, $timestamp, $smokeStatus) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + $this->smokeStatus = $smokeStatus; + $this->callInitiator = "IVR"; + } +} + +class LogOnEvent { + public $audienceMemberId; + public $timestamp; + + function __construct($audienceMemberId, $timestamp) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + } +} + +class IVREvents { + public $version; + public $activityId; + public $messageId; + public $source; + public $logOnEvent; + public $logOffEvent; + + function __construct($version, $activityId, $messageId, $source, $logOnEvent=NULL, $logOffEvent=NULL) { + $this->version = $version; + $this->activityId = $activityId; + $this->messageId = $messageId; + $this->source = $source; + $this->logOnEvent = $logOnEvent; + $this->logOffEvent = $logOffEvent; + } + +} +?> +--EXPECT-- +<?xml version="1.0" encoding="UTF-8"?> +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testurl/Message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns1:ivrEvents version="1.0" activityId="101" messageId="12345" source="IVR"><ns1:logOffEvent audienceMemberId="34567" timestamp="2005-11-08T11:22:07+03:00" smokeStatus="Smoked" callInitiator="IVR"/><ns1:logOnEvent xsi:nil="true"/></ns1:ivrEvents></SOAP-ENV:Body></SOAP-ENV:Envelope> + +object(IVREvents)#5 (6) { + ["version"]=> + string(3) "1.0" + ["activityId"]=> + int(101) + ["messageId"]=> + int(12345) + ["source"]=> + string(3) "IVR" + ["logOnEvent"]=> + NULL + ["logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + ["audienceMemberId"]=> + int(34567) + ["timestamp"]=> + string(25) "2005-11-08T11:22:07+03:00" + ["smokeStatus"]=> + string(6) "Smoked" + ["callInitiator"]=> + string(3) "IVR" + } + } +} +--UEXPECT-- +<?xml version="1.0" encoding="UTF-8"?> +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testurl/Message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns1:ivrEvents version="1.0" activityId="101" messageId="12345" source="IVR"><ns1:logOffEvent audienceMemberId="34567" timestamp="2005-11-08T11:22:07+03:00" smokeStatus="Smoked" callInitiator="IVR"/><ns1:logOnEvent xsi:nil="true"/></ns1:ivrEvents></SOAP-ENV:Body></SOAP-ENV:Envelope> + +object(IVREvents)#5 (6) { + [u"version"]=> + unicode(3) "1.0" + [u"activityId"]=> + int(101) + [u"messageId"]=> + int(12345) + [u"source"]=> + unicode(3) "IVR" + [u"logOnEvent"]=> + NULL + [u"logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + [u"audienceMemberId"]=> + int(34567) + [u"timestamp"]=> + unicode(25) "2005-11-08T11:22:07+03:00" + [u"smokeStatus"]=> + unicode(6) "Smoked" + [u"callInitiator"]=> + unicode(3) "IVR" + } + } +} http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug36226-2.wsdl?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/soap/tests/bugs/bug36226-2.wsdl diff -u /dev/null php-src/ext/soap/tests/bugs/bug36226-2.wsdl:1.2 --- /dev/null Tue Mar 20 07:51:47 2007 +++ php-src/ext/soap/tests/bugs/bug36226-2.wsdl Tue Mar 20 07:51:47 2007 @@ -0,0 +1,543 @@ +<?xml version="1.0" encoding="utf-8"?> +<definitions xmlns:s1="http://testurl/Events" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://testurl/Message" xmlns:s3="http://testurl/Smoker" xmlns:soap12enc="http://www.w3.org/2002/06/soap-envelope" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:s4="http://testurl/AudienceMember" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s2="http://testurl/Actions" xmlns:tns="http://testurl/Service" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://testurl/Service" xmlns="http://schemas.xmlsoap.org/wsdl/"> + <types> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Message"> + <s:import namespace="http://testurl/Events" /> + <s:import namespace="http://testurl/Actions" /> + <s:element name="ivrActions" type="s0:actions" /> + <s:complexType name="actions"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerAction" type="s2:pauseSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerAction" type="s2:terminateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="activateSmokerAction" type="s2:activateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="addSmokerAction" type="s2:addSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="updateSmokerAction" type="s2:updateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerAction" type="s2:deleteSmokerAction" /> + </s:choice> + </s:sequence> + <s:attribute default="Client" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractMessage" abstract="true"> + <s:attribute default="1.0" name="version" type="s:string" /> + <s:attribute name="activityId" type="s:unsignedLong" use="required" /> + <s:attribute name="messageId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="events"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="authFailureEvent" type="s1:authFailureEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="logOffEvent" type="s1:logOffEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="cravingLineEvent" type="s1:cravingLineEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateEvent" type="s1:terminateEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="relapseWakeSmsReplaceEvent" type="s1:relapseWakeSmsReplaceEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="confessionLineEvent" type="s1:confessionLineEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="rfqRecordedEvent" type="s1:rfqRecordedEvent" /> + <s:element nillable="true" minOccurs="0" maxOccurs="1" name="logOnEvent" type="s1:logOnEvent" /> + </s:choice> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="ivrMessageSource"> + <s:restriction base="s:string"> + <s:enumeration value="IVR" /> + <s:enumeration value="Client" /> + </s:restriction> + </s:simpleType> + <s:complexType name="actionResults"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="updateSmokerActionResult" type="s2:updateSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="activateSmokerActionResult" type="s2:activateSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerActionResult" type="s2:deleteSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="addSmokerActionResult" type="s2:addSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerActionResult" type="s2:pauseSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerActionResult" type="s2:terminateSmokerActionResult" /> + </s:choice> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="eventResults"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="eventResult" type="s1:eventResult" /> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:element name="ivrActionResults" type="s0:actionResults" /> + <s:element name="ivrEvents" type="s0:events" /> + <s:element name="ivrEventResults" type="s0:eventResults" /> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Events"> + <s:complexType name="authFailureEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="mobileNumber" type="s:string" /> + <s:attribute name="line" type="s1:line" use="required" /> + <s:attribute name="reason" type="s:string" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractEvent" abstract="true"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" /> + <s:attribute name="timestamp" type="s:dateTime" use="required" /> + </s:complexType> + <s:complexType name="logOnEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="cravingLineEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="selection" type="s1:cravingLineEventSelection" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="cravingLineEventSelection"> + <s:attribute name="type" type="s1:cravingLineMessageType" use="required" /> + <s:attribute name="msgNumber" type="s:positiveInteger" /> + </s:complexType> + <s:simpleType name="cravingLineMessageType"> + <s:restriction base="s:string"> + <s:enumeration value="Motivational" /> + <s:enumeration value="StressReval" /> + <s:enumeration value="EffectReg" /> + </s:restriction> + </s:simpleType> + <s:complexType name="confessionLineEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="smokeStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Smoked" /> + <s:enumeration value="SmokeFree" /> + </s:restriction> + </s:simpleType> + <s:complexType name="rfqRecordedEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="logOffEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" /> + <s:attribute name="callInitiator" type="s1:callInitiator" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="callInitiator"> + <s:restriction base="s:string"> + <s:enumeration value="AudienceMember" /> + <s:enumeration value="IVR" /> + </s:restriction> + </s:simpleType> + <s:complexType name="relapseWakeSmsReplaceEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="relapseCount" type="s:positiveInteger" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="line"> + <s:restriction base="s:string"> + <s:enumeration value="LogOnOffLine" /> + <s:enumeration value="CravingLine" /> + <s:enumeration value="ConfessionLine" /> + <s:enumeration value="ReasonsForQuittingLine" /> + </s:restriction> + </s:simpleType> + <s:complexType name="eventResult"> + <s:attribute name="success" type="s:boolean" use="required" /> + </s:complexType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Actions"> + <s:import namespace="http://testurl/Smoker" /> + <s:complexType name="updateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:updateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractActionResult"> + <s:attribute name="resultId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="pauseSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:pauseSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="pauseSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:pauseSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:pauseSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="pauseSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Paused" /> + <s:enumeration value="NotPaused" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="pauseSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="addSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:addSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="addSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:addSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:addSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="addSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Added" /> + <s:enumeration value="NotAdded" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="addSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="DuplicateID" /> + </s:restriction> + </s:simpleType> + <s:complexType name="deleteSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:deleteSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="deleteSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:deleteSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:deleteSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="deleteSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Deleted" /> + <s:enumeration value="NotDeleted" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="deleteSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="activateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:activateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="activateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:activateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:activateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="activateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Activated" /> + <s:enumeration value="NotActivated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="activateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="terminateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:terminateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:terminateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:terminateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="terminateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Terminated" /> + <s:enumeration value="NotTerminated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="terminateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="updateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:updateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:updateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="updateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Updated" /> + <s:enumeration value="NotUpdated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="updateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="pauseSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractAction" abstract="true"> + <s:attribute name="requestId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="addSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="updateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="deleteSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="activateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Smoker"> + <s:import namespace="http://testurl/AudienceMember" /> + <s:complexType name="smoker"> + <s:complexContent mixed="false"> + <s:extension base="s4:ivrAudienceMember"> + <s:attribute name="startDate" type="s:date" use="required" /> + <s:attribute name="phase" type="s3:phase" use="required" /> + <s:attribute name="day" type="s:positiveInteger" /> + <s:attribute name="track" type="s3:track" use="required" /> + <s:attribute name="status" type="s3:status" use="required" /> + <s:attribute name="baseTime" type="s:string" /> + <s:attribute name="sunWakeOffset" type="s:string" /> + <s:attribute name="monWakeOffset" type="s:string" /> + <s:attribute name="tueWakeOffset" type="s:string" /> + <s:attribute name="wedWakeOffset" type="s:string" /> + <s:attribute name="thuWakeOffset" type="s:string" /> + <s:attribute name="friWakeOffset" type="s:string" /> + <s:attribute name="satWakeOffset" type="s:string" /> + <s:attribute name="sunSleepOffset" type="s:string" /> + <s:attribute name="monSleepOffset" type="s:string" /> + <s:attribute name="tueSleepOffset" type="s:string" /> + <s:attribute name="wedSleepOffset" type="s:string" /> + <s:attribute name="thuSleepOffset" type="s:string" /> + <s:attribute name="friSleepOffset" type="s:string" /> + <s:attribute name="satSleepOffset" type="s:string" /> + <s:attribute name="sunLogOnWindowOffset" type="s:string" /> + <s:attribute name="monLogOnWindowOffset" type="s:string" /> + <s:attribute name="tueLogOnWindowOffset" type="s:string" /> + <s:attribute name="wedLogOnWindowOffset" type="s:string" /> + <s:attribute name="thuLogOnWindowOffset" type="s:string" /> + <s:attribute name="friLogOnWindowOffset" type="s:string" /> + <s:attribute name="satLogOnWindowOffset" type="s:string" /> + <s:attribute name="sunLogOffWindowOffset" type="s:string" /> + <s:attribute name="monLogOffWindowOffset" type="s:string" /> + <s:attribute name="tueLogOffWindowOffset" type="s:string" /> + <s:attribute name="wedLogOffWindowOffset" type="s:string" /> + <s:attribute name="thuLogOffWindowOffset" type="s:string" /> + <s:attribute name="friLogOffWindowOffset" type="s:string" /> + <s:attribute name="satLogOffWindowOffset" type="s:string" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="phase"> + <s:restriction base="s:string"> + <s:enumeration value="Prep" /> + <s:enumeration value="Quit" /> + <s:enumeration value="Followup" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="track"> + <s:restriction base="s:string"> + <s:enumeration value="NRT" /> + <s:enumeration value="NonNRT" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="status"> + <s:restriction base="s:string"> + <s:enumeration value="Pre-Start" /> + <s:enumeration value="Completed" /> + <s:enumeration value="Terminated" /> + <s:enumeration value="Paused" /> + <s:enumeration value="Active" /> + </s:restriction> + </s:simpleType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/AudienceMember"> + <s:import namespace="http://testurl/Smoker" /> + <s:complexType name="ivrAudienceMember"> + <s:attribute name="id" type="s:unsignedLong" use="required" /> + <s:attribute name="mobileNumber" type="s:string" /> + <s:attribute name="firstName" type="s:string" /> + <s:attribute name="lastName" type="s:string" /> + </s:complexType> + </s:schema> + </types> + <message name="PostActionsSoapIn"> + <part name="ivrActions" element="s0:ivrActions" /> + </message> + <message name="PostActionsSoapOut"> + <part name="PostActionsResult" element="s0:ivrActionResults" /> + </message> + <message name="PostEventsSoapIn"> + <part name="ivrEvents" element="s0:ivrEvents" /> + </message> + <message name="PostEventsSoapOut"> + <part name="PostEventsResult" element="s0:ivrEventResults" /> + </message> + <portType name="IVRServicePortSoap"> + <operation name="PostActions"> + <input message="tns:PostActionsSoapIn" /> + <output message="tns:PostActionsSoapOut" /> + </operation> + <operation name="PostEvents"> + <input message="tns:PostEventsSoapIn" /> + <output message="tns:PostEventsSoapOut" /> + </operation> + </portType> + <binding name="IVRServicePortSoap" type="tns:IVRServicePortSoap"> + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> + <operation name="PostActions"> + <soap:operation soapAction="http://testurl/Service:postActionsIn" style="document" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="PostEvents"> + <soap:operation soapAction="http://testurl/Service:postEventsIn" style="document" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + <binding name="IVRServicePortSoap12" type="tns:IVRServicePortSoap"> + <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> + <operation name="PostActions"> + <soap12:operation soapAction="http://testurl/Service:postActionsIn" style="document" /> + <input> + <soap12:body use="literal" /> + </input> + <output> + <soap12:body use="literal" /> + </output> + </operation> + <operation name="PostEvents"> + <soap12:operation soapAction="http://testurl/Service:postEventsIn" style="document" /> + <input> + <soap12:body use="literal" /> + </input> + <output> + <soap12:body use="literal" /> + </output> + </operation> + </binding> + <service name="IVRServicePort"> + <port name="IVRServicePortSoap" binding="tns:IVRServicePortSoap"> + <soap:address location="test://" /> + </port> + <port name="IVRServicePortSoap12" binding="tns:IVRServicePortSoap12"> + <soap12:address location="test://" /> + </port> + </service> +</definitions>
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_encoding.c?r1=1.154&r2=1.155&diff_format=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.154 php-src/ext/soap/php_encoding.c:1.155 --- php-src/ext/soap/php_encoding.c:1.154 Sun Feb 25 13:24:25 2007 +++ php-src/ext/soap/php_encoding.c Tue Mar 20 07:51:47 2007 @@ -17,7 +17,7 @@ | Dmitry Stogov <dmitry@zend.com> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.154 2007/02/25 13:24:25 dmitry Exp $ */ +/* $Id: php_encoding.c,v 1.155 2007/03/20 07:51:47 dmitry Exp $ */ #include <time.h> @@ -1187,7 +1187,8 @@ add_next_index_zval(array, val); } while ((node = get_node(node->next, model->u.element->name)) != NULL); val = array; - } else if ((SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && + } else if ((Z_TYPE_P(val) != IS_NULL || !model->u.element->nillable) && + (SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && (model->max_occurs == -1 || model->max_occurs > 1)) { zval *array; http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug36226-2.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/soap/tests/bugs/bug36226-2.phpt diff -u /dev/null php-src/ext/soap/tests/bugs/bug36226-2.phpt:1.2 --- /dev/null Tue Mar 20 07:51:47 2007 +++ php-src/ext/soap/tests/bugs/bug36226-2.phpt Tue Mar 20 07:51:47 2007 @@ -0,0 +1,151 @@ +--TEST-- +Bug #36226 (Inconsistent handling when passing nillable arrays) +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- +<?php +$timestamp = "2005-11-08T11:22:07+03:00"; +$wsdl = dirname(__FILE__)."/bug36226-2.wsdl"; + +function PostEvents($x) { + var_dump($x); + exit(); + return $x; +} + +class TestSoapClient extends SoapClient { + function __construct($wsdl, $options) { + parent::__construct($wsdl, $options); + $this->server = new SoapServer($wsdl, $options); + $this->server->addFunction('PostEvents'); + } + + function __doRequest($request, $location, $action, $version) { + echo "$request\n"; + $this->server->handle($request); + return $response; + } +} + +$soapClient = new TestSoapClient($wsdl, + array( + 'trace' => 1, + 'exceptions' => 0, + 'classmap' => array( + 'logOnEvent' => 'LogOnEvent', + 'logOffEvent' => 'LogOffEvent', + 'events' => 'IVREvents' + ), + 'features' => SOAP_SINGLE_ELEMENT_ARRAYS + )); + +$logOnEvent = null; +//$logOnEvent = array(); +$logOffEvents[] = new LogOffEvent(34567, $timestamp, "Smoked"); +//$logOffEvents[] = new LogOffEvent(34568, $timestamp, "SmokeFree"); +$ivrEvents = new IVREvents("1.0", 101, 12345, 'IVR', $logOnEvent, $logOffEvents); +$result = $soapClient->PostEvents($ivrEvents); + +class LogOffEvent { + public $audienceMemberId; + public $timestamp; + public $smokeStatus; + public $callInitiator; + + function __construct($audienceMemberId, $timestamp, $smokeStatus) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + $this->smokeStatus = $smokeStatus; + $this->callInitiator = "IVR"; + } +} + +class LogOnEvent { + public $audienceMemberId; + public $timestamp; + + function __construct($audienceMemberId, $timestamp) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + } +} + +class IVREvents { + public $version; + public $activityId; + public $messageId; + public $source; + public $logOnEvent; + public $logOffEvent; + + function __construct($version, $activityId, $messageId, $source, $logOnEvent=NULL, $logOffEvent=NULL) { + $this->version = $version; + $this->activityId = $activityId; + $this->messageId = $messageId; + $this->source = $source; + $this->logOnEvent = $logOnEvent; + $this->logOffEvent = $logOffEvent; + } + +} +?> +--EXPECT-- +<?xml version="1.0" encoding="UTF-8"?> +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testurl/Message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns1:ivrEvents version="1.0" activityId="101" messageId="12345" source="IVR"><ns1:logOffEvent audienceMemberId="34567" timestamp="2005-11-08T11:22:07+03:00" smokeStatus="Smoked" callInitiator="IVR"/><ns1:logOnEvent xsi:nil="true"/></ns1:ivrEvents></SOAP-ENV:Body></SOAP-ENV:Envelope> + +object(IVREvents)#5 (6) { + ["version"]=> + string(3) "1.0" + ["activityId"]=> + int(101) + ["messageId"]=> + int(12345) + ["source"]=> + string(3) "IVR" + ["logOnEvent"]=> + NULL + ["logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + ["audienceMemberId"]=> + int(34567) + ["timestamp"]=> + string(25) "2005-11-08T11:22:07+03:00" + ["smokeStatus"]=> + string(6) "Smoked" + ["callInitiator"]=> + string(3) "IVR" + } + } +} +--UEXPECT-- +<?xml version="1.0" encoding="UTF-8"?> +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testurl/Message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns1:ivrEvents version="1.0" activityId="101" messageId="12345" source="IVR"><ns1:logOffEvent audienceMemberId="34567" timestamp="2005-11-08T11:22:07+03:00" smokeStatus="Smoked" callInitiator="IVR"/><ns1:logOnEvent xsi:nil="true"/></ns1:ivrEvents></SOAP-ENV:Body></SOAP-ENV:Envelope> + +object(IVREvents)#5 (6) { + [u"version"]=> + unicode(3) "1.0" + [u"activityId"]=> + int(101) + [u"messageId"]=> + int(12345) + [u"source"]=> + unicode(3) "IVR" + [u"logOnEvent"]=> + NULL + [u"logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + [u"audienceMemberId"]=> + int(34567) + [u"timestamp"]=> + unicode(25) "2005-11-08T11:22:07+03:00" + [u"smokeStatus"]=> + unicode(6) "Smoked" + [u"callInitiator"]=> + unicode(3) "IVR" + } + } +} http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug36226-2.wsdl?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/soap/tests/bugs/bug36226-2.wsdl diff -u /dev/null php-src/ext/soap/tests/bugs/bug36226-2.wsdl:1.2 --- /dev/null Tue Mar 20 07:51:47 2007 +++ php-src/ext/soap/tests/bugs/bug36226-2.wsdl Tue Mar 20 07:51:47 2007 @@ -0,0 +1,543 @@ +<?xml version="1.0" encoding="utf-8"?> +<definitions xmlns:s1="http://testurl/Events" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://testurl/Message" xmlns:s3="http://testurl/Smoker" xmlns:soap12enc="http://www.w3.org/2002/06/soap-envelope" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:s4="http://testurl/AudienceMember" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s2="http://testurl/Actions" xmlns:tns="http://testurl/Service" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://testurl/Service" xmlns="http://schemas.xmlsoap.org/wsdl/"> + <types> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Message"> + <s:import namespace="http://testurl/Events" /> + <s:import namespace="http://testurl/Actions" /> + <s:element name="ivrActions" type="s0:actions" /> + <s:complexType name="actions"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerAction" type="s2:pauseSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerAction" type="s2:terminateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="activateSmokerAction" type="s2:activateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="addSmokerAction" type="s2:addSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="updateSmokerAction" type="s2:updateSmokerAction" /> + <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerAction" type="s2:deleteSmokerAction" /> + </s:choice> + </s:sequence> + <s:attribute default="Client" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractMessage" abstract="true"> + <s:attribute default="1.0" name="version" type="s:string" /> + <s:attribute name="activityId" type="s:unsignedLong" use="required" /> + <s:attribute name="messageId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="events"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="authFailureEvent" type="s1:authFailureEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="logOffEvent" type="s1:logOffEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="cravingLineEvent" type="s1:cravingLineEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateEvent" type="s1:terminateEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="relapseWakeSmsReplaceEvent" type="s1:relapseWakeSmsReplaceEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="confessionLineEvent" type="s1:confessionLineEvent" /> + <s:element minOccurs="0" maxOccurs="1" name="rfqRecordedEvent" type="s1:rfqRecordedEvent" /> + <s:element nillable="true" minOccurs="0" maxOccurs="1" name="logOnEvent" type="s1:logOnEvent" /> + </s:choice> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="ivrMessageSource"> + <s:restriction base="s:string"> + <s:enumeration value="IVR" /> + <s:enumeration value="Client" /> + </s:restriction> + </s:simpleType> + <s:complexType name="actionResults"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:choice minOccurs="0" maxOccurs="unbounded"> + <s:element minOccurs="0" maxOccurs="1" name="updateSmokerActionResult" type="s2:updateSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="activateSmokerActionResult" type="s2:activateSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerActionResult" type="s2:deleteSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="addSmokerActionResult" type="s2:addSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerActionResult" type="s2:pauseSmokerActionResult" /> + <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerActionResult" type="s2:terminateSmokerActionResult" /> + </s:choice> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="eventResults"> + <s:complexContent mixed="false"> + <s:extension base="s0:abstractMessage"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="eventResult" type="s1:eventResult" /> + </s:sequence> + <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:element name="ivrActionResults" type="s0:actionResults" /> + <s:element name="ivrEvents" type="s0:events" /> + <s:element name="ivrEventResults" type="s0:eventResults" /> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Events"> + <s:complexType name="authFailureEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="mobileNumber" type="s:string" /> + <s:attribute name="line" type="s1:line" use="required" /> + <s:attribute name="reason" type="s:string" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractEvent" abstract="true"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" /> + <s:attribute name="timestamp" type="s:dateTime" use="required" /> + </s:complexType> + <s:complexType name="logOnEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="cravingLineEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="selection" type="s1:cravingLineEventSelection" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="cravingLineEventSelection"> + <s:attribute name="type" type="s1:cravingLineMessageType" use="required" /> + <s:attribute name="msgNumber" type="s:positiveInteger" /> + </s:complexType> + <s:simpleType name="cravingLineMessageType"> + <s:restriction base="s:string"> + <s:enumeration value="Motivational" /> + <s:enumeration value="StressReval" /> + <s:enumeration value="EffectReg" /> + </s:restriction> + </s:simpleType> + <s:complexType name="confessionLineEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="smokeStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Smoked" /> + <s:enumeration value="SmokeFree" /> + </s:restriction> + </s:simpleType> + <s:complexType name="rfqRecordedEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent" /> + </s:complexContent> + </s:complexType> + <s:complexType name="logOffEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" /> + <s:attribute name="callInitiator" type="s1:callInitiator" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="callInitiator"> + <s:restriction base="s:string"> + <s:enumeration value="AudienceMember" /> + <s:enumeration value="IVR" /> + </s:restriction> + </s:simpleType> + <s:complexType name="relapseWakeSmsReplaceEvent"> + <s:complexContent mixed="false"> + <s:extension base="s1:abstractEvent"> + <s:attribute name="relapseCount" type="s:positiveInteger" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="line"> + <s:restriction base="s:string"> + <s:enumeration value="LogOnOffLine" /> + <s:enumeration value="CravingLine" /> + <s:enumeration value="ConfessionLine" /> + <s:enumeration value="ReasonsForQuittingLine" /> + </s:restriction> + </s:simpleType> + <s:complexType name="eventResult"> + <s:attribute name="success" type="s:boolean" use="required" /> + </s:complexType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Actions"> + <s:import namespace="http://testurl/Smoker" /> + <s:complexType name="updateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:updateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractActionResult"> + <s:attribute name="resultId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="pauseSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:pauseSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="pauseSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:pauseSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:pauseSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="pauseSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Paused" /> + <s:enumeration value="NotPaused" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="pauseSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="addSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:addSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="addSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:addSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:addSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="addSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Added" /> + <s:enumeration value="NotAdded" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="addSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="DuplicateID" /> + </s:restriction> + </s:simpleType> + <s:complexType name="deleteSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:deleteSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="deleteSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:deleteSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:deleteSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="deleteSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Deleted" /> + <s:enumeration value="NotDeleted" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="deleteSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="activateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:activateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="activateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:activateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:activateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="activateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Activated" /> + <s:enumeration value="NotActivated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="activateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="terminateSmokerActionResult"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractActionResult"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:terminateSmokerActionResultSmoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:terminateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:terminateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="terminateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Terminated" /> + <s:enumeration value="NotTerminated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="terminateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="updateSmokerActionResultSmoker"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + <s:attribute name="status" type="s2:updateSmokerActionResultSmokerStatus" use="required" /> + <s:attribute name="exception" type="s2:updateSmokerActionResultSmokerException" /> + </s:complexType> + <s:simpleType name="updateSmokerActionResultSmokerStatus"> + <s:restriction base="s:string"> + <s:enumeration value="Updated" /> + <s:enumeration value="NotUpdated" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="updateSmokerActionResultSmokerException"> + <s:restriction base="s:string"> + <s:enumeration value="UnspecifiedError" /> + <s:enumeration value="IDNotFound" /> + </s:restriction> + </s:simpleType> + <s:complexType name="pauseSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="abstractAction" abstract="true"> + <s:attribute name="requestId" type="s:unsignedLong" use="required" /> + </s:complexType> + <s:complexType name="addSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="updateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="terminateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="deleteSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:sequence> + <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" /> + </s:sequence> + </s:extension> + </s:complexContent> + </s:complexType> + <s:complexType name="activateSmokerAction"> + <s:complexContent mixed="false"> + <s:extension base="s2:abstractAction"> + <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" /> + </s:extension> + </s:complexContent> + </s:complexType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Smoker"> + <s:import namespace="http://testurl/AudienceMember" /> + <s:complexType name="smoker"> + <s:complexContent mixed="false"> + <s:extension base="s4:ivrAudienceMember"> + <s:attribute name="startDate" type="s:date" use="required" /> + <s:attribute name="phase" type="s3:phase" use="required" /> + <s:attribute name="day" type="s:positiveInteger" /> + <s:attribute name="track" type="s3:track" use="required" /> + <s:attribute name="status" type="s3:status" use="required" /> + <s:attribute name="baseTime" type="s:string" /> + <s:attribute name="sunWakeOffset" type="s:string" /> + <s:attribute name="monWakeOffset" type="s:string" /> + <s:attribute name="tueWakeOffset" type="s:string" /> + <s:attribute name="wedWakeOffset" type="s:string" /> + <s:attribute name="thuWakeOffset" type="s:string" /> + <s:attribute name="friWakeOffset" type="s:string" /> + <s:attribute name="satWakeOffset" type="s:string" /> + <s:attribute name="sunSleepOffset" type="s:string" /> + <s:attribute name="monSleepOffset" type="s:string" /> + <s:attribute name="tueSleepOffset" type="s:string" /> + <s:attribute name="wedSleepOffset" type="s:string" /> + <s:attribute name="thuSleepOffset" type="s:string" /> + <s:attribute name="friSleepOffset" type="s:string" /> + <s:attribute name="satSleepOffset" type="s:string" /> + <s:attribute name="sunLogOnWindowOffset" type="s:string" /> + <s:attribute name="monLogOnWindowOffset" type="s:string" /> + <s:attribute name="tueLogOnWindowOffset" type="s:string" /> + <s:attribute name="wedLogOnWindowOffset" type="s:string" /> + <s:attribute name="thuLogOnWindowOffset" type="s:string" /> + <s:attribute name="friLogOnWindowOffset" type="s:string" /> + <s:attribute name="satLogOnWindowOffset" type="s:string" /> + <s:attribute name="sunLogOffWindowOffset" type="s:string" /> + <s:attribute name="monLogOffWindowOffset" type="s:string" /> + <s:attribute name="tueLogOffWindowOffset" type="s:string" /> + <s:attribute name="wedLogOffWindowOffset" type="s:string" /> + <s:attribute name="thuLogOffWindowOffset" type="s:string" /> + <s:attribute name="friLogOffWindowOffset" type="s:string" /> + <s:attribute name="satLogOffWindowOffset" type="s:string" /> + </s:extension> + </s:complexContent> + </s:complexType> + <s:simpleType name="phase"> + <s:restriction base="s:string"> + <s:enumeration value="Prep" /> + <s:enumeration value="Quit" /> + <s:enumeration value="Followup" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="track"> + <s:restriction base="s:string"> + <s:enumeration value="NRT" /> + <s:enumeration value="NonNRT" /> + </s:restriction> + </s:simpleType> + <s:simpleType name="status"> + <s:restriction base="s:string"> + <s:enumeration value="Pre-Start" /> + <s:enumeration value="Completed" /> + <s:enumeration value="Terminated" /> + <s:enumeration value="Paused" /> + <s:enumeration value="Active" /> + </s:restriction> + </s:simpleType> + </s:schema> + <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/AudienceMember"> + <s:import namespace="http://testurl/Smoker" /> + <s:complexType name="ivrAudienceMember"> + <s:attribute name="id" type="s:unsignedLong" use="required" /> + <s:attribute name="mobileNumber" type="s:string" /> + <s:attribute name="firstName" type="s:string" /> + <s:attribute name="lastName" type="s:string" /> + </s:complexType> + </s:schema> + </types> + <message name="PostActionsSoapIn"> + <part name="ivrActions" element="s0:ivrActions" /> + </message> + <message name="PostActionsSoapOut"> + <part name="PostActionsResult" element="s0:ivrActionResults" /> + </message> + <message name="PostEventsSoapIn"> + <part name="ivrEvents" element="s0:ivrEvents" /> + </message> + <message name="PostEventsSoapOut"> + <part name="PostEventsResult" element="s0:ivrEventResults" /> + </message> + <portType name="IVRServicePortSoap"> + <operation name="PostActions"> + <input message="tns:PostActionsSoapIn" /> + <output message="tns:PostActionsSoapOut" /> + </operation> + <operation name="PostEvents"> + <input message="tns:PostEventsSoapIn" /> + <output message="tns:PostEventsSoapOut" /> + </operation> + </portType> + <binding name="IVRServicePortSoap" type="tns:IVRServicePortSoap"> + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> + <operation name="PostActions"> + <soap:operation soapAction="http://testurl/Service:postActionsIn" style="document" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="PostEvents"> + <soap:operation soapAction="http://testurl/Service:postEventsIn" style="document" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + <binding name="IVRServicePortSoap12" type="tns:IVRServicePortSoap"> + <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> + <operation name="PostActions"> + <soap12:operation soapAction="http://testurl/Service:postActionsIn" style="document" /> + <input> + <soap12:body use="literal" /> + </input> + <output> + <soap12:body use="literal" /> + </output> + </operation> + <operation name="PostEvents"> + <soap12:operation soapAction="http://testurl/Service:postEventsIn" style="document" /> + <input> + <soap12:body use="literal" /> + </input> + <output> + <soap12:body use="literal" /> + </output> + </operation> + </binding> + <service name="IVRServicePort"> + <port name="IVRServicePortSoap" binding="tns:IVRServicePortSoap"> + <soap:address location="test://" /> + </port> + <port name="IVRServicePortSoap12" binding="tns:IVRServicePortSoap12"> + <soap12:address location="test://" /> + </port> + </service> +</definitions>