]> granicus.if.org Git - php/commitdiff
Fixed bug #35142 (SOAP Client/Server Complex Object Support)
authorDmitry Stogov <dmitry@php.net>
Tue, 8 Nov 2005 08:30:19 +0000 (08:30 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 8 Nov 2005 08:30:19 +0000 (08:30 +0000)
NEWS
ext/soap/php_encoding.c
ext/soap/php_schema.c
ext/soap/tests/bugs/bug35142.phpt [new file with mode: 0755]
ext/soap/tests/bugs/bug35142.wsdl [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 9865e76e6711e990dc5e25df7630aebd30627d48..e0cd294d5ad214584e8295b6db09f9ae4a7d39fd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Nov 2005, PHP 5.1
 - Fixed initializing and argument checking for posix_mknod(). (Derick)
+- Fixed bug #35142 (SOAP Client/Server Complex Object Support). (Dmitry)
 - Fixed bug #35135 (PDOStatment without related PDO object may crash). (Ilia)
 - Fixed bug #35091 (SoapClient leaks memory). (Dmitry)
 - Fixed bug #35078 (configure does not find ldap_start_tls_s). (Jani)
index bca17d4a59d8c2109742b02148e73549a0b6ef85..1162a417cb525b2f8d0828138922d09c3dadf086 100644 (file)
@@ -1223,6 +1223,10 @@ static zval *to_zval_object(encodeTypePtr type, xmlNodePtr data)
                                  unset_zval_property(ret, "any" TSRMLS_CC);
                                        redo_any = 1;
                          }
+                               if (Z_TYPE_P(ret) == IS_OBJECT && ce != ZEND_STANDARD_CLASS_DEF_PTR) {
+                                       zend_object *zobj = zend_objects_get_address(ret TSRMLS_CC);
+                                       zobj->ce = ce;
+                               }
                        } else {
                                zval *base;
 
index d6183ffc939b7f6eae4abb56fdd1ec69b2395b3c..565a7fb46b01da4abc9fd6ca78f6d83b68cb4492 100644 (file)
@@ -2192,9 +2192,25 @@ static void schema_content_model_fixup(sdlCtx *ctx, sdlContentModelPtr model)
                        }
                        break;
                }
-               case XSD_CONTENT_SEQUENCE:
-               case XSD_CONTENT_ALL:
                case XSD_CONTENT_CHOICE: {
+                       if (model->max_occurs != 1) {
+                               HashPosition pos;
+                               sdlContentModelPtr *tmp;
+
+                               zend_hash_internal_pointer_reset_ex(model->u.content, &pos);
+                               while (zend_hash_get_current_data_ex(model->u.content, (void**)&tmp, &pos) == SUCCESS) {
+                                       (*tmp)->min_occurs = 0;
+                                       (*tmp)->max_occurs = model->max_occurs;
+                                       zend_hash_move_forward_ex(model->u.content, &pos);
+                               }
+
+                               model->kind = XSD_CONTENT_ALL;
+                               model->min_occurs = 1;
+                               model->max_occurs = 1;
+                       }
+               }
+               case XSD_CONTENT_SEQUENCE:
+               case XSD_CONTENT_ALL: {
                        sdlContentModelPtr *tmp;
 
                        zend_hash_internal_pointer_reset(model->u.content);
diff --git a/ext/soap/tests/bugs/bug35142.phpt b/ext/soap/tests/bugs/bug35142.phpt
new file mode 100755 (executable)
index 0000000..b27d9bc
--- /dev/null
@@ -0,0 +1,135 @@
+--TEST--
+Bug #35142 SOAP Client/Server Complex Object Support 
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+<?php
+ini_set("soap.wsdl_cache_enabled",0);
+$timestamp = "2005-11-08T11:22:07+03:00";
+$wsdl = dirname(__FILE__)."/bug35142.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')));
+
+$logOnEvent = new LogOnEvent(34567, $timestamp);
+$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 $callInititator;
+
+  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;
+  }
+}
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testurl/Message"><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:logOffEvent audienceMemberId="34568" timestamp="2005-11-08T11:22:07+03:00" smokeStatus="SmokeFree" callInitiator="IVR"/><ns1:logOnEvent audienceMemberId="34567" timestamp="2005-11-08T11:22:07+03:00"/></ns1:ivrEvents></SOAP-ENV:Body></SOAP-ENV:Envelope>
+
+object(IVREvents)#%d (6) {
+  ["version"]=>
+  string(3) "1.0"
+  ["activityId"]=>
+  int(101)
+  ["messageId"]=>
+  int(12345)
+  ["logOffEvent"]=>
+  array(2) {
+    [0]=>
+    object(LogOffEvent)#%d (4) {
+      ["audienceMemberId"]=>
+      int(34567)
+      ["timestamp"]=>
+      string(25) "2005-11-08T11:22:07+03:00"
+      ["smokeStatus"]=>
+      string(6) "Smoked"
+      ["callInitiator"]=>
+      string(3) "IVR"
+    }
+    [1]=>
+    object(LogOffEvent)#%d (4) {
+      ["audienceMemberId"]=>
+      int(34568)
+      ["timestamp"]=>
+      string(25) "2005-11-08T11:22:07+03:00"
+      ["smokeStatus"]=>
+      string(9) "SmokeFree"
+      ["callInitiator"]=>
+      string(3) "IVR"
+    }
+  }
+  ["logOnEvent"]=>
+  object(LogOnEvent)#%d (2) {
+    ["audienceMemberId"]=>
+    int(34567)
+    ["timestamp"]=>
+    string(25) "2005-11-08T11:22:07+03:00"
+  }
+  ["source"]=>
+  string(3) "IVR"
+}
diff --git a/ext/soap/tests/bugs/bug35142.wsdl b/ext/soap/tests/bugs/bug35142.wsdl
new file mode 100755 (executable)
index 0000000..2c712ec
--- /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 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