// Copyright 2003-2004 The Apache Software Foundation.
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//        http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*
 * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
 * This file contains definitions of the web service
 */

#include "InteropTestPortType.hpp"


InteropTestPortType::InteropTestPortType()
{
}

InteropTestPortType::~InteropTestPortType()
{
}

/* This function is called by the AxisEngine when something went wrong
 with the current web service request processing. Appropriate actions should
 be taken here.*/
void InteropTestPortType::onFault()
{
}

xsd__string InteropTestPortType::echoString(xsd__string Value0)  
{	return Value0;
}
xsd__string_Array InteropTestPortType::echoStringArray(xsd__string_Array Value0)  
{	return Value0;
}
int InteropTestPortType::echoInteger(int Value0)  
{	return Value0;
}
xsd__int_Array InteropTestPortType::echoIntegerArray(xsd__int_Array Value0)  
{	return Value0;
}
float InteropTestPortType::echoFloat(float Value0)  
{	return Value0;
}
xsd__float_Array InteropTestPortType::echoFloatArray(xsd__float_Array Value0)  
{	return Value0;
}
SOAPStruct* InteropTestPortType::echoStruct(SOAPStruct* Value0)  
{	return Value0;
}
SOAPStruct_Array InteropTestPortType::echoStructArray(SOAPStruct_Array Value0)  
{	return Value0;
}
void InteropTestPortType::echoVoid()  
{
}
xsd__base64Binary InteropTestPortType::echoBase64(xsd__base64Binary Value0)  
{	return Value0;
}
xsd__dateTime InteropTestPortType::echoDate(xsd__dateTime Value0)  
{	return Value0;
}
xsd__hexBinary InteropTestPortType::echoHexBinary(xsd__hexBinary Value0)  
{	return Value0;
}
xsd__decimal InteropTestPortType::echoDecimal(xsd__decimal Value0)  
{	return Value0;
}
xsd__boolean InteropTestPortType::echoBoolean(xsd__boolean Value0)  
{	return Value0;
}
