1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * OpenOffice.org - a multi-platform office productivity suite
10 * This file is part of OpenOffice.org.
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
27 ************************************************************************/
29 #include <tools/debug.hxx>
30 #include <tools/diagnose_ex.h>
31 #include <com/sun/star/xml/sax/InputSource.hpp>
32 #include <com/sun/star/xml/sax/XParser.hpp>
33 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
34 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
35 #include <com/sun/star/lang/XComponent.hpp>
36 #include <com/sun/star/io/XActiveDataSource.hpp>
37 #include <com/sun/star/xml/sax/SAXParseException.hpp>
38 #include <com/sun/star/io/XOutputStream.hpp>
39 #include <com/sun/star/document/XFilter.hpp>
40 #include <com/sun/star/document/XExporter.hpp>
41 #include <com/sun/star/document/XImporter.hpp>
42 #include <comphelper/processfactory.hxx>
43 #include <unotools/streamwrap.hxx>
44 #include <sot/storage.hxx>
45 #include <svx/svdmodel.hxx>
46 #include <svx/xmleohlp.hxx>
47 #include <svx/xmlgrhlp.hxx>
49 #include <svx/unomodel.hxx>
51 using ::rtl::OUString
;
52 using namespace ::com::sun::star
;
53 using namespace ::com::sun::star::uno
;
55 sal_Bool
SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
, const Reference
< lang::XComponent
>& xComponent
)
57 return SvxDrawingLayerExport( pModel
, xOut
, xComponent
, "com.sun.star.comp.DrawingLayer.XMLExporter" );
60 sal_Bool
SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
, const Reference
< lang::XComponent
>& xComponent
, const char* pExportService
)
62 sal_Bool bDocRet
= xOut
.is();
64 Reference
< document::XGraphicObjectResolver
> xGraphicResolver
;
65 SvXMLGraphicHelper
*pGraphicHelper
= 0;
67 Reference
< document::XEmbeddedObjectResolver
> xObjectResolver
;
68 SvXMLEmbeddedObjectHelper
*pObjectHelper
= 0;
70 Reference
< lang::XComponent
> xSourceDoc( xComponent
);
73 if( !xSourceDoc
.is() )
75 xSourceDoc
= new SvxUnoDrawingModel( pModel
);
76 pModel
->setUnoModel( Reference
< XInterface
>::query( xSourceDoc
) );
79 uno::Reference
< lang::XMultiServiceFactory
> xServiceFactory( ::comphelper::getProcessServiceFactory() );
80 if( !xServiceFactory
.is() )
82 OSL_FAIL( "got no service manager" );
88 uno::Reference
< uno::XInterface
> xWriter( xServiceFactory
->createInstance( OUString( "com.sun.star.xml.sax.Writer" ) ) );
91 OSL_FAIL( "com.sun.star.xml.sax.Writer service missing" );
95 ::comphelper::IEmbeddedHelper
*pPersist
= pModel
->GetPersist();
98 pObjectHelper
= SvXMLEmbeddedObjectHelper::Create( *pPersist
, EMBEDDEDOBJECTHELPER_MODE_WRITE
);
99 xObjectResolver
= pObjectHelper
;
102 pGraphicHelper
= SvXMLGraphicHelper::Create( GRAPHICHELPER_MODE_WRITE
);
103 xGraphicResolver
= pGraphicHelper
;
107 uno::Reference
<xml::sax::XDocumentHandler
> xHandler( xWriter
, uno::UNO_QUERY
);
110 uno::Reference
< io::XActiveDataSource
> xDocSrc( xWriter
, uno::UNO_QUERY
);
111 xDocSrc
->setOutputStream( xOut
);
113 uno::Sequence
< uno::Any
> aArgs( xObjectResolver
.is() ? 3 : 2 );
114 aArgs
[0] <<= xHandler
;
115 aArgs
[1] <<= xGraphicResolver
;
116 if( xObjectResolver
.is() )
117 aArgs
[2] <<= xObjectResolver
;
119 uno::Reference
< document::XFilter
> xFilter( xServiceFactory
->createInstanceWithArguments( OUString::createFromAscii( pExportService
), aArgs
), uno::UNO_QUERY
);
122 OSL_FAIL( "com.sun.star.comp.Draw.XMLExporter service missing" );
128 uno::Reference
< document::XExporter
> xExporter( xFilter
, uno::UNO_QUERY
);
131 xExporter
->setSourceDocument( xSourceDoc
);
133 uno::Sequence
< beans::PropertyValue
> aDescriptor( 0 );
134 bDocRet
= xFilter
->filter( aDescriptor
);
140 catch(uno::Exception
const&)
142 DBG_UNHANDLED_EXCEPTION();
147 SvXMLGraphicHelper::Destroy( pGraphicHelper
);
148 xGraphicResolver
= 0;
151 SvXMLEmbeddedObjectHelper::Destroy( pObjectHelper
);
157 sal_Bool
SvxDrawingLayerExport( SdrModel
* pModel
, const uno::Reference
<io::XOutputStream
>& xOut
)
159 Reference
< lang::XComponent
> xComponent
;
160 return SvxDrawingLayerExport( pModel
, xOut
, xComponent
);
163 //-////////////////////////////////////////////////////////////////////
165 sal_Bool
SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
, const Reference
< lang::XComponent
>& xComponent
)
167 return SvxDrawingLayerImport( pModel
, xInputStream
, xComponent
, "com.sun.star.comp.Draw.XMLOasisImporter" );
170 sal_Bool
SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
, const Reference
< lang::XComponent
>& xComponent
, const char* pImportService
)
174 Reference
< document::XGraphicObjectResolver
> xGraphicResolver
;
175 SvXMLGraphicHelper
*pGraphicHelper
= 0;
177 Reference
< document::XEmbeddedObjectResolver
> xObjectResolver
;
178 SvXMLEmbeddedObjectHelper
*pObjectHelper
= 0;
180 Reference
< lang::XComponent
> xTargetDocument( xComponent
);
181 if( !xTargetDocument
.is() )
183 xTargetDocument
= new SvxUnoDrawingModel( pModel
);
184 pModel
->setUnoModel( Reference
< XInterface
>::query( xTargetDocument
) );
187 Reference
< frame::XModel
> xTargetModel( xTargetDocument
, UNO_QUERY
);
191 // Get service factory
192 Reference
< lang::XMultiServiceFactory
> xServiceFactory
= comphelper::getProcessServiceFactory();
193 DBG_ASSERT( xServiceFactory
.is(), "XMLReader::Read: got no service manager" );
195 if( !xServiceFactory
.is() )
200 if ( xTargetModel
.is() )
201 xTargetModel
->lockControllers();
203 // -------------------------------------
205 pGraphicHelper
= SvXMLGraphicHelper::Create( GRAPHICHELPER_MODE_READ
);
206 xGraphicResolver
= pGraphicHelper
;
208 ::comphelper::IEmbeddedHelper
*pPersist
= pModel
->GetPersist();
211 pObjectHelper
= SvXMLEmbeddedObjectHelper::Create(
213 EMBEDDEDOBJECTHELPER_MODE_READ
);
214 xObjectResolver
= pObjectHelper
;
218 // -------------------------------------
224 // prepare ParserInputSrouce
225 xml::sax::InputSource aParserInput
;
226 aParserInput
.aInputStream
= xInputStream
;
229 Reference
< xml::sax::XParser
> xParser( xServiceFactory
->createInstance( OUString("com.sun.star.xml.sax.Parser") ), UNO_QUERY
);
230 DBG_ASSERT( xParser
.is(), "Can't create parser" );
232 // prepare filter arguments
233 Sequence
<Any
> aFilterArgs( 2 );
234 Any
*pArgs
= aFilterArgs
.getArray();
235 *pArgs
++ <<= xGraphicResolver
;
236 *pArgs
++ <<= xObjectResolver
;
239 Reference
< xml::sax::XDocumentHandler
> xFilter( xServiceFactory
->createInstanceWithArguments( OUString::createFromAscii( pImportService
), aFilterArgs
), UNO_QUERY
);
240 DBG_ASSERT( xFilter
.is(), "Can't instantiate filter component." );
243 if( xParser
.is() && xFilter
.is() )
245 // connect parser and filter
246 xParser
->setDocumentHandler( xFilter
);
248 // connect model and filter
249 uno::Reference
< document::XImporter
> xImporter( xFilter
, UNO_QUERY
);
250 xImporter
->setTargetDocument( xTargetDocument
);
252 // finally, parser the stream
253 xParser
->parseStream( aParserInput
);
259 catch( uno::Exception
& )
261 DBG_UNHANDLED_EXCEPTION();
265 SvXMLGraphicHelper::Destroy( pGraphicHelper
);
266 xGraphicResolver
= 0;
269 SvXMLEmbeddedObjectHelper::Destroy( pObjectHelper
);
272 if ( xTargetModel
.is() )
273 xTargetModel
->unlockControllers();
278 sal_Bool
SvxDrawingLayerImport( SdrModel
* pModel
, const uno::Reference
<io::XInputStream
>& xInputStream
)
280 Reference
< lang::XComponent
> xComponent
;
281 return SvxDrawingLayerImport( pModel
, xInputStream
, xComponent
);
284 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */