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


XSD_QName::XSD_QName()
{
}

XSD_QName::~XSD_QName()
{
}

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

xsd__QName XSD_QName::asNonNillableElement(xsd__QName Value0)  
{
	return Value0;
}
xsd__QName XSD_QName::asNillableElement(xsd__QName Value0)  
{
	return Value0;
}
RequiredAttributeElement* XSD_QName::asRequiredAttribute(RequiredAttributeElement* Value0)  
{
	return Value0;
}
OptionalAttributeElement* XSD_QName::asOptionalAttribute(OptionalAttributeElement* Value0)  
{
	return Value0;
}
xsd__QName_Array * XSD_QName::asArray(xsd__QName_Array * Value0)  
{
	return Value0;
}
SimpleComplexType* XSD_QName::asComplexType(SimpleComplexType* Value0)  
{
	return Value0;
}
