/*
 * 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 "InteropTestPortTypeDoc.hpp"


InteropTestPortTypeDoc::InteropTestPortTypeDoc()
{
}

InteropTestPortTypeDoc::~InteropTestPortTypeDoc()
{
}

/* 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 InteropTestPortTypeDoc::onFault()
{
}

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