22#include <com/sun/star/graphic/XSvgParser.hpp>
23#include <com/sun/star/lang/XServiceInfo.hpp>
24#include <com/sun/star/lang/XInitialization.hpp>
28#include <com/sun/star/xml/sax/XParser.hpp>
29#include <com/sun/star/xml/sax/Parser.hpp>
30#include <com/sun/star/xml/sax/InputSource.hpp>
51 uno::Reference< uno::XComponentContext >
context_;
52 bool parseSvgXML(uno::Reference<io::XInputStream>
const & xSVGStream,
53 uno::Reference<xml::sax::XDocumentHandler>
const & xSvgDocHdl);
56 uno::Reference< uno::XComponentContext > context);
57 XSvgParser(
const XSvgParser&) =
delete;
58 XSvgParser& operator=(
const XSvgParser&) =
delete;
61 virtual uno::Sequence< uno::Reference< ::graphic::XPrimitive2D > > SAL_CALL getDecomposition(
62 const uno::Reference< ::io::XInputStream >& xSVGStream,
63 const OUString& aAbsolutePath)
override;
65 virtual uno::Any SAL_CALL getDrawCommands(
66 uno::Reference<io::XInputStream>
const & xSvgStream,
67 const OUString& aAbsolutePath)
override;
77 XSvgParser::XSvgParser(
78 uno::Reference< uno::XComponentContext > context):
83 bool XSvgParser::parseSvgXML(uno::Reference<io::XInputStream>
const & xSVGStream, uno::Reference<xml::sax::XDocumentHandler>
const & xSvgDocHdl)
88 xml::sax::InputSource myInputSource;
89 myInputSource.aInputStream = xSVGStream;
92 uno::Reference< xml::sax::XParser > xParser(
97 uno::Reference<lang::XInitialization>
const xInit(xParser,
98 uno::UNO_QUERY_THROW);
99 uno::Sequence<uno::Any>
args{
uno::Any(OUString(
"DoSmeplease")) };
100 xInit->initialize(args);
103 xParser->setDocumentHandler(xSvgDocHdl);
110 xParser->parseStream(myInputSource);
112 catch(
const uno::Exception&)
121 uno::Sequence< uno::Reference< ::graphic::XPrimitive2D > > XSvgParser::getDecomposition(
122 const uno::Reference< ::io::XInputStream >& xSVGStream,
123 const OUString& aAbsolutePath )
131 parseSvgXML(xSVGStream, pSvgDocHdl);
134 for(std::unique_ptr<SvgNode>
const & pCandidate : pSvgDocHdl->getSvgDocument().getSvgNodeVector())
136 if (Display::None != pCandidate->getDisplay())
138 pCandidate->decomposeSvgNode(aRetval,
false);
144 OSL_ENSURE(
false,
"Invalid stream (!)");
150 uno::Any SAL_CALL XSvgParser::getDrawCommands(
151 uno::Reference<io::XInputStream>
const & xSvgStream,
152 const OUString& aAbsolutePath)
156 if (!xSvgStream.is())
160 parseSvgXML(xSvgStream, pSvgDocHdl);
163 for (std::unique_ptr<SvgNode>
const & pCandidate : pSvgDocHdl->getSvgDocument().getSvgNodeVector())
165 if (Display::None != pCandidate->getDisplay())
167 mpVisitor = std::make_shared<SvgDrawVisitor>();
169 std::shared_ptr<gfx::DrawRoot> pDrawRoot(
mpVisitor->getDrawRoot());
170 sal_uInt64 nPointer =
reinterpret_cast<sal_uInt64
>(pDrawRoot.get());
171 aAnyResult <<= sal_uInt64(nPointer);
178 OUString SAL_CALL XSvgParser::getImplementationName()
180 return "svgio::svgreader::XSvgParser";
183 sal_Bool SAL_CALL XSvgParser::supportsService(
const OUString& rServiceName)
188 uno::Sequence< OUString > SAL_CALL XSvgParser::getSupportedServiceNames()
190 return {
"com.sun.star.graphic.SvgTools" };
195extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
197 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
199 return cppu::acquire(
new svgio::svgreader::XSvgParser(context));
206 return xSvgParser->getDecomposition(
xStream, OUString()).getLength() != 0;
css::uno::Sequence< css::uno::Reference< css::graphic::XPrimitive2D > > toSequence() const
#define TOOLS_INFO_EXCEPTION(area, stream)
Reference< XComponentContext > getProcessComponentContext()
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * svgio_XSvgParser_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
std::shared_ptr< SvgDrawVisitor > mpVisitor
uno::Reference< uno::XComponentContext > context_
bool TestImportSVG(SvStream &rStream)