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


XSD_language::XSD_language()
{
}

XSD_language::~XSD_language()
{
}

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

xsd__language XSD_language::asNonNillableElement(xsd__language Value0)  
{
	return Value0;
}
xsd__language XSD_language::asNillableElement(xsd__language Value0)  
{
	return Value0;
}
RequiredAttributeElement* XSD_language::asRequiredAttribute(RequiredAttributeElement* Value0)  
{
	return Value0;
}
OptionalAttributeElement* XSD_language::asOptionalAttribute(OptionalAttributeElement* Value0)  
{
	return Value0;
}
xsd__language_Array * XSD_language::asArray(xsd__language_Array * Value0)  
{
	return Value0;
}
SimpleComplexType* XSD_language::asComplexType(SimpleComplexType* Value0)  
{
	return Value0;
}
