]> granicus.if.org Git - php/commitdiff
Fixed bug #36226 (Inconsistent handling when passing nillable arrays)
authorDmitry Stogov <dmitry@php.net>
Tue, 20 Mar 2007 07:51:32 +0000 (07:51 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 20 Mar 2007 07:51:32 +0000 (07:51 +0000)
NEWS
ext/soap/php_encoding.c
ext/soap/tests/bugs/bug36226-2.phpt [new file with mode: 0755]
ext/soap/tests/bugs/bug36226-2.wsdl [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index c4b78b51f5787bff271e4cbaf60d09a403c6a4dd..3165bd1a4e3be7b0188e637fb61d1673b659dc44 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -104,6 +104,8 @@ PHP                                                                        NEWS
 - Fixed bug #38406 (crash when assigning objects to SimpleXML attributes). (Tony)
 - Fixed bug #37799 (ftp_ssl_connect() falls back to non-ssl connection). (Nuno)
 - Fixed bug #36496 (SSL support in imap_open() not working on Windows). (Edin)
+- Fixed bug #36226 (Inconsistent handling when passing nillable arrays).
+  (Dmitry)
 - Fixed bug #35872 (Avoid crash caused by object store being referenced during RSHUTDOWN) (Andy) 
 - Fixed bug #34794 (proc_close() hangs when used with two processes).
   (jdolecek at netbsd dot org, Nuno)
index 53b7fa1f3f68b31977ec045143866413e703f710..83dd51c645db0032cbc7f44032eb52537732d38d 100644 (file)
@@ -1221,7 +1221,8 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr
                                                        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;
 
diff --git a/ext/soap/tests/bugs/bug36226-2.phpt b/ext/soap/tests/bugs/bug36226-2.phpt
new file mode 100755 (executable)
index 0000000..5479ae9
--- /dev/null
@@ -0,0 +1,121 @@
+--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"
+    }
+  }
+}
diff --git a/ext/soap/tests/bugs/bug36226-2.wsdl b/ext/soap/tests/bugs/bug36226-2.wsdl
new file mode 100755 (executable)
index 0000000..18c2ce3
--- /dev/null
@@ -0,0 +1,543 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<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/">\r
+  <types>\r
+    <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Message">\r
+      <s:import namespace="http://testurl/Events" />\r
+      <s:import namespace="http://testurl/Actions" />\r
+      <s:element name="ivrActions" type="s0:actions" />\r
+      <s:complexType name="actions">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s0:abstractMessage">\r
+            <s:sequence>\r
+              <s:choice minOccurs="0" maxOccurs="unbounded">\r
+                <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerAction" type="s2:pauseSmokerAction" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerAction" type="s2:terminateSmokerAction" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="activateSmokerAction" type="s2:activateSmokerAction" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="addSmokerAction" type="s2:addSmokerAction" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="updateSmokerAction" type="s2:updateSmokerAction" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerAction" type="s2:deleteSmokerAction" />\r
+              </s:choice>\r
+            </s:sequence>\r
+            <s:attribute default="Client" name="source" type="s0:ivrMessageSource" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="abstractMessage" abstract="true">\r
+        <s:attribute default="1.0" name="version" type="s:string" />\r
+        <s:attribute name="activityId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="messageId" type="s:unsignedLong" use="required" />\r
+      </s:complexType>\r
+      <s:complexType name="events">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s0:abstractMessage">\r
+            <s:sequence>\r
+              <s:choice minOccurs="0" maxOccurs="unbounded">\r
+                <s:element minOccurs="0" maxOccurs="1" name="authFailureEvent" type="s1:authFailureEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="logOffEvent" type="s1:logOffEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="cravingLineEvent" type="s1:cravingLineEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="terminateEvent" type="s1:terminateEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="relapseWakeSmsReplaceEvent" type="s1:relapseWakeSmsReplaceEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="confessionLineEvent" type="s1:confessionLineEvent" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="rfqRecordedEvent" type="s1:rfqRecordedEvent" />\r
+                <s:element nillable="true" minOccurs="0" maxOccurs="1" name="logOnEvent" type="s1:logOnEvent" />\r
+              </s:choice>\r
+            </s:sequence>\r
+            <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:simpleType name="ivrMessageSource">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="IVR" />\r
+          <s:enumeration value="Client" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="actionResults">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s0:abstractMessage">\r
+            <s:sequence>\r
+              <s:choice minOccurs="0" maxOccurs="unbounded">\r
+                <s:element minOccurs="0" maxOccurs="1" name="updateSmokerActionResult" type="s2:updateSmokerActionResult" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="activateSmokerActionResult" type="s2:activateSmokerActionResult" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="deleteSmokerActionResult" type="s2:deleteSmokerActionResult" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="addSmokerActionResult" type="s2:addSmokerActionResult" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="pauseSmokerActionResult" type="s2:pauseSmokerActionResult" />\r
+                <s:element minOccurs="0" maxOccurs="1" name="terminateSmokerActionResult" type="s2:terminateSmokerActionResult" />\r
+              </s:choice>\r
+            </s:sequence>\r
+            <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="eventResults">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s0:abstractMessage">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="eventResult" type="s1:eventResult" />\r
+            </s:sequence>\r
+            <s:attribute default="IVR" name="source" type="s0:ivrMessageSource" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:element name="ivrActionResults" type="s0:actionResults" />\r
+      <s:element name="ivrEvents" type="s0:events" />\r
+      <s:element name="ivrEventResults" type="s0:eventResults" />\r
+    </s:schema>\r
+    <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Events">\r
+      <s:complexType name="authFailureEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent">\r
+            <s:attribute name="mobileNumber" type="s:string" />\r
+            <s:attribute name="line" type="s1:line" use="required" />\r
+            <s:attribute name="reason" type="s:string" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="abstractEvent" abstract="true">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" />\r
+        <s:attribute name="timestamp" type="s:dateTime" use="required" />\r
+      </s:complexType>\r
+      <s:complexType name="logOnEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent" />\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="cravingLineEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="selection" type="s1:cravingLineEventSelection" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="cravingLineEventSelection">\r
+        <s:attribute name="type" type="s1:cravingLineMessageType" use="required" />\r
+        <s:attribute name="msgNumber" type="s:positiveInteger" />\r
+      </s:complexType>\r
+      <s:simpleType name="cravingLineMessageType">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Motivational" />\r
+          <s:enumeration value="StressReval" />\r
+          <s:enumeration value="EffectReg" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="confessionLineEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent">\r
+            <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:simpleType name="smokeStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Smoked" />\r
+          <s:enumeration value="SmokeFree" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="rfqRecordedEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent" />\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="terminateEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent" />\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="logOffEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent">\r
+            <s:attribute name="smokeStatus" type="s1:smokeStatus" use="required" />\r
+            <s:attribute name="callInitiator" type="s1:callInitiator" use="required" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:simpleType name="callInitiator">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="AudienceMember" />\r
+          <s:enumeration value="IVR" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="relapseWakeSmsReplaceEvent">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s1:abstractEvent">\r
+            <s:attribute name="relapseCount" type="s:positiveInteger" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:simpleType name="line">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="LogOnOffLine" />\r
+          <s:enumeration value="CravingLine" />\r
+          <s:enumeration value="ConfessionLine" />\r
+          <s:enumeration value="ReasonsForQuittingLine" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="eventResult">\r
+        <s:attribute name="success" type="s:boolean" use="required" />\r
+      </s:complexType>\r
+    </s:schema>\r
+    <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Actions">\r
+      <s:import namespace="http://testurl/Smoker" />\r
+      <s:complexType name="updateSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:updateSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="abstractActionResult">\r
+        <s:attribute name="resultId" type="s:unsignedLong" use="required" />\r
+      </s:complexType>\r
+      <s:complexType name="pauseSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:pauseSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="pauseSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:pauseSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:pauseSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="pauseSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Paused" />\r
+          <s:enumeration value="NotPaused" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="pauseSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="IDNotFound" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="addSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:addSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="addSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:addSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:addSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="addSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Added" />\r
+          <s:enumeration value="NotAdded" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="addSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="DuplicateID" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="deleteSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:deleteSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="deleteSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:deleteSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:deleteSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="deleteSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Deleted" />\r
+          <s:enumeration value="NotDeleted" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="deleteSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="IDNotFound" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="activateSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:activateSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="activateSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:activateSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:activateSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="activateSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Activated" />\r
+          <s:enumeration value="NotActivated" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="activateSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="IDNotFound" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="terminateSmokerActionResult">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractActionResult">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s2:terminateSmokerActionResultSmoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="terminateSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:terminateSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:terminateSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="terminateSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Terminated" />\r
+          <s:enumeration value="NotTerminated" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="terminateSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="IDNotFound" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="updateSmokerActionResultSmoker">\r
+        <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="status" type="s2:updateSmokerActionResultSmokerStatus" use="required" />\r
+        <s:attribute name="exception" type="s2:updateSmokerActionResultSmokerException" />\r
+      </s:complexType>\r
+      <s:simpleType name="updateSmokerActionResultSmokerStatus">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Updated" />\r
+          <s:enumeration value="NotUpdated" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="updateSmokerActionResultSmokerException">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="UnspecifiedError" />\r
+          <s:enumeration value="IDNotFound" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:complexType name="pauseSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="abstractAction" abstract="true">\r
+        <s:attribute name="requestId" type="s:unsignedLong" use="required" />\r
+      </s:complexType>\r
+      <s:complexType name="addSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="updateSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="smoker" type="s3:smoker" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="terminateSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="deleteSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:sequence>\r
+              <s:element minOccurs="0" maxOccurs="unbounded" name="audienceMemberID" type="s:unsignedLong" />\r
+            </s:sequence>\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:complexType name="activateSmokerAction">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s2:abstractAction">\r
+            <s:attribute name="audienceMemberId" type="s:unsignedLong" use="required" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+    </s:schema>\r
+    <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/Smoker">\r
+      <s:import namespace="http://testurl/AudienceMember" />\r
+      <s:complexType name="smoker">\r
+        <s:complexContent mixed="false">\r
+          <s:extension base="s4:ivrAudienceMember">\r
+            <s:attribute name="startDate" type="s:date" use="required" />\r
+            <s:attribute name="phase" type="s3:phase" use="required" />\r
+            <s:attribute name="day" type="s:positiveInteger" />\r
+            <s:attribute name="track" type="s3:track" use="required" />\r
+            <s:attribute name="status" type="s3:status" use="required" />\r
+            <s:attribute name="baseTime" type="s:string" />\r
+            <s:attribute name="sunWakeOffset" type="s:string" />\r
+            <s:attribute name="monWakeOffset" type="s:string" />\r
+            <s:attribute name="tueWakeOffset" type="s:string" />\r
+            <s:attribute name="wedWakeOffset" type="s:string" />\r
+            <s:attribute name="thuWakeOffset" type="s:string" />\r
+            <s:attribute name="friWakeOffset" type="s:string" />\r
+            <s:attribute name="satWakeOffset" type="s:string" />\r
+            <s:attribute name="sunSleepOffset" type="s:string" />\r
+            <s:attribute name="monSleepOffset" type="s:string" />\r
+            <s:attribute name="tueSleepOffset" type="s:string" />\r
+            <s:attribute name="wedSleepOffset" type="s:string" />\r
+            <s:attribute name="thuSleepOffset" type="s:string" />\r
+            <s:attribute name="friSleepOffset" type="s:string" />\r
+            <s:attribute name="satSleepOffset" type="s:string" />\r
+            <s:attribute name="sunLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="monLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="tueLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="wedLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="thuLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="friLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="satLogOnWindowOffset" type="s:string" />\r
+            <s:attribute name="sunLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="monLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="tueLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="wedLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="thuLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="friLogOffWindowOffset" type="s:string" />\r
+            <s:attribute name="satLogOffWindowOffset" type="s:string" />\r
+          </s:extension>\r
+        </s:complexContent>\r
+      </s:complexType>\r
+      <s:simpleType name="phase">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Prep" />\r
+          <s:enumeration value="Quit" />\r
+          <s:enumeration value="Followup" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="track">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="NRT" />\r
+          <s:enumeration value="NonNRT" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+      <s:simpleType name="status">\r
+        <s:restriction base="s:string">\r
+          <s:enumeration value="Pre-Start" />\r
+          <s:enumeration value="Completed" />\r
+          <s:enumeration value="Terminated" />\r
+          <s:enumeration value="Paused" />\r
+          <s:enumeration value="Active" />\r
+        </s:restriction>\r
+      </s:simpleType>\r
+    </s:schema>\r
+    <s:schema elementFormDefault="qualified" targetNamespace="http://testurl/AudienceMember">\r
+      <s:import namespace="http://testurl/Smoker" />\r
+      <s:complexType name="ivrAudienceMember">\r
+        <s:attribute name="id" type="s:unsignedLong" use="required" />\r
+        <s:attribute name="mobileNumber" type="s:string" />\r
+        <s:attribute name="firstName" type="s:string" />\r
+        <s:attribute name="lastName" type="s:string" />\r
+      </s:complexType>\r
+    </s:schema>\r
+  </types>\r
+  <message name="PostActionsSoapIn">\r
+    <part name="ivrActions" element="s0:ivrActions" />\r
+  </message>\r
+  <message name="PostActionsSoapOut">\r
+    <part name="PostActionsResult" element="s0:ivrActionResults" />\r
+  </message>\r
+  <message name="PostEventsSoapIn">\r
+    <part name="ivrEvents" element="s0:ivrEvents" />\r
+  </message>\r
+  <message name="PostEventsSoapOut">\r
+    <part name="PostEventsResult" element="s0:ivrEventResults" />\r
+  </message>\r
+  <portType name="IVRServicePortSoap">\r
+    <operation name="PostActions">\r
+      <input message="tns:PostActionsSoapIn" />\r
+      <output message="tns:PostActionsSoapOut" />\r
+    </operation>\r
+    <operation name="PostEvents">\r
+      <input message="tns:PostEventsSoapIn" />\r
+      <output message="tns:PostEventsSoapOut" />\r
+    </operation>\r
+  </portType>\r
+  <binding name="IVRServicePortSoap" type="tns:IVRServicePortSoap">\r
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />\r
+    <operation name="PostActions">\r
+      <soap:operation soapAction="http://testurl/Service:postActionsIn" style="document" />\r
+      <input>\r
+        <soap:body use="literal" />\r
+      </input>\r
+      <output>\r
+        <soap:body use="literal" />\r
+      </output>\r
+    </operation>\r
+    <operation name="PostEvents">\r
+      <soap:operation soapAction="http://testurl/Service:postEventsIn" style="document" />\r
+      <input>\r
+        <soap:body use="literal" />\r
+      </input>\r
+      <output>\r
+        <soap:body use="literal" />\r
+      </output>\r
+    </operation>\r
+  </binding>\r
+  <binding name="IVRServicePortSoap12" type="tns:IVRServicePortSoap">\r
+    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />\r
+    <operation name="PostActions">\r
+      <soap12:operation soapAction="http://testurl/Service:postActionsIn" style="document" />\r
+      <input>\r
+        <soap12:body use="literal" />\r
+      </input>\r
+      <output>\r
+        <soap12:body use="literal" />\r
+      </output>\r
+    </operation>\r
+    <operation name="PostEvents">\r
+      <soap12:operation soapAction="http://testurl/Service:postEventsIn" style="document" />\r
+      <input>\r
+        <soap12:body use="literal" />\r
+      </input>\r
+      <output>\r
+        <soap12:body use="literal" />\r
+      </output>\r
+    </operation>\r
+  </binding>\r
+  <service name="IVRServicePort">\r
+    <port name="IVRServicePortSoap" binding="tns:IVRServicePortSoap">\r
+      <soap:address location="test://" />\r
+    </port>\r
+    <port name="IVRServicePortSoap12" binding="tns:IVRServicePortSoap12">\r
+      <soap12:address location="test://" />\r
+    </port>\r
+  </service>\r
+</definitions>\r