xref: /AOO41X/main/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include <com/sun/star/document/XImporter.hpp>
27cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
28cdf0e10cSrcweir #include <com/sun/star/util/XModifiable2.hpp>
29cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // #110680#
32cdf0e10cSrcweir //#ifndef _COMPHELPER_PROCESSFACTORY_HXX_
33cdf0e10cSrcweir //#include <comphelper/processfactory.hxx>
34cdf0e10cSrcweir //#endif
35cdf0e10cSrcweir #include <tools/globname.hxx>
36cdf0e10cSrcweir #include <sot/clsids.hxx>
37cdf0e10cSrcweir #include <tools/globname.hxx>
38cdf0e10cSrcweir #include <sot/clsids.hxx>
39cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
40cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
41cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
42cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
43cdf0e10cSrcweir #include "xmloff/xmlerror.hxx"
44cdf0e10cSrcweir #include <xmloff/attrlist.hxx>
45cdf0e10cSrcweir #include "xmloff/XMLFilterServiceNames.h"
46cdf0e10cSrcweir #include "XMLEmbeddedObjectImportContext.hxx"
47cdf0e10cSrcweir 
48cdf0e10cSrcweir using ::rtl::OUString;
49cdf0e10cSrcweir using ::rtl::OUStringBuffer;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir using namespace ::com::sun::star::uno;
52cdf0e10cSrcweir using namespace ::com::sun::star::util;
53cdf0e10cSrcweir using namespace ::com::sun::star::beans;
54cdf0e10cSrcweir using namespace ::com::sun::star::lang;
55cdf0e10cSrcweir using namespace ::com::sun::star::frame;
56cdf0e10cSrcweir using namespace ::com::sun::star::document;
57cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
58cdf0e10cSrcweir using namespace ::xmloff::token;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir struct XMLServiceMapEntry_Impl
61cdf0e10cSrcweir {
62cdf0e10cSrcweir 	enum XMLTokenEnum eClass;
63cdf0e10cSrcweir 	const sal_Char *sFilterService;
64cdf0e10cSrcweir 	sal_Int32	   nFilterServiceLen;
65cdf0e10cSrcweir };
66cdf0e10cSrcweir 
67cdf0e10cSrcweir #define SERVICE_MAP_ENTRY( cls, app ) \
68cdf0e10cSrcweir 	{ XML_##cls, \
69cdf0e10cSrcweir 	  XML_IMPORT_FILTER_##app, sizeof(XML_IMPORT_FILTER_##app)-1}
70cdf0e10cSrcweir 
71cdf0e10cSrcweir const XMLServiceMapEntry_Impl aServiceMap[] =
72cdf0e10cSrcweir {
73cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( TEXT, WRITER ),
74cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( ONLINE_TEXT, WRITER ),
75cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( SPREADSHEET, CALC ),
76cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( DRAWING, DRAW ),
77cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( GRAPHICS, DRAW ),
78cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( PRESENTATION, IMPRESS ),
79cdf0e10cSrcweir 	SERVICE_MAP_ENTRY( CHART, CHART ),
80cdf0e10cSrcweir 	{ XML_TOKEN_INVALID, 0, 0 }
81cdf0e10cSrcweir };
82cdf0e10cSrcweir 
83cdf0e10cSrcweir class XMLEmbeddedObjectImportContext_Impl : public SvXMLImportContext
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	::com::sun::star::uno::Reference<
86cdf0e10cSrcweir 		::com::sun::star::xml::sax::XDocumentHandler > xHandler;
87cdf0e10cSrcweir 
88cdf0e10cSrcweir public:
89cdf0e10cSrcweir 	TYPEINFO();
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	XMLEmbeddedObjectImportContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
92cdf0e10cSrcweir 									const ::rtl::OUString& rLName,
93cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference<
94cdf0e10cSrcweir 		::com::sun::star::xml::sax::XDocumentHandler >& rHandler );
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	virtual ~XMLEmbeddedObjectImportContext_Impl();
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
99cdf0e10cSrcweir 								   const ::rtl::OUString& rLocalName,
100cdf0e10cSrcweir 								   const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 	virtual void EndElement();
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	virtual void Characters( const ::rtl::OUString& rChars );
107cdf0e10cSrcweir };
108cdf0e10cSrcweir 
109cdf0e10cSrcweir TYPEINIT1( XMLEmbeddedObjectImportContext_Impl, SvXMLImportContext );
110cdf0e10cSrcweir 
XMLEmbeddedObjectImportContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<XDocumentHandler> & rHandler)111cdf0e10cSrcweir XMLEmbeddedObjectImportContext_Impl::XMLEmbeddedObjectImportContext_Impl(
112cdf0e10cSrcweir 		SvXMLImport& rImport, sal_uInt16 nPrfx,
113cdf0e10cSrcweir 		const OUString& rLName,
114cdf0e10cSrcweir 		const Reference< XDocumentHandler >& rHandler ) :
115cdf0e10cSrcweir 	SvXMLImportContext( rImport, nPrfx, rLName ),
116cdf0e10cSrcweir 	xHandler( rHandler )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
~XMLEmbeddedObjectImportContext_Impl()120cdf0e10cSrcweir XMLEmbeddedObjectImportContext_Impl::~XMLEmbeddedObjectImportContext_Impl()
121cdf0e10cSrcweir {
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> &)124cdf0e10cSrcweir SvXMLImportContext *XMLEmbeddedObjectImportContext_Impl::CreateChildContext(
125cdf0e10cSrcweir 		sal_uInt16 nPrefix,
126cdf0e10cSrcweir 		const OUString& rLocalName,
127cdf0e10cSrcweir 		const Reference< XAttributeList >& )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 	return new XMLEmbeddedObjectImportContext_Impl( GetImport(),
130cdf0e10cSrcweir 													nPrefix, rLocalName,
131cdf0e10cSrcweir 												    xHandler );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
StartElement(const Reference<XAttributeList> & xAttrList)134cdf0e10cSrcweir void XMLEmbeddedObjectImportContext_Impl::StartElement(
135cdf0e10cSrcweir 		const Reference< XAttributeList >& xAttrList )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir 	xHandler->startElement( GetImport().GetNamespaceMap().GetQNameByKey(
138cdf0e10cSrcweir 								GetPrefix(), GetLocalName() ),
139cdf0e10cSrcweir 							xAttrList );
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
EndElement()142cdf0e10cSrcweir void XMLEmbeddedObjectImportContext_Impl::EndElement()
143cdf0e10cSrcweir {
144cdf0e10cSrcweir 	xHandler->endElement( GetImport().GetNamespaceMap().GetQNameByKey(
145cdf0e10cSrcweir 								GetPrefix(), GetLocalName() ) );
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
Characters(const OUString & rChars)148cdf0e10cSrcweir void XMLEmbeddedObjectImportContext_Impl::Characters( const OUString& rChars )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir 	xHandler->characters( rChars );
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
153cdf0e10cSrcweir //-----------------------------------------------------------------------------
154cdf0e10cSrcweir 
155cdf0e10cSrcweir TYPEINIT1( XMLEmbeddedObjectImportContext, SvXMLImportContext );
156cdf0e10cSrcweir 
SetComponent(Reference<XComponent> & rComp)157cdf0e10cSrcweir sal_Bool XMLEmbeddedObjectImportContext::SetComponent(
158cdf0e10cSrcweir 		Reference< XComponent >& rComp )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir 	if( !rComp.is() || !sFilterService.getLength() )
161cdf0e10cSrcweir 		return sal_False;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	Sequence<Any> aArgs( 0 );
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 	// #110680#
167cdf0e10cSrcweir 	// Reference< XMultiServiceFactory > xServiceFactory = comphelper::getProcessServiceFactory();
168cdf0e10cSrcweir 	Reference< XMultiServiceFactory > xServiceFactory = GetImport().getServiceFactory();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	xHandler = Reference < XDocumentHandler >(
171cdf0e10cSrcweir 		xServiceFactory->createInstanceWithArguments( sFilterService, aArgs),
172cdf0e10cSrcweir 											   UNO_QUERY);
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	if( !xHandler.is() )
175cdf0e10cSrcweir 		return sal_False;
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 	try
178cdf0e10cSrcweir 	{
179cdf0e10cSrcweir 		Reference < XModifiable2 > xModifiable2( rComp, UNO_QUERY_THROW );
180cdf0e10cSrcweir 		xModifiable2->disableSetModified();
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir 	catch( Exception& )
183cdf0e10cSrcweir 	{
184cdf0e10cSrcweir 	}
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	Reference < XImporter > xImporter( xHandler, UNO_QUERY );
187cdf0e10cSrcweir 	xImporter->setTargetDocument( rComp );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 	xComp = rComp;	// keep ref to component only if there is a handler
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 	return sal_True;
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
XMLEmbeddedObjectImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<XAttributeList> & xAttrList)194cdf0e10cSrcweir XMLEmbeddedObjectImportContext::XMLEmbeddedObjectImportContext(
195cdf0e10cSrcweir 		SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
196cdf0e10cSrcweir 		const Reference< XAttributeList >& xAttrList ) :
197cdf0e10cSrcweir 	SvXMLImportContext( rImport, nPrfx, rLName )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir 	SvGlobalName aName;
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 	if( nPrfx == XML_NAMESPACE_MATH &&
202cdf0e10cSrcweir 		IsXMLToken( rLName, XML_MATH ) )
203cdf0e10cSrcweir 	{
204cdf0e10cSrcweir 		sFilterService = OUString( RTL_CONSTASCII_USTRINGPARAM(XML_IMPORT_FILTER_MATH) );
205cdf0e10cSrcweir 		aName = SvGlobalName(SO3_SM_CLASSID);
206cdf0e10cSrcweir 	}
207cdf0e10cSrcweir 	else if( nPrfx == XML_NAMESPACE_OFFICE &&
208cdf0e10cSrcweir 		IsXMLToken( rLName, XML_DOCUMENT ) )
209cdf0e10cSrcweir 	{
210cdf0e10cSrcweir 		OUString sMime;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
213cdf0e10cSrcweir 		for( sal_Int16 i=0; i < nAttrCount; i++ )
214cdf0e10cSrcweir 		{
215cdf0e10cSrcweir 			const OUString& rAttrName = xAttrList->getNameByIndex( i );
216cdf0e10cSrcweir 			OUString aLocalName;
217cdf0e10cSrcweir 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,	&aLocalName );
218cdf0e10cSrcweir 			if( nPrefix == XML_NAMESPACE_OFFICE &&
219cdf0e10cSrcweir 				IsXMLToken( aLocalName, XML_MIMETYPE ) )
220cdf0e10cSrcweir 			{
221cdf0e10cSrcweir 				sMime = xAttrList->getValueByIndex( i );
222cdf0e10cSrcweir 				break;
223cdf0e10cSrcweir 			}
224cdf0e10cSrcweir 		}
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 		OUString sClass;
227cdf0e10cSrcweir 		static const char * aTmp[] =
228cdf0e10cSrcweir 		{
229cdf0e10cSrcweir 			"application/vnd.oasis.openoffice.",
230cdf0e10cSrcweir 			"application/x-vnd.oasis.openoffice.",
231cdf0e10cSrcweir 			"application/vnd.oasis.opendocument.",
232cdf0e10cSrcweir 			"application/x-vnd.oasis.opendocument.",
233cdf0e10cSrcweir 			NULL
234cdf0e10cSrcweir 		};
235cdf0e10cSrcweir 		for (int k=0; aTmp[k]; k++)
236cdf0e10cSrcweir 		{
237cdf0e10cSrcweir 			::rtl::OUString sTmpString = ::rtl::OUString::createFromAscii(aTmp[k]);
238cdf0e10cSrcweir 			if( sMime.matchAsciiL( aTmp[k], sTmpString.getLength() ) )
239cdf0e10cSrcweir 			{
240cdf0e10cSrcweir 				sClass = sMime.copy( sTmpString.getLength() );
241cdf0e10cSrcweir 				break;
242cdf0e10cSrcweir 			}
243cdf0e10cSrcweir 		}
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 		if( sClass.getLength() )
246cdf0e10cSrcweir 		{
247cdf0e10cSrcweir 			const XMLServiceMapEntry_Impl *pEntry = aServiceMap;
248cdf0e10cSrcweir 			while( pEntry->eClass != XML_TOKEN_INVALID )
249cdf0e10cSrcweir 			{
250cdf0e10cSrcweir 				if( IsXMLToken( sClass, pEntry->eClass ) )
251cdf0e10cSrcweir 				{
252cdf0e10cSrcweir 					sFilterService = OUString( pEntry->sFilterService,
253cdf0e10cSrcweir 											   pEntry->nFilterServiceLen,
254cdf0e10cSrcweir 											   RTL_TEXTENCODING_ASCII_US );
255cdf0e10cSrcweir 
256cdf0e10cSrcweir 					switch( pEntry->eClass )
257cdf0e10cSrcweir 					{
258cdf0e10cSrcweir 					case XML_TEXT:			aName = SvGlobalName(SO3_SW_CLASSID); break;
259cdf0e10cSrcweir 					case XML_ONLINE_TEXT:	aName = SvGlobalName(SO3_SWWEB_CLASSID); break;
260cdf0e10cSrcweir 					case XML_SPREADSHEET:	aName = SvGlobalName(SO3_SC_CLASSID); break;
261cdf0e10cSrcweir 					case XML_DRAWING:
262cdf0e10cSrcweir 					case XML_GRAPHICS:
263cdf0e10cSrcweir 					case XML_IMAGE:		aName = SvGlobalName(SO3_SDRAW_CLASSID); break;
264cdf0e10cSrcweir 					case XML_PRESENTATION:	aName = SvGlobalName(SO3_SIMPRESS_CLASSID); break;
265cdf0e10cSrcweir 					case XML_CHART:			aName = SvGlobalName(SO3_SCH_CLASSID); break;
266cdf0e10cSrcweir 					default:
267cdf0e10cSrcweir 						break;
268cdf0e10cSrcweir 					}
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 					break;
271cdf0e10cSrcweir 				}
272cdf0e10cSrcweir 				pEntry++;
273cdf0e10cSrcweir 			}
274cdf0e10cSrcweir 		}
275cdf0e10cSrcweir 	}
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	sCLSID = aName.GetHexName();
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
~XMLEmbeddedObjectImportContext()280cdf0e10cSrcweir XMLEmbeddedObjectImportContext::~XMLEmbeddedObjectImportContext()
281cdf0e10cSrcweir {
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> &)284cdf0e10cSrcweir SvXMLImportContext *XMLEmbeddedObjectImportContext::CreateChildContext(
285cdf0e10cSrcweir 		sal_uInt16 nPrefix, const OUString& rLocalName,
286cdf0e10cSrcweir 		const Reference< XAttributeList >& )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir 	if( xHandler.is() )
289cdf0e10cSrcweir 		return new XMLEmbeddedObjectImportContext_Impl( GetImport(),
290cdf0e10cSrcweir 														nPrefix, rLocalName,
291cdf0e10cSrcweir 														xHandler );
292cdf0e10cSrcweir 	else
293cdf0e10cSrcweir 		return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
StartElement(const Reference<XAttributeList> & rAttrList)296cdf0e10cSrcweir void XMLEmbeddedObjectImportContext::StartElement(
297cdf0e10cSrcweir 		const Reference< XAttributeList >& rAttrList )
298cdf0e10cSrcweir {
299cdf0e10cSrcweir 	if( xHandler.is() )
300cdf0e10cSrcweir 	{
301cdf0e10cSrcweir 		xHandler->startDocument();
302cdf0e10cSrcweir 		// #i34042: copy namepspace declarations
303cdf0e10cSrcweir 		SvXMLAttributeList *pAttrList = new SvXMLAttributeList( rAttrList );
304cdf0e10cSrcweir 		Reference< XAttributeList > xAttrList( pAttrList );
305cdf0e10cSrcweir 		const SvXMLNamespaceMap& rNamespaceMap = GetImport().GetNamespaceMap();
306cdf0e10cSrcweir 		sal_uInt16 nPos = rNamespaceMap.GetFirstKey();
307cdf0e10cSrcweir 		while( USHRT_MAX != nPos )
308cdf0e10cSrcweir 		{
309cdf0e10cSrcweir 			OUString aAttrName( rNamespaceMap.GetAttrNameByKey( nPos ) );
310cdf0e10cSrcweir 			if( 0 == xAttrList->getValueByName( aAttrName ).getLength() )
311cdf0e10cSrcweir 			{
312cdf0e10cSrcweir 				pAttrList->AddAttribute( aAttrName,
313cdf0e10cSrcweir 									 	 rNamespaceMap.GetNameByKey( nPos ) );
314cdf0e10cSrcweir 			}
315cdf0e10cSrcweir 			nPos = rNamespaceMap.GetNextKey( nPos );
316cdf0e10cSrcweir 		}
317cdf0e10cSrcweir 		xHandler->startElement( GetImport().GetNamespaceMap().GetQNameByKey(
318cdf0e10cSrcweir 									GetPrefix(), GetLocalName() ),
319cdf0e10cSrcweir 								xAttrList );
320cdf0e10cSrcweir 	}
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
EndElement()323cdf0e10cSrcweir void XMLEmbeddedObjectImportContext::EndElement()
324cdf0e10cSrcweir {
325cdf0e10cSrcweir 	if( xHandler.is() )
326cdf0e10cSrcweir 	{
327cdf0e10cSrcweir 		xHandler->endElement( GetImport().GetNamespaceMap().GetQNameByKey(
328cdf0e10cSrcweir 									GetPrefix(), GetLocalName() ) );
329cdf0e10cSrcweir 		xHandler->endDocument();
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 		// storing part is commented out since it should be done through the object, not the model
333cdf0e10cSrcweir 		// TODO/LATER: probably an object should be provided here an be stored here
334cdf0e10cSrcweir 
335cdf0e10cSrcweir //		// Save the object. That's required because the object should not be
336cdf0e10cSrcweir //		// modified (it has been loaded just now). Setting it to unmodified
337cdf0e10cSrcweir //		// only does not work, because it is then assumed that it has been
338cdf0e10cSrcweir //		// stored.
339cdf0e10cSrcweir //		Reference < XStorable > xStorable( xComp, UNO_QUERY );
340cdf0e10cSrcweir //		if( xStorable.is() )
341cdf0e10cSrcweir //		{
342cdf0e10cSrcweir //			try
343cdf0e10cSrcweir //			{
344cdf0e10cSrcweir //				xStorable->store();
345cdf0e10cSrcweir //			}
346cdf0e10cSrcweir //			catch( ::com::sun::star::beans::PropertyVetoException& )
347cdf0e10cSrcweir //			{
348cdf0e10cSrcweir //				Sequence<OUString> aSeq( 0 );
349cdf0e10cSrcweir //				GetImport().SetError( XMLERROR_FLAG_WARNING |
350cdf0e10cSrcweir //								  XMLERROR_API,
351cdf0e10cSrcweir //								  aSeq );
352cdf0e10cSrcweir //			}
353cdf0e10cSrcweir //		}
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 	try
356cdf0e10cSrcweir 	{
357cdf0e10cSrcweir 		Reference < XModifiable2 > xModifiable2( xComp, UNO_QUERY_THROW );
358cdf0e10cSrcweir 		xModifiable2->enableSetModified();
359cdf0e10cSrcweir 		xModifiable2->setModified( sal_True ); // trigger new replacement image generation
360cdf0e10cSrcweir 	}
361cdf0e10cSrcweir 	catch( Exception& )
362cdf0e10cSrcweir 	{
363cdf0e10cSrcweir 	}
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 
366cdf0e10cSrcweir //		// reset modifies state for the object since it has been imported
367cdf0e10cSrcweir //		// completly and therfor hasn't been modified.
368cdf0e10cSrcweir //		Reference < XModifiable > xModifiable( xComp, UNO_QUERY );
369cdf0e10cSrcweir //		if( xModifiable.is() )
370cdf0e10cSrcweir //		{
371cdf0e10cSrcweir //			try
372cdf0e10cSrcweir //			{
373cdf0e10cSrcweir //				xModifiable->setModified( sal_False );
374cdf0e10cSrcweir //			}
375cdf0e10cSrcweir //			catch( ::com::sun::star::beans::PropertyVetoException& e )
376cdf0e10cSrcweir //			{
377cdf0e10cSrcweir //				Sequence<OUString> aSeq( 0 );
378cdf0e10cSrcweir //				GetImport().SetError( XMLERROR_FLAG_WARNING |
379cdf0e10cSrcweir //								  XMLERROR_API,
380cdf0e10cSrcweir //								  aSeq );
381cdf0e10cSrcweir //			}
382cdf0e10cSrcweir //		}
383cdf0e10cSrcweir 	}
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
Characters(const::rtl::OUString & rChars)386cdf0e10cSrcweir void XMLEmbeddedObjectImportContext::Characters( const ::rtl::OUString& rChars )
387cdf0e10cSrcweir {
388cdf0e10cSrcweir 	if( xHandler.is() )
389cdf0e10cSrcweir 		xHandler->characters( rChars );
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
392