Kaydet (Commit) fcb1e4d8 authored tarafından Michael Stahl's avatar Michael Stahl

fdo#60471: svgio, sax: enable internal entity declarations for SVG

Change-Id: I147acac61dfe0b626268fe1e600dcf641ca63a0c
üst 2f4bd9d4
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <osl/diagnose.h> #include <osl/diagnose.h>
#include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/util/XCloneable.hpp> #include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
#include <com/sun/star/xml/sax/XParser.hpp> #include <com/sun/star/xml/sax/XParser.hpp>
#include <com/sun/star/xml/sax/SAXParseException.hpp> #include <com/sun/star/xml/sax/SAXParseException.hpp>
...@@ -32,8 +32,7 @@ ...@@ -32,8 +32,7 @@
#include <cppuhelper/factory.hxx> #include <cppuhelper/factory.hxx>
#include <cppuhelper/weak.hxx> #include <cppuhelper/weak.hxx>
#include <cppuhelper/implbase1.hxx> #include <cppuhelper/implbase3.hxx>
#include <cppuhelper/implbase2.hxx>
#include <expat.h> #include <expat.h>
...@@ -45,7 +44,6 @@ using namespace ::com::sun::star::uno; ...@@ -45,7 +44,6 @@ using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang; using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::registry; using namespace ::com::sun::star::registry;
using namespace ::com::sun::star::xml::sax; using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::io; using namespace ::com::sun::star::io;
#include "factory.hxx" #include "factory.hxx"
...@@ -136,11 +134,10 @@ class SaxExpatParser_Impl; ...@@ -136,11 +134,10 @@ class SaxExpatParser_Impl;
// This class implements the external Parser interface // This class implements the external Parser interface
class SaxExpatParser : class SaxExpatParser
public WeakImplHelper2< : public WeakImplHelper3< XInitialization
XParser, , XServiceInfo
XServiceInfo , XParser >
>
{ {
public: public:
...@@ -153,6 +150,10 @@ public: ...@@ -153,6 +150,10 @@ public:
static Sequence< OUString > getSupportedServiceNames_Static(void) throw (); static Sequence< OUString > getSupportedServiceNames_Static(void) throw ();
public: public:
// ::com::sun::star::lang::XInitialization:
virtual void SAL_CALL initialize(Sequence<Any> const& rArguments)
throw (RuntimeException, Exception);
// The SAX-Parser-Interface // The SAX-Parser-Interface
virtual void SAL_CALL parseStream( const InputSource& structSource) virtual void SAL_CALL parseStream( const InputSource& structSource)
throw ( SAXException, throw ( SAXException,
...@@ -222,6 +223,7 @@ class SaxExpatParser_Impl ...@@ -222,6 +223,7 @@ class SaxExpatParser_Impl
public: // module scope public: // module scope
Mutex aMutex; Mutex aMutex;
OUString sCDATA; OUString sCDATA;
bool m_bEnableDoS; // fdo#60471 thank you Adobe Illustrator
Reference< XDocumentHandler > rDocumentHandler; Reference< XDocumentHandler > rDocumentHandler;
Reference< XExtendedDocumentHandler > rExtendedDocumentHandler; Reference< XExtendedDocumentHandler > rExtendedDocumentHandler;
...@@ -257,6 +259,7 @@ public: // module scope ...@@ -257,6 +259,7 @@ public: // module scope
public: public:
SaxExpatParser_Impl() SaxExpatParser_Impl()
: sCDATA("CDATA") : sCDATA("CDATA")
, m_bEnableDoS(false)
{ {
} }
...@@ -452,6 +455,22 @@ SaxExpatParser::~SaxExpatParser() ...@@ -452,6 +455,22 @@ SaxExpatParser::~SaxExpatParser()
delete m_pImpl; delete m_pImpl;
} }
// ::com::sun::star::lang::XInitialization:
void SAL_CALL
SaxExpatParser::initialize(Sequence< Any > const& rArguments)
throw (RuntimeException, Exception)
{
// possible arguments: a string "DoSmeplease"
if (rArguments.getLength())
{
OUString str;
if ((rArguments[0] >>= str) && "DoSmeplease" == str)
{
MutexGuard guard( m_pImpl->aMutex );
m_pImpl->m_bEnableDoS = true;
}
}
}
/*************** /***************
* *
...@@ -500,7 +519,10 @@ void SaxExpatParser::parseStream( const InputSource& structSource) ...@@ -500,7 +519,10 @@ void SaxExpatParser::parseStream( const InputSource& structSource)
XML_SetCharacterDataHandler( entity.pParser , call_callbackCharacters ); XML_SetCharacterDataHandler( entity.pParser , call_callbackCharacters );
XML_SetProcessingInstructionHandler(entity.pParser , XML_SetProcessingInstructionHandler(entity.pParser ,
call_callbackProcessingInstruction ); call_callbackProcessingInstruction );
XML_SetEntityDeclHandler(entity.pParser, call_callbackEntityDecl); if (!m_pImpl->m_bEnableDoS)
{
XML_SetEntityDeclHandler(entity.pParser, call_callbackEntityDecl);
}
XML_SetNotationDeclHandler( entity.pParser, call_callbackNotationDecl ); XML_SetNotationDeclHandler( entity.pParser, call_callbackNotationDecl );
XML_SetExternalEntityRefHandler( entity.pParser, XML_SetExternalEntityRefHandler( entity.pParser,
call_callbackExternalEntityRef); call_callbackExternalEntityRef);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <com/sun/star/graphic/XSvgParser.hpp> #include <com/sun/star/graphic/XSvgParser.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <cppuhelper/implbase2.hxx> #include <cppuhelper/implbase2.hxx>
#include <svgio/svgreader/svgdocumenthandler.hxx> #include <svgio/svgreader/svgdocumenthandler.hxx>
#include <com/sun/star/xml/sax/XParser.hpp> #include <com/sun/star/xml/sax/XParser.hpp>
...@@ -131,6 +132,14 @@ namespace svgio ...@@ -131,6 +132,14 @@ namespace svgio
// get parser // get parser
uno::Reference< xml::sax::XParser > xParser( uno::Reference< xml::sax::XParser > xParser(
xml::sax::Parser::create(context_)); xml::sax::Parser::create(context_));
// fdo#60471 need to enable internal entities because
// certain ... popular proprietary products write SVG files
// that use entities to define XML namespaces.
uno::Reference<lang::XInitialization> const xInit(xParser,
uno::UNO_QUERY_THROW);
uno::Sequence<uno::Any> args(1);
args[0] <<= OUString("DoSmeplease");
xInit->initialize(args);
// connect parser and filter // connect parser and filter
xParser->setDocumentHandler(xSvgDocHdl); xParser->setDocumentHandler(xSvgDocHdl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment