LibreOffice Module xmloff (master) 1
XMLEmbeddedObjectImportContext.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <sal/config.h>
21
22#include <string_view>
23#include <tuple>
24
25#include <sal/log.hxx>
26#include <com/sun/star/document/XImporter.hpp>
27#include <com/sun/star/uno/XComponentContext.hpp>
28#include <com/sun/star/util/XModifiable2.hpp>
29#include <tools/globname.hxx>
32#include <xmloff/xmlimp.hxx>
34#include <xmloff/xmltoken.hxx>
35#include <xmloff/attrlist.hxx>
38
39using namespace ::com::sun::star::uno;
40using namespace ::com::sun::star::util;
41using namespace ::com::sun::star::beans;
42using namespace ::com::sun::star::lang;
43using namespace ::com::sun::star::document;
44using namespace ::com::sun::star::xml::sax;
45using namespace ::xmloff::token;
46
47namespace {
48
49class XMLEmbeddedObjectImportContext_Impl : public SvXMLImportContext
50{
51 css::uno::Reference< css::xml::sax::XFastDocumentHandler > mxFastHandler;
52
53public:
54
55 XMLEmbeddedObjectImportContext_Impl( SvXMLImport& rImport,
56 const css::uno::Reference< css::xml::sax::XFastDocumentHandler >& rHandler );
57
58 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
59 sal_Int32 nElement,
60 const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
61
62 virtual void SAL_CALL startFastElement(
63 sal_Int32 nElement,
64 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
65
66 virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
67
68 virtual void SAL_CALL characters( const OUString& rChars ) override;
69};
70
71}
72
73XMLEmbeddedObjectImportContext_Impl::XMLEmbeddedObjectImportContext_Impl(
74 SvXMLImport& rImport,
75 const Reference< XFastDocumentHandler >& rHandler ) :
76 SvXMLImportContext( rImport ),
77 mxFastHandler( rHandler )
78{
79 assert(mxFastHandler);
80}
81
82css::uno::Reference< css::xml::sax::XFastContextHandler > XMLEmbeddedObjectImportContext_Impl::createFastChildContext(
83 sal_Int32 ,
84 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
85{
86 return new XMLEmbeddedObjectImportContext_Impl(GetImport(), mxFastHandler);
87}
88
89void XMLEmbeddedObjectImportContext_Impl::startFastElement(
90 sal_Int32 nElement,
91 const Reference< XFastAttributeList >& xAttrList )
92{
93 mxFastHandler->startFastElement( nElement, xAttrList );
94}
95
96void XMLEmbeddedObjectImportContext_Impl::endFastElement(sal_Int32 nElement)
97{
98 mxFastHandler->endFastElement( nElement );
99}
100
101void XMLEmbeddedObjectImportContext_Impl::characters( const OUString& rChars )
102{
103 mxFastHandler->characters( rChars );
104}
105
106
107void XMLEmbeddedObjectImportContext::SetComponent( Reference< XComponent > const & rComp )
108{
109 if( !rComp.is() || sFilterService.isEmpty() )
110 return;
111
112 Sequence<Any> aArgs( 0 );
113
114 Reference< XComponentContext > xContext( GetImport().GetComponentContext() );
115
116 Reference<XInterface> xFilter =
117 xContext->getServiceManager()->createInstanceWithArgumentsAndContext(sFilterService, aArgs, xContext);
118 SAL_WARN_IF(!xFilter, "xmloff", "could not create filter " << sFilterService);
119 if( !xFilter.is() )
120 return;
121
122 assert(dynamic_cast<SvXMLImport*>(xFilter.get()));
123 SvXMLImport *pFastHandler = dynamic_cast<SvXMLImport*>(xFilter.get());
124 mxFastHandler = pFastHandler;
125
126 try
127 {
128 Reference < XModifiable2 > xModifiable2( rComp, UNO_QUERY_THROW );
129 xModifiable2->disableSetModified();
130 }
131 catch( Exception& )
132 {
133 }
134
135 Reference < XImporter > xImporter( mxFastHandler, UNO_QUERY );
136 xImporter->setTargetDocument( rComp );
137
138 xComp = rComp; // keep ref to component only if there is a handler
139
140 // #i34042: copy namespace declarations
141 // We created a new instance of XMLImport, so we need to propagate the namespace
142 // declarations to it.
143 pFastHandler->GetNamespaceMap() = GetImport().GetNamespaceMap();
144}
145
147 SvXMLImport& rImport, sal_Int32 nElement,
148 const Reference< XFastAttributeList >& xAttrList ) :
149 SvXMLImportContext( rImport )
150{
152
153 if( nElement == XML_ELEMENT(MATH, XML_MATH) )
154 {
157 }
158 else if( nElement == XML_ELEMENT(OFFICE, XML_DOCUMENT) )
159 {
160 OUString sMime;
161
162 for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
163 {
164 switch (aIter.getToken())
165 {
167 sMime = aIter.toString();
168 break;
169 default:
170 XMLOFF_WARN_UNKNOWN("xmloff", aIter);
171 }
172 }
173
174 OUString sClass;
175 static std::u16string_view const prefixes[] = {
176 u"application/vnd.oasis.openoffice.",
177 u"application/x-vnd.oasis.openoffice.",
178 u"application/vnd.oasis.opendocument.",
179 u"application/x-vnd.oasis.opendocument."};
180 for (auto const & p: prefixes)
181 {
182 if (sMime.startsWith(p, &sClass))
183 {
184 break;
185 }
186 }
187
188 if( !sClass.isEmpty() )
189 {
190 static const std::tuple<XMLTokenEnum, OUString, SvGUID> aServiceMap[] = {
198 };
199 for (auto const& [eClass, sMatchingFilterService, rCLASSID] : aServiceMap)
200 {
201 if (IsXMLToken(sClass, eClass))
202 {
203 sFilterService = sMatchingFilterService;
204 aName = SvGlobalName(rCLASSID);
205 break;
206 }
207 }
208 }
209 }
210
211 sCLSID = aName.GetHexName();
212}
213
215{
216}
217
218css::uno::Reference< css::xml::sax::XFastContextHandler > XMLEmbeddedObjectImportContext::createFastChildContext(
219 sal_Int32 ,
220 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
221{
222 if( mxFastHandler.is() )
223 return new XMLEmbeddedObjectImportContext_Impl( GetImport(), mxFastHandler );
224 return nullptr;
225}
226
228 sal_Int32 nElement,
229 const Reference< XFastAttributeList >& rAttrList )
230{
231 if( !mxFastHandler.is() )
232 return;
233
234 mxFastHandler->startDocument();
235 mxFastHandler->startFastElement( nElement, rAttrList );
236}
237
239{
240 if( !mxFastHandler.is() )
241 return;
242
243 mxFastHandler->endFastElement( nElement );
244 mxFastHandler->endDocument();
245
246 try
247 {
248 Reference < XModifiable2 > xModifiable2( xComp, UNO_QUERY_THROW );
249 xModifiable2->enableSetModified();
250 xModifiable2->setModified( true ); // trigger new replacement image generation
251 }
252 catch( Exception& )
253 {
254 }
255}
256
257void XMLEmbeddedObjectImportContext::characters( const OUString& rChars )
258{
259 if( mxFastHandler.is() )
260 mxFastHandler->characters( rChars );
261}
262
263/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
constexpr OUStringLiteral XML_IMPORT_FILTER_CALC
constexpr OUStringLiteral XML_IMPORT_FILTER_DRAW
constexpr OUStringLiteral XML_IMPORT_FILTER_WRITER
constexpr OUStringLiteral XML_IMPORT_FILTER_CHART
constexpr OUStringLiteral XML_IMPORT_FILTER_IMPRESS
constexpr OUStringLiteral XML_IMPORT_FILTER_MATH
This class deliberately does not support XWeak, to improve performance when loading large documents.
Definition: xmlictxt.hxx:48
virtual void SAL_CALL startFastElement(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
Definition: xmlictxt.cxx:45
virtual void SAL_CALL endFastElement(sal_Int32 Element) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
Definition: xmlictxt.cxx:40
SvXMLImport & GetImport()
Definition: xmlictxt.hxx:60
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
Definition: xmlictxt.cxx:59
virtual void SAL_CALL characters(const OUString &aChars) override
This method is called for all characters that are contained in the current element.
Definition: xmlictxt.cxx:70
SvXMLNamespaceMap & GetNamespaceMap()
Definition: xmlimp.hxx:399
virtual void SAL_CALL characters(const OUString &rChars) override
This method is called for all characters that are contained in the current element.
XMLEmbeddedObjectImportContext(SvXMLImport &rImport, sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
void SetComponent(css::uno::Reference< css::lang::XComponent > const &rComp)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
css::uno::Reference< css::xml::sax::XFastDocumentHandler > mxFastHandler
css::uno::Reference< css::lang::XComponent > xComp
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
#define SO3_SDRAW_CLASSID
#define SO3_SWWEB_CLASSID
#define SO3_SIMPRESS_CLASSID
#define SO3_SCH_CLASSID
#define SO3_SC_CLASSID
#define SO3_SW_CLASSID
#define SO3_SM_CLASSID
float u
MATH
OUString aName
void * p
#define SAL_WARN_IF(condition, area, stream)
@ Exception
FastAttributeList & castToFastAttributeList(const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
Handling of tokens in XML:
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
compare eToken to the string
Definition: xmltoken.cxx:3583
const std::pair< OUString, OUString > aServiceMap[]
Definition: xmlexp.cxx:127
#define XMLOFF_WARN_UNKNOWN(area, rIter)
Definition: xmlictxt.hxx:114
#define XML_ELEMENT(prefix, name)
Definition: xmlimp.hxx:98