1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <tools/debug.hxx>
21 #include <tools/diagnose_ex.h>
22 #include <com/sun/star/xml/sax/InputSource.hpp>
23 #include <com/sun/star/xml/sax/Parser.hpp>
24 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
25 #include <com/sun/star/xml/sax/Writer.hpp>
26 #include <com/sun/star/lang/XComponent.hpp>
27 #include <com/sun/star/xml/sax/XFastParser.hpp>
28 #include <com/sun/star/io/XOutputStream.hpp>
29 #include <com/sun/star/document/XFilter.hpp>
30 #include <com/sun/star/document/XExporter.hpp>
31 #include <com/sun/star/document/XImporter.hpp>
32 #include <comphelper/processfactory.hxx>
33 #include <svx/svdmodel.hxx>
34 #include <svx/xmleohlp.hxx>
35 #include <svx/xmlgrhlp.hxx>
37 #include <svx/unomodel.hxx>
39 using namespace ::com::sun::star
;
40 using namespace ::com::sun::star::uno
;
42 bool SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
, const Reference
< lang::XComponent
>& xComponent
)
44 return SvxDrawingLayerExport( pModel
, xOut
, xComponent
, "com.sun.star.comp.DrawingLayer.XMLExporter" );
47 bool SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
, const Reference
< lang::XComponent
>& xComponent
, const char* pExportService
)
49 bool bDocRet
= xOut
.is();
51 uno::Reference
<document::XGraphicStorageHandler
> xGraphicStorageHandler
;
52 rtl::Reference
<SvXMLGraphicHelper
> xGraphicHelper
;
54 Reference
< document::XEmbeddedObjectResolver
> xObjectResolver
;
55 rtl::Reference
<SvXMLEmbeddedObjectHelper
> xObjectHelper
;
57 Reference
< lang::XComponent
> xSourceDoc( xComponent
);
60 if( !xSourceDoc
.is() )
62 xSourceDoc
= new SvxUnoDrawingModel( pModel
);
63 pModel
->setUnoModel( Reference
< XInterface
>::query( xSourceDoc
) );
66 uno::Reference
< uno::XComponentContext
> xContext( ::comphelper::getProcessComponentContext() );
70 uno::Reference
< xml::sax::XWriter
> xWriter
= xml::sax::Writer::create( xContext
);
72 ::comphelper::IEmbeddedHelper
*pPersist
= pModel
->GetPersist();
75 xObjectHelper
= SvXMLEmbeddedObjectHelper::Create( *pPersist
, SvXMLEmbeddedObjectHelperMode::Write
);
76 xObjectResolver
= xObjectHelper
.get();
79 xGraphicHelper
= SvXMLGraphicHelper::Create( SvXMLGraphicHelperMode::Write
);
80 xGraphicStorageHandler
= xGraphicHelper
.get();
82 uno::Reference
<xml::sax::XDocumentHandler
> xHandler
= xWriter
;
85 xWriter
->setOutputStream( xOut
);
87 uno::Sequence
< uno::Any
> aArgs( xObjectResolver
.is() ? 3 : 2 );
88 aArgs
[0] <<= xHandler
;
89 aArgs
[1] <<= xGraphicStorageHandler
;
90 if( xObjectResolver
.is() )
91 aArgs
[2] <<= xObjectResolver
;
93 uno::Reference
< document::XFilter
> xFilter( xContext
->getServiceManager()->createInstanceWithArgumentsAndContext( OUString::createFromAscii( pExportService
), aArgs
, xContext
), uno::UNO_QUERY
);
96 OSL_FAIL( "com.sun.star.comp.Draw.XMLExporter service missing" );
102 uno::Reference
< document::XExporter
> xExporter( xFilter
, uno::UNO_QUERY
);
105 xExporter
->setSourceDocument( xSourceDoc
);
107 uno::Sequence
< beans::PropertyValue
> aDescriptor( 0 );
108 bDocRet
= xFilter
->filter( aDescriptor
);
113 catch(uno::Exception
const&)
115 DBG_UNHANDLED_EXCEPTION("svx");
120 xGraphicHelper
->dispose();
121 xGraphicHelper
.clear();
122 xGraphicStorageHandler
= nullptr;
124 if( xObjectHelper
.is() )
125 xObjectHelper
->dispose();
130 bool SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
)
132 Reference
< lang::XComponent
> xComponent
;
133 return SvxDrawingLayerExport( pModel
, xOut
, xComponent
);
138 bool SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
, const Reference
< lang::XComponent
>& xComponent
)
140 return SvxDrawingLayerImport( pModel
, xInputStream
, xComponent
, "com.sun.star.comp.Draw.XMLOasisImporter" );
143 bool SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
, const Reference
< lang::XComponent
>& xComponent
, const char* pImportService
)
147 uno::Reference
<document::XGraphicStorageHandler
> xGraphicStorageHandler
;
148 rtl::Reference
<SvXMLGraphicHelper
> xGraphicHelper
;
150 Reference
< document::XEmbeddedObjectResolver
> xObjectResolver
;
151 rtl::Reference
<SvXMLEmbeddedObjectHelper
> xObjectHelper
;
153 Reference
< lang::XComponent
> xTargetDocument( xComponent
);
154 if( !xTargetDocument
.is() )
156 xTargetDocument
= new SvxUnoDrawingModel( pModel
);
157 pModel
->setUnoModel( Reference
< XInterface
>::query( xTargetDocument
) );
160 Reference
< frame::XModel
> xTargetModel( xTargetDocument
, UNO_QUERY
);
164 // Get service factory
165 Reference
< uno::XComponentContext
> xContext
= comphelper::getProcessComponentContext();
167 if ( xTargetModel
.is() )
168 xTargetModel
->lockControllers();
171 xGraphicHelper
= SvXMLGraphicHelper::Create( SvXMLGraphicHelperMode::Read
);
172 xGraphicStorageHandler
= xGraphicHelper
.get();
174 ::comphelper::IEmbeddedHelper
*pPersist
= pModel
->GetPersist();
177 xObjectHelper
= SvXMLEmbeddedObjectHelper::Create(
179 SvXMLEmbeddedObjectHelperMode::Read
);
180 xObjectResolver
= xObjectHelper
.get();
184 // prepare ParserInputSource
185 xml::sax::InputSource aParserInput
;
186 aParserInput
.aInputStream
= xInputStream
;
188 // prepare filter arguments
189 Sequence
<Any
> aFilterArgs( 2 );
190 Any
*pArgs
= aFilterArgs
.getArray();
191 *pArgs
++ <<= xGraphicStorageHandler
;
192 *pArgs
++ <<= xObjectResolver
;
195 Reference
< XInterface
> xFilter
= xContext
->getServiceManager()->createInstanceWithArgumentsAndContext( OUString::createFromAscii( pImportService
), aFilterArgs
, xContext
);
196 SAL_WARN_IF( !xFilter
, "svx", "Can't instantiate filter component " << pImportService
);
197 uno::Reference
< xml::sax::XFastParser
> xFastParser( xFilter
, UNO_QUERY
);
201 if( xFastParser
.is() )
203 // connect model and filter
204 uno::Reference
< document::XImporter
> xImporter( xFilter
, UNO_QUERY
);
205 xImporter
->setTargetDocument( xTargetDocument
);
207 // finally, parser the stream
208 xFastParser
->parseStream( aParserInput
);
213 catch( uno::Exception
& )
215 DBG_UNHANDLED_EXCEPTION("svx");
219 xGraphicHelper
->dispose();
220 xGraphicHelper
.clear();
221 xGraphicStorageHandler
= nullptr;
223 if( xObjectHelper
.is() )
224 xObjectHelper
->dispose();
225 xObjectHelper
.clear();
226 xObjectResolver
= nullptr;
228 if ( xTargetModel
.is() )
229 xTargetModel
->unlockControllers();
234 bool SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
)
236 Reference
< lang::XComponent
> xComponent
;
237 return SvxDrawingLayerImport( pModel
, xInputStream
, xComponent
);
240 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */