Sfoglia il codice sorgente

Trying to talk to the xip example app

added sending of wsdl
ivowolf 14 anni fa
parent
commit
e078c0a7a0

+ 2 - 2
Plugins/org.commontk.dicom.examplehost/ctkDicomExampleHost.cpp

@@ -19,9 +19,9 @@ void ctkDicomExampleHost::StartApplication(QString AppPath){
 
     QStringList l;
     l.append("--hostURL");
-    l.append(QString("http://localhost:") + QString::number(this->getHostPort()) );
+    l.append(QString("http://localhost:") + QString::number(this->getHostPort()) + "/HostInterface" );
     l.append("--applicationURL");
-    l.append(QString("http://localhost:") + QString::number(this->getAppPort()));
+    l.append(QString("http://localhost:") + QString::number(this->getAppPort()) + "/ApplicationInterface" );
     l.append("dicomapp"); // the app plugin to use - has to be changed later
     //if (!QProcess::startDetached (
     //{

+ 1 - 0
Plugins/org.commontk.dicom.wg23.core/CMakeLists.txt

@@ -42,6 +42,7 @@ SET(PLUGIN_UI_FORMS
 
 # QRC Files which should be compiled into the plugin
 SET(PLUGIN_resources
+  Resources/dah_wsdl.qrc
 )
 
 #Compute the plugin dependencies

+ 178 - 0
Plugins/org.commontk.dicom.wg23.core/Resources/ApplicationService.wsdl

@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. -->
+<definitions targetNamespace="http://wg23.dicom.nema.org/"
+	name="ApplicationService" xmlns="http://schemas.xmlsoap.org/wsdl/"
+	xmlns:tns="http://wg23.dicom.nema.org/"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+	<types>
+		<xsd:schema>
+			<xsd:import namespace="http://wg23.dicom.nema.org/"
+				schemaLocation="ApplicationService_schema1.xsd"/>
+		</xsd:schema>
+	</types>
+	<message name="bringToFront">
+		<part name="parameters" element="tns:bringToFront"/>
+	</message>
+	<message name="bringToFrontResponse">
+		<part name="parameters" element="tns:bringToFrontResponse"/>
+	</message>
+	<message name="getAsModels">
+		<part name="parameters" element="tns:getAsModels"/>
+	</message>
+	<message name="getAsModelsResponse">
+		<part name="parameters" element="tns:getAsModelsResponse"/>
+	</message>	
+	<message name="getDataAsFile">
+		<part name="parameters" element="tns:getDataAsFile"/>
+	</message>
+	<message name="getDataAsFileResponse">
+		<part name="parameters" element="tns:getDataAsFileResponse"/>
+	</message>
+	<message name="getDataAsSpecificTypeFile">
+		<part name="parameters" element="tns:getDataAsSpecificTypeFile"/>
+	</message>
+	<message name="getDataAsSpecificTypeFileResponse">
+		<part name="parameters" element="tns:getDataAsSpecificTypeFileResponse"/>
+	</message>
+	<message name="notifyDataAvailable">
+		<part name="parameters" element="tns:notifyDataAvailable"/>
+	</message>
+	<message name="notifyDataAvailableResponse">
+		<part name="parameters" element="tns:notifyDataAvailableResponse"/>
+	</message>
+	<message name="queryModel">
+		<part name="parameters" element="tns:queryModel"/>
+	</message>
+	<message name="queryModelResponse">
+		<part name="parameters" element="tns:queryModelResponse"/>
+	</message>
+	<message name="getState">
+		<part name="parameters" element="tns:getState"/>
+	</message>
+	<message name="getStateResponse">
+		<part name="parameters" element="tns:getStateResponse"/>
+	</message>
+	<message name="setState">
+		<part name="parameters" element="tns:setState"/>
+	</message>
+	<message name="setStateResponse">
+		<part name="parameters" element="tns:setStateResponse"/>
+	</message>
+	<portType name="Application">
+		<operation name="bringToFront">
+			<input message="tns:bringToFront"/>
+			<output message="tns:bringToFrontResponse"/>
+		</operation>
+		<operation name="getAsModels">
+			<input message="tns:getAsModels"/>
+			<output message="tns:getAsModelsResponse"/>
+		</operation>
+		<operation name="getDataAsFile">
+			<input message="tns:getDataAsFile"/>
+			<output message="tns:getDataAsFileResponse"/>
+		</operation>
+		<operation name="getDataAsSpecificTypeFile">
+			<input message="tns:getDataAsSpecificTypeFile"/>
+			<output message="tns:getDataAsSpecificTypeFileResponse"/>
+		</operation>
+		<operation name="notifyDataAvailable">
+			<input message="tns:notifyDataAvailable"/>
+			<output message="tns:notifyDataAvailableResponse"/>
+		</operation>
+		<operation name="queryModel">
+			<input message="tns:queryModel"/>
+			<output message="tns:queryModelResponse"/>
+		</operation>
+		<operation name="getState">
+			<input message="tns:getState"/>
+			<output message="tns:getStateResponse"/>
+		</operation>
+		<operation name="setState">
+			<input message="tns:setState"/>
+			<output message="tns:setStateResponse"/>
+		</operation>
+	</portType>
+	<binding name="ApplicationPortBinding" type="tns:Application">
+		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
+			style="document"/>
+		<operation name="bringToFront">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getAsModels">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getDataAsFile">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getDataAsSpecificTypeFile">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="notifyDataAvailable">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="queryModel">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getState">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="setState">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+	</binding>
+	<service name="ApplicationService">
+		<port name="ApplicationPort" binding="tns:ApplicationPortBinding">
+			<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
+		</port>
+	</service>
+</definitions>
+

+ 260 - 0
Plugins/org.commontk.dicom.wg23.core/Resources/ApplicationService_schema1.xsd

@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0"
+	targetNamespace="http://wg23.dicom.nema.org/"
+	xmlns:tns="http://wg23.dicom.nema.org/"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	
+	<xs:element name="bringToFront" type="tns:bringToFront"/>
+	<xs:element name="bringToFrontResponse" type="tns:bringToFrontResponse"/>
+	<xs:element name="getAsModels" type="tns:getAsModels"/>
+	<xs:element name="getAsModelsResponse" type="tns:getAsModelsResponse"/>
+	<xs:element name="getDataAsFile" type="tns:getDataAsFile"/>
+	<xs:element name="getDataAsFileResponse" type="tns:getDataAsFileResponse"/>
+	<xs:element name="getDataAsSpecificTypeFile"
+		type="tns:getDataAsSpecificTypeFile"/>
+	<xs:element name="getDataAsSpecificTypeFileResponse"
+		type="tns:getDataAsSpecificTypeFileResponse"/>
+	<xs:element name="getState" type="tns:getState"/>
+	<xs:element name="getStateResponse" type="tns:getStateResponse"/>
+	<xs:element name="notifyDataAvailable" type="tns:notifyDataAvailable"/>
+	<xs:element name="notifyDataAvailableResponse"
+		type="tns:notifyDataAvailableResponse"/>
+	<xs:element name="queryModel" type="tns:queryModel"/>
+	<xs:element name="queryModelResponse" type="tns:queryModelResponse"/>
+	<xs:element name="setState" type="tns:setState"/>
+	<xs:element name="setStateResponse" type="tns:setStateResponse"/>
+	
+	<xs:complexType name="getState">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="getStateResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="tns:state"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getDataAsFile">
+		<xs:sequence>
+			<xs:element name="uuids" type="tns:ArrayOfUUID"/>
+			<xs:element name="includeBulkData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getDataAsFileResponse">
+		<xs:sequence>
+			<xs:element name="objectLocators" type="tns:ArrayOfObjectLocator"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getDataAsSpecificTypeFile">
+		<xs:sequence>
+			<xs:element name="objectUUIDs" type="tns:ArrayOfUUID"/>
+			<xs:element name="mimeType" type="xs:string"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+			<xs:element name="includeBulkData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getDataAsSpecificTypeFileResponse">
+		<xs:sequence>
+			<xs:element name="objectLocators" type="tns:ArrayOfObjectLocator"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="uuid">
+		<xs:sequence>
+			<xs:element name="uuid" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="objectLocator">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid"/>
+			<xs:element name="uri" type="xs:anyURI"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="notifyDataAvailable">
+		<xs:sequence>
+			<xs:element name="availableData" type="tns:availableData"/>
+			<xs:element name="lastData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="availableData">
+		<xs:sequence>
+			<xs:element name="patients" type="tns:ArrayOfPatient"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="patient">
+		<xs:sequence>
+			<xs:element name="name" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+			<xs:element name="studies" type="tns:ArrayOfStudy"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="study">
+		<xs:sequence>
+			<xs:element name="studyUID" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+			<xs:element name="series" type="tns:ArrayOfSeries"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="series">
+		<xs:sequence>
+			<xs:element name="seriesUID" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="modality">
+		<xs:sequence>
+			<xs:element name="modality" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="objectDescriptor">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid"/>
+			<xs:element name="mimeType" type="xs:string"/>
+			<xs:element name="classUID" type="tns:uid"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+			<xs:element name="modality" type="tns:modality"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="uid">
+		<xs:sequence>
+			<xs:element name="uid" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="notifyDataAvailableResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="queryModel">
+		<xs:sequence>
+			<xs:element name="objUUIDs" type="tns:ArrayOfUUID"/>
+			<xs:element name="modelXpaths" type="tns:ArrayOfString"/>
+			<xs:element name="includeBulkDataPointers" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="queryModelResponse">
+		<xs:sequence>
+			<xs:element name="queryResults" type="tns:ArrayOfQueryResult"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="queryResult">
+		<xs:sequence>
+			<xs:element name="model" type="tns:uuid"/>
+			<xs:element name="xpath" type="xs:string"/>
+			<xs:element name="results" type="tns:ArrayOfString"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getAsModels">
+		<xs:sequence>
+			<xs:element name="uuids" type="tns:ArrayOfUUID"/>
+			<xs:element name="classUID" type="tns:uid"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getAsModelsResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="tns:modelSetDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="modelSetDescriptor">
+		<xs:sequence>
+			<xs:element name="models" type="tns:ArrayOfUUID"/>
+			<xs:element name="failedSourceObjects" type="tns:ArrayOfUUID"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="bringToFront">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="bringToFrontResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="setState">
+		<xs:sequence>
+			<xs:element name="newState" type="tns:state"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="setStateResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="ArrayOfUUID">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="ArrayOfPatient">
+		<xs:sequence>
+			<xs:element name="patient" type="tns:patient" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfStudy">
+		<xs:sequence>
+			<xs:element name="study" type="tns:study" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfSeries">
+		<xs:sequence>
+			<xs:element name="series" type="tns:series" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfObjectLocator">
+		<xs:sequence>
+			<xs:element name="objectLocator" type="tns:objectLocator" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfObjectDescriptor">
+		<xs:sequence>
+			<xs:element name="objectDescriptor" type="tns:objectDescriptor"
+				minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfString">
+		<xs:sequence>
+			<xs:element name="string" type="xs:string" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfQueryResult">
+		<xs:sequence>
+			<xs:element name="queryResult" type="tns:queryResult" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="state">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="EXIT"/>
+			<xs:enumeration value="CANCELED"/>
+			<xs:enumeration value="SUSPENDED"/>
+			<xs:enumeration value="COMPLETED"/>
+			<xs:enumeration value="INPROGRESS"/>
+			<xs:enumeration value="IDLE"/>
+		</xs:restriction>
+	</xs:simpleType>
+</xs:schema>

+ 235 - 0
Plugins/org.commontk.dicom.wg23.core/Resources/HostService.wsdl

@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. -->
+<definitions targetNamespace="http://wg23.dicom.nema.org/" name="HostService"
+	xmlns="http://schemas.xmlsoap.org/wsdl/"
+	xmlns:tns="http://wg23.dicom.nema.org/"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+	<types>
+		<xsd:schema>
+			<xsd:import namespace="http://wg23.dicom.nema.org/"
+				schemaLocation="HostService_schema1.xsd"/>
+		</xsd:schema>
+	</types>
+	<message name="generateUID">
+		<part name="parameters" element="tns:generateUID"/>
+	</message>
+	<message name="generateUIDResponse">
+		<part name="parameters" element="tns:generateUIDResponse"/>
+	</message>
+	<message name="getAvailableScreen">
+		<part name="parameters" element="tns:getAvailableScreen"/>
+	</message>
+	<message name="getAvailableScreenResponse">
+		<part name="parameters" element="tns:getAvailableScreenResponse"/>
+	</message>
+	<message name="getOutputDir">
+		<part name="parameters" element="tns:getOutputDir"/>
+	</message>
+	<message name="getOutputDirResponse">
+		<part name="parameters" element="tns:getOutputDirResponse"/>
+	</message>
+	<message name="getTmpDir">
+		<part name="parameters" element="tns:getTmpDir"/>
+	</message>
+	<message name="getTmpDirResponse">
+		<part name="parameters" element="tns:getTmpDirResponse"/>
+	</message>
+	<message name="notifyStateChanged">
+		<part name="parameters" element="tns:notifyStateChanged"/>
+	</message>
+	<message name="notifyStateChangedResponse">
+		<part name="parameters" element="tns:notifyStateChangedResponse"/>
+	</message>
+	<message name="notifyStatus">
+		<part name="parameters" element="tns:notifyStatus"/>
+	</message>
+	<message name="notifyStatusResponse">
+		<part name="parameters" element="tns:notifyStatusResponse"/>
+	</message>
+	<message name="getAsModels">
+		<part name="parameters" element="tns:getAsModels"/>
+	</message>
+	<message name="getAsModelsResponse">
+		<part name="parameters" element="tns:getAsModelsResponse"/>
+	</message>
+	<message name="getDataAsFile">
+		<part name="parameters" element="tns:getDataAsFile"/>
+	</message>
+	<message name="getDataAsFileResponse">
+		<part name="parameters" element="tns:getDataAsFileResponse"/>
+	</message>
+	<message name="getDataAsSpecificTypeFile">
+		<part name="parameters" element="tns:getDataAsSpecificTypeFile"/>
+	</message>
+	<message name="getDataAsSpecificTypeFileResponse">
+		<part name="parameters" element="tns:getDataAsSpecificTypeFileResponse"/>
+	</message>	
+	<message name="notifyDataAvailable">
+		<part name="parameters" element="tns:notifyDataAvailable"/>
+	</message>
+	<message name="notifyDataAvailableResponse">
+		<part name="parameters" element="tns:notifyDataAvailableResponse"/>
+	</message>
+	<message name="queryModel">
+		<part name="parameters" element="tns:queryModel"/>
+	</message>
+	<message name="queryModelResponse">
+		<part name="parameters" element="tns:queryModelResponse"/>
+	</message>
+	<portType name="Host">
+		<operation name="generateUID">
+			<input message="tns:generateUID"/>
+			<output message="tns:generateUIDResponse"/>
+		</operation>
+		<operation name="getAvailableScreen">
+			<input message="tns:getAvailableScreen"/>
+			<output message="tns:getAvailableScreenResponse"/>
+		</operation>
+		<operation name="getOutputDir">
+			<input message="tns:getOutputDir"/>
+			<output message="tns:getOutputDirResponse"/>
+		</operation>
+		<operation name="getTmpDir">
+			<input message="tns:getTmpDir"/>
+			<output message="tns:getTmpDirResponse"/>
+		</operation>
+		<operation name="notifyStateChanged">
+			<input message="tns:notifyStateChanged"/>
+			<output message="tns:notifyStateChangedResponse"/>
+		</operation>
+		<operation name="notifyStatus">
+			<input message="tns:notifyStatus"/>
+			<output message="tns:notifyStatusResponse"/>
+		</operation>
+		<operation name="getAsModels">
+			<input message="tns:getAsModels"/>
+			<output message="tns:getAsModelsResponse"/>
+		</operation>
+		<operation name="getDataAsFile">
+			<input message="tns:getDataAsFile"/>
+			<output message="tns:getDataAsFileResponse"/>
+		</operation>
+		<operation name="getDataAsSpecificTypeFile">
+			<input message="tns:getDataAsSpecificTypeFile"/>
+			<output message="tns:getDataAsSpecificTypeFileResponse"/>
+		</operation>		
+		<operation name="notifyDataAvailable">
+			<input message="tns:notifyDataAvailable"/>
+			<output message="tns:notifyDataAvailableResponse"/>
+		</operation>
+		<operation name="queryModel">
+			<input message="tns:queryModel"/>
+			<output message="tns:queryModelResponse"/>
+		</operation>
+	</portType>
+	<binding name="HostPortBinding" type="tns:Host">
+		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
+			style="document"/>
+		<operation name="generateUID">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getAvailableScreen">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getOutputDir">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getTmpDir">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="notifyStateChanged">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="notifyStatus">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getAsModels">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getDataAsFile">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="getDataAsSpecificTypeFile">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>		
+		<operation name="notifyDataAvailable">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+		<operation name="queryModel">
+			<soap:operation soapAction=""/>
+			<input>
+				<soap:body use="literal"/>
+			</input>
+			<output>
+				<soap:body use="literal"/>
+			</output>
+		</operation>
+	</binding>
+	<service name="HostService">
+		<port name="HostPort" binding="tns:HostPortBinding">
+			<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
+		</port>
+	</service>
+</definitions>

+ 315 - 0
Plugins/org.commontk.dicom.wg23.core/Resources/HostService_schema1.xsd

@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0"
+	targetNamespace="http://wg23.dicom.nema.org/"
+	xmlns:tns="http://wg23.dicom.nema.org/"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	
+	<xs:element name="generateUID" type="tns:generateUID"/>
+	<xs:element name="generateUIDResponse" type="tns:generateUIDResponse"/>
+	<xs:element name="getAsModels" type="tns:getAsModels"/>
+	<xs:element name="getAsModelsResponse" type="tns:getAsModelsResponse"/>
+	<xs:element name="getAvailableScreen" type="tns:getAvailableScreen"/>
+	<xs:element name="getAvailableScreenResponse"
+		type="tns:getAvailableScreenResponse"/>
+	<xs:element name="getDataAsFile" type="tns:getDataAsFile"/>
+	<xs:element name="getDataAsFileResponse" type="tns:getDataAsFileResponse"/>
+	<xs:element name="getDataAsSpecificTypeFile"
+		type="tns:getDataAsSpecificTypeFile"/>
+	<xs:element name="getDataAsSpecificTypeFileResponse"
+		type="tns:getDataAsSpecificTypeFileResponse"/>
+	<xs:element name="getOutputDir" type="tns:getOutputDir"/>
+	<xs:element name="getOutputDirResponse" type="tns:getOutputDirResponse"/>
+	<xs:element name="getTmpDir" type="tns:getTmpDir"/>
+	<xs:element name="getTmpDirResponse" type="tns:getTmpDirResponse"/>
+	<xs:element name="notifyDataAvailable" type="tns:notifyDataAvailable"/>
+	<xs:element name="notifyDataAvailableResponse"
+		type="tns:notifyDataAvailableResponse"/>
+	<xs:element name="notifyStateChanged" type="tns:notifyStateChanged"/>
+	<xs:element name="notifyStateChangedResponse"
+		type="tns:notifyStateChangedResponse"/>
+	<xs:element name="notifyStatus" type="tns:notifyStatus"/>
+	<xs:element name="notifyStatusResponse" type="tns:notifyStatusResponse"/>
+	<xs:element name="queryModel" type="tns:queryModel"/>
+	<xs:element name="queryModelResponse" type="tns:queryModelResponse"/>
+	
+	<xs:complexType name="getDataAsFile">
+		<xs:sequence>
+			<xs:element name="uuids" type="tns:ArrayOfUUID"/>
+			<xs:element name="includeBulkData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getDataAsFileResponse">
+		<xs:sequence>
+			<xs:element name="objectLocators" type="tns:ArrayOfObjectLocator"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getDataAsSpecificTypeFile">
+		<xs:sequence>
+			<xs:element name="objectUUIDs" type="tns:ArrayOfUUID"/>
+			<xs:element name="mimeType" type="xs:string"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+			<xs:element name="includeBulkData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getDataAsSpecificTypeFileResponse">
+		<xs:sequence>
+			<xs:element name="objectLocators" type="tns:ArrayOfObjectLocator"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="uuid">
+		<xs:sequence>
+			<xs:element name="uuid" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="objectLocator">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid"/>
+			<xs:element name="uri" type="xs:anyURI"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getAvailableScreen">
+		<xs:sequence>
+			<xs:element name="appPreferredScreen" type="tns:rectangle"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="rectangle">
+		<xs:sequence>
+			<xs:element name="refPointX" type="xs:int"/>
+			<xs:element name="refPointY" type="xs:int"/>
+			<xs:element name="width" type="xs:int"/>
+			<xs:element name="height" type="xs:int"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getAvailableScreenResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="tns:rectangle"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="notifyDataAvailable">
+		<xs:sequence>
+			<xs:element name="availableData" type="tns:availableData"/>
+			<xs:element name="lastData" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="availableData">
+		<xs:sequence>
+			<xs:element name="patients" type="tns:ArrayOfPatient"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="patient">
+		<xs:sequence>
+			<xs:element name="name" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+			<xs:element name="studies" type="tns:ArrayOfStudy"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="study">
+		<xs:sequence>
+			<xs:element name="studyUID" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+			<xs:element name="series" type="tns:ArrayOfSeries"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="series">
+		<xs:sequence>
+			<xs:element name="seriesUID" type="xs:string"/>
+			<xs:element name="objectDescriptors"
+				type="tns:ArrayOfObjectDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="modality">
+		<xs:sequence>
+			<xs:element name="modality" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="objectDescriptor">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid"/>
+			<xs:element name="mimeType" type="xs:string"/>
+			<xs:element name="classUID" type="tns:uid"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+			<xs:element name="modality" type="tns:modality"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="uid">
+		<xs:sequence>
+			<xs:element name="uid" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="notifyDataAvailableResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="queryModel">
+		<xs:sequence>
+			<xs:element name="objUUIDs" type="tns:ArrayOfUUID"/>
+			<xs:element name="modelXpaths" type="tns:ArrayOfString"/>
+			<xs:element name="includeBulkDataPointers" type="xs:boolean"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="queryModelResponse">
+		<xs:sequence>
+			<xs:element name="queryResults" type="tns:ArrayOfQueryResult"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="queryResult">
+		<xs:sequence>
+			<xs:element name="model" type="tns:uuid"/>
+			<xs:element name="xpath" type="xs:string"/>
+			<xs:element name="results" type="tns:ArrayOfString"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="getAsModels">
+		<xs:sequence>
+			<xs:element name="uuids" type="tns:ArrayOfUUID"/>
+			<xs:element name="classUID" type="tns:uid"/>
+			<xs:element name="transferSyntaxUID" type="tns:uid"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getAsModelsResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="tns:modelSetDescriptor"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="modelSetDescriptor">
+		<xs:sequence>
+			<xs:element name="models" type="tns:ArrayOfUUID"/>
+			<xs:element name="failedSourceObjects" type="tns:ArrayOfUUID"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="notifyStatus">
+		<xs:sequence>
+			<xs:element name="newStatus" type="tns:status"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="status">
+		<xs:sequence>
+			<xs:element name="codeValue" type="xs:int"/>
+			<xs:element name="codingSchemeDesignator" type="xs:string"/>
+			<xs:element name="message" type="xs:string"/>
+			<xs:element name="statusType" type="tns:statusType"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="notifyStatusResponse">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="notifyStateChanged">
+		<xs:sequence>
+			<xs:element name="newState" type="tns:state"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="notifyStateChangedResponse">
+		<xs:sequence/>
+	</xs:complexType>
+	
+	<xs:complexType name="getTmpDir">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="getTmpDirResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="generateUID">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="generateUIDResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="tns:uid"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="getOutputDir">
+		<xs:sequence/>
+	</xs:complexType>
+	<xs:complexType name="getOutputDirResponse">
+		<xs:sequence>
+			<xs:element name="retval" type="xs:string"/>
+		</xs:sequence>
+	</xs:complexType>
+	
+	<xs:complexType name="ArrayOfUUID">
+		<xs:sequence>
+			<xs:element name="uuid" type="tns:uuid" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfPatient">
+		<xs:sequence>
+			<xs:element name="patient" type="tns:patient" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfStudy">
+		<xs:sequence>
+			<xs:element name="study" type="tns:study" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfSeries">
+		<xs:sequence>
+			<xs:element name="series" type="tns:series" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfObjectLocator">
+		<xs:sequence>
+			<xs:element name="objectLocator" type="tns:objectLocator" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfObjectDescriptor">
+		<xs:sequence>
+			<xs:element name="objectDescriptor" type="tns:objectDescriptor"
+				minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfString">
+		<xs:sequence>
+			<xs:element name="string" type="xs:string" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfQueryResult">
+		<xs:sequence>
+			<xs:element name="queryResult" type="tns:queryResult" minOccurs="0"
+				maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="statusType">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="FATALERROR"/>
+			<xs:enumeration value="WARNING"/>
+			<xs:enumeration value="ERROR"/>
+			<xs:enumeration value="INFORMATION"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="state">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="EXIT"/>
+			<xs:enumeration value="CANCELED"/>
+			<xs:enumeration value="SUSPENDED"/>
+			<xs:enumeration value="COMPLETED"/>
+			<xs:enumeration value="INPROGRESS"/>
+			<xs:enumeration value="IDLE"/>
+		</xs:restriction>
+	</xs:simpleType>
+</xs:schema>

+ 8 - 0
Plugins/org.commontk.dicom.wg23.core/Resources/dah_wsdl.qrc

@@ -0,0 +1,8 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/dah">
+  <file>HostService.wsdl</file>
+  <file>ApplicationService.wsdl</file>
+</qresource>
+</RCC>
+
+

+ 3 - 3
Plugins/org.commontk.dicom.wg23.core/ctkDicomServicePrivate.cpp

@@ -42,7 +42,7 @@ void ctkDicomServicePrivate::responseReady()
 
 const QtSoapType & ctkDicomServicePrivate::askHost(const QString& methodName, QtSoapType* soapType )
 {
-  qDebug() << "Submitting request " << methodName;
+  qDebug() << "Submitting request " << methodName << " to path " << "/HostInterface";
 
   http.setAction(methodName);
 
@@ -54,9 +54,9 @@ const QtSoapType & ctkDicomServicePrivate::askHost(const QString& methodName, Qt
     qDebug() << "  Argument type is " << soapType->typeName();
   }
 
-  http.submitRequest(request, "/IHostService");
+  http.submitRequest(request, "/HostInterface");//"/IHostService");
 
-  qDebug() << "Submitted request " << methodName;
+  qDebug() << "Submitted request " << methodName ;
 
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 

+ 4 - 0
Plugins/org.commontk.dicom.wg23.core/ctkSimpleSoapServer.cpp

@@ -39,5 +39,9 @@ void ctkSimpleSoapServer::incomingConnection(int socketDescriptor)
           this, SIGNAL(incomingSoapMessage(QtSoapMessage, QtSoapMessage*)),
           Qt::BlockingQueuedConnection);
 
+  connect(runnable, SIGNAL(incomingWSDLMessage(QString,QString*)),
+          this, SIGNAL(incomingWSDLMessage(QString, QString*)),
+          Qt::BlockingQueuedConnection);
+
   QThreadPool::globalInstance()->start(runnable);
 }

+ 1 - 0
Plugins/org.commontk.dicom.wg23.core/ctkSimpleSoapServer.h

@@ -41,6 +41,7 @@ public:
 signals:
 
   void incomingSoapMessage(const QtSoapMessage& message, QtSoapMessage* reply);
+  void incomingWSDLMessage(const QString& message, QString* reply);
 
 public slots:
 

+ 44 - 28
Plugins/org.commontk.dicom.wg23.core/ctkSoapConnectionRunnable.cpp

@@ -56,51 +56,67 @@ void ctkSoapConnectionRunnable::run()
 
 void ctkSoapConnectionRunnable::readClient(QTcpSocket& socket)
 {
+  bool wsdlRequest = false;
   //qDebug() << socket->readAll();
   while (socket.canReadLine()) {
     QString line = socket.readLine();
     qDebug() << line;
+    if(line.contains("?wsdl HTTP"))
+    {
+      wsdlRequest = true;
+    }
     if (line.trimmed().isEmpty())
     {
-      // Read the http body, which contains the soap message
-      QByteArray body = socket.readAll();
-      qDebug() << body;
-
-      if (body.trimmed().isEmpty())
-      {
-        qDebug() << "Message body empty";
-        return;
-      }
-
-      QtSoapMessage msg;
-      if (!msg.setContent(body))
+      QString content;
+      if(wsdlRequest)
       {
-        qDebug() << "QtSoap import failed:" << msg.errorString();
-        return;
+        wsdlRequest = false;
+        emit incomingWSDLMessage("wsdl", &content);
       }
-
-      QtSoapMessage reply;
-      emit incomingSoapMessage(msg, &reply);
-
-      if (reply.isFault())
+      else
       {
-        qDebug() << "QtSoap reply faulty";
-        return;
+        // Read the http body, which contains the soap message
+        QByteArray body = socket.readAll();
+        qDebug() << body;
+
+        if (body.trimmed().isEmpty())
+        {
+          qDebug() << "Message body empty";
+          content = "";
+        }
+        else
+        {
+          QtSoapMessage msg;
+          if (!msg.setContent(body))
+          {
+            qDebug() << "QtSoap import failed:" << msg.errorString();
+            return;
+          }
+
+          QtSoapMessage reply;
+          emit incomingSoapMessage(msg, &reply);
+
+          if (reply.isFault())
+          {
+            qDebug() << "QtSoap reply faulty";
+            return;
+          }
+
+          qDebug() << "SOAP reply:";
+
+          content = reply.toXmlString();
+        }
       }
 
-      qDebug() << "SOAP reply:";
-
-      QString soapContent = reply.toXmlString();
-
       QByteArray block;
       block.append("HTTP/1.1 200 OK\n");
       block.append("Content-Type: text/xml;charset=utf-8\n");
-      block.append("Content-Length: ").append(QString::number(soapContent.size())).append("\n");
+      block.append("Content-Length: ").append(QString::number(content.size())).append("\n");
       block.append("\n");
 
-      block.append(soapContent);
+      block.append(content);
 
-      qDebug() << block;
+      //qDebug() << block;
 
       socket.write(block);
 

+ 1 - 0
Plugins/org.commontk.dicom.wg23.core/ctkSoapConnectionRunnable_p.h

@@ -43,6 +43,7 @@ public:
 signals:
 
   void incomingSoapMessage(const QtSoapMessage& message, QtSoapMessage* reply);
+  void incomingWSDLMessage(const QString& message, QString* reply);
 
 private:
 

+ 19 - 0
Plugins/org.commontk.dicom.wg23.host/ctkDicomHostServerPrivate.cpp

@@ -33,6 +33,8 @@ ctkDicomHostServerPrivate::ctkDicomHostServerPrivate(ctkDicomHostInterface* host
 {
   connect(&server, SIGNAL(incomingSoapMessage(QtSoapMessage,QtSoapMessage*)),
           this, SLOT(incomingSoapMessage(QtSoapMessage,QtSoapMessage*)));
+  connect(&server, SIGNAL(incomingWSDLMessage(QString,QString*)),
+          this, SLOT(incomingWSDLMessage(QString,QString*)));
 
   if (!server.listen(QHostAddress::LocalHost, this->port))
   {
@@ -40,6 +42,23 @@ ctkDicomHostServerPrivate::ctkDicomHostServerPrivate(ctkDicomHostInterface* host
   }
 }
 
+void ctkDicomHostServerPrivate::incomingWSDLMessage(
+  const QString& message, QString* reply)
+{
+  if (message == "wsdl")
+  {
+    QFile wsdlfile(":/dah/HostService.wsdl");
+    wsdlfile.open(QFile::ReadOnly | QFile::Text);
+    if(wsdlfile.isOpen())
+    {
+      QTextStream textstream(&wsdlfile);
+      *reply = textstream.readAll();
+      reply->replace("REPLACE_WITH_ACTUAL_URL","http://127.0.0.1:8080/HostInterface");
+      reply->replace("HostService_schema1.xsd","http://127.0.0.1:8080/HostInterface?xsd=1");
+    }
+  }
+}
+
 void ctkDicomHostServerPrivate::incomingSoapMessage(
   const QtSoapMessage& message, QtSoapMessage* reply)
 {

+ 1 - 0
Plugins/org.commontk.dicom.wg23.host/ctkDicomHostServerPrivate.h

@@ -45,6 +45,7 @@ public slots:
 
   void incomingSoapMessage(const QtSoapMessage& message,
                            QtSoapMessage* reply);
+  void incomingWSDLMessage(const QString& message, QString* reply);
 
 private: