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( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
87 503 : Broadcast( GalleryHint( GALLERY_HINT_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 SvStorage( false, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), pThm->IsReadOnly() ? STREAM_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 SvStorage( false, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_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 ), STREAM_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 ), STREAM_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() != INET_PROT_NOT_VALID, "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 ), STREAM_WRITE | STREAM_COPY_ON_SYMLINK | STREAM_TRUNC ));
210 : #else
211 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_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, sal_uIntPtr 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 ), STREAM_READ ));
261 :
262 0 : if( pIStm )
263 : {
264 0 : pIStm->ReadUInt32( nNextNumber );
265 0 : }
266 : }
267 :
268 : // create extension
269 0 : if( nFormat )
270 : {
271 0 : switch( nFormat )
272 : {
273 0 : case( CVT_BMP ): pExt = ".bmp"; break;
274 0 : case( CVT_GIF ): pExt = ".gif"; break;
275 0 : case( CVT_JPG ): pExt = ".jpg"; break;
276 0 : case( CVT_MET ): pExt = ".met"; break;
277 0 : case( CVT_PCT ): pExt = ".pct"; break;
278 0 : case( CVT_PNG ): pExt = ".png"; break;
279 0 : case( CVT_SVM ): pExt = ".svm"; break;
280 0 : case( CVT_TIF ): pExt = ".tif"; break;
281 0 : case( CVT_WMF ): pExt = ".wmf"; break;
282 0 : case( CVT_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 ), INET_PROT_PRIV_SOFFICE );
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 ), STREAM_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( GALLERY_HINT_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( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
478 0 : Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
479 0 : delete pEntry;
480 :
481 0 : ImplSetModified( true );
482 0 : ImplBroadcast( nPos );
483 : }
484 :
485 0 : return( pEntry != NULL );
486 : }
487 :
488 0 : bool GalleryTheme::ChangeObjectPos( size_t nOldPos, size_t nNewPos )
489 : {
490 0 : if (nOldPos == nNewPos || nOldPos >= aObjectList.size())
491 0 : return false;
492 :
493 0 : GalleryObject* pEntry = aObjectList[nOldPos];
494 :
495 0 : GalleryObjectList::iterator it = aObjectList.begin();
496 0 : ::std::advance(it, nNewPos);
497 0 : aObjectList.insert(it, pEntry);
498 :
499 0 : if (nNewPos < nOldPos)
500 0 : nOldPos++;
501 :
502 0 : it = aObjectList.begin();
503 0 : ::std::advance(it, nOldPos);
504 0 : aObjectList.erase(it);
505 :
506 0 : ImplSetModified(true);
507 0 : ImplBroadcast((nNewPos < nOldPos)? nNewPos: (nNewPos - 1));
508 :
509 0 : return true;
510 : }
511 :
512 0 : void GalleryTheme::Actualize( const Link& rActualizeLink, GalleryProgress* pProgress )
513 : {
514 0 : if( !IsReadOnly() )
515 : {
516 0 : Graphic aGraphic;
517 0 : OUString aFormat;
518 : GalleryObject* pEntry;
519 0 : const size_t nCount = aObjectList.size();
520 :
521 0 : LockBroadcaster();
522 0 : bAbortActualize = false;
523 :
524 : // reset delete flag
525 0 : for (size_t i = 0; i < nCount; i++)
526 0 : aObjectList[ i ]->mbDelete = false;
527 :
528 0 : for(size_t i = 0; ( i < nCount ) && !bAbortActualize; i++)
529 : {
530 0 : if( pProgress )
531 0 : pProgress->Update( i, nCount - 1 );
532 :
533 0 : pEntry = aObjectList[ i ];
534 :
535 0 : const INetURLObject aURL( pEntry->aURL );
536 :
537 0 : rActualizeLink.Call( (void*) &aURL );
538 :
539 : // SvDraw objects will be updated later
540 0 : if( pEntry->eObjKind != SGA_OBJ_SVDRAW )
541 : {
542 : // Still a function should be implemented,
543 : // which assigns files to the relevant entry.
544 : // insert graphics as graphic objects into the gallery
545 0 : if( pEntry->eObjKind == SGA_OBJ_SOUND )
546 : {
547 0 : SgaObjectSound aObjSound( aURL );
548 0 : if( !InsertObject( aObjSound ) )
549 0 : pEntry->mbDelete = true;
550 : }
551 : else
552 : {
553 0 : aGraphic.Clear();
554 :
555 0 : if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) )
556 : {
557 0 : boost::scoped_ptr<SgaObject> pNewObj;
558 :
559 0 : if ( SGA_OBJ_INET == pEntry->eObjKind )
560 0 : pNewObj.reset((SgaObject*) new SgaObjectINet( aGraphic, aURL, aFormat ));
561 0 : else if ( aGraphic.IsAnimated() )
562 0 : pNewObj.reset((SgaObject*) new SgaObjectAnim( aGraphic, aURL, aFormat ));
563 : else
564 0 : pNewObj.reset((SgaObject*) new SgaObjectBmp( aGraphic, aURL, aFormat ));
565 :
566 0 : if( !InsertObject( *pNewObj ) )
567 0 : pEntry->mbDelete = true;
568 : }
569 : else
570 0 : pEntry->mbDelete = true; // set delete flag
571 : }
572 : }
573 : else
574 : {
575 0 : if ( aSvDrawStorageRef.Is() )
576 : {
577 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( pEntry->aURL ) );
578 0 : SvStorageStreamRef pIStm = aSvDrawStorageRef->OpenSotStream( aStmName, STREAM_READ );
579 :
580 0 : if( pIStm && !pIStm->GetError() )
581 : {
582 0 : pIStm->SetBufferSize( 16384 );
583 :
584 0 : SgaObjectSvDraw aNewObj( *pIStm, pEntry->aURL );
585 :
586 0 : if( !InsertObject( aNewObj ) )
587 0 : pEntry->mbDelete = true;
588 :
589 0 : pIStm->SetBufferSize( 0L );
590 0 : }
591 : }
592 : }
593 0 : }
594 :
595 : // remove all entries with set flag
596 0 : for ( size_t i = 0; i < aObjectList.size(); )
597 : {
598 0 : pEntry = aObjectList[ i ];
599 0 : if( pEntry->mbDelete )
600 : {
601 0 : Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
602 0 : Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uLong >( pEntry ) ) );
603 0 : GalleryObjectList::iterator it = aObjectList.begin();
604 0 : ::std::advance( it, i );
605 0 : aObjectList.erase( it );
606 0 : delete pEntry;
607 : }
608 0 : else ++i;
609 : }
610 :
611 : // update theme
612 0 : ::utl::TempFile aTmp;
613 0 : INetURLObject aInURL( GetSdgURL() );
614 0 : INetURLObject aTmpURL( aTmp.GetURL() );
615 :
616 : DBG_ASSERT( aInURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
617 : DBG_ASSERT( aTmpURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
618 :
619 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aInURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ));
620 0 : boost::scoped_ptr<SvStream> pTmpStm(::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ));
621 :
622 0 : if( pIStm && pTmpStm )
623 : {
624 0 : for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
625 : {
626 0 : pEntry = aObjectList[ i ];
627 0 : boost::scoped_ptr<SgaObject> pObj;
628 :
629 0 : switch( pEntry->eObjKind )
630 : {
631 0 : case( SGA_OBJ_BMP ): pObj.reset(new SgaObjectBmp()); break;
632 0 : case( SGA_OBJ_ANIM ): pObj.reset(new SgaObjectAnim()); break;
633 0 : case( SGA_OBJ_INET ): pObj.reset(new SgaObjectINet()); break;
634 0 : case( SGA_OBJ_SVDRAW ): pObj.reset(new SgaObjectSvDraw()); break;
635 0 : case (SGA_OBJ_SOUND): pObj.reset(new SgaObjectSound()); break;
636 :
637 : default:
638 0 : break;
639 : }
640 :
641 0 : if( pObj )
642 : {
643 0 : pIStm->Seek( pEntry->nOffset );
644 0 : ReadSgaObject( *pIStm, *pObj);
645 0 : pEntry->nOffset = pTmpStm->Tell();
646 0 : WriteSgaObject( *pTmpStm, *pObj );
647 : }
648 0 : }
649 : }
650 : else
651 : {
652 : OSL_FAIL( "File(s) could not be opened" );
653 : }
654 :
655 0 : pIStm.reset();
656 0 : pTmpStm.reset();
657 :
658 0 : CopyFile( aTmpURL, aInURL );
659 0 : KillFile( aTmpURL );
660 :
661 0 : sal_uIntPtr nStorErr = 0;
662 :
663 : try
664 : {
665 0 : SvStorageRef aTempStorageRef( new SvStorage( false, aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ) );
666 0 : aSvDrawStorageRef->CopyTo( aTempStorageRef );
667 0 : nStorErr = aSvDrawStorageRef->GetError();
668 : }
669 0 : catch (const css::ucb::ContentCreationException& e)
670 : {
671 : SAL_WARN("svx", "failed to open: "
672 : << aTmpURL.GetMainURL(INetURLObject::NO_DECODE)
673 : << "due to : " << e.Message);
674 0 : nStorErr = ERRCODE_IO_GENERAL;
675 : }
676 :
677 0 : if( !nStorErr )
678 : {
679 0 : aSvDrawStorageRef.Clear();
680 0 : CopyFile( aTmpURL, GetSdvURL() );
681 0 : ImplCreateSvDrawStorage();
682 : }
683 :
684 0 : KillFile( aTmpURL );
685 0 : ImplSetModified( true );
686 0 : ImplWrite();
687 0 : UnlockBroadcaster();
688 : }
689 0 : }
690 :
691 0 : GalleryThemeEntry* GalleryTheme::CreateThemeEntry( const INetURLObject& rURL, bool bReadOnly )
692 : {
693 : DBG_ASSERT( rURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
694 :
695 0 : GalleryThemeEntry* pRet = NULL;
696 :
697 0 : if( FileExists( rURL ) )
698 : {
699 0 : boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( rURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ));
700 :
701 0 : if( pIStm )
702 : {
703 0 : OUString aThemeName;
704 : sal_uInt16 nVersion;
705 0 : bool bThemeNameFromResource = false;
706 :
707 0 : pIStm->ReadUInt16( nVersion );
708 :
709 0 : if( nVersion <= 0x00ff )
710 : {
711 0 : sal_uInt32 nThemeId = 0;
712 :
713 0 : OString aTmpStr = read_uInt16_lenPrefixed_uInt8s_ToOString(*pIStm);
714 0 : aThemeName = OStringToOUString(aTmpStr, RTL_TEXTENCODING_UTF8);
715 :
716 : // execute a charakter conversion
717 0 : if( nVersion >= 0x0004 )
718 : {
719 : sal_uInt32 nCount;
720 : sal_uInt16 nTemp16;
721 :
722 0 : pIStm->ReadUInt32( nCount ).ReadUInt16( nTemp16 );
723 0 : pIStm->Seek( STREAM_SEEK_TO_END );
724 :
725 : // check whether there is a newer version;
726 : // therefore jump back by 520Bytes (8 bytes ID + 512Bytes reserve buffer)
727 : // if this is at all possible.
728 0 : if( pIStm->Tell() >= 520 )
729 : {
730 : sal_uInt32 nId1, nId2;
731 :
732 0 : pIStm->SeekRel( -520 );
733 0 : pIStm->ReadUInt32( nId1 ).ReadUInt32( nId2 );
734 :
735 0 : if( nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
736 0 : nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
737 : {
738 0 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( *pIStm, STREAM_READ ));
739 :
740 0 : pIStm->ReadUInt32( nThemeId );
741 :
742 0 : if( pCompat->GetVersion() >= 2 )
743 : {
744 0 : pIStm->ReadCharAsBool( bThemeNameFromResource );
745 0 : }
746 : }
747 : }
748 : }
749 :
750 0 : INetURLObject aPathURL( rURL );
751 : pRet = new GalleryThemeEntry( false, aPathURL, aThemeName,
752 : bReadOnly, false, nThemeId,
753 0 : bThemeNameFromResource );
754 0 : }
755 0 : }
756 : }
757 :
758 0 : return pRet;
759 : }
760 :
761 0 : bool GalleryTheme::GetThumb( sal_uIntPtr nPos, BitmapEx& rBmp, bool )
762 : {
763 0 : SgaObject* pObj = AcquireObject( nPos );
764 0 : bool bRet = false;
765 :
766 0 : if( pObj )
767 : {
768 0 : rBmp = pObj->GetThumbBmp();
769 0 : ReleaseObject( pObj );
770 0 : bRet = true;
771 : }
772 :
773 0 : return bRet;
774 : }
775 :
776 0 : bool GalleryTheme::GetGraphic( sal_uIntPtr nPos, Graphic& rGraphic, bool bProgress )
777 : {
778 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
779 0 : bool bRet = false;
780 :
781 0 : if( pObject )
782 : {
783 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
784 :
785 0 : switch( pObject->eObjKind )
786 : {
787 : case( SGA_OBJ_BMP ):
788 : case( SGA_OBJ_ANIM ):
789 : case( SGA_OBJ_INET ):
790 : {
791 0 : OUString aFilterDummy;
792 0 : bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy, bProgress ) != SGA_IMPORT_NONE );
793 : }
794 0 : break;
795 :
796 : case( SGA_OBJ_SVDRAW ):
797 : {
798 0 : SvxGalleryDrawModel aModel;
799 :
800 0 : if( aModel.GetModel() )
801 : {
802 0 : if( GetModel( nPos, *aModel.GetModel(), bProgress ) )
803 : {
804 0 : ImageMap aIMap;
805 :
806 0 : if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) )
807 0 : bRet = true;
808 : else
809 : {
810 0 : VirtualDevice aVDev;
811 0 : aVDev.SetMapMode( MapMode( MAP_100TH_MM ) );
812 0 : FmFormView aView( aModel.GetModel(), &aVDev );
813 :
814 0 : aView.hideMarkHandles();
815 0 : aView.ShowSdrPage(aView.GetModel()->GetPage(0));
816 0 : aView.MarkAll();
817 0 : rGraphic = aView.GetAllMarkedGraphic();
818 0 : bRet = true;
819 0 : }
820 : }
821 0 : }
822 : }
823 0 : break;
824 :
825 : case( SGA_OBJ_SOUND ):
826 : {
827 0 : SgaObject* pObj = AcquireObject( nPos );
828 :
829 0 : if( pObj )
830 : {
831 0 : rGraphic = pObj->GetThumbBmp();
832 : //Bitmap aBmp( pObj->GetThumbBmp() );
833 : //aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
834 : //rGraphic = aBmp;
835 0 : ReleaseObject( pObj );
836 0 : bRet = true;
837 : }
838 : }
839 0 : break;
840 :
841 : default:
842 0 : break;
843 0 : }
844 : }
845 :
846 0 : return bRet;
847 : }
848 :
849 0 : bool GalleryTheme::InsertGraphic( const Graphic& rGraphic, sal_uIntPtr nInsertPos )
850 : {
851 0 : bool bRet = false;
852 :
853 0 : if( rGraphic.GetType() != GRAPHIC_NONE )
854 : {
855 0 : sal_uIntPtr nExportFormat = CVT_UNKNOWN;
856 0 : const GfxLink aGfxLink( ( (Graphic&) rGraphic ).GetLink() );
857 :
858 0 : if( aGfxLink.GetDataSize() )
859 : {
860 0 : switch( aGfxLink.GetType() )
861 : {
862 0 : case( GFX_LINK_TYPE_EPS_BUFFER ): nExportFormat = CVT_SVM; break;
863 0 : case( GFX_LINK_TYPE_NATIVE_GIF ): nExportFormat = CVT_GIF; break;
864 :
865 : // #i15508# added BMP type
866 : // could not find/trigger a call to this, but should do no harm
867 0 : case( GFX_LINK_TYPE_NATIVE_BMP ): nExportFormat = CVT_BMP; break;
868 :
869 0 : case( GFX_LINK_TYPE_NATIVE_JPG ): nExportFormat = CVT_JPG; break;
870 0 : case( GFX_LINK_TYPE_NATIVE_PNG ): nExportFormat = CVT_PNG; break;
871 0 : case( GFX_LINK_TYPE_NATIVE_TIF ): nExportFormat = CVT_TIF; break;
872 0 : case( GFX_LINK_TYPE_NATIVE_WMF ): nExportFormat = CVT_WMF; break;
873 0 : case( GFX_LINK_TYPE_NATIVE_MET ): nExportFormat = CVT_MET; break;
874 0 : case( GFX_LINK_TYPE_NATIVE_PCT ): nExportFormat = CVT_PCT; break;
875 0 : case( GFX_LINK_TYPE_NATIVE_SVG ): nExportFormat = CVT_SVG; break;
876 : default:
877 0 : break;
878 : }
879 : }
880 : else
881 : {
882 0 : if( rGraphic.GetType() == GRAPHIC_BITMAP )
883 : {
884 0 : if( rGraphic.IsAnimated() )
885 0 : nExportFormat = CVT_GIF;
886 : else
887 0 : nExportFormat = CVT_PNG;
888 : }
889 : else
890 0 : nExportFormat = CVT_SVM;
891 : }
892 :
893 0 : const INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_BMP, nExportFormat ) );
894 0 : boost::scoped_ptr<SvStream> pOStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ));
895 :
896 0 : if( pOStm )
897 : {
898 0 : pOStm->SetVersion( SOFFICE_FILEFORMAT_50 );
899 :
900 0 : if( CVT_SVM == nExportFormat )
901 : {
902 0 : GDIMetaFile aMtf( rGraphic.GetGDIMetaFile() );
903 :
904 0 : aMtf.Write( *pOStm );
905 0 : bRet = ( pOStm->GetError() == ERRCODE_NONE );
906 : }
907 : else
908 : {
909 0 : if( aGfxLink.GetDataSize() && aGfxLink.GetData() )
910 : {
911 0 : pOStm->Write( aGfxLink.GetData(), aGfxLink.GetDataSize() );
912 0 : bRet = ( pOStm->GetError() == ERRCODE_NONE );
913 : }
914 : else
915 0 : bRet = ( GraphicConverter::Export( *pOStm, rGraphic, nExportFormat ) == ERRCODE_NONE );
916 : }
917 :
918 0 : pOStm.reset();
919 : }
920 :
921 0 : if( bRet )
922 : {
923 0 : const SgaObjectBmp aObjBmp( aURL );
924 0 : InsertObject( aObjBmp, nInsertPos );
925 0 : }
926 : }
927 :
928 0 : return bRet;
929 : }
930 :
931 0 : bool GalleryTheme::GetModel( sal_uIntPtr nPos, SdrModel& rModel, bool )
932 : {
933 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
934 0 : bool bRet = false;
935 :
936 0 : if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
937 : {
938 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
939 0 : SvStorageRef xStor( GetSvDrawStorage() );
940 :
941 0 : if( xStor.Is() )
942 : {
943 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
944 0 : SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
945 :
946 0 : if( xIStm.Is() && !xIStm->GetError() )
947 : {
948 0 : xIStm->SetBufferSize( STREAMBUF_SIZE );
949 0 : bRet = GallerySvDrawImport( *xIStm, rModel );
950 0 : xIStm->SetBufferSize( 0L );
951 0 : }
952 0 : }
953 : }
954 :
955 0 : return bRet;
956 : }
957 :
958 0 : bool GalleryTheme::InsertModel( const FmFormModel& rModel, sal_uIntPtr nInsertPos )
959 : {
960 0 : INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
961 0 : SvStorageRef xStor( GetSvDrawStorage() );
962 0 : bool bRet = false;
963 :
964 0 : if( xStor.Is() )
965 : {
966 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
967 0 : SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
968 :
969 0 : if( xOStm.Is() && !xOStm->GetError() )
970 : {
971 0 : SvMemoryStream aMemStm( 65535, 65535 );
972 0 : FmFormModel* pFormModel = (FmFormModel*) &rModel;
973 :
974 0 : pFormModel->BurnInStyleSheetAttributes();
975 :
976 : {
977 0 : uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( aMemStm ) );
978 :
979 0 : if( xDocOut.is() )
980 0 : SvxDrawingLayerExport( pFormModel, xDocOut );
981 : }
982 :
983 0 : aMemStm.Seek( 0 );
984 :
985 0 : xOStm->SetBufferSize( 16348 );
986 0 : GalleryCodec aCodec( *xOStm );
987 0 : aCodec.Write( aMemStm );
988 :
989 0 : if( !xOStm->GetError() )
990 : {
991 0 : SgaObjectSvDraw aObjSvDraw( rModel, aURL );
992 0 : bRet = InsertObject( aObjSvDraw, nInsertPos );
993 : }
994 :
995 0 : xOStm->SetBufferSize( 0L );
996 0 : xOStm->Commit();
997 0 : }
998 : }
999 :
1000 0 : return bRet;
1001 : }
1002 :
1003 0 : bool GalleryTheme::GetModelStream( sal_uIntPtr nPos, SotStorageStreamRef& rxModelStream, bool )
1004 : {
1005 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
1006 0 : bool bRet = false;
1007 :
1008 0 : if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
1009 : {
1010 0 : const INetURLObject aURL( ImplGetURL( pObject ) );
1011 0 : SvStorageRef xStor( GetSvDrawStorage() );
1012 :
1013 0 : if( xStor.Is() )
1014 : {
1015 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1016 0 : SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
1017 :
1018 0 : if( xIStm.Is() && !xIStm->GetError() )
1019 : {
1020 0 : sal_uInt32 nVersion = 0;
1021 :
1022 0 : xIStm->SetBufferSize( 16348 );
1023 :
1024 0 : if( GalleryCodec::IsCoded( *xIStm, nVersion ) )
1025 : {
1026 0 : SvxGalleryDrawModel aModel;
1027 :
1028 0 : if( aModel.GetModel() )
1029 : {
1030 0 : if( GallerySvDrawImport( *xIStm, *aModel.GetModel() ) )
1031 : {
1032 0 : aModel.GetModel()->BurnInStyleSheetAttributes();
1033 :
1034 : {
1035 0 : uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxModelStream ) );
1036 :
1037 0 : if( SvxDrawingLayerExport( aModel.GetModel(), xDocOut ) )
1038 0 : rxModelStream->Commit();
1039 : }
1040 : }
1041 :
1042 0 : bRet = ( rxModelStream->GetError() == ERRCODE_NONE );
1043 0 : }
1044 : }
1045 :
1046 0 : xIStm->SetBufferSize( 0 );
1047 0 : }
1048 0 : }
1049 : }
1050 :
1051 0 : return bRet;
1052 : }
1053 :
1054 0 : bool GalleryTheme::InsertModelStream( const SotStorageStreamRef& rxModelStream, sal_uIntPtr nInsertPos )
1055 : {
1056 0 : INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
1057 0 : SvStorageRef xStor( GetSvDrawStorage() );
1058 0 : bool bRet = false;
1059 :
1060 0 : if( xStor.Is() )
1061 : {
1062 0 : const OUString aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1063 0 : SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
1064 :
1065 0 : if( xOStm.Is() && !xOStm->GetError() )
1066 : {
1067 0 : GalleryCodec aCodec( *xOStm );
1068 0 : SvMemoryStream aMemStm( 65535, 65535 );
1069 :
1070 0 : xOStm->SetBufferSize( 16348 );
1071 0 : aCodec.Write( *rxModelStream );
1072 :
1073 0 : if( !xOStm->GetError() )
1074 : {
1075 0 : xOStm->Seek( 0 );
1076 0 : SgaObjectSvDraw aObjSvDraw( *xOStm, aURL );
1077 0 : bRet = InsertObject( aObjSvDraw, nInsertPos );
1078 : }
1079 :
1080 0 : xOStm->SetBufferSize( 0L );
1081 0 : xOStm->Commit();
1082 0 : }
1083 : }
1084 :
1085 0 : return bRet;
1086 : }
1087 :
1088 0 : bool GalleryTheme::GetURL( sal_uIntPtr nPos, INetURLObject& rURL, bool )
1089 : {
1090 0 : const GalleryObject* pObject = ImplGetGalleryObject( nPos );
1091 0 : bool bRet = false;
1092 :
1093 0 : if( pObject )
1094 : {
1095 0 : rURL = INetURLObject( ImplGetURL( pObject ) );
1096 0 : bRet = true;
1097 : }
1098 :
1099 0 : return bRet;
1100 : }
1101 :
1102 503 : bool GalleryTheme::InsertURL( const INetURLObject& rURL, sal_uIntPtr nInsertPos )
1103 : {
1104 503 : Graphic aGraphic;
1105 1006 : OUString aFormat;
1106 1006 : boost::scoped_ptr<SgaObject> pNewObj;
1107 503 : const sal_uInt16 nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat );
1108 503 : bool bRet = false;
1109 :
1110 503 : if( nImportRet != SGA_IMPORT_NONE )
1111 : {
1112 468 : if ( SGA_IMPORT_INET == nImportRet )
1113 0 : pNewObj.reset((SgaObject*) new SgaObjectINet( aGraphic, rURL, aFormat ));
1114 468 : else if ( aGraphic.IsAnimated() )
1115 0 : pNewObj.reset((SgaObject*) new SgaObjectAnim( aGraphic, rURL, aFormat ));
1116 : else
1117 468 : pNewObj.reset((SgaObject*) new SgaObjectBmp( aGraphic, rURL, aFormat ));
1118 : }
1119 : #if HAVE_FEATURE_AVMEDIA
1120 35 : else if( ::avmedia::MediaWindow::isMediaURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), ""/*TODO?*/ ) )
1121 35 : pNewObj.reset((SgaObject*) new SgaObjectSound( rURL ));
1122 : #endif
1123 503 : if( pNewObj && InsertObject( *pNewObj, nInsertPos ) )
1124 503 : bRet = true;
1125 :
1126 1006 : return bRet;
1127 : }
1128 :
1129 0 : bool GalleryTheme::InsertFileOrDirURL( const INetURLObject& rFileOrDirURL, sal_uIntPtr nInsertPos )
1130 : {
1131 0 : INetURLObject aURL;
1132 0 : ::std::vector< INetURLObject > aURLVector;
1133 0 : bool bRet = false;
1134 :
1135 : try
1136 : {
1137 0 : ::ucbhelper::Content aCnt( rFileOrDirURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
1138 0 : bool bFolder = false;
1139 :
1140 0 : aCnt.getPropertyValue("IsFolder") >>= bFolder;
1141 :
1142 0 : if( bFolder )
1143 : {
1144 0 : uno::Sequence< OUString > aProps( 1 );
1145 0 : aProps[ 0 ] = "Url";
1146 0 : uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
1147 0 : uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
1148 0 : if( xContentAccess.is() )
1149 : {
1150 0 : while( xResultSet->next() )
1151 : {
1152 0 : aURL.SetSmartURL( xContentAccess->queryContentIdentifierString() );
1153 0 : aURLVector.push_back( aURL );
1154 : }
1155 0 : }
1156 : }
1157 : else
1158 0 : aURLVector.push_back( rFileOrDirURL );
1159 : }
1160 0 : catch( const ucb::ContentCreationException& )
1161 : {
1162 : }
1163 0 : catch( const uno::RuntimeException& )
1164 : {
1165 : }
1166 0 : catch( const uno::Exception& )
1167 : {
1168 : }
1169 :
1170 0 : ::std::vector< INetURLObject >::const_iterator aIter( aURLVector.begin() ), aEnd( aURLVector.end() );
1171 :
1172 0 : while( aIter != aEnd )
1173 0 : bRet = bRet || InsertURL( *aIter++, nInsertPos );
1174 :
1175 0 : return bRet;
1176 : }
1177 :
1178 0 : bool GalleryTheme::InsertTransferable( const uno::Reference< datatransfer::XTransferable >& rxTransferable, sal_uIntPtr nInsertPos )
1179 : {
1180 0 : bool bRet = false;
1181 :
1182 0 : if( rxTransferable.is() )
1183 : {
1184 0 : TransferableDataHelper aDataHelper( rxTransferable );
1185 0 : boost::scoped_ptr<Graphic> pGraphic;
1186 :
1187 0 : if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) )
1188 : {
1189 0 : SotStorageStreamRef xModelStm;
1190 :
1191 0 : if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xModelStm ) )
1192 0 : bRet = InsertModelStream( xModelStm, nInsertPos );
1193 : }
1194 0 : else if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ||
1195 0 : aDataHelper.HasFormat( FORMAT_FILE ) )
1196 : {
1197 0 : FileList aFileList;
1198 :
1199 0 : if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) )
1200 0 : aDataHelper.GetFileList( SOT_FORMAT_FILE_LIST, aFileList );
1201 : else
1202 : {
1203 0 : OUString aFile;
1204 0 : if (aDataHelper.GetString(FORMAT_FILE, aFile) && !aFile.isEmpty())
1205 0 : aFileList.AppendFile( aFile );
1206 : }
1207 :
1208 0 : for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i )
1209 : {
1210 0 : const OUString aFile( aFileList.GetFile( i ) );
1211 0 : INetURLObject aURL( aFile );
1212 :
1213 0 : if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
1214 : {
1215 0 : OUString aLocalURL;
1216 :
1217 0 : if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFile, aLocalURL ) )
1218 0 : aURL = INetURLObject( aLocalURL );
1219 : }
1220 :
1221 0 : if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
1222 0 : bRet = InsertFileOrDirURL( aURL, nInsertPos );
1223 0 : }
1224 : }
1225 : else
1226 : {
1227 0 : Graphic aGraphic;
1228 0 : sal_uIntPtr nFormat = 0;
1229 :
1230 0 : if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) )
1231 0 : nFormat = SOT_FORMATSTR_ID_SVXB;
1232 0 : else if( aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) )
1233 0 : nFormat = FORMAT_GDIMETAFILE;
1234 0 : else if( aDataHelper.HasFormat( FORMAT_BITMAP ) )
1235 0 : nFormat = FORMAT_BITMAP;
1236 :
1237 0 : if( nFormat && aDataHelper.GetGraphic( nFormat, aGraphic ) )
1238 0 : pGraphic.reset(new Graphic( aGraphic ));
1239 : }
1240 :
1241 0 : if( pGraphic )
1242 : {
1243 0 : bRet = false;
1244 :
1245 0 : if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVIM ) )
1246 : {
1247 :
1248 0 : ImageMap aImageMap;
1249 :
1250 : // according to KA we don't need a BaseURL here
1251 0 : if( aDataHelper.GetImageMap( SOT_FORMATSTR_ID_SVIM, aImageMap ) )
1252 : {
1253 0 : SvxGalleryDrawModel aModel;
1254 :
1255 0 : if( aModel.GetModel() )
1256 : {
1257 0 : SgaUserDataFactory aFactory;
1258 :
1259 0 : SdrPage* pPage = aModel.GetModel()->GetPage(0);
1260 0 : SdrGrafObj* pGrafObj = new SdrGrafObj( *pGraphic );
1261 :
1262 0 : pGrafObj->AppendUserData( new SgaIMapInfo( aImageMap ) );
1263 0 : pPage->InsertObject( pGrafObj );
1264 0 : bRet = InsertModel( *aModel.GetModel(), nInsertPos );
1265 0 : }
1266 0 : }
1267 : }
1268 :
1269 0 : if( !bRet )
1270 0 : bRet = InsertGraphic( *pGraphic, nInsertPos );
1271 0 : }
1272 : }
1273 :
1274 0 : return bRet;
1275 : }
1276 :
1277 0 : void GalleryTheme::CopyToClipboard( vcl::Window* pWindow, sal_uIntPtr nPos )
1278 : {
1279 0 : GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false );
1280 0 : pTransferable->CopyToClipboard( pWindow );
1281 0 : }
1282 :
1283 0 : void GalleryTheme::StartDrag( vcl::Window* pWindow, sal_uIntPtr nPos )
1284 : {
1285 0 : GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, true );
1286 0 : pTransferable->StartDrag( pWindow, DND_ACTION_COPY | DND_ACTION_LINK );
1287 0 : }
1288 :
1289 22 : SvStream& GalleryTheme::WriteData( SvStream& rOStm ) const
1290 : {
1291 22 : const INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
1292 44 : const INetURLObject aRelURL2( GetParent()->GetUserURL() );
1293 22 : sal_uInt32 nCount = GetObjectCount();
1294 : bool bRel;
1295 :
1296 22 : rOStm.WriteUInt16( 0x0004 );
1297 22 : write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStm, GetRealName(), RTL_TEXTENCODING_UTF8);
1298 22 : rOStm.WriteUInt32( nCount ).WriteUInt16( osl_getThreadTextEncoding() );
1299 :
1300 525 : for( sal_uInt32 i = 0; i < nCount; i++ )
1301 : {
1302 503 : const GalleryObject* pObj = ImplGetGalleryObject( i );
1303 503 : OUString aPath;
1304 :
1305 503 : if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1306 : {
1307 0 : aPath = GetSvDrawStreamNameFromURL( pObj->aURL );
1308 0 : bRel = false;
1309 : }
1310 : else
1311 : {
1312 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1313 503 : aPath = aPath.copy( 0, std::min(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1314 503 : bRel = aPath == aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
1315 :
1316 503 : if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1317 : {
1318 0 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1319 0 : aPath = aPath.copy( std::min(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1320 : }
1321 : else
1322 : {
1323 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1324 503 : aPath = aPath.copy( 0, std::min(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1325 503 : bRel = aPath == aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
1326 :
1327 503 : if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1328 : {
1329 0 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1330 0 : aPath = aPath.copy( std::min(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength(), aPath.getLength()) );
1331 : }
1332 : else
1333 503 : aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1334 : }
1335 : }
1336 :
1337 503 : if ( !m_aDestDir.isEmpty() )
1338 : {
1339 503 : bool aFound = aPath.indexOf(m_aDestDir) != -1;
1340 503 : aPath = aPath.replaceFirst(m_aDestDir, "");
1341 503 : if ( aFound )
1342 503 : bRel = m_bDestDirRelative;
1343 : else
1344 : SAL_WARN( "svx", "failed to replace destdir of '"
1345 : << m_aDestDir << "' in '" << aPath << "'");
1346 : }
1347 :
1348 503 : rOStm.WriteUChar( bRel );
1349 503 : write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStm, aPath, RTL_TEXTENCODING_UTF8);
1350 503 : rOStm.WriteUInt32( pObj->nOffset ).WriteUInt16( pObj->eObjKind );
1351 503 : }
1352 :
1353 : // more recently, a 512-byte reserve buffer is written,
1354 : // to recognize them two sal_uIntPtr-Ids will be written.
1355 22 : rOStm.WriteUInt32( COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) ).WriteUInt32( COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) );
1356 :
1357 22 : const long nReservePos = rOStm.Tell();
1358 44 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( rOStm, STREAM_WRITE, 2 ));
1359 :
1360 22 : rOStm.WriteUInt32( GetId() ).WriteUChar( IsThemeNameFromResource() ); // From version 2 and up
1361 :
1362 22 : pCompat.reset();
1363 :
1364 : // Fill the rest of the buffer.
1365 22 : const long nRest = std::max( 512L - ( (long) rOStm.Tell() - nReservePos ), 0L );
1366 :
1367 22 : if( nRest )
1368 : {
1369 22 : boost::scoped_array<char> pReserve(new char[ nRest ]);
1370 22 : memset( pReserve.get(), 0, nRest );
1371 22 : rOStm.Write( pReserve.get(), nRest );
1372 : }
1373 :
1374 44 : return rOStm;
1375 : }
1376 :
1377 11 : SvStream& GalleryTheme::ReadData( SvStream& rIStm )
1378 : {
1379 : sal_uInt32 nCount;
1380 : sal_uInt16 nVersion;
1381 11 : OUString aThemeName;
1382 : rtl_TextEncoding nTextEncoding;
1383 :
1384 11 : rIStm.ReadUInt16( nVersion );
1385 22 : OString aTmpStr = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm);
1386 11 : rIStm.ReadUInt32( nCount );
1387 :
1388 11 : if( nVersion >= 0x0004 )
1389 : {
1390 : sal_uInt16 nTmp16;
1391 11 : rIStm.ReadUInt16( nTmp16 );
1392 11 : nTextEncoding = (rtl_TextEncoding) nTmp16;
1393 : }
1394 : else
1395 0 : nTextEncoding = RTL_TEXTENCODING_UTF8;
1396 :
1397 11 : aThemeName = OStringToOUString(aTmpStr, nTextEncoding);
1398 :
1399 11 : if( nCount <= ( 1L << 14 ) )
1400 : {
1401 : GalleryObject* pObj;
1402 11 : INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
1403 22 : INetURLObject aRelURL2( GetParent()->GetUserURL() );
1404 : sal_uInt32 nId1, nId2;
1405 : bool bRel;
1406 :
1407 11 : for( size_t i = 0, n = aObjectList.size(); i < n; ++i )
1408 : {
1409 0 : pObj = aObjectList[ i ];
1410 0 : Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1411 0 : Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1412 0 : delete pObj;
1413 : }
1414 11 : aObjectList.clear();
1415 :
1416 11 : for( sal_uInt32 i = 0; i < nCount; i++ )
1417 : {
1418 0 : pObj = new GalleryObject;
1419 :
1420 0 : OUString aFileName;
1421 0 : OUString aPath;
1422 : sal_uInt16 nTemp;
1423 :
1424 0 : rIStm.ReadCharAsBool( bRel );
1425 0 : OString aTempFileName = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm);
1426 0 : rIStm.ReadUInt32( pObj->nOffset );
1427 0 : rIStm.ReadUInt16( nTemp ); pObj->eObjKind = (SgaObjKind) nTemp;
1428 :
1429 0 : aFileName = OStringToOUString(aTempFileName, osl_getThreadTextEncoding());
1430 :
1431 0 : if( bRel )
1432 : {
1433 0 : aFileName = aFileName.replaceAll( "\\", "/" );
1434 0 : aPath = aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
1435 :
1436 0 : if( aFileName[ 0 ] != '/' )
1437 0 : aPath += "/";
1438 :
1439 0 : aPath += aFileName;
1440 :
1441 0 : pObj->aURL = INetURLObject( aPath );
1442 :
1443 0 : if( !FileExists( pObj->aURL ) )
1444 : {
1445 0 : aPath = aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
1446 :
1447 0 : if( aFileName[0] != '/' )
1448 0 : aPath += "/";
1449 :
1450 0 : aPath += aFileName;
1451 :
1452 : // assign this URL, even in the case it is not valid (#94482)
1453 0 : pObj->aURL = INetURLObject( aPath );
1454 : }
1455 : }
1456 : else
1457 : {
1458 0 : if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1459 : {
1460 0 : OUString aDummyURL( "gallery/svdraw/" );
1461 0 : pObj->aURL = INetURLObject( aDummyURL += aFileName, INET_PROT_PRIV_SOFFICE );
1462 : }
1463 : else
1464 : {
1465 0 : OUString aLocalURL;
1466 :
1467 0 : pObj->aURL = INetURLObject( aFileName );
1468 :
1469 0 : if( ( pObj->aURL.GetProtocol() == INET_PROT_NOT_VALID ) &&
1470 0 : ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aLocalURL ) )
1471 : {
1472 0 : pObj->aURL = INetURLObject( aLocalURL );
1473 0 : }
1474 : }
1475 : }
1476 0 : aObjectList.push_back( pObj );
1477 0 : }
1478 :
1479 11 : rIStm.ReadUInt32( nId1 ).ReadUInt32( nId2 );
1480 :
1481 : // In newer versions a 512 byte reserve buffer is located at the end,
1482 : // the data is located at the beginning of this buffer and are clamped
1483 : // by a VersionCompat.
1484 33 : if( !rIStm.IsEof() &&
1485 22 : nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
1486 11 : nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
1487 : {
1488 11 : boost::scoped_ptr<VersionCompat> pCompat(new VersionCompat( rIStm, STREAM_READ ));
1489 : sal_uInt32 nTemp32;
1490 11 : bool bThemeNameFromResource = false;
1491 :
1492 11 : rIStm.ReadUInt32( nTemp32 );
1493 :
1494 11 : if( pCompat->GetVersion() >= 2 )
1495 : {
1496 11 : rIStm.ReadCharAsBool( bThemeNameFromResource );
1497 : }
1498 :
1499 11 : SetId( nTemp32, bThemeNameFromResource );
1500 11 : }
1501 : }
1502 : else
1503 0 : rIStm.SetError( SVSTREAM_READ_ERROR );
1504 :
1505 11 : ImplSetModified( false );
1506 :
1507 22 : return rIStm;
1508 : }
1509 :
1510 22 : SvStream& WriteGalleryTheme( SvStream& rOut, const GalleryTheme& rTheme )
1511 : {
1512 22 : return rTheme.WriteData( rOut );
1513 : }
1514 :
1515 11 : SvStream& ReadGalleryTheme( SvStream& rIn, GalleryTheme& rTheme )
1516 : {
1517 11 : return rTheme.ReadData( rIn );
1518 : }
1519 :
1520 536 : void GalleryTheme::ImplSetModified( bool bModified )
1521 : {
1522 536 : pThm->SetModified(bModified);
1523 536 : }
1524 :
1525 22 : const OUString& GalleryTheme::GetRealName() const { return pThm->GetThemeName(); }
1526 44 : const INetURLObject& GalleryTheme::GetThmURL() const { return pThm->GetThmURL(); }
1527 503 : const INetURLObject& GalleryTheme::GetSdgURL() const { return pThm->GetSdgURL(); }
1528 22 : const INetURLObject& GalleryTheme::GetSdvURL() const { return pThm->GetSdvURL(); }
1529 22 : sal_uInt32 GalleryTheme::GetId() const { return pThm->GetId(); }
1530 11 : void GalleryTheme::SetId( sal_uInt32 nNewId, bool bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); }
1531 22 : bool GalleryTheme::IsThemeNameFromResource() const { return pThm->IsNameFromResource(); }
1532 0 : bool GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); }
1533 0 : bool GalleryTheme::IsDefault() const { return pThm->IsDefault(); }
1534 22 : bool GalleryTheme::IsModified() const { return pThm->IsModified(); }
1535 1509 : const OUString& GalleryTheme::GetName() const { return pThm->GetThemeName(); }
1536 :
1537 0 : void GalleryTheme::InsertAllThemes( ListBox& rListBox )
1538 : {
1539 0 : for( sal_uInt16 i = RID_GALLERYSTR_THEME_FIRST; i <= RID_GALLERYSTR_THEME_LAST; i++ )
1540 0 : rListBox.InsertEntry(GAL_RESSTR(i));
1541 651 : }
1542 :
1543 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|