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


XSDElement::XSDElement()
{
}

XSDElement::~XSDElement()
{
}

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

xsd__int XSDElement::setGetDataInt(xsd__int Value0)  
{
	return Value0;
}
xsd__unsignedInt XSDElement::setGetDataUnsignedInt(xsd__unsignedInt Value0)  
{
	return Value0;
}
xsd__long XSDElement::setGetDataLong(xsd__long Value0)  
{
	return Value0;
}
xsd__unsignedLong XSDElement::setGetDataUnsignedLong(xsd__unsignedLong Value0)  
{
	return Value0;
}
xsd__double XSDElement::setGetDataDouble(xsd__double Value0)  
{
	return Value0;
}
xsd__float XSDElement::setGetDataFloat(xsd__float Value0)  
{
	return Value0;
}
xsd__byte XSDElement::setGetDataByte(xsd__byte Value0)  
{
	return Value0;
}
xsd__unsignedByte XSDElement::setGetDataUnsignedByte(xsd__unsignedByte Value0)  
{
	return Value0;
}
xsd__boolean XSDElement::setGetDataBoolean(xsd__boolean Value0)  
{
	return Value0;
}
xsd__string XSDElement::setGetDataString(xsd__string Value0)  
{
	return Value0;
}
xsd__short XSDElement::setGetDataShort(xsd__short Value0)  
{
	return Value0;
}
xsd__unsignedShort XSDElement::setGetDataUnsignedShort(xsd__unsignedShort Value0)  
{
	return Value0;
}
xsd__dateTime XSDElement::setGetDateTimeType(xsd__dateTime Value0)  
{
	return Value0;
}
xsd__date XSDElement::setGetDateType(xsd__date Value0)  
{
	return Value0;
}
xsd__duration XSDElement::setGetDataDurationType(xsd__duration Value0)  
{
	return Value0;
}
xsd__time XSDElement::setGetTimeType(xsd__time Value0)  
{
	return Value0;
}
xsd__base64Binary XSDElement::setGetBase64BinaryType(xsd__base64Binary Value0)  
{
	return Value0;
}
xsd__hexBinary XSDElement::setGetHexBinary(xsd__hexBinary Value0)  
{
	return Value0;
}
xsd__decimal XSDElement::setGetDecimalType(xsd__decimal Value0)  
{
	return Value0;
}
xsd__integer XSDElement::setGetIntegerType(xsd__integer Value0)  
{
	return Value0;
}
void XSDElement::setQNameType(xsd__QName Value0)  
{
}
xsd__QName XSDElement::getQNameType()  
{
	return NULL;
}
void XSDElement::setAnyURIType(xsd__anyURI Value0)  
{
}
xsd__anyURI XSDElement::getAnyURIType()  
{
	return NULL;
}
