<?xml version="1.0" encoding="UTF-8"?>
<!--
	The IPCablecom CMS Subscriber Provisioning interface.
	Specified in Web Service Description Language 1.1.
-->
<definitions name="PcspI01Service" targetNamespace="unique_fully_qualified_namespace" xmlns:tns="unique_fully_qualified_namespace" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<!--	NOTE: the parameter <unique_fully_qualified_namespace>	MUST be replaced by fully qualified unique identifiers for the actual implementation.
-->
	<!--
		The <types> section defines custom datatypes required by the interface.
		
		PCSPI01 requires two custom datatypes: 
			PcspArg (and array of)
			PcspObj (and array of).

		// PcspArg (pseudo code)		
		//
		class PcspArg
		{
			// EntityName and key of a specific object.
			// Wildcard are currently not permitted.
			// Key is ignored when entity is PcspRelation.
			//
			String entityName;
			String key;

			// Reserved for future use. Set to 0 for now.
			//		
			int flags;
		}
	
		// PcspObj (pseudo code).
		//
		class PcspObj
		{
			// EntityName and key of the specific object.
			// Key is ignored when entity is PcspRelation.
			//
			String entityName;
			String key;
		
			// cmdStatus:
			//	PcspObj as method output/result - MUST be set to one of the status codes specified below.
			//	PcspObj as input to Put() - MUST be set to one of the following:
			// 		1, create new object
			// 		2, modify existing object.
			// This field is ignored when entity is PcspRelation.
			//
			int cmdStatus;
		
			// XML encoding per PCSP Data Model Schema or 0 (null)
			//
			String xmlEncoding;
		}

		EntityNames; MUST be one of the following:
		
			"PcspService"
			"PcspMta"
			"PcspEndpoint"
			"PcspCms"
			"PcspRelation"
			
		Status codes: Used for method output or contained in the cmdStatus field of a PcspObj result (output). 
	
			0 , Operation succeeded
			1 , Object not found
			2 , Invalid Put() mode specified.
			3 , Object creation failed, object already exists
			4 , Read op failed
			5 , Create op failed
			6 , Modify op failed
			7 , Delete op failed
			8 , Internal problem.
			9 , Server Busy
			10, Unsupported operation.
			11, Vendor extension.
	
		...extended as needed...
	-->
	<types>
		<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.IPCablecom.com/pcsp/i01">
			<complexType name="PcspObj">
				<sequence>
					<element name="entityName" type="string"/>
					<element name="key" type="string"/>
					<element name="cmdStatus" type="int"/>
					<element name="xmlEncoding" type="string"/>
				</sequence>
			</complexType>
			<complexType name="ArrayOfPcspObj">
				<complexContent>
					<restriction base="soapenc:Array">
						<attribute ref="soapenc:arrayType" wsdl:arrayType="tns:PcspObj[]"/>
					</restriction>
				</complexContent>
			</complexType>
			<complexType name="PcspArg">
				<sequence>
					<element name="entityName" type="string"/>
					<element name="key" type="string"/>
					<element name="flags" type="int"/>
				</sequence>
			</complexType>
			<complexType name="ArrayOfPcspArg">
				<complexContent>
					<restriction base="soapenc:Array">
						<attribute ref="soapenc:arrayType" wsdl:arrayType="tns:PcspArg[]"/>
					</restriction>
				</complexContent>
			</complexType>
		</schema>
	</types>
	<!--
		Message section.
		
		Invoking a method on the interface involves two "messages"...an input message and an output message.
		"In" contains the set of input args to the method call.
		"Out" contains the return values.
	-->
	<message name="Get0In">
		<part name="args" type="tns:ArrayOfPcspArg"/>
	</message>
	<message name="Get0Out">
		<part name="Result" type="tns:ArrayOfPcspObj"/>
	</message>
	<message name="Put1In">
		<part name="objs" type="tns:ArrayOfPcspObj"/>
	</message>
	<message name="Put1Out">
		<part name="Result" type="tns:ArrayOfPcspObj"/>
	</message>
	<message name="Delete2In">
		<part name="args" type="tns:ArrayOfPcspArg"/>
	</message>
	<message name="Delete2Out">
		<part name="Result" type="tns:ArrayOfPcspObj"/>
	</message>
	<message name="CmdStatus3In">
		<part name="isCmd" type="xsd:boolean"/>
		<part name="code" type="xsd:int"/>
		<part name="subCode" type="xsd:int"/>
		<part name="vendorExtension" type="xsd:string"/>
	</message>
	<message name="CmdStatus3Out">
		<part name="Result" type="xsd:int"/>
	</message>
	<!--
		Port type defines the interface.
		
		Each "operation" is a method on the interface, with associated input and output messages
		(args and return values).
		
		// The PCSP service interface (in pseudo code).
		//
		interface IPcspI01Service
		{
			// Get (read) one or more objects from the server.
			// EntityName of "PcspRelation' it not allowed (objects only)
			//
			PcspObj[] Get(PcspArg[] args);

			// Put (write) objects and relations to the server.
			//
			PcspObj[] Put(PcspObj[] objs);

			// Delete objects and relations from the server.
			//
			PcspObj[] Delete(PcspArg[] args);

			// Out-of-band command and status reporting.
			//
			// Predefined command codes:
			// 	0 - extension command
			//
			// Predefined status codes:
			// 	0 - extension status
			//	
			int CmdStatust(boolean cmd,		// true for CMD, false for STATUS.
							int code,		// CMD or STATUS code (see above).
							int subCode		// SubCode. Further refines code.
							String extension);
	}
	-->
	<portType name="PcspI01Service">
		<operation name="Get" parameterOrder="args">
			<input name="Get0In" message="tns:Get0In"/>
			<output name="Get0Out" message="tns:Get0Out"/>
		</operation>
		<operation name="Put" parameterOrder="objs">
			<input name="Put1In" message="tns:Put1In"/>
			<output name="Put1Out" message="tns:Put1Out"/>
		</operation>
		<operation name="Delete" parameterOrder="args">
			<input name="Delete2In" message="tns:Delete2In"/>
			<output name="Delete2Out" message="tns:Delete2Out"/>
		</operation>
		<operation name="CmdStatus" parameterOrder="isCmd code subCode vendorExtension">
			<input name="CmdStatus3In" message="tns:CmdStatus3In"/>
			<output name="CmdStatus3Out" message="tns:CmdStatus3Out"/>
		</operation>
	</portType>
	<!--
		Bind the interface ("portType") to transport specifics.
		Essentially, each method's input and output flow is bound as a 
		remote procedure call using SOAP 1.1.
	-->
	<binding name="PcspI01Service" type="tns:PcspI01Service">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="Get">
			<soap:operation soapAction="Get" style="rpc"/>
			<input name="Get0In">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="Get0Out">
				<soap:body use="encoded" amespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
		<operation name="Put">
			<soap:operation soapAction="Put" style="rpc"/>
			<input name="Put1In">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="Put1Out">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
		<operation name="Delete">
			<soap:operation soapAction="Delete" style="rpc"/>
			<input name="Delete2In">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="Delete2Out">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
		<operation name="CmdStatus">
			<soap:operation soapAction="CmdStatus" style="rpc"/>
			<input name="CmdStatus3In">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</input>
			<output name="CmdStatus3Out">
				<soap:body use="encoded" namespace="http://www.IPCablecom.com/pcsp/i01" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
			</output>
		</operation>
	</binding>
	<!--
		The top level definition of the PCSP I01 Service.
		
		Note that the <service> element does not contain an address. It is assumed that the actual address
		of the service will be set explicitly within the client and server.
	-->
	<service name="PcspI01Service">
		<documentation>IPCablecom CMS Subscriber Provisioning Service I01</documentation>
		<port name="PcspI01Service" binding="tns:PcspI01Service">
			<soap:address location=""/>
		</port>
	</service>
</definitions>