blob: 238c940af555417b375231c08a49f92ef373ff85 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 "XalanXMLSerializerFactory.hpp"
#include "xalanc/PlatformSupport/XalanTranscodingServices.hpp"
#include "xalanc/XMLSupport/FormatterToXML.hpp"
#include "xalanc/XMLSupport/FormatterToXMLUnicode.hpp"
#include "xalanc/XMLSupport/XalanDummyIndentWriter.hpp"
#include "xalanc/XMLSupport/XalanIndentWriter.hpp"
#include "xalanc/XMLSupport/XalanOtherEncodingWriter.hpp"
#include "xalanc/XMLSupport/XalanUTF8Writer.hpp"
#include "xalanc/XMLSupport/XalanUTF16Writer.hpp"
namespace XALAN_CPP_NAMESPACE {
FormatterListener*
XalanXMLSerializerFactory::create(
MemoryManager& theManager,
Writer& theWriter,
const XalanDOMString& theVersion,
bool doIndent,
int theIndentAmount,
const XalanDOMString& theEncoding,
const XalanDOMString& /*theMediaType*/,
const XalanDOMString& theDoctypeSystem,
const XalanDOMString& theDoctypePublic,
bool generateXMLDeclaration,
const XalanDOMString& theStandaloneString)
{
bool isVersion1_1 = false;
if (theVersion == XalanXMLSerializerBase::s_1_1String)
{
isVersion1_1 = true;
}
XalanDOMString fixedEncoding(theEncoding, theManager);
setEncoding(theManager, theWriter, fixedEncoding);
FormatterListener* theFormatter = 0;
if (XalanTranscodingServices::encodingIsUTF8(fixedEncoding))
{
if (isVersion1_1 == true)
{
if(doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF8Writer> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF8Writer> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF8Writer,
XalanXMLSerializerBase::UTF8,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else // doIndent == false
{
typedef XalanDummyIndentWriter<XalanUTF8Writer> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF8Writer,
XalanXMLSerializerBase::UTF8,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
else // XML 1.0 section
{
if(doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF8Writer> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF8Writer> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF8Writer,
XalanXMLSerializerBase::UTF8,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else // doIndent == false
{
typedef XalanDummyIndentWriter<XalanUTF8Writer> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF8Writer,
XalanXMLSerializerBase::UTF8,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
}
else if (XalanTranscodingServices::encodingIsUTF16(fixedEncoding))
{
if (isVersion1_1 == true)
{
if(doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF16Writer> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF16Writer> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter, NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF16Writer,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else //doIndent == false
{
typedef XalanDummyIndentWriter<XalanUTF16Writer> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF16Writer,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
else // XML 1.0 section
{
if(doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<XalanUTF16Writer> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<XalanUTF16Writer> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF16Writer,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else // doIndent == false
{
typedef XalanDummyIndentWriter<XalanUTF16Writer> IndentWriter;
typedef FormatterToXMLUnicode<
XalanUTF16Writer,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
}
else // all other encodings
{
typedef XalanOtherEncodingWriter< XalanFormatterWriter::CommonRepresentableCharFunctor,
XalanXMLSerializerBase::UTF16> WriterType ;
if( isVersion1_1 == true)
{
if (doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<WriterType> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<WriterType> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
WriterType,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else
{
typedef XalanDummyIndentWriter<WriterType> IndentWriter;
typedef FormatterToXMLUnicode<
WriterType,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_1,
IndentWriter,
FormatterListener::XML_VERSION_1_1> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
else // XML 1.0 section
{
if(doIndent == true)
{
typedef XalanFormatterWriter::NewLineWriterFunctor<WriterType> NewLineWriter;
typedef XalanFormatterWriter::WhiteSpaceWriterFunctor<WriterType> WhiteSpaceWriter;
typedef XalanIndentWriter<WhiteSpaceWriter,NewLineWriter> IndentWriter;
typedef FormatterToXMLUnicode<
WriterType,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
else //doIndent == false
{
typedef XalanDummyIndentWriter<WriterType> IndentWriter;
typedef FormatterToXMLUnicode<
WriterType,
XalanXMLSerializerBase::UTF16,
XalanXMLSerializerBase::CharFunctor1_0,
IndentWriter,
FormatterListener::XML_VERSION_1_0> Type;
theFormatter =
Type::create(
theManager,
theWriter,
fixedEncoding,
theDoctypeSystem,
theDoctypePublic,
generateXMLDeclaration,
theStandaloneString,
theIndentAmount);
}
}
}
assert (theFormatter != 0);
return theFormatter;
}
void
XalanXMLSerializerFactory::setEncoding(
MemoryManager& theManager,
Writer& theWriter,
XalanDOMString& theEncoding)
{
XalanOutputStream* const stream = theWriter.getStream();
if(stream != 0)
{
if(theEncoding.empty())
{
// Default to UTF-8 if the requested encoding is not supported...
stream->setOutputEncoding(XalanDOMString(XalanTranscodingServices::s_utf8String, theManager));
theEncoding = XalanTranscodingServices::s_utf8String;
}
else
{
try
{
stream->setOutputEncoding(theEncoding);
}
catch(const XalanOutputStream::UnsupportedEncodingException&)
{
// Default to UTF-8 if the requested encoding is not supported...
stream->setOutputEncoding(XalanDOMString(XalanTranscodingServices::s_utf8String, theManager));
theEncoding = XalanTranscodingServices::s_utf8String;
}
}
}
}
}