1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #ifdef _MSC_VER
28 #pragma warning (disable:4190)
29 #endif
30 #include <com/sun/star/graphic/XGraphicProvider.hpp>
31 #include <com/sun/star/graphic/GraphicType.hpp>
32 #include <com/sun/star/ucb/XSimpleFileAccess2.hpp>
33
34 #include <unotools/localfilehelper.hxx>
35 #include <tools/errinf.hxx>
36 #include <vcl/msgbox.hxx>
37 #include <vcl/metaact.hxx>
38 #include <vcl/virdev.hxx>
39 #include <sfx2/docfile.hxx>
40 #include <sfx2/docfilt.hxx>
41 #include <sfx2/frame.hxx>
42 #include <svx/svdograf.hxx>
43 #include <svx/svdpagv.hxx>
44
45 #include "../../ui/inc/strings.hrc"
46 #include "../../ui/inc/DrawViewShell.hxx"
47 #include "../../ui/inc/DrawDocShell.hxx"
48 #include "../../ui/inc/ClientView.hxx"
49 #include "../../ui/inc/FrameView.hxx"
50
51 #include "comphelper/anytostring.hxx"
52 #include "cppuhelper/exc_hlp.hxx"
53
54 // --
55 #include <comphelper/processfactory.hxx>
56 #include <unotools/pathoptions.hxx>
57 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
58 #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
59 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
60 #include <sfx2/filedlghelper.hxx>
61 #include <tools/urlobj.hxx>
62 #include <svtools/filter.hxx>
63 #include <svx/xoutbmp.hxx>
64
65 // --
66
67 #include "sdpage.hxx"
68 #include "drawdoc.hxx"
69 #include "sdresid.hxx"
70 #include "sdgrffilter.hxx"
71 #include "../../ui/inc/ViewShellBase.hxx"
72 #include <com/sun/star/uno/Sequence.h>
73 #include <com/sun/star/beans/PropertyValue.hpp>
74 #include <com/sun/star/beans/PropertyValues.hpp>
75 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
76 #include <com/sun/star/lang/XComponent.hpp>
77 #include <com/sun/star/document/XFilter.hpp>
78 #include <com/sun/star/document/XExporter.hpp>
79 #include <comphelper/processfactory.hxx>
80 #include <com/sun/star/view/XSelectionSupplier.hpp>
81 #include <com/sun/star/drawing/XDrawView.hpp>
82 #include "../../ui/inc/DrawController.hxx"
83 #include <cppuhelper/implbase2.hxx>
84 #include <com/sun/star/drawing/XShape.hpp>
85 #include <com/sun/star/task/XInteractionHandler.hpp>
86 #include <com/sun/star/task/XInteractionRequest.hpp>
87 #include <com/sun/star/drawing/GraphicFilterRequest.hpp>
88
89 using namespace ::com::sun::star;
90 using namespace ::com::sun::star::uno;
91 using namespace ::com::sun::star::lang;
92 using namespace ::com::sun::star::beans;
93 using namespace ::com::sun::star::graphic;
94 using namespace ::com::sun::star::io;
95 using namespace ::com::sun::star::ucb;
96 using namespace com::sun::star::ui::dialogs;
97 using rtl::OUString;
98 using namespace ::sfx2;
99
100
101 // -----------------------------------------------------------------------------
102
103 class SdGRFFilter_ImplInteractionHdl : public ::cppu::WeakImplHelper1< com::sun::star::task::XInteractionHandler >
104 {
105 com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler > m_xInter;
106 sal_uInt16 nFilterError;
107
108 public:
109
SdGRFFilter_ImplInteractionHdl(com::sun::star::uno::Reference<com::sun::star::task::XInteractionHandler> xInteraction)110 SdGRFFilter_ImplInteractionHdl( com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler > xInteraction ) :
111 m_xInter( xInteraction ),
112 nFilterError( GRFILTER_OK )
113 {}
114
115 ~SdGRFFilter_ImplInteractionHdl();
116
GetErrorCode() const117 sal_uInt16 GetErrorCode() const { return nFilterError; };
118
119 virtual void SAL_CALL handle( const com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest >& )
120 throw( com::sun::star::uno::RuntimeException );
121 };
122
~SdGRFFilter_ImplInteractionHdl()123 SdGRFFilter_ImplInteractionHdl::~SdGRFFilter_ImplInteractionHdl()
124 {
125 }
126
handle(const com::sun::star::uno::Reference<com::sun::star::task::XInteractionRequest> & xRequest)127 void SdGRFFilter_ImplInteractionHdl::handle( const com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest >& xRequest )
128 throw( com::sun::star::uno::RuntimeException )
129 {
130 if( !m_xInter.is() )
131 return;
132
133 com::sun::star::drawing::GraphicFilterRequest aErr;
134 if ( xRequest->getRequest() >>= aErr )
135 nFilterError = (sal_uInt16)aErr.ErrCode;
136 else
137 m_xInter->handle( xRequest );
138 }
139
140
141 // ---------------
142 // - SdPPTFilter -
143 // ---------------
144
SdGRFFilter(SfxMedium & rMedium,::sd::DrawDocShell & rDocShell)145 SdGRFFilter::SdGRFFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) :
146 SdFilter( rMedium, rDocShell, sal_True )
147 {
148 }
149
150 // -----------------------------------------------------------------------------
151
~SdGRFFilter()152 SdGRFFilter::~SdGRFFilter()
153 {
154 }
155
156 // -----------------------------------------------------------------------------
157
HandleGraphicFilterError(sal_uInt16 nFilterError,sal_uLong nStreamError)158 void SdGRFFilter::HandleGraphicFilterError( sal_uInt16 nFilterError, sal_uLong nStreamError )
159 {
160 sal_uInt16 nId;
161
162 switch( nFilterError )
163 {
164 case GRFILTER_OPENERROR:
165 nId = STR_IMPORT_GRFILTER_OPENERROR;
166 break;
167 case GRFILTER_IOERROR:
168 nId = STR_IMPORT_GRFILTER_IOERROR;
169 break;
170 case GRFILTER_FORMATERROR:
171 nId = STR_IMPORT_GRFILTER_FORMATERROR;
172 break;
173 case GRFILTER_VERSIONERROR:
174 nId = STR_IMPORT_GRFILTER_VERSIONERROR;
175 break;
176 case GRFILTER_TOOBIG:
177 nId = STR_IMPORT_GRFILTER_TOOBIG;
178 break;
179 case 0 :
180 nId = 0;
181 break;
182
183 default:
184 case GRFILTER_FILTERERROR:
185 nId = STR_IMPORT_GRFILTER_FILTERERROR;
186 break;
187 }
188
189 if( ERRCODE_NONE != nStreamError )
190 ErrorHandler::HandleError( nStreamError );
191 else if( STR_IMPORT_GRFILTER_IOERROR == nId )
192 ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
193 else
194 {
195 ErrorBox aErrorBox( NULL, WB_OK, String( SdResId( nId ) ) );
196 aErrorBox.Execute();
197 }
198 }
199
200 // -----------------------------------------------------------------------------
201
Import()202 sal_Bool SdGRFFilter::Import()
203 {
204 Graphic aGraphic;
205 const String aFileName( mrMedium.GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
206 GraphicFilter* pGraphicFilter = GraphicFilter::GetGraphicFilter();
207 const sal_uInt16 nFilter = pGraphicFilter->GetImportFormatNumberForTypeName( mrMedium.GetFilter()->GetTypeName() );
208 sal_Bool bRet = sal_False;
209
210 // ggf. Filterdialog ausfuehren
211 if ( !pGraphicFilter->HasImportDialog( nFilter ) || pGraphicFilter->DoImportDialog( NULL, nFilter ) )
212 {
213 SvStream* pIStm = mrMedium.GetInStream();
214 sal_uInt16 nReturn = pIStm ? pGraphicFilter->ImportGraphic( aGraphic, aFileName, *pIStm, nFilter ) : 1;
215
216 if( nReturn )
217 HandleGraphicFilterError( nReturn, pGraphicFilter->GetLastError().nStreamError );
218 else
219 {
220 if( mrDocument.GetPageCount() == 0L )
221 mrDocument.CreateFirstPages();
222
223 SdPage* pPage = mrDocument.GetSdPage( 0, PK_STANDARD );
224 Point aPos;
225 Size aPagSize( pPage->GetSize() );
226 Size aGrfSize( OutputDevice::LogicToLogic( aGraphic.GetPrefSize(),
227 aGraphic.GetPrefMapMode(), MAP_100TH_MM ) );
228
229 aPagSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder();
230 aPagSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
231
232 // scale to fit page
233 if ( ( ( aGrfSize.Height() > aPagSize.Height() ) || ( aGrfSize.Width() > aPagSize.Width() ) ) &&
234 aGrfSize.Height() && aPagSize.Height() )
235 {
236 double fGrfWH = (double) aGrfSize.Width() / aGrfSize.Height();
237 double fWinWH = (double) aPagSize.Width() / aPagSize.Height();
238
239 // Grafik an Pagesize anpassen (skaliert)
240 if( fGrfWH < fWinWH )
241 {
242 aGrfSize.Width() = (long) ( aPagSize.Height() * fGrfWH );
243 aGrfSize.Height() = aPagSize.Height();
244 }
245 else if( fGrfWH > 0.F )
246 {
247 aGrfSize.Width() = aPagSize.Width();
248 aGrfSize.Height()= (long) ( aPagSize.Width() / fGrfWH );
249 }
250 }
251
252 // Ausgaberechteck fuer Grafik setzen
253 aPos.X() = ( ( aPagSize.Width() - aGrfSize.Width() ) >> 1 ) + pPage->GetLftBorder();
254 aPos.Y() = ( ( aPagSize.Height() - aGrfSize.Height() ) >> 1 ) + pPage->GetUppBorder();
255
256 pPage->InsertObject( new SdrGrafObj( aGraphic, Rectangle( aPos, aGrfSize ) ) );
257 bRet = sal_True;
258 }
259 }
260 return bRet;
261 }
262
263 // -----------------------------------------------------------------------------
264
Export()265 sal_Bool SdGRFFilter::Export()
266 {
267 // SJ: todo: error handling, the GraphicExportFilter does not support proper errorhandling
268
269 sal_Bool bRet = sal_False;
270
271 uno::Reference< lang::XMultiServiceFactory >
272 xSMgr( ::comphelper::getProcessServiceFactory() );
273 uno::Reference< uno::XInterface > xComponent
274 ( xSMgr->createInstance( rtl::OUString::createFromAscii( "com.sun.star.drawing.GraphicExportFilter" ) ),
275 uno::UNO_QUERY );
276 if ( xComponent.is() )
277 {
278 uno::Reference< document::XExporter > xExporter
279 ( xComponent, uno::UNO_QUERY );
280 uno::Reference< document::XFilter > xFilter
281 ( xComponent, uno::UNO_QUERY );
282 if ( xExporter.is() && xFilter.is() )
283 {
284 SdPage* pPage = NULL;
285 sd::DrawViewShell* pDrawViewShell = static_cast< ::sd::DrawViewShell* >
286 ( ( ( mrDocShell.GetViewShell() && mrDocShell.GetViewShell()->ISA(::sd::DrawViewShell ) ) ? mrDocShell.GetViewShell() : NULL ) );
287
288 PageKind ePageKind = PK_STANDARD;
289 if( pDrawViewShell )
290 {
291 ePageKind = pDrawViewShell->GetPageKind();
292 if( PK_HANDOUT == ePageKind )
293 pPage = mrDocument.GetSdPage( 0, PK_HANDOUT );
294 else
295 pPage = pDrawViewShell->GetActualPage();
296 }
297 else
298 pPage = mrDocument.GetSdPage( 0, PK_STANDARD );
299
300 if ( pPage )
301 {
302 // taking the 'correct' page number, seems that there might exist a better method to archive this
303 pPage = mrDocument.GetSdPage( pPage->GetPageNum() ? ( pPage->GetPageNum() - 1 ) >> 1 : 0, ePageKind );
304 if ( pPage )
305 {
306 uno::Reference< lang::XComponent > xSource( pPage->getUnoPage(), uno::UNO_QUERY );
307 SfxItemSet* pSet = mrMedium.GetItemSet();
308 GraphicFilter* pGraphicFilter = GraphicFilter::GetGraphicFilter();
309 if ( pSet && pGraphicFilter && xSource.is() )
310 {
311 const String aTypeName( mrMedium.GetFilter()->GetTypeName() );
312 const sal_uInt16 nFilter = pGraphicFilter->GetExportFormatNumberForTypeName( aTypeName );
313 if ( nFilter != GRFILTER_FORMAT_NOTFOUND )
314 {
315 uno::Reference< task::XInteractionHandler > mXInteractionHandler;
316
317 beans::PropertyValues aArgs;
318 TransformItems( SID_SAVEASDOC, *pSet, aArgs );
319
320 rtl::OUString sInteractionHandler( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) );
321 rtl::OUString sFilterName( RTL_CONSTASCII_USTRINGPARAM( "FilterName" ) );
322 rtl::OUString sShortName( pGraphicFilter->GetExportFormatShortName( nFilter ) );
323
324 sal_Bool bFilterNameFound = sal_False;
325 sal_Int32 i, nCount;
326 for ( i = 0, nCount = aArgs.getLength(); i < nCount; i++ )
327 {
328 rtl::OUString& rStr = aArgs[ i ].Name;
329 if ( rStr == sFilterName )
330 {
331 bFilterNameFound = sal_True;
332 aArgs[ i ].Name = sFilterName;
333 aArgs[ i ].Value <<= sShortName;
334 }
335 else if ( rStr == sInteractionHandler )
336 {
337 uno::Reference< task::XInteractionHandler > xHdl;
338 if ( aArgs[ i ].Value >>= xHdl )
339 {
340 mXInteractionHandler = new SdGRFFilter_ImplInteractionHdl( xHdl );
341 aArgs[ i ].Value <<= mXInteractionHandler;
342 }
343 }
344 }
345 if ( !bFilterNameFound )
346 {
347 aArgs.realloc( ++nCount );
348 aArgs[ i ].Name = sFilterName;
349 aArgs[ i ].Value <<= sShortName;
350 }
351
352 // take selection if needed
353 if( ( SFX_ITEM_SET == pSet->GetItemState( SID_SELECTION ) )
354 && static_cast< const SfxBoolItem& >( pSet->Get( SID_SELECTION ) ).GetValue()
355 && pDrawViewShell )
356 {
357 uno::Reference< view::XSelectionSupplier > xSelectionSupplier(
358 pDrawViewShell->GetViewShellBase().GetController(), uno::UNO_QUERY );
359 if ( xSelectionSupplier.is() )
360 {
361 uno::Any aSelection( xSelectionSupplier->getSelection() );
362 uno::Reference< lang::XComponent > xSelection;
363 if ( aSelection >>= xSelection )
364 xSource = xSelection;
365 }
366 }
367 xExporter->setSourceDocument( xSource );
368 bRet = xFilter->filter( aArgs );
369 if ( !bRet && mXInteractionHandler.is() )
370 SdGRFFilter::HandleGraphicFilterError(
371 static_cast< SdGRFFilter_ImplInteractionHdl* >( mXInteractionHandler.get() )->GetErrorCode(),
372 pGraphicFilter->GetLastError().nStreamError );
373 }
374 }
375 }
376 }
377 }
378 }
379 return bRet;
380 }
381
SaveGraphic(const::com::sun::star::uno::Reference<::com::sun::star::drawing::XShape> & xShape)382 void SdGRFFilter::SaveGraphic( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xShape )
383 {
384 try
385 {
386 Reference< XMultiServiceFactory > xSM( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
387
388 Reference< XGraphicProvider > xProvider( xSM->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.graphic.GraphicProvider" ) ) ), UNO_QUERY_THROW );
389 Reference< XPropertySet > xShapeSet( xShape, UNO_QUERY_THROW );
390
391 // detect mime type of graphic
392 OUString aMimeType;
393 OUString sGraphicURL;
394
395 // first try to detect from graphic object
396 Reference< XPropertySet > xGraphicSet( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ) ), UNO_QUERY_THROW );
397 xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ) ) >>= sGraphicURL;
398
399 bool bIsLinked = (sGraphicURL.getLength() != 0) && (sGraphicURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.GraphicObject:") ) != 0);
400
401 if( !bIsLinked )
402 xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) ) ) >>= aMimeType;
403
404 if( bIsLinked || aMimeType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "image/x-vclgraphic" ) ) || !aMimeType.getLength() )
405 {
406 // this failed, try to detect it from graphic stream and URL
407 OUString aURL( sGraphicURL );
408
409 if( aURL.getLength() == 0 )
410 xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStreamURL" ) ) ) >>= aURL;
411
412 {
413 Reference< XInputStream > xGraphStream( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStream" ) ) ), UNO_QUERY );
414 PropertyValues aDesc(2);
415 aDesc[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
416 aDesc[0].Value <<= aURL;
417 aDesc[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "InputStream" ) );
418 aDesc[1].Value <<= xGraphStream;
419
420 Reference< XPropertySet > xDescSet( xProvider->queryGraphicDescriptor( aDesc ), UNO_QUERY_THROW );
421
422 xDescSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) ) ) >>= aMimeType;
423 }
424 }
425
426 if( aMimeType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "image/x-vclgraphic" ) ) || !aMimeType.getLength() )
427 {
428 // this also failed, now set a mimetype that fits graphic best
429
430 // gif for animated pixel
431 // png for non animated pixel
432 // svm for vector format
433 sal_Int8 nGraphicType = 0;
434 xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicType" ) ) ) >>= nGraphicType;
435 switch( nGraphicType )
436 {
437 case ::com::sun::star::graphic::GraphicType::VECTOR:
438 aMimeType = OUString::createFromAscii( "image/x-svm" );
439 break;
440
441 case ::com::sun::star::graphic::GraphicType::PIXEL:
442 {
443 sal_Bool bAnimated = sal_False;
444 xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Animated" ) ) ) >>= bAnimated;
445
446 if( bAnimated )
447 {
448 aMimeType = OUString::createFromAscii( "image/gif" );
449 break;
450 }
451 }
452 // Fallthrough!
453 // case ::com::sun::star::graphic::GraphicType::EMPTY:
454 default:
455 aMimeType = OUString::createFromAscii( "image/png" );
456 break;
457 }
458 }
459
460 // init dialog
461 SvtPathOptions aPathOpt;
462 String sGrfPath( aPathOpt.GetGraphicPath() );
463
464 FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION, 0 );
465 Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
466
467 String aTitle( SdResId( STR_TITLE_SAVE_AS_PICTURE ) );
468 aDlgHelper.SetTitle( aTitle );
469
470 INetURLObject aPath;
471 aPath.SetSmartURL( sGrfPath);
472 xFP->setDisplayDirectory( aPath.GetMainURL(INetURLObject::DECODE_TO_IURI) );
473
474 // populate filter dialog filter list and select default filter to match graphic mime type
475
476 GraphicFilter& rGF = *GraphicFilter::GetGraphicFilter();
477 Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
478 OUString aDefaultFormatName;
479 sal_uInt16 nCount = rGF.GetExportFormatCount();
480
481 std::map< OUString, OUString > aMimeTypeMap;
482
483 for ( sal_uInt16 i = 0; i < nCount; i++ )
484 {
485 const OUString aExportFormatName( rGF.GetExportFormatName( i ) );
486 const OUString aFilterMimeType( rGF.GetExportFormatMediaType( i ) );
487 xFltMgr->appendFilter( aExportFormatName, rGF.GetExportWildcard( i ) );
488 aMimeTypeMap[ aExportFormatName ] = aFilterMimeType;
489 if( aMimeType == aFilterMimeType )
490 aDefaultFormatName = aExportFormatName;
491 }
492
493 if( aDefaultFormatName.getLength() == 0 )
494 {
495 nCount = rGF.GetImportFormatCount();
496 for( sal_uInt16 i = 0; i < nCount; i++ )
497 {
498 const OUString aFilterMimeType( rGF.GetImportFormatMediaType( i ) );
499 if( aMimeType == aFilterMimeType )
500 {
501 aDefaultFormatName = rGF.GetImportFormatName( i );
502 xFltMgr->appendFilter( aDefaultFormatName, rGF.GetImportWildcard( i ) );
503 aMimeTypeMap[ aDefaultFormatName ] = aFilterMimeType;
504 break;
505 }
506 }
507 }
508
509 if( aDefaultFormatName.getLength() == 0 )
510 aDefaultFormatName = OUString( RTL_CONSTASCII_USTRINGPARAM( "PNG - Portable Network Graphic" ) );
511
512 xFltMgr->setCurrentFilter( aDefaultFormatName );
513
514 // execute dialog
515
516 if( aDlgHelper.Execute() == ERRCODE_NONE )
517 {
518 OUString sPath( xFP->getFiles().getConstArray()[0] );
519 aPath.SetSmartURL( sPath);
520 sGrfPath = aPath.GetPath();
521
522 OUString aExportMimeType( aMimeTypeMap[xFltMgr->getCurrentFilter()] );
523
524 Reference< XInputStream > xGraphStream;
525 if( aMimeType == aExportMimeType )
526 xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStream" ) ) ) >>= xGraphStream;
527
528 if( xGraphStream.is() )
529 {
530 Reference< XSimpleFileAccess2 > xFileAccess( xSM->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ucb.SimpleFileAccess" ) ) ), UNO_QUERY_THROW );
531 xFileAccess->writeFile( sPath, xGraphStream );
532 }
533 else
534 {
535 PropertyValues aDesc(2);
536 aDesc[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
537 aDesc[0].Value <<= sPath;
538 aDesc[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) );
539 aDesc[1].Value <<= aExportMimeType;
540 Reference< XGraphic > xGraphic( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ) ), UNO_QUERY_THROW );
541 xProvider->storeGraphic( xGraphic, aDesc );
542 }
543 }
544 }
545 catch( Exception& )
546 {
547 DBG_ERROR(
548 (rtl::OString("SdGRFFilter::SaveGraphic(), "
549 "exception caught: ") +
550 rtl::OUStringToOString(
551 comphelper::anyToString( cppu::getCaughtException() ),
552 RTL_TEXTENCODING_UTF8 )).getStr() );
553 }
554 }
555