Line data Source code
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 <config_features.h>
21 :
22 : #include "sal/config.h"
23 :
24 : #include <algorithm>
25 :
26 : #include <comphelper/processfactory.hxx>
27 : #include <tools/urlobj.hxx>
28 : #include <tools/vcompat.hxx>
29 : #include <unotools/streamwrap.hxx>
30 : #include <unotools/ucbstreamhelper.hxx>
31 : #include <unotools/tempfile.hxx>
32 : #include <unotools/localfilehelper.hxx>
33 : #include <ucbhelper/content.hxx>
34 : #include <sot/storage.hxx>
35 : #include <sot/formats.hxx>
36 : #include <sot/filelist.hxx>
37 : #include <vcl/virdev.hxx>
38 : #include <vcl/cvtgrf.hxx>
39 : #include <svl/itempool.hxx>
40 : #include <sfx2/docfile.hxx>
41 : #include <avmedia/mediawindow.hxx>
42 : #include <svx/svdograf.hxx>
43 : #include <svx/fmpage.hxx>
44 : #include "codec.hxx"
45 : #include <svx/unomodel.hxx>
46 : #include <svx/fmmodel.hxx>
47 : #include <svx/fmview.hxx>
48 : #include "svx/galmisc.hxx"
49 : #include "svx/galtheme.hxx"
50 : #include <com/sun/star/sdbc/XResultSet.hpp>
51 : #include <com/sun/star/ucb/XContentAccess.hpp>
52 : #include <com/sun/star/io/XInputStream.hpp>
53 : #include "galobj.hxx"
54 : #include <svx/gallery1.hxx>
55 : #include "galtheme.hrc"
56 : #include <vcl/lstbox.hxx>
57 : #include "gallerydrawmodel.hxx"
58 : #include <boost/scoped_array.hpp>
59 : #include <boost/scoped_ptr.hpp>
60 :
61 : using namespace ::com::sun::star;
62 :
63 : // - SgaTheme -
64 :
65 :
66 22 : GalleryTheme::GalleryTheme( Gallery* pGallery, GalleryThemeEntry* pThemeEntry )
67 : : m_bDestDirRelative(false)
68 : , pParent(pGallery)
69 : , pThm(pThemeEntry)
70 : , mnThemeLockCount(0)
71 : , mnBroadcasterLockCount(0)
72 : , nDragPos(0)
73 : , bDragging(false)
74 22 : , bAbortActualize(false)
75 : {
76 22 : ImplCreateSvDrawStorage();
77 22 : }
78 :
79 66 : GalleryTheme::~GalleryTheme()
80 : {
81 22 : ImplWrite();
82 :
83 525 : for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
84 : {
85 503 : GalleryObject* pEntry = aObjectList[ i ];
86 503 : Broadcast( GalleryHint( GalleryHintType::CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
87 503 : Broadcast( GalleryHint( GalleryHintType::OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
88 503 : delete pEntry;
89 : }
90 22 : aObjectList.clear();
91 :
92 44 : }
93 :
94 22 : void GalleryTheme::ImplCreateSvDrawStorage()
95 : {
96 : try
97 : {
98 22 : aSvDrawStorageRef = new SotStorage( false, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), pThm->IsReadOnly() ? StreamMode::READ : STREAM_STD_READWRITE );
99 : // #i50423# ReadOnly may not been set though the file can't be written (because of security reasons)
100 22 : if ( ( aSvDrawStorageRef->GetError() != ERRCODE_NONE ) && !pThm->IsReadOnly() )
101 0 : aSvDrawStorageRef = new SotStorage( false, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ );
102 : }
103 0 : catch (const css::ucb::ContentCreationException& e)
104 : {
105 : SAL_WARN("svx", "failed to open: "
106 : << GetSdvURL().GetMainURL(INetURLObject::NO_DECODE)
107 : << "due to : " << e.Message);
108 : }
109 22 : }
110 :
111 503 : bool GalleryTheme::ImplWriteSgaObject( const SgaObject& rObj, size_t nPos, GalleryObject* pExistentEntry )
112 : {
113 503 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE ));
114 503 : bool bRet = false;
115 :
116 503 : if( pOStm )
117 : {
118 503 : const sal_uInt32 nOffset = pOStm->Seek( STREAM_SEEK_TO_END );
119 :
120 503 : rObj.WriteData( *pOStm, m_aDestDir );
121 :
122 503 : if( !pOStm->GetError() )
123 : {
124 : GalleryObject* pEntry;
125 :
126 503 : if( !pExistentEntry )
127 : {
128 503 : pEntry = new GalleryObject;
129 503 : if ( nPos < aObjectList.size() )
130 : {
131 0 : GalleryObjectList::iterator it = aObjectList.begin();
132 0 : ::std::advance( it, nPos );
133 0 : aObjectList.insert( it, pEntry );
134 : }
135 : else
136 503 : aObjectList.push_back( pEntry );
137 : }
138 : else
139 0 : pEntry = pExistentEntry;
140 :
141 503 : pEntry->aURL = rObj.GetURL();
142 503 : pEntry->nOffset = nOffset;
143 503 : pEntry->eObjKind = rObj.GetObjKind();
144 503 : bRet = true;
145 : }
146 : }
147 :
148 503 : return bRet;
149 : }
150 :
151 0 : SgaObject* GalleryTheme::ImplReadSgaObject( GalleryObject* pEntry )
152 : {
153 0 : SgaObject* pSgaObj = NULL;
154 :
155 0 : if( pEntry )
156 : {
157 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ ));
158 :
159 0 : if( pIStm )
160 : {
161 : sal_uInt32 nInventor;
162 :
163 : // Check to ensure that the file is a valid SGA file
164 0 : pIStm->Seek( pEntry->nOffset );
165 0 : pIStm->ReadUInt32( nInventor );
166 :
167 0 : if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) )
168 : {
169 0 : pIStm->Seek( pEntry->nOffset );
170 :
171 0 : switch( pEntry->eObjKind )
172 : {
173 0 : case( SGA_OBJ_BMP ): pSgaObj = new SgaObjectBmp(); break;
174 0 : case( SGA_OBJ_ANIM ): pSgaObj = new SgaObjectAnim(); break;
175 0 : case( SGA_OBJ_INET ): pSgaObj = new SgaObjectINet(); break;
176 0 : case( SGA_OBJ_SVDRAW ): pSgaObj = new SgaObjectSvDraw(); break;
177 0 : case( SGA_OBJ_SOUND ): pSgaObj = new SgaObjectSound(); break;
178 :
179 : default:
180 0 : break;
181 : }
182 :
183 0 : if( pSgaObj )
184 : {
185 0 : ReadSgaObject( *pIStm, *pSgaObj );
186 0 : pSgaObj->ImplUpdateURL( pEntry->aURL );
187 : }
188 : }
189 0 : }
190 : }
191 :
192 0 : return pSgaObj;
193 : }
194 :
195 22 : void GalleryTheme::ImplWrite()
196 : {
197 22 : if( IsModified() )
198 : {
199 22 : INetURLObject aPathURL( GetThmURL() );
200 :
201 22 : aPathURL.removeSegment();
202 22 : aPathURL.removeFinalSlash();
203 :
204 : DBG_ASSERT( aPathURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
205 :
206 22 : if( FileExists( aPathURL ) || CreateDir( aPathURL ) )
207 : {
208 : #ifdef UNX
209 22 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE | StreamMode::COPY_ON_SYMLINK | StreamMode::TRUNC ));
210 : #else
211 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE | StreamMode::TRUNC ));
212 : #endif
213 :
214 22 : if( pOStm )
215 : {
216 22 : WriteGalleryTheme( *pOStm, *this );
217 22 : pOStm.reset();
218 : }
219 :
220 22 : ImplSetModified( false );
221 22 : }
222 : }
223 22 : }
224 :
225 0 : const GalleryObject* GalleryTheme::ImplGetGalleryObject( const INetURLObject& rURL )
226 : {
227 0 : for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
228 0 : if ( aObjectList[ i ]->aURL == rURL )
229 0 : return aObjectList[ i ];
230 0 : return NULL;
231 : }
232 :
233 0 : INetURLObject GalleryTheme::ImplGetURL( const GalleryObject* pObject ) const
234 : {
235 0 : INetURLObject aURL;
236 :
237 0 : if( pObject )
238 0 : aURL = pObject->aURL;
239 :
240 0 : return aURL;
241 : }
242 :
243 0 : INetURLObject GalleryTheme::ImplCreateUniqueURL( SgaObjKind eObjKind, ConvertDataFormat nFormat )
244 : {
245 0 : INetURLObject aDir( GetParent()->GetUserURL() );
246 0 : INetURLObject aInfoFileURL( GetParent()->GetUserURL() );
247 0 : INetURLObject aNewURL;
248 0 : sal_uInt32 nNextNumber = 1999;
249 0 : sal_Char const* pExt = NULL;
250 : bool bExists;
251 :
252 0 : aDir.Append( OUString("dragdrop") );
253 0 : CreateDir( aDir );
254 :
255 0 : aInfoFileURL.Append( OUString("sdddndx1") );
256 :
257 : // read next possible number
258 0 : if( FileExists( aInfoFileURL ) )
259 : {
260 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ ));
261 :
262 0 : if( pIStm )
263 : {
264 0 : pIStm->ReadUInt32( nNextNumber );
265 0 : }
266 : }
267 :
268 : // create extension
269 0 : if( nFormat != ConvertDataFormat::Unknown )
270 : {
271 0 : switch( nFormat )
272 : {
273 0 : case( ConvertDataFormat::BMP ): pExt = ".bmp"; break;
274 0 : case( ConvertDataFormat::GIF ): pExt = ".gif"; break;
275 0 : case( ConvertDataFormat::JPG ): pExt = ".jpg"; break;
276 0 : case( ConvertDataFormat::MET ): pExt = ".met"; break;
277 0 : case( ConvertDataFormat::PCT ): pExt = ".pct"; break;
278 0 : case( ConvertDataFormat::PNG ): pExt = ".png"; break;
279 0 : case( ConvertDataFormat::SVM ): pExt = ".svm"; break;
280 0 : case( ConvertDataFormat::TIF ): pExt = ".tif"; break;
281 0 : case( ConvertDataFormat::WMF ): pExt = ".wmf"; break;
282 0 : case( ConvertDataFormat::EMF ): pExt = ".emf"; break;
283 :
284 : default:
285 0 : pExt = ".grf";
286 0 : break;
287 : }
288 : }
289 :
290 0 : do
291 : {
292 : // get URL
293 0 : if( SGA_OBJ_SVDRAW == eObjKind )
294 : {
295 0 : OUString aFileName( "gallery/svdraw/dd" );
296 0 : aNewURL = INetURLObject( aFileName += OUString::number( ++nNextNumber % 99999999 ), INetProtocol::PrivSoffice );
297 :
298 0 : bExists = false;
299 :
300 0 : for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
301 0 : if ( aObjectList[ i ]->aURL == aNewURL )
302 : {
303 0 : bExists = true;
304 0 : break;
305 0 : }
306 : }
307 : else
308 : {
309 0 : OUString aFileName( "dd" );
310 :
311 0 : aFileName += OUString::number( ++nNextNumber % 999999 );
312 :
313 0 : if (pExt)
314 0 : aFileName += OUString( pExt, strlen(pExt), RTL_TEXTENCODING_ASCII_US );
315 :
316 0 : aNewURL = aDir;
317 0 : aNewURL.Append( aFileName );
318 :
319 0 : bExists = FileExists( aNewURL );
320 : }
321 : }
322 : while( bExists );
323 :
324 : // write updated number
325 0 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE ));
326 :
327 0 : if( pOStm )
328 : {
329 0 : pOStm->WriteUInt32( nNextNumber );
330 : }
331 :
332 0 : return aNewURL;
333 : }
334 :
335 503 : void GalleryTheme::ImplBroadcast( sal_uIntPtr nUpdatePos )
336 : {
337 503 : if( !IsBroadcasterLocked() )
338 : {
339 503 : if( GetObjectCount() && ( nUpdatePos >= GetObjectCount() ) )
340 503 : nUpdatePos = GetObjectCount() - 1;
341 :
342 503 : Broadcast( GalleryHint( GalleryHintType::THEME_UPDATEVIEW, GetName(), nUpdatePos ) );
343 : }
344 503 : }
345 :
346 0 : bool GalleryTheme::UnlockTheme()
347 : {
348 : DBG_ASSERT( mnThemeLockCount, "Theme is not locked" );
349 :
350 0 : bool bRet = false;
351 :
352 0 : if( mnThemeLockCount )
353 : {
354 0 : --mnThemeLockCount;
355 0 : bRet = true;
356 : }
357 :
358 0 : return bRet;
359 : }
360 :
361 0 : void GalleryTheme::UnlockBroadcaster( sal_uIntPtr nUpdatePos )
362 : {
363 : DBG_ASSERT( mnBroadcasterLockCount, "Broadcaster is not locked" );
364 :
365 0 : if( mnBroadcasterLockCount && !--mnBroadcasterLockCount )
366 0 : ImplBroadcast( nUpdatePos );
367 0 : }
368 :
369 503 : bool GalleryTheme::InsertObject( const SgaObject& rObj, sal_uIntPtr nInsertPos )
370 : {
371 503 : if (!rObj.IsValid())
372 0 : return false;
373 :
374 503 : GalleryObject* pFoundEntry = NULL;
375 503 : size_t iFoundPos = 0;
376 16671 : for (size_t n = aObjectList.size(); iFoundPos < n; ++iFoundPos)
377 : {
378 16168 : if (aObjectList[ iFoundPos ]->aURL == rObj.GetURL())
379 : {
380 0 : pFoundEntry = aObjectList[ iFoundPos ];
381 0 : break;
382 : }
383 : }
384 :
385 503 : if (pFoundEntry)
386 : {
387 0 : GalleryObject aNewEntry;
388 :
389 : // update title of new object if necessary
390 0 : if (rObj.GetTitle().isEmpty())
391 : {
392 0 : boost::scoped_ptr<SgaObject> pOldObj(ImplReadSgaObject(pFoundEntry));
393 :
394 0 : if (pOldObj)
395 : {
396 0 : ((SgaObject&) rObj).SetTitle( pOldObj->GetTitle() );
397 0 : }
398 : }
399 0 : else if (rObj.GetTitle() == "__<empty>__")
400 0 : ((SgaObject&) rObj).SetTitle("");
401 :
402 0 : ImplWriteSgaObject(rObj, nInsertPos, &aNewEntry);
403 0 : pFoundEntry->nOffset = aNewEntry.nOffset;
404 : }
405 : else
406 503 : ImplWriteSgaObject(rObj, nInsertPos, NULL);
407 :
408 503 : ImplSetModified(true);
409 503 : ImplBroadcast(pFoundEntry? iFoundPos: nInsertPos);
410 :
411 503 : return true;
412 : }
413 :
414 0 : SgaObject* GalleryTheme::AcquireObject( size_t nPos )
415 : {
416 0 : return ImplReadSgaObject( aObjectList[ nPos ] );
417 : }
418 :
419 0 : void GalleryTheme::GetPreviewBitmapExAndStrings(sal_uIntPtr nPos, BitmapEx& rBitmapEx, Size& rSize, OUString& rTitle, OUString& rPath) const
420 : {
421 0 : const GalleryObject* pGalleryObject = nPos < aObjectList.size() ? aObjectList[ nPos ] : NULL;
422 :
423 0 : if(pGalleryObject)
424 : {
425 0 : rBitmapEx = pGalleryObject->maPreviewBitmapEx;
426 0 : rSize = pGalleryObject->maPreparedSize;
427 0 : rTitle = pGalleryObject->maTitle;
428 0 : rPath = pGalleryObject->maPath;
429 : }
430 : else
431 : {
432 : OSL_ENSURE(false, "OOps, no GalleryObject at this index (!)");
433 : }
434 0 : }
435 :
436 0 : void GalleryTheme::SetPreviewBitmapExAndStrings(sal_uIntPtr nPos, const BitmapEx& rBitmapEx, const Size& rSize, const OUString& rTitle, const OUString& rPath)
437 : {
438 0 : GalleryObject* pGalleryObject = nPos < aObjectList.size() ? aObjectList[ nPos ] : NULL;
439 :
440 0 : if(pGalleryObject)
441 : {
442 0 : pGalleryObject->maPreviewBitmapEx = rBitmapEx;
443 0 : pGalleryObject->maPreparedSize = rSize;
444 0 : pGalleryObject->maTitle = rTitle;
445 0 : pGalleryObject->maPath = rPath;
446 : }
447 : else
448 : {
449 : OSL_ENSURE(false, "OOps, no GalleryObject at this index (!)");
450 : }
451 0 : }
452 :
453 0 : void GalleryTheme::ReleaseObject( SgaObject* pObject )
454 : {
455 0 : delete pObject;
456 0 : }
457 :
458 0 : bool GalleryTheme::RemoveObject( size_t nPos )
459 : {
460 0 : GalleryObject* pEntry = NULL;
461 0 : if ( nPos < aObjectList.size() )
462 : {
463 0 : GalleryObjectList::iterator it = aObjectList.begin();
464 0 : ::std::advance( it, nPos );
465 0 : pEntry = *it;
466 0 : aObjectList.erase( it );
467 : }
468 :
469 0 : if( aObjectList.empty() )
470 0 : KillFile( GetSdgURL() );
471 :
472 0 : if( pEntry )
473 : {
474 0 : if( SGA_OBJ_SVDRAW == pEntry->eObjKind )
475 0 : aSvDrawStorageRef->Remove( pEntry->aURL.GetMainURL( INetURLObject::NO_DECODE ) );
476 :
477 0 : Broadcast( GalleryHint( GalleryHintType::CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
478 0 : Broadcast( GalleryHint( GalleryHintType::OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
479 0 : delete pEntry;
480 0 : pEntry = NULL;
481 :
482 0 : ImplSetModified( true );
483 0 : ImplBroadcast( nPos );
484 : }
485 :
486 0 : return( pEntry != NULL );
487 : }
488 :
489 0 : bool GalleryTheme::ChangeObjectPos( size_t nOldPos, size_t nNewPos )
490 : {
491 0 : if (nOldPos == nNewPos || nOldPos >= aObjectList.size())
492 0 : return false;
493 :
494 0 : GalleryObject* pEntry = aObjectList[nOldPos];
495 :
496 0 : GalleryObjectList::iterator it = aObjectList.begin();
497 0 : ::std::advance(it, nNewPos);
498 0 : aObjectList.insert(it, pEntry);
499 :
500 0 : if (nNewPos < nOldPos)
501 0 : nOldPos++;
502 :
503 0 : it = aObjectList.begin();
504 0 : ::std::advance(it, nOldPos);
505 0 : aObjectList.erase(it);
506 :
507 0 : ImplSetModified(true);
508 0 : ImplBroadcast((nNewPos < nOldPos)? nNewPos: (nNewPos - 1));
509 :
510 0 : return true;
511 : }
512 :
513 0 : void GalleryTheme::Actualize( const Link<>& rActualizeLink, GalleryProgress* pProgress )
514 : {
515 0 : if( !IsReadOnly() )
516 : {
517 0 : Graphic aGraphic;
518 0 : OUString aFormat;
519 : GalleryObject* pEntry;
520 0 : const size_t nCount = aObjectList.size();
521 :
522 0 : LockBroadcaster();
523 0 : bAbortActualize = false;
524 :
525 : // reset delete flag
526 0 : for (size_t i = 0; i < nCount; i++)
527 0 : aObjectList[ i ]->mbDelete = false;
528 :
529 0 : for(size_t i = 0; ( i < nCount ) && !bAbortActualize; i++)
530 : {
531 0 : if( pProgress )
532 0 : pProgress->Update( i, nCount - 1 );
533 :
534 0 : pEntry = aObjectList[ i ];
535 :
536 0 : const INetURLObject aURL( pEntry->aURL );
537 :
538 0 : rActualizeLink.Call( const_cast<INetURLObject *>(&aURL) );
539 :
540 : // SvDraw objects will be updated later
541 0 : if( pEntry->eObjKind != SGA_OBJ_SVDRAW )
542 : {
543 : // Still a function should be implemented,
544 : // which assigns files to the relevant entry.
545 : // insert graphics as graphic objects into the gallery
546 0 : if( pEntry->eObjKind == SGA_OBJ_SOUND )
547 : {
548 0 : SgaObjectSound aObjSound( aURL );
549 0 : if( !InsertObject( aObjSound ) )
550 0 : pEntry->mbDelete = true;
551 : }
552 : else
553 : {
554 0 : aGraphic.Clear();
555 :
556 0 : if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) != GalleryGraphicImportRet::IMPORT_NONE )
557 : {
558 0 : boost::scoped_ptr<SgaObject> pNewObj;
559 :
560 0 : if ( SGA_OBJ_INET == pEntry->eObjKind )
561 0 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectINet( aGraphic, aURL, aFormat )));
562 0 : else if ( aGraphic.IsAnimated() )
563 0 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectAnim( aGraphic, aURL, aFormat )));
564 : else
565 0 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectBmp( aGraphic, aURL, aFormat )));
566 :
567 0 : if( !InsertObject( *pNewObj ) )
568 0 : pEntry->mbDelete = true;
569 : }
570 : else
571 0 : pEntry->mbDelete = true; // set delete flag
572 : }
573 : }
574 : else
575 : {
576 0 : if ( aSvDrawStorageRef.Is() )
577 : {
578 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( pEntry->aURL ) );
579 0 : tools::SvRef<SotStorageStream> pIStm = aSvDrawStorageRef->OpenSotStream( aStmName, StreamMode::READ );
580 :
581 0 : if( pIStm && !pIStm->GetError() )
582 : {
583 0 : pIStm->SetBufferSize( 16384 );
584 :
585 0 : SgaObjectSvDraw aNewObj( *pIStm, pEntry->aURL );
586 :
587 0 : if( !InsertObject( aNewObj ) )
588 0 : pEntry->mbDelete = true;
589 :
590 0 : pIStm->SetBufferSize( 0L );
591 0 : }
592 : }
593 : }
594 0 : }
595 :
596 : // remove all entries with set flag
597 0 : for ( size_t i = 0; i < aObjectList.size(); )
598 : {
599 0 : pEntry = aObjectList[ i ];
600 0 : if( pEntry->mbDelete )
601 : {
602 0 : Broadcast( GalleryHint( GalleryHintType::CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
603 0 : Broadcast( GalleryHint( GalleryHintType::OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uLong >( pEntry ) ) );
604 0 : GalleryObjectList::iterator it = aObjectList.begin();
605 0 : ::std::advance( it, i );
606 0 : aObjectList.erase( it );
607 0 : delete pEntry;
608 : }
609 0 : else ++i;
610 : }
611 :
612 : // update theme
613 0 : ::utl::TempFile aTmp;
614 0 : INetURLObject aInURL( GetSdgURL() );
615 0 : INetURLObject aTmpURL( aTmp.GetURL() );
616 :
617 : DBG_ASSERT( aInURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
618 : DBG_ASSERT( aTmpURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
619 :
620 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aInURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ ));
621 0 : boost::scoped_ptr<SvStream> pTmpStm(::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE | StreamMode::TRUNC ));
622 :
623 0 : if( pIStm && pTmpStm )
624 : {
625 0 : for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
626 : {
627 0 : pEntry = aObjectList[ i ];
628 0 : boost::scoped_ptr<SgaObject> pObj;
629 :
630 0 : switch( pEntry->eObjKind )
631 : {
632 0 : case( SGA_OBJ_BMP ): pObj.reset(new SgaObjectBmp()); break;
633 0 : case( SGA_OBJ_ANIM ): pObj.reset(new SgaObjectAnim()); break;
634 0 : case( SGA_OBJ_INET ): pObj.reset(new SgaObjectINet()); break;
635 0 : case( SGA_OBJ_SVDRAW ): pObj.reset(new SgaObjectSvDraw()); break;
636 0 : case (SGA_OBJ_SOUND): pObj.reset(new SgaObjectSound()); break;
637 :
638 : default:
639 0 : break;
640 : }
641 :
642 0 : if( pObj )
643 : {
644 0 : pIStm->Seek( pEntry->nOffset );
645 0 : ReadSgaObject( *pIStm, *pObj);
646 0 : pEntry->nOffset = pTmpStm->Tell();
647 0 : WriteSgaObject( *pTmpStm, *pObj );
648 : }
649 0 : }
650 : }
651 : else
652 : {
653 : OSL_FAIL( "File(s) could not be opened" );
654 : }
655 :
656 0 : pIStm.reset();
657 0 : pTmpStm.reset();
658 :
659 0 : CopyFile( aTmpURL, aInURL );
660 0 : KillFile( aTmpURL );
661 :
662 0 : sal_uIntPtr nStorErr = 0;
663 :
664 : try
665 : {
666 0 : tools::SvRef<SotStorage> aTempStorageRef( new SotStorage( false, aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ) );
667 0 : aSvDrawStorageRef->CopyTo( aTempStorageRef );
668 0 : nStorErr = aSvDrawStorageRef->GetError();
669 : }
670 0 : catch (const css::ucb::ContentCreationException& e)
671 : {
672 : SAL_WARN("svx", "failed to open: "
673 : << aTmpURL.GetMainURL(INetURLObject::NO_DECODE)
674 : << "due to : " << e.Message);
675 0 : nStorErr = ERRCODE_IO_GENERAL;
676 : }
677 :
678 0 : if( !nStorErr )
679 : {
680 0 : aSvDrawStorageRef.Clear();
681 0 : CopyFile( aTmpURL, GetSdvURL() );
682 0 : ImplCreateSvDrawStorage();
683 : }
684 :
685 0 : KillFile( aTmpURL );
686 0 : ImplSetModified( true );
687 0 : ImplWrite();
688 0 : UnlockBroadcaster();
689 : }
690 0 : }
691 :
692 16 : GalleryThemeEntry* GalleryTheme::CreateThemeEntry( const INetURLObject& rURL, bool bReadOnly )
693 : {
694 : DBG_ASSERT( rURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
695 :
696 16 : GalleryThemeEntry* pRet = NULL;
697 :
698 16 : if( FileExists( rURL ) )
699 : {
700 16 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( rURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ ));
701 :
702 16 : if( pIStm )
703 : {
704 16 : OUString aThemeName;
705 : sal_uInt16 nVersion;
706 :
707 16 : pIStm->ReadUInt16( nVersion );
708 :
709 16 : if( nVersion <= 0x00ff )
710 : {
711 16 : bool bThemeNameFromResource = false;
712 16 : sal_uInt32 nThemeId = 0;
713 :
714 16 : OString aTmpStr = read_uInt16_lenPrefixed_uInt8s_ToOString(*pIStm);
715 16 : aThemeName = OStringToOUString(aTmpStr, RTL_TEXTENCODING_UTF8);
716 :
717 : // execute a charakter conversion
718 16 : if( nVersion >= 0x0004 )
719 : {
720 : sal_uInt32 nCount;
721 : sal_uInt16 nTemp16;
722 :
723 16 : pIStm->ReadUInt32( nCount ).ReadUInt16( nTemp16 );
724 16 : pIStm->Seek( STREAM_SEEK_TO_END );
725 :
726 : // check whether there is a newer version;
727 : // therefore jump back by 520Bytes (8 bytes ID + 512Bytes reserve buffer)
728 : // if this is at all possible.
729 16 : if( pIStm->Tell() >= 520 )
730 : {
731 : sal_uInt32 nId1, nId2;
732 :
733 16 : pIStm->SeekRel( -520 );
734 16 : pIStm->ReadUInt32( nId1 ).ReadUInt32( nId2 );
735 :
736 32 : if( nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
737 16 : nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
738 : {
739 16 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( *pIStm, StreamMode::READ ));
740 :
741 16 : pIStm->ReadUInt32( nThemeId );
742 :
743 16 : if( pCompat->GetVersion() >= 2 )
744 : {
745 16 : pIStm->ReadCharAsBool( bThemeNameFromResource );
746 16 : }
747 : }
748 : }
749 : }
750 :
751 32 : INetURLObject aPathURL( rURL );
752 : pRet = new GalleryThemeEntry( false, aPathURL, aThemeName,
753 : bReadOnly, false, nThemeId,
754 32 : bThemeNameFromResource );
755 16 : }
756 16 : }
757 : }
758 :
759 16 : return pRet;
760 : }
761 :
762 0 : bool GalleryTheme::GetThumb( sal_uIntPtr nPos, BitmapEx& rBmp, bool )
763 : {
764 0 : SgaObject* pObj = AcquireObject( nPos );
765 0 : bool bRet = false;
766 :
767 0 : if( pObj )
768 : {
769 0 : rBmp = pObj->GetThumbBmp();
770 0 : ReleaseObject( pObj );
771 0 : bRet = true;
772 : }
773 :
774 0 : return bRet;
775 : }
776 :
777 0 : bool GalleryTheme::GetGraphic( sal_uIntPtr nPos, Graphic& rGraphic, bool bProgress )
778 : {
779 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
780 0 : bool bRet = false;
781 :
782 0 : if( pObject )
783 : {
784 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
785 :
786 0 : switch( pObject->eObjKind )
787 : {
788 : case( SGA_OBJ_BMP ):
789 : case( SGA_OBJ_ANIM ):
790 : case( SGA_OBJ_INET ):
791 : {
792 0 : OUString aFilterDummy;
793 0 : bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy, bProgress ) != GalleryGraphicImportRet::IMPORT_NONE );
794 : }
795 0 : break;
796 :
797 : case( SGA_OBJ_SVDRAW ):
798 : {
799 0 : SvxGalleryDrawModel aModel;
800 :
801 0 : if( aModel.GetModel() )
802 : {
803 0 : if( GetModel( nPos, *aModel.GetModel(), bProgress ) )
804 : {
805 0 : ImageMap aIMap;
806 :
807 0 : if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) )
808 0 : bRet = true;
809 : else
810 : {
811 0 : ScopedVclPtrInstance< VirtualDevice > pVDev;
812 0 : pVDev->SetMapMode( MapMode( MAP_100TH_MM ) );
813 0 : FmFormView aView( aModel.GetModel(), pVDev );
814 :
815 0 : aView.hideMarkHandles();
816 0 : aView.ShowSdrPage(aView.GetModel()->GetPage(0));
817 0 : aView.MarkAll();
818 0 : rGraphic = aView.GetAllMarkedGraphic();
819 0 : bRet = true;
820 0 : }
821 : }
822 0 : }
823 : }
824 0 : break;
825 :
826 : case( SGA_OBJ_SOUND ):
827 : {
828 0 : SgaObject* pObj = AcquireObject( nPos );
829 :
830 0 : if( pObj )
831 : {
832 0 : rGraphic = pObj->GetThumbBmp();
833 : //Bitmap aBmp( pObj->GetThumbBmp() );
834 : //aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
835 : //rGraphic = aBmp;
836 0 : ReleaseObject( pObj );
837 0 : bRet = true;
838 : }
839 : }
840 0 : break;
841 :
842 : default:
843 0 : break;
844 0 : }
845 : }
846 :
847 0 : return bRet;
848 : }
849 :
850 0 : bool GalleryTheme::InsertGraphic( const Graphic& rGraphic, sal_uIntPtr nInsertPos )
851 : {
852 0 : bool bRet = false;
853 :
854 0 : if( rGraphic.GetType() != GRAPHIC_NONE )
855 : {
856 0 : ConvertDataFormat nExportFormat = ConvertDataFormat::Unknown;
857 0 : const GfxLink aGfxLink( ( (Graphic&) rGraphic ).GetLink() );
858 :
859 0 : if( aGfxLink.GetDataSize() )
860 : {
861 0 : switch( aGfxLink.GetType() )
862 : {
863 0 : case( GFX_LINK_TYPE_EPS_BUFFER ): nExportFormat = ConvertDataFormat::SVM; break;
864 0 : case( GFX_LINK_TYPE_NATIVE_GIF ): nExportFormat = ConvertDataFormat::GIF; break;
865 :
866 : // #i15508# added BMP type
867 : // could not find/trigger a call to this, but should do no harm
868 0 : case( GFX_LINK_TYPE_NATIVE_BMP ): nExportFormat = ConvertDataFormat::BMP; break;
869 :
870 0 : case( GFX_LINK_TYPE_NATIVE_JPG ): nExportFormat = ConvertDataFormat::JPG; break;
871 0 : case( GFX_LINK_TYPE_NATIVE_PNG ): nExportFormat = ConvertDataFormat::PNG; break;
872 0 : case( GFX_LINK_TYPE_NATIVE_TIF ): nExportFormat = ConvertDataFormat::TIF; break;
873 0 : case( GFX_LINK_TYPE_NATIVE_WMF ): nExportFormat = ConvertDataFormat::WMF; break;
874 0 : case( GFX_LINK_TYPE_NATIVE_MET ): nExportFormat = ConvertDataFormat::MET; break;
875 0 : case( GFX_LINK_TYPE_NATIVE_PCT ): nExportFormat = ConvertDataFormat::PCT; break;
876 0 : case( GFX_LINK_TYPE_NATIVE_SVG ): nExportFormat = ConvertDataFormat::SVG; break;
877 : default:
878 0 : break;
879 : }
880 : }
881 : else
882 : {
883 0 : if( rGraphic.GetType() == GRAPHIC_BITMAP )
884 : {
885 0 : if( rGraphic.IsAnimated() )
886 0 : nExportFormat = ConvertDataFormat::GIF;
887 : else
888 0 : nExportFormat = ConvertDataFormat::PNG;
889 : }
890 : else
891 0 : nExportFormat = ConvertDataFormat::SVM;
892 : }
893 :
894 0 : const INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_BMP, nExportFormat ) );
895 0 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE | StreamMode::TRUNC ));
896 :
897 0 : if( pOStm )
898 : {
899 0 : pOStm->SetVersion( SOFFICE_FILEFORMAT_50 );
900 :
901 0 : if( ConvertDataFormat::SVM == nExportFormat )
902 : {
903 0 : GDIMetaFile aMtf( rGraphic.GetGDIMetaFile() );
904 :
905 0 : aMtf.Write( *pOStm );
906 0 : bRet = ( pOStm->GetError() == ERRCODE_NONE );
907 : }
908 : else
909 : {
910 0 : if( aGfxLink.GetDataSize() && aGfxLink.GetData() )
911 : {
912 0 : pOStm->Write( aGfxLink.GetData(), aGfxLink.GetDataSize() );
913 0 : bRet = ( pOStm->GetError() == ERRCODE_NONE );
914 : }
915 : else
916 0 : bRet = ( GraphicConverter::Export( *pOStm, rGraphic, nExportFormat ) == ERRCODE_NONE );
917 : }
918 :
919 0 : pOStm.reset();
920 : }
921 :
922 0 : if( bRet )
923 : {
924 0 : const SgaObjectBmp aObjBmp( aURL );
925 0 : InsertObject( aObjBmp, nInsertPos );
926 0 : }
927 : }
928 :
929 0 : return bRet;
930 : }
931 :
932 0 : bool GalleryTheme::GetModel( sal_uIntPtr nPos, SdrModel& rModel, bool )
933 : {
934 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
935 0 : bool bRet = false;
936 :
937 0 : if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
938 : {
939 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
940 0 : tools::SvRef<SotStorage> xStor( GetSvDrawStorage() );
941 :
942 0 : if( xStor.Is() )
943 : {
944 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
945 0 : tools::SvRef<SotStorageStream> xIStm( xStor->OpenSotStream( aStmName, StreamMode::READ ) );
946 :
947 0 : if( xIStm.Is() && !xIStm->GetError() )
948 : {
949 0 : xIStm->SetBufferSize( STREAMBUF_SIZE );
950 0 : bRet = GallerySvDrawImport( *xIStm, rModel );
951 0 : xIStm->SetBufferSize( 0L );
952 0 : }
953 0 : }
954 : }
955 :
956 0 : return bRet;
957 : }
958 :
959 0 : bool GalleryTheme::InsertModel( const FmFormModel& rModel, sal_uIntPtr nInsertPos )
960 : {
961 0 : INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
962 0 : tools::SvRef<SotStorage> xStor( GetSvDrawStorage() );
963 0 : bool bRet = false;
964 :
965 0 : if( xStor.Is() )
966 : {
967 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
968 0 : tools::SvRef<SotStorageStream> xOStm( xStor->OpenSotStream( aStmName, StreamMode::WRITE | StreamMode::TRUNC ) );
969 :
970 0 : if( xOStm.Is() && !xOStm->GetError() )
971 : {
972 0 : SvMemoryStream aMemStm( 65535, 65535 );
973 0 : FmFormModel* pFormModel = const_cast<FmFormModel*>(&rModel);
974 :
975 0 : pFormModel->BurnInStyleSheetAttributes();
976 :
977 : {
978 0 : uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( aMemStm ) );
979 :
980 0 : if( xDocOut.is() )
981 0 : SvxDrawingLayerExport( pFormModel, xDocOut );
982 : }
983 :
984 0 : aMemStm.Seek( 0 );
985 :
986 0 : xOStm->SetBufferSize( 16348 );
987 0 : GalleryCodec aCodec( *xOStm );
988 0 : aCodec.Write( aMemStm );
989 :
990 0 : if( !xOStm->GetError() )
991 : {
992 0 : SgaObjectSvDraw aObjSvDraw( rModel, aURL );
993 0 : bRet = InsertObject( aObjSvDraw, nInsertPos );
994 : }
995 :
996 0 : xOStm->SetBufferSize( 0L );
997 0 : xOStm->Commit();
998 0 : }
999 : }
1000 :
1001 0 : return bRet;
1002 : }
1003 :
1004 0 : bool GalleryTheme::GetModelStream( sal_uIntPtr nPos, tools::SvRef<SotStorageStream>& rxModelStream, bool )
1005 : {
1006 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
1007 0 : bool bRet = false;
1008 :
1009 0 : if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
1010 : {
1011 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
1012 0 : tools::SvRef<SotStorage> xStor( GetSvDrawStorage() );
1013 :
1014 0 : if( xStor.Is() )
1015 : {
1016 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1017 0 : tools::SvRef<SotStorageStream> xIStm( xStor->OpenSotStream( aStmName, StreamMode::READ ) );
1018 :
1019 0 : if( xIStm.Is() && !xIStm->GetError() )
1020 : {
1021 0 : sal_uInt32 nVersion = 0;
1022 :
1023 0 : xIStm->SetBufferSize( 16348 );
1024 :
1025 0 : if( GalleryCodec::IsCoded( *xIStm, nVersion ) )
1026 : {
1027 0 : SvxGalleryDrawModel aModel;
1028 :
1029 0 : if( aModel.GetModel() )
1030 : {
1031 0 : if( GallerySvDrawImport( *xIStm, *aModel.GetModel() ) )
1032 : {
1033 0 : aModel.GetModel()->BurnInStyleSheetAttributes();
1034 :
1035 : {
1036 0 : uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxModelStream ) );
1037 :
1038 0 : if( SvxDrawingLayerExport( aModel.GetModel(), xDocOut ) )
1039 0 : rxModelStream->Commit();
1040 : }
1041 : }
1042 :
1043 0 : bRet = ( rxModelStream->GetError() == ERRCODE_NONE );
1044 0 : }
1045 : }
1046 :
1047 0 : xIStm->SetBufferSize( 0 );
1048 0 : }
1049 0 : }
1050 : }
1051 :
1052 0 : return bRet;
1053 : }
1054 :
1055 0 : bool GalleryTheme::InsertModelStream( const tools::SvRef<SotStorageStream>& rxModelStream, sal_uIntPtr nInsertPos )
1056 : {
1057 0 : INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
1058 0 : tools::SvRef<SotStorage> xStor( GetSvDrawStorage() );
1059 0 : bool bRet = false;
1060 :
1061 0 : if( xStor.Is() )
1062 : {
1063 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1064 0 : tools::SvRef<SotStorageStream> xOStm( xStor->OpenSotStream( aStmName, StreamMode::WRITE | StreamMode::TRUNC ) );
1065 :
1066 0 : if( xOStm.Is() && !xOStm->GetError() )
1067 : {
1068 0 : GalleryCodec aCodec( *xOStm );
1069 0 : SvMemoryStream aMemStm( 65535, 65535 );
1070 :
1071 0 : xOStm->SetBufferSize( 16348 );
1072 0 : aCodec.Write( *rxModelStream );
1073 :
1074 0 : if( !xOStm->GetError() )
1075 : {
1076 0 : xOStm->Seek( 0 );
1077 0 : SgaObjectSvDraw aObjSvDraw( *xOStm, aURL );
1078 0 : bRet = InsertObject( aObjSvDraw, nInsertPos );
1079 : }
1080 :
1081 0 : xOStm->SetBufferSize( 0L );
1082 0 : xOStm->Commit();
1083 0 : }
1084 : }
1085 :
1086 0 : return bRet;
1087 : }
1088 :
1089 0 : bool GalleryTheme::GetURL( sal_uIntPtr nPos, INetURLObject& rURL, bool )
1090 : {
1091 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
1092 0 : bool bRet = false;
1093 :
1094 0 : if( pObject )
1095 : {
1096 0 : rURL = INetURLObject( ImplGetURL( pObject ) );
1097 0 : bRet = true;
1098 : }
1099 :
1100 0 : return bRet;
1101 : }
1102 :
1103 503 : bool GalleryTheme::InsertURL( const INetURLObject& rURL, sal_uIntPtr nInsertPos )
1104 : {
1105 503 : Graphic aGraphic;
1106 1006 : OUString aFormat;
1107 1006 : boost::scoped_ptr<SgaObject> pNewObj;
1108 503 : const GalleryGraphicImportRet nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat );
1109 503 : bool bRet = false;
1110 :
1111 503 : if( nImportRet != GalleryGraphicImportRet::IMPORT_NONE )
1112 : {
1113 468 : if ( GalleryGraphicImportRet::IMPORT_INET == nImportRet )
1114 0 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectINet( aGraphic, rURL, aFormat )));
1115 468 : else if ( aGraphic.IsAnimated() )
1116 0 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectAnim( aGraphic, rURL, aFormat )));
1117 : else
1118 468 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectBmp( aGraphic, rURL, aFormat )));
1119 : }
1120 : #if HAVE_FEATURE_AVMEDIA
1121 35 : else if( ::avmedia::MediaWindow::isMediaURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), ""/*TODO?*/ ) )
1122 35 : pNewObj.reset(static_cast<SgaObject*>(new SgaObjectSound( rURL )));
1123 : #endif
1124 503 : if( pNewObj && InsertObject( *pNewObj, nInsertPos ) )
1125 503 : bRet = true;
1126 :
1127 1006 : return bRet;
1128 : }
1129 :
1130 0 : bool GalleryTheme::InsertFileOrDirURL( const INetURLObject& rFileOrDirURL, sal_uIntPtr nInsertPos )
1131 : {
1132 0 : INetURLObject aURL;
1133 0 : ::std::vector< INetURLObject > aURLVector;
1134 0 : bool bRet = false;
1135 :
1136 : try
1137 : {
1138 0 : ::ucbhelper::Content aCnt( rFileOrDirURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
1139 0 : bool bFolder = false;
1140 :
1141 0 : aCnt.getPropertyValue("IsFolder") >>= bFolder;
1142 :
1143 0 : if( bFolder )
1144 : {
1145 0 : uno::Sequence< OUString > aProps( 1 );
1146 0 : aProps[ 0 ] = "Url";
1147 0 : uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
1148 0 : uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
1149 0 : if( xContentAccess.is() )
1150 : {
1151 0 : while( xResultSet->next() )
1152 : {
1153 0 : aURL.SetSmartURL( xContentAccess->queryContentIdentifierString() );
1154 0 : aURLVector.push_back( aURL );
1155 : }
1156 0 : }
1157 : }
1158 : else
1159 0 : aURLVector.push_back( rFileOrDirURL );
1160 : }
1161 0 : catch( const ucb::ContentCreationException& )
1162 : {
1163 : }
1164 0 : catch( const uno::RuntimeException& )
1165 : {
1166 : }
1167 0 : catch( const uno::Exception& )
1168 : {
1169 : }
1170 :
1171 0 : ::std::vector< INetURLObject >::const_iterator aIter( aURLVector.begin() ), aEnd( aURLVector.end() );
1172 :
1173 0 : while( aIter != aEnd )
1174 0 : bRet = bRet || InsertURL( *aIter++, nInsertPos );
1175 :
1176 0 : return bRet;
1177 : }
1178 :
1179 0 : bool GalleryTheme::InsertTransferable( const uno::Reference< datatransfer::XTransferable >& rxTransferable, sal_uIntPtr nInsertPos )
1180 : {
1181 0 : bool bRet = false;
1182 :
1183 0 : if( rxTransferable.is() )
1184 : {
1185 0 : TransferableDataHelper aDataHelper( rxTransferable );
1186 0 : boost::scoped_ptr<Graphic> pGraphic;
1187 :
1188 0 : if( aDataHelper.HasFormat( SotClipboardFormatId::DRAWING ) )
1189 : {
1190 0 : tools::SvRef<SotStorageStream> xModelStm;
1191 :
1192 0 : if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::DRAWING, xModelStm ) )
1193 0 : bRet = InsertModelStream( xModelStm, nInsertPos );
1194 : }
1195 0 : else if( aDataHelper.HasFormat( SotClipboardFormatId::FILE_LIST ) ||
1196 0 : aDataHelper.HasFormat( SotClipboardFormatId::SIMPLE_FILE ) )
1197 : {
1198 0 : FileList aFileList;
1199 :
1200 0 : if( aDataHelper.HasFormat( SotClipboardFormatId::FILE_LIST ) )
1201 0 : aDataHelper.GetFileList( SotClipboardFormatId::FILE_LIST, aFileList );
1202 : else
1203 : {
1204 0 : OUString aFile;
1205 0 : if (aDataHelper.GetString(SotClipboardFormatId::SIMPLE_FILE, aFile) && !aFile.isEmpty())
1206 0 : aFileList.AppendFile( aFile );
1207 : }
1208 :
1209 0 : for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i )
1210 : {
1211 0 : const OUString aFile( aFileList.GetFile( i ) );
1212 0 : INetURLObject aURL( aFile );
1213 :
1214 0 : if( aURL.GetProtocol() == INetProtocol::NotValid )
1215 : {
1216 0 : OUString aLocalURL;
1217 :
1218 0 : if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFile, aLocalURL ) )
1219 0 : aURL = INetURLObject( aLocalURL );
1220 : }
1221 :
1222 0 : if( aURL.GetProtocol() != INetProtocol::NotValid )
1223 0 : bRet = InsertFileOrDirURL( aURL, nInsertPos );
1224 0 : }
1225 : }
1226 : else
1227 : {
1228 0 : Graphic aGraphic;
1229 0 : SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
1230 :
1231 0 : if( aDataHelper.HasFormat( SotClipboardFormatId::SVXB ) )
1232 0 : nFormat = SotClipboardFormatId::SVXB;
1233 0 : else if( aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) )
1234 0 : nFormat = SotClipboardFormatId::GDIMETAFILE;
1235 0 : else if( aDataHelper.HasFormat( SotClipboardFormatId::BITMAP ) )
1236 0 : nFormat = SotClipboardFormatId::BITMAP;
1237 :
1238 0 : if( nFormat != SotClipboardFormatId::NONE && aDataHelper.GetGraphic( nFormat, aGraphic ) )
1239 0 : pGraphic.reset(new Graphic( aGraphic ));
1240 : }
1241 :
1242 0 : if( pGraphic )
1243 : {
1244 0 : bRet = false;
1245 :
1246 0 : if( aDataHelper.HasFormat( SotClipboardFormatId::SVIM ) )
1247 : {
1248 :
1249 0 : ImageMap aImageMap;
1250 :
1251 : // according to KA we don't need a BaseURL here
1252 0 : if( aDataHelper.GetImageMap( SotClipboardFormatId::SVIM, aImageMap ) )
1253 : {
1254 0 : SvxGalleryDrawModel aModel;
1255 :
1256 0 : if( aModel.GetModel() )
1257 : {
1258 0 : SgaUserDataFactory aFactory;
1259 :
1260 0 : SdrPage* pPage = aModel.GetModel()->GetPage(0);
1261 0 : SdrGrafObj* pGrafObj = new SdrGrafObj( *pGraphic );
1262 :
1263 0 : pGrafObj->AppendUserData( new SgaIMapInfo( aImageMap ) );
1264 0 : pPage->InsertObject( pGrafObj );
1265 0 : bRet = InsertModel( *aModel.GetModel(), nInsertPos );
1266 0 : }
1267 0 : }
1268 : }
1269 :
1270 0 : if( !bRet )
1271 0 : bRet = InsertGraphic( *pGraphic, nInsertPos );
1272 0 : }
1273 : }
1274 :
1275 0 : return bRet;
1276 : }
1277 :
1278 0 : void GalleryTheme::CopyToClipboard( vcl::Window* pWindow, sal_uIntPtr nPos )
1279 : {
1280 0 : GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false );
1281 0 : pTransferable->CopyToClipboard( pWindow );
1282 0 : }
1283 :
1284 0 : void GalleryTheme::StartDrag( vcl::Window* pWindow, sal_uIntPtr nPos )
1285 : {
1286 0 : GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, true );
1287 0 : pTransferable->StartDrag( pWindow, DND_ACTION_COPY | DND_ACTION_LINK );
1288 0 : }
1289 :
1290 22 : SvStream& GalleryTheme::WriteData( SvStream& rOStm ) const
1291 : {
1292 22 : const INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
1293 44 : const INetURLObject aRelURL2( GetParent()->GetUserURL() );
1294 22 : sal_uInt32 nCount = GetObjectCount();
1295 : bool bRel;
1296 :
1297 22 : rOStm.WriteUInt16( 0x0004 );
1298 22 : write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStm, GetRealName(), RTL_TEXTENCODING_UTF8);
1299 22 : rOStm.WriteUInt32( nCount ).WriteUInt16( osl_getThreadTextEncoding() );
1300 :
1301 525 : for( sal_uInt32 i = 0; i < nCount; i++ )
1302 : {
1303 503 : const GalleryObject* pObj = ImplGetGalleryObject( i );
1304 503 : OUString aPath;
1305 :
1306 503 : if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1307 : {
1308 0 : aPath = GetSvDrawStreamNameFromURL( pObj->aURL );
1309 0 : bRel = false;
1310 : }
1311 : else
1312 : {
1313 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1314 503 : aPath = aPath.copy( 0, std::min(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1315 503 : bRel = aPath == aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
1316 :
1317 503 : if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1318 : {
1319 0 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1320 0 : aPath = aPath.copy( std::min(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1321 : }
1322 : else
1323 : {
1324 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1325 503 : aPath = aPath.copy( 0, std::min(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1326 503 : bRel = aPath == aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
1327 :
1328 503 : if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1329 : {
1330 0 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1331 0 : aPath = aPath.copy( std::min(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1332 : }
1333 : else
1334 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1335 : }
1336 : }
1337 :
1338 503 : if ( !m_aDestDir.isEmpty() )
1339 : {
1340 503 : bool aFound = aPath.indexOf(m_aDestDir) != -1;
1341 503 : aPath = aPath.replaceFirst(m_aDestDir, "");
1342 503 : if ( aFound )
1343 503 : bRel = m_bDestDirRelative;
1344 : else
1345 : SAL_WARN( "svx", "failed to replace destdir of '"
1346 : << m_aDestDir << "' in '" << aPath << "'");
1347 : }
1348 :
1349 503 : rOStm.WriteBool( bRel );
1350 503 : write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStm, aPath, RTL_TEXTENCODING_UTF8);
1351 503 : rOStm.WriteUInt32( pObj->nOffset ).WriteUInt16( pObj->eObjKind );
1352 503 : }
1353 :
1354 : // more recently, a 512-byte reserve buffer is written,
1355 : // to recognize them two sal_uIntPtr-Ids will be written.
1356 22 : rOStm.WriteUInt32( COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) ).WriteUInt32( COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) );
1357 :
1358 22 : const long nReservePos = rOStm.Tell();
1359 44 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( rOStm, StreamMode::WRITE, 2 ));
1360 :
1361 22 : rOStm.WriteUInt32( GetId() ).WriteBool( IsThemeNameFromResource() ); // From version 2 and up
1362 :
1363 22 : pCompat.reset();
1364 :
1365 : // Fill the rest of the buffer.
1366 22 : const long nRest = std::max( 512L - ( (long) rOStm.Tell() - nReservePos ), 0L );
1367 :
1368 22 : if( nRest )
1369 : {
1370 22 : boost::scoped_array<char> pReserve(new char[ nRest ]);
1371 22 : memset( pReserve.get(), 0, nRest );
1372 22 : rOStm.Write( pReserve.get(), nRest );
1373 : }
1374 :
1375 44 : return rOStm;
1376 : }
1377 :
1378 11 : SvStream& GalleryTheme::ReadData( SvStream& rIStm )
1379 : {
1380 : sal_uInt32 nCount;
1381 : sal_uInt16 nVersion;
1382 11 : OUString aThemeName;
1383 : rtl_TextEncoding nTextEncoding;
1384 :
1385 11 : rIStm.ReadUInt16( nVersion );
1386 22 : OString aTmpStr = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm);
1387 11 : rIStm.ReadUInt32( nCount );
1388 :
1389 11 : if( nVersion >= 0x0004 )
1390 : {
1391 : sal_uInt16 nTmp16;
1392 11 : rIStm.ReadUInt16( nTmp16 );
1393 11 : nTextEncoding = (rtl_TextEncoding) nTmp16;
1394 : }
1395 : else
1396 0 : nTextEncoding = RTL_TEXTENCODING_UTF8;
1397 :
1398 11 : aThemeName = OStringToOUString(aTmpStr, nTextEncoding);
1399 :
1400 11 : if( nCount <= ( 1L << 14 ) )
1401 : {
1402 : GalleryObject* pObj;
1403 11 : INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
1404 22 : INetURLObject aRelURL2( GetParent()->GetUserURL() );
1405 : sal_uInt32 nId1, nId2;
1406 : bool bRel;
1407 :
1408 11 : for( size_t i = 0, n = aObjectList.size(); i < n; ++i )
1409 : {
1410 0 : pObj = aObjectList[ i ];
1411 0 : Broadcast( GalleryHint( GalleryHintType::CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1412 0 : Broadcast( GalleryHint( GalleryHintType::OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1413 0 : delete pObj;
1414 : }
1415 11 : aObjectList.clear();
1416 :
1417 11 : for( sal_uInt32 i = 0; i < nCount; i++ )
1418 : {
1419 0 : pObj = new GalleryObject;
1420 :
1421 0 : OUString aFileName;
1422 0 : OUString aPath;
1423 : sal_uInt16 nTemp;
1424 :
1425 0 : rIStm.ReadCharAsBool( bRel );
1426 0 : OString aTempFileName = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm);
1427 0 : rIStm.ReadUInt32( pObj->nOffset );
1428 0 : rIStm.ReadUInt16( nTemp ); pObj->eObjKind = (SgaObjKind) nTemp;
1429 :
1430 0 : aFileName = OStringToOUString(aTempFileName, osl_getThreadTextEncoding());
1431 :
1432 0 : if( bRel )
1433 : {
1434 0 : aFileName = aFileName.replaceAll( "\\", "/" );
1435 0 : aPath = aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
1436 :
1437 0 : if( aFileName[ 0 ] != '/' )
1438 0 : aPath += "/";
1439 :
1440 0 : aPath += aFileName;
1441 :
1442 0 : pObj->aURL = INetURLObject( aPath );
1443 :
1444 0 : if( !FileExists( pObj->aURL ) )
1445 : {
1446 0 : aPath = aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
1447 :
1448 0 : if( aFileName[0] != '/' )
1449 0 : aPath += "/";
1450 :
1451 0 : aPath += aFileName;
1452 :
1453 : // assign this URL, even in the case it is not valid (#94482)
1454 0 : pObj->aURL = INetURLObject( aPath );
1455 : }
1456 : }
1457 : else
1458 : {
1459 0 : if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1460 : {
1461 0 : OUString aDummyURL( "gallery/svdraw/" );
1462 0 : pObj->aURL = INetURLObject( aDummyURL += aFileName, INetProtocol::PrivSoffice );
1463 : }
1464 : else
1465 : {
1466 0 : OUString aLocalURL;
1467 :
1468 0 : pObj->aURL = INetURLObject( aFileName );
1469 :
1470 0 : if( ( pObj->aURL.GetProtocol() == INetProtocol::NotValid ) &&
1471 0 : ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aLocalURL ) )
1472 : {
1473 0 : pObj->aURL = INetURLObject( aLocalURL );
1474 0 : }
1475 : }
1476 : }
1477 0 : aObjectList.push_back( pObj );
1478 0 : }
1479 :
1480 11 : rIStm.ReadUInt32( nId1 ).ReadUInt32( nId2 );
1481 :
1482 : // In newer versions a 512 byte reserve buffer is located at the end,
1483 : // the data is located at the beginning of this buffer and are clamped
1484 : // by a VersionCompat.
1485 33 : if( !rIStm.IsEof() &&
1486 22 : nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
1487 11 : nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
1488 : {
1489 11 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, StreamMode::READ ));
1490 : sal_uInt32 nTemp32;
1491 11 : bool bThemeNameFromResource = false;
1492 :
1493 11 : rIStm.ReadUInt32( nTemp32 );
1494 :
1495 11 : if( pCompat->GetVersion() >= 2 )
1496 : {
1497 11 : rIStm.ReadCharAsBool( bThemeNameFromResource );
1498 : }
1499 :
1500 11 : SetId( nTemp32, bThemeNameFromResource );
1501 11 : }
1502 : }
1503 : else
1504 0 : rIStm.SetError( SVSTREAM_READ_ERROR );
1505 :
1506 11 : ImplSetModified( false );
1507 :
1508 22 : return rIStm;
1509 : }
1510 :
1511 22 : SvStream& WriteGalleryTheme( SvStream& rOut, const GalleryTheme& rTheme )
1512 : {
1513 22 : return rTheme.WriteData( rOut );
1514 : }
1515 :
1516 11 : SvStream& ReadGalleryTheme( SvStream& rIn, GalleryTheme& rTheme )
1517 : {
1518 11 : return rTheme.ReadData( rIn );
1519 : }
1520 :
1521 536 : void GalleryTheme::ImplSetModified( bool bModified )
1522 : {
1523 536 : pThm->SetModified(bModified);
1524 536 : }
1525 :
1526 22 : const OUString& GalleryTheme::GetRealName() const { return pThm->GetThemeName(); }
1527 44 : const INetURLObject& GalleryTheme::GetThmURL() const { return pThm->GetThmURL(); }
1528 503 : const INetURLObject& GalleryTheme::GetSdgURL() const { return pThm->GetSdgURL(); }
1529 22 : const INetURLObject& GalleryTheme::GetSdvURL() const { return pThm->GetSdvURL(); }
1530 22 : sal_uInt32 GalleryTheme::GetId() const { return pThm->GetId(); }
1531 11 : void GalleryTheme::SetId( sal_uInt32 nNewId, bool bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); }
1532 22 : bool GalleryTheme::IsThemeNameFromResource() const { return pThm->IsNameFromResource(); }
1533 0 : bool GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); }
1534 0 : bool GalleryTheme::IsDefault() const { return pThm->IsDefault(); }
1535 22 : bool GalleryTheme::IsModified() const { return pThm->IsModified(); }
1536 :
1537 0 : tools::SvRef<SotStorage> GalleryTheme::GetSvDrawStorage() const
1538 : {
1539 0 : return aSvDrawStorageRef;
1540 : }
1541 :
1542 1509 : const OUString& GalleryTheme::GetName() const { return pThm->GetThemeName(); }
1543 :
1544 0 : void GalleryTheme::InsertAllThemes( ListBox& rListBox )
1545 : {
1546 0 : for( sal_uInt16 i = RID_GALLERYSTR_THEME_FIRST; i <= RID_GALLERYSTR_THEME_LAST; i++ )
1547 0 : rListBox.InsertEntry(GAL_RESSTR(i));
1548 435 : }
1549 :
1550 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|