/*
 * Copyright 1999-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.
 */

#include "XSLTInputSource.hpp"



#include <cassert>

#if !defined(XALAN_CLASSIC_IOSTREAMS)
#include <istream>
#endif



#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
#include <xalanc/PlatformSupport/StdBinInputStream.hpp>
#include <xalanc/PlatformSupport/URISupport.hpp>



XALAN_CPP_NAMESPACE_BEGIN



XSLTInputSource::XSLTInputSource(MemoryManager&     theMemoryManager) :
	InputSource(&theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



// $$$ ToDo:  Xerces' InputSource class does not yet have a copy
// constructor or assignment operator.  See bug #7944.
XSLTInputSource::XSLTInputSource(
            const XSLTInputSource&	theSource,
            MemoryManager&          theMemoryManager) :
	InputSource(&theMemoryManager),
	m_stream(theSource.m_stream),
	m_node(theSource.m_node)
{
	setIssueFatalErrorIfNotFound(theSource.getIssueFatalErrorIfNotFound());

	const XMLCh*	theValue = theSource.getSystemId();

	if (theValue != 0)
	{
		setSystemId(theValue);
	}

	theValue = theSource.getPublicId();

	if (theValue != 0)
	{
		setPublicId(theValue);
	}

	theValue = theSource.getEncoding();

	if (theValue != 0)
	{
		setEncoding(theValue);
	}
}



XSLTInputSource&
XSLTInputSource::operator=(const XSLTInputSource&	theRHS)
{
	if (this != &theRHS)
	{
		m_stream = theRHS.m_stream;
		m_node = theRHS.m_node;

		setIssueFatalErrorIfNotFound(theRHS.getIssueFatalErrorIfNotFound());

		const XMLCh*	theValue = theRHS.getSystemId();

		if (theValue != 0)
		{
			setSystemId(theValue);
		}

		theValue = theRHS.getPublicId();

		if (theValue != 0)
		{
			setPublicId(theValue);
		}

		theValue = theRHS.getEncoding();

		if (theValue != 0)
		{
			setEncoding(theValue);
		}

	}

	return *this;
}



XSLTInputSource::XSLTInputSource(
            const XMLCh*	systemId,
            MemoryManager&  theMemoryManager) :
	InputSource(
        systemId,
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
            const XalanDOMString&	systemId,
            MemoryManager&          theMemoryManager) :
	InputSource(
        systemId.c_str(),
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
			const XMLCh*	systemId,
			const XMLCh*	publicId,
            MemoryManager&  theMemoryManager) :
	InputSource(
        systemId,
        publicId,
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
			const XalanDOMString&	systemId,
			const XalanDOMString&	publicId,
            MemoryManager&          theMemoryManager) :
	InputSource(
        systemId.c_str(),
        publicId.c_str(),
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
            const char*     systemId,
            MemoryManager&  theMemoryManager) :
	InputSource(
        systemId,
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
			const char*		systemId,
			const char*		publicId,
            MemoryManager&  theMemoryManager) :
	InputSource(
        systemId,
		publicId,
        &theMemoryManager),
	m_stream(0),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
            XalanNode*		node,
            MemoryManager&  theMemoryManager) :
	InputSource(&theMemoryManager),
	m_stream(0),
	m_node(node)
{
}



XSLTInputSource::XSLTInputSource(
            StreamType*	    stream,
            MemoryManager&  theMemoryManager) :
	InputSource(&theMemoryManager),
	m_stream(stream),
	m_node(0)
{
}



XSLTInputSource::XSLTInputSource(
            StreamType&	    stream,
            MemoryManager&  theMemoryManager) :
	InputSource(&theMemoryManager),
	m_stream(&stream),
	m_node(0)
{
}



BinInputStreamType*
XSLTInputSource::makeStream() const
{
	BinInputStreamType*		theResult = 0;

    MemoryManagerType*  theManager = getMemoryManager();

    assert(theManager != 0 );

	if (m_stream != 0)
	{
        
		theResult = new (theManager) StdBinInputStream(*m_stream);
	}
	else if (m_node == 0)
	{
		const XalanDOMChar* const	theSystemId = getSystemId();

		if (theSystemId != 0)
		{
            XALAN_USING_XERCES(XMLURL)

			XMLURL  theURL(theManager);

			URISupport::getURLFromString(theSystemId, theURL, *theManager);

			theResult = theURL.makeNewStream();
		}
	}

	return theResult;
}



XALAN_CPP_NAMESPACE_END
