20#include <com/sun/star/lang/XServiceInfo.hpp>
21#include <com/sun/star/xml/sax/XParser.hpp>
22#include <com/sun/star/xml/sax/FastParser.hpp>
23#include <com/sun/star/lang/XInitialization.hpp>
24#include <com/sun/star/beans/Pair.hpp>
33using namespace ::
cppu;
37using namespace xml::sax;
42class NamespaceHandler :
public WeakImplHelper< XFastNamespaceHandler >
45 struct NamespaceDefine
48 OUString m_aNamespaceURI;
50 NamespaceDefine( OUString aPrefix, OUString aNamespaceURI ) : m_aPrefix(
std::move( aPrefix )), m_aNamespaceURI(
std::move( aNamespaceURI )) {}
52 std::vector< std::unique_ptr< NamespaceDefine > > m_aNamespaceDefines;
59 virtual void SAL_CALL registerNamespace(
const OUString& rNamespacePrefix,
const OUString& rNamespaceURI )
override;
60 virtual OUString SAL_CALL getNamespaceURI(
const OUString& rNamespacePrefix )
override;
63NamespaceHandler::NamespaceHandler()
69 for(
const auto& aNamespaceDefine : m_aNamespaceDefines)
71 OUString& rPrefix = aNamespaceDefine->m_aPrefix;
72 OUString& rNamespaceURI = aNamespaceDefine->m_aNamespaceURI;
74 if ( rPrefix.isEmpty() )
77 sDecl =
"xmlns:" + rPrefix;
78 rAttrList->AddAttribute( sDecl, rNamespaceURI );
80 m_aNamespaceDefines.clear();
83void NamespaceHandler::registerNamespace(
const OUString& rNamespacePrefix,
const OUString& rNamespaceURI )
85 m_aNamespaceDefines.push_back( std::make_unique<NamespaceDefine>(
86 rNamespacePrefix, rNamespaceURI) );
89OUString NamespaceHandler::getNamespaceURI(
const OUString& )
94class SaxLegacyFastParser :
public WeakImplHelper< XInitialization, XServiceInfo, XParser >
99 SaxLegacyFastParser();
102 virtual void SAL_CALL initialize(css::uno::Sequence<css::uno::Any>
const& rArguments)
override;
105 virtual void SAL_CALL parseStream(
const InputSource& structSource)
override;
106 virtual void SAL_CALL setDocumentHandler(
const Reference< XDocumentHandler > & xHandler)
override;
107 virtual void SAL_CALL setErrorHandler(
const Reference< XErrorHandler > & xHandler)
override;
108 virtual void SAL_CALL setDTDHandler(
const Reference < XDTDHandler > & xHandler)
override;
109 virtual void SAL_CALL setEntityResolver(
const Reference< XEntityResolver >& xResolver)
override;
110 virtual void SAL_CALL
setLocale(
const Locale &locale )
override;
119 Reference< XDocumentHandler > m_xDocumentHandler;
120 Reference< XFastTokenHandler > m_xTokenHandler;
125class CallbackDocumentHandler :
public WeakImplHelper< XFastDocumentHandler >
128 Reference< XDocumentHandler > m_xDocumentHandler;
129 Reference< XFastTokenHandler > m_xTokenHandler;
131 OUString getNamespacePrefixFromToken( sal_Int32 nToken );
132 OUString getNameFromToken( sal_Int32 nToken );
134 static constexpr OUStringLiteral aDefaultNamespace =
u"";
135 static constexpr OUStringLiteral aNamespaceSeparator =
u":";
138 CallbackDocumentHandler( Reference< XDocumentHandler >
const & xDocumentHandler,
140 Reference< XFastTokenHandler >
const & xTokenHandler);
143 virtual void SAL_CALL startDocument()
override;
144 virtual void SAL_CALL endDocument()
override;
145 virtual void SAL_CALL processingInstruction(
const OUString& rTarget,
const OUString& rData )
override;
146 virtual void SAL_CALL setDocumentLocator(
const Reference< XLocator >& xLocator )
override;
149 virtual void SAL_CALL startFastElement( sal_Int32 nElement,
const Reference< XFastAttributeList >& Attribs )
override;
150 virtual void SAL_CALL startUnknownElement(
const OUString& Namespace,
const OUString& Name,
const Reference< XFastAttributeList >& Attribs )
override;
151 virtual void SAL_CALL endFastElement( sal_Int32 Element )
override;
152 virtual void SAL_CALL endUnknownElement(
const OUString& Namespace,
const OUString& Name )
override;
153 virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 nElement,
const Reference< XFastAttributeList >& Attribs )
override;
154 virtual Reference< XFastContextHandler > SAL_CALL createUnknownChildContext(
const OUString& Namespace,
const OUString& Name,
const Reference< XFastAttributeList >& Attribs )
override;
155 virtual void SAL_CALL characters(
const OUString& aChars )
override;
159OUString CallbackDocumentHandler::getNamespacePrefixFromToken( sal_Int32 nToken )
161 if ( ( nToken & 0xffff0000 ) != 0 )
164 return OUString(
reinterpret_cast< const char*
>(
165 aSeq.getConstArray() ),
aSeq.getLength(), RTL_TEXTENCODING_UTF8 );
171OUString CallbackDocumentHandler::getNameFromToken( sal_Int32 nToken )
174 return OUString(
reinterpret_cast< const char*
>(
175 aSeq.getConstArray() ),
aSeq.getLength(), RTL_TEXTENCODING_UTF8 );
178CallbackDocumentHandler::CallbackDocumentHandler( Reference< XDocumentHandler >
const & xDocumentHandler,
180 Reference< XFastTokenHandler >
const & xTokenHandler)
182 m_xDocumentHandler.set( xDocumentHandler );
183 m_aNamespaceHandler = rNamespaceHandler;
184 m_xTokenHandler.set( xTokenHandler );
187void SAL_CALL CallbackDocumentHandler::startDocument()
189 if ( m_xDocumentHandler.is() )
190 m_xDocumentHandler->startDocument();
193void SAL_CALL CallbackDocumentHandler::endDocument()
195 if ( m_xDocumentHandler.is() )
196 m_xDocumentHandler->endDocument();
199void SAL_CALL CallbackDocumentHandler::processingInstruction(
const OUString& rTarget,
const OUString& rData )
201 if ( m_xDocumentHandler.is() )
202 m_xDocumentHandler->processingInstruction( rTarget, rData );
205void SAL_CALL CallbackDocumentHandler::setDocumentLocator(
const Reference< XLocator >& xLocator )
207 if ( m_xDocumentHandler.is() )
208 m_xDocumentHandler->setDocumentLocator( xLocator );
211void SAL_CALL CallbackDocumentHandler::startFastElement( sal_Int32 nElement ,
const Reference< XFastAttributeList >& Attribs )
213 const OUString& rPrefix = CallbackDocumentHandler::getNamespacePrefixFromToken( nElement );
214 const OUString& rLocalName = CallbackDocumentHandler::getNameFromToken( nElement );
215 startUnknownElement( aDefaultNamespace, (rPrefix.isEmpty())? rLocalName : rPrefix + aNamespaceSeparator + rLocalName, Attribs );
218void SAL_CALL CallbackDocumentHandler::startUnknownElement(
const OUString& ,
const OUString& Name,
const Reference< XFastAttributeList >& Attribs )
220 if ( !m_xDocumentHandler.is() )
224 m_aNamespaceHandler->addNSDeclAttributes( rAttrList );
226 const Sequence< xml::FastAttribute > fastAttribs = Attribs->getFastAttributes();
227 for (
const auto& rAttr : fastAttribs)
229 const OUString& rAttrValue = rAttr.Value;
230 sal_Int32
nToken = rAttr.Token;
231 const OUString& rAttrNamespacePrefix = CallbackDocumentHandler::getNamespacePrefixFromToken( nToken );
232 OUString sAttrName = CallbackDocumentHandler::getNameFromToken( nToken );
233 if ( !rAttrNamespacePrefix.isEmpty() )
234 sAttrName = rAttrNamespacePrefix + aNamespaceSeparator + sAttrName;
236 rAttrList->AddAttribute( sAttrName, rAttrValue );
239 const Sequence< xml::Attribute > unknownAttribs = Attribs->getUnknownAttributes();
240 for (
const auto& rAttr : unknownAttribs)
242 const OUString& rAttrValue = rAttr.Value;
243 const OUString& rAttrName = rAttr.Name;
245 rAttrList->AddAttribute( rAttrName, rAttrValue );
247 m_xDocumentHandler->startElement( Name, rAttrList );
250void SAL_CALL CallbackDocumentHandler::endFastElement( sal_Int32 nElement )
252 const OUString& rPrefix = CallbackDocumentHandler::getNamespacePrefixFromToken( nElement );
253 const OUString& rLocalName = CallbackDocumentHandler::getNameFromToken( nElement );
254 endUnknownElement( aDefaultNamespace, (rPrefix.isEmpty())? rLocalName : rPrefix + aNamespaceSeparator + rLocalName );
258void SAL_CALL CallbackDocumentHandler::endUnknownElement(
const OUString& ,
const OUString& Name )
260 if ( m_xDocumentHandler.is() )
262 m_xDocumentHandler->endElement( Name );
266Reference< XFastContextHandler > SAL_CALL CallbackDocumentHandler::createFastChildContext( sal_Int32,
const Reference< XFastAttributeList >& )
272Reference< XFastContextHandler > SAL_CALL CallbackDocumentHandler::createUnknownChildContext(
const OUString&,
const OUString&,
const Reference< XFastAttributeList >& )
277void SAL_CALL CallbackDocumentHandler::characters(
const OUString& aChars )
279 if ( m_xDocumentHandler.is() )
280 m_xDocumentHandler->characters( aChars );
283SaxLegacyFastParser::SaxLegacyFastParser( ) : m_aNamespaceHandler( new NamespaceHandler ),
286 m_xParser->setNamespaceHandler( m_aNamespaceHandler );
289void SAL_CALL SaxLegacyFastParser::initialize(Sequence< Any >
const& rArguments )
291 if (!rArguments.hasElements())
294 Reference< XFastTokenHandler > xTokenHandler;
296 if ( ( rArguments[0] >>= xTokenHandler ) && xTokenHandler.is() )
298 m_xTokenHandler.set( xTokenHandler );
300 else if ( ( rArguments[0] >>= str ) &&
"registerNamespaces" == str )
302 css::beans::Pair< OUString, sal_Int32 > rPair;
303 for (sal_Int32 i = 1;
i < rArguments.getLength();
i++ )
305 rArguments[
i] >>= rPair;
306 m_xParser->registerNamespace( rPair.First, rPair.Second );
311 uno::Reference<lang::XInitialization>
const xInit(
m_xParser,
312 uno::UNO_QUERY_THROW);
313 xInit->initialize( rArguments );
317void SaxLegacyFastParser::parseStream(
const InputSource& structSource )
319 m_xParser->setFastDocumentHandler(
new CallbackDocumentHandler( m_xDocumentHandler,
320 m_aNamespaceHandler, m_xTokenHandler ) );
321 m_xParser->setTokenHandler( m_xTokenHandler );
325void SaxLegacyFastParser::setDocumentHandler(
const Reference< XDocumentHandler > & xHandler )
327 m_xDocumentHandler = xHandler;
330void SaxLegacyFastParser::setErrorHandler(
const Reference< XErrorHandler > & xHandler )
335void SaxLegacyFastParser::setDTDHandler(
const Reference < XDTDHandler > & )
340void SaxLegacyFastParser::setEntityResolver(
const Reference< XEntityResolver >& xResolver )
342 m_xParser->setEntityResolver( xResolver );
345void SaxLegacyFastParser::setLocale(
const Locale &locale )
350OUString SaxLegacyFastParser::getImplementationName()
352 return "com.sun.star.comp.extensions.xml.sax.LegacyFastParser";
355sal_Bool SaxLegacyFastParser::supportsService(
const OUString& ServiceName)
360Sequence< OUString > SaxLegacyFastParser::getSupportedServiceNames()
362 return {
"com.sun.star.xml.sax.LegacyFastParser" };
367extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
369 css::uno::XComponentContext *,
370 css::uno::Sequence<css::uno::Any>
const &)
372 return cppu::acquire(
new SaxLegacyFastParser);
rtl::Reference< ParserThread > m_xParser
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_extensions_xml_sax_LegacyFastParser_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
Sequence< sal_Int8 > aSeq
void setLocale(const LanguageTag &languageTag)
Reference< XComponentContext > getProcessComponentContext()
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
css::uno::Reference< css::deployment::XPackageRegistry > create(css::uno::Reference< css::deployment::XPackageRegistry > const &xRootRegistry, OUString const &context, OUString const &cachePath, css::uno::Reference< css::uno::XComponentContext > const &xComponentContext)