LibreOffice Module svx (master)  1
galtheme.cxx
Go to the documentation of this file.
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 #include <sal/log.hxx>
24 
25 #include <algorithm>
26 
27 #include <comphelper/fileformat.h>
29 #include <osl/file.hxx>
30 #include <osl/thread.hxx>
31 #include <tools/diagnose_ex.h>
32 #include <tools/urlobj.hxx>
33 #include <tools/vcompat.hxx>
34 #include <tools/datetime.hxx>
35 #include <unotools/datetime.hxx>
36 #include <unotools/streamwrap.hxx>
38 #include <unotools/tempfile.hxx>
39 #include <ucbhelper/content.hxx>
40 #include <com/sun/star/ucb/ContentCreationException.hpp>
41 #include <sot/storage.hxx>
42 #include <sot/formats.hxx>
43 #include <sot/filelist.hxx>
44 #include <vcl/virdev.hxx>
45 #include <vcl/cvtgrf.hxx>
46 #include <avmedia/mediawindow.hxx>
47 #include <svx/svdograf.hxx>
48 #include "codec.hxx"
49 #include <svx/unomodel.hxx>
50 #include <svx/fmmodel.hxx>
51 #include <svx/fmview.hxx>
52 #include <svx/galmisc.hxx>
53 #include <svx/galtheme.hxx>
54 #include <svx/svdpage.hxx>
56 #include <com/sun/star/sdbc/XResultSet.hpp>
57 #include <com/sun/star/ucb/XContentAccess.hpp>
58 #include <galobj.hxx>
59 #include <svx/gallery1.hxx>
60 #include "gallerydrawmodel.hxx"
61 #include <memory>
62 
63 using namespace ::com::sun::star;
64 
66  : pParent(pGallery)
67  , pThm(pThemeEntry)
68  , mnThemeLockCount(0)
69  , mnBroadcasterLockCount(0)
70  , nDragPos(0)
71  , bDragging(false)
72  , bAbortActualize(false)
73 {
75 }
76 
78 {
79  if(pThm->IsModified())
80  if(!mpGalleryStorageEngine->implWrite(*this, pThm))
81  ImplSetModified(false);
82 
83  for (auto & pEntry : maGalleryObjectCollection.getObjectList())
84  {
86  pEntry.reset();
87  }
89  mpGalleryStorageEngine->clearSotStorage();
90 }
91 
92 void GalleryTheme::SetDestDir(const OUString& rDestDir, bool bRelative)
93 {
94  mpGalleryStorageEngine->setDestDir(rDestDir, bRelative);
95 }
96 
97 void GalleryTheme::ImplBroadcast(sal_uInt32 nUpdatePos)
98 {
99  if( !IsBroadcasterLocked() )
100  {
101  if( GetObjectCount() && ( nUpdatePos >= GetObjectCount() ) )
102  nUpdatePos = GetObjectCount() - 1;
103 
104  Broadcast( GalleryHint( GalleryHintType::THEME_UPDATEVIEW, GetName(), reinterpret_cast<void*>(nUpdatePos) ) );
105  }
106 }
107 
109 {
110  DBG_ASSERT( mnThemeLockCount, "Theme is not locked" );
111 
112  bool bRet = false;
113 
114  if( mnThemeLockCount )
115  {
117  bRet = true;
118  }
119 
120  return bRet;
121 }
122 
124 {
125  DBG_ASSERT( mnBroadcasterLockCount, "Broadcaster is not locked" );
126 
128  ImplBroadcast( 0 );
129 }
130 
131 bool GalleryTheme::InsertObject(const SgaObject& rObj, sal_uInt32 nInsertPos)
132 {
133  if (!rObj.IsValid())
134  return false;
135 
136  GalleryObject* pFoundEntry = nullptr;
137  sal_uInt32 iFoundPos = 0;
138  for (sal_uInt32 n = maGalleryObjectCollection.size(); iFoundPos < n; ++iFoundPos)
139  {
140  if (maGalleryObjectCollection.get(iFoundPos)->getURL() == rObj.GetURL())
141  {
142  pFoundEntry = maGalleryObjectCollection.get(iFoundPos).get();
143  break;
144  }
145  }
146 
147  mpGalleryStorageEngine->insertObject(rObj, pFoundEntry, nInsertPos);
148 
149  ImplSetModified(true);
150  ImplBroadcast(pFoundEntry? iFoundPos: nInsertPos);
151 
152  return true;
153 }
154 
155 std::unique_ptr<SgaObject> GalleryTheme::AcquireObject(sal_uInt32 nPos)
156 {
157  return mpGalleryStorageEngine->implReadSgaObject(maGalleryObjectCollection.getForPosition(nPos));
158 }
159 
160 void GalleryTheme::GetPreviewBitmapExAndStrings(sal_uInt32 nPos, BitmapEx& rBitmapEx, Size& rSize, OUString& rTitle, OUString& rPath)
161 {
162  const GalleryObject* pGalleryObject = maGalleryObjectCollection.get(nPos).get();
163 
164  rBitmapEx = pGalleryObject->maPreviewBitmapEx;
165  rSize = pGalleryObject->maPreparedSize;
166  rTitle = pGalleryObject->maTitle;
167  rPath = pGalleryObject->maPath;
168 }
169 
170 void GalleryTheme::SetPreviewBitmapExAndStrings(sal_uInt32 nPos, const BitmapEx& rBitmapEx, const Size& rSize, const OUString& rTitle, const OUString& rPath)
171 {
172  GalleryObject* pGalleryObject = maGalleryObjectCollection.get(nPos).get();
173 
174  pGalleryObject->maPreviewBitmapEx = rBitmapEx;
175  pGalleryObject->maPreparedSize = rSize;
176  pGalleryObject->maTitle = rTitle;
177  pGalleryObject->maPath = rPath;
178 }
179 
180 void GalleryTheme::RemoveObject(sal_uInt32 nPos)
181 {
182  auto it = maGalleryObjectCollection.getObjectList().begin() + nPos;
183  std::unique_ptr<GalleryObject> pEntry = std::move(*it);
185 
186  mpGalleryStorageEngine->removeObject(pEntry);
187 
189  pEntry.reset();
190 
191  ImplSetModified( true );
192  ImplBroadcast( nPos );
193 }
194 
195 bool GalleryTheme::ChangeObjectPos(sal_uInt32 nOldPos, sal_uInt32 nNewPos)
196 {
197  if (nOldPos == nNewPos || nOldPos >= maGalleryObjectCollection.size())
198  return false;
199 
200  std::unique_ptr<GalleryObject> pEntry = std::move(maGalleryObjectCollection.get(nOldPos));
201 
202  maGalleryObjectCollection.getObjectList().insert(maGalleryObjectCollection.getObjectList().begin() + nNewPos, std::move(pEntry));
203 
204  if (nNewPos < nOldPos)
205  nOldPos++;
206 
207  auto it = maGalleryObjectCollection.getObjectList().begin() + nOldPos;
209 
210  ImplSetModified(true);
211  ImplBroadcast((nNewPos < nOldPos)? nNewPos: (nNewPos - 1));
212 
213  return true;
214 }
215 
217 {
218  if( IsReadOnly() )
219  return;
220 
221  Graphic aGraphic;
222  OUString aFormat;
223  const sal_uInt32 nCount = maGalleryObjectCollection.size();
224 
225  LockBroadcaster();
226  bAbortActualize = false;
227 
228  // reset delete flag
229  for (sal_uInt32 i = 0; i < nCount; i++)
230  maGalleryObjectCollection.get(i)->mbDelete = false;
231 
232  for (sal_uInt32 i = 0; ( i < nCount ) && !bAbortActualize; i++)
233  {
234  if( pProgress )
235  pProgress->Update( i, nCount - 1 );
236 
237  GalleryObject* pEntry = maGalleryObjectCollection.get(i).get();
238 
239  const INetURLObject aURL( pEntry->getURL());
240 
241  rActualizeLink.Call( aURL );
242 
243  // SvDraw objects will be updated later
244  if( pEntry->eObjKind != SgaObjKind::SvDraw )
245  {
246  // Still a function should be implemented,
247  // which assigns files to the relevant entry.
248  // insert graphics as graphic objects into the gallery
249  if( pEntry->eObjKind == SgaObjKind::Sound )
250  {
251  SgaObjectSound aObjSound( aURL );
252  if( !InsertObject( aObjSound ) )
253  pEntry->mbDelete = true;
254  }
255  else
256  {
257  aGraphic.Clear();
258 
259  if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) != GalleryGraphicImportRet::IMPORT_NONE )
260  {
261  std::unique_ptr<SgaObject> pNewObj;
262 
263  if ( SgaObjKind::Inet == pEntry->eObjKind )
264  pNewObj.reset(new SgaObjectINet( aGraphic, aURL ));
265  else if ( aGraphic.IsAnimated() )
266  pNewObj.reset(new SgaObjectAnim( aGraphic, aURL ));
267  else
268  pNewObj.reset(new SgaObjectBmp( aGraphic, aURL ));
269 
270  if( !InsertObject( *pNewObj ) )
271  pEntry->mbDelete = true;
272  }
273  else
274  pEntry->mbDelete = true; // set delete flag
275  }
276  }
277  else
278  {
279  //update SvDraw object
280  if ( mpGalleryStorageEngine->GetSvDrawStorage().is() )
281  {
282  SgaObjectSvDraw aNewObj = mpGalleryStorageEngine->updateSvDrawObject(pEntry);
283  if (aNewObj.IsValid() && !InsertObject(aNewObj))
284  pEntry->mbDelete = true;
285  }
286  }
287  }
288 
289  // remove all entries with set flag
290  for ( auto it = maGalleryObjectCollection.getObjectList().begin(); it != maGalleryObjectCollection.getObjectList().end(); /* increment is in the body of loop */)
291  {
292  if( (*it)->mbDelete )
293  {
295  it = maGalleryObjectCollection.getObjectList().erase( it );
296  }
297  else
298  ++it;
299  }
300 
301  // update theme
302  mpGalleryStorageEngine->updateTheme();
303  ImplSetModified( true );
304  if (pThm->IsModified())
305  if (!mpGalleryStorageEngine->implWrite(*this, pThm))
306  ImplSetModified(false);
308 }
309 
310 bool GalleryTheme::GetThumb(sal_uInt32 nPos, BitmapEx& rBmp)
311 {
312  std::unique_ptr<SgaObject> pObj = AcquireObject( nPos );
313  bool bRet = false;
314 
315  if( pObj )
316  {
317  rBmp = pObj->GetThumbBmp();
318  bRet = true;
319  }
320 
321  return bRet;
322 }
323 
324 bool GalleryTheme::GetGraphic(sal_uInt32 nPos, Graphic& rGraphic)
325 {
327  bool bRet = false;
328 
329  if( pObject )
330  {
331  const INetURLObject aURL( ImplGetURL( pObject ) );
332 
333  switch( pObject->eObjKind )
334  {
335  case SgaObjKind::Bitmap:
337  case SgaObjKind::Inet:
338  {
339  OUString aFilterDummy;
340  bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy ) != GalleryGraphicImportRet::IMPORT_NONE );
341  }
342  break;
343 
344  case SgaObjKind::SvDraw:
345  {
346  SvxGalleryDrawModel aModel;
347 
348  if( aModel.GetModel() )
349  {
350  if( GetModel( nPos, *aModel.GetModel() ) )
351  {
352  ImageMap aIMap;
353 
354  if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) )
355  bRet = true;
356  else
357  {
359  pVDev->SetMapMode( MapMode( MapUnit::Map100thMM ) );
360  FmFormView aView(*aModel.GetModel(), pVDev);
361 
362  aView.hideMarkHandles();
363  aView.ShowSdrPage(aView.GetModel()->GetPage(0));
364  aView.MarkAll();
365  rGraphic = aView.GetAllMarkedGraphic();
366  bRet = true;
367  }
368  }
369  }
370  }
371  break;
372 
373  case SgaObjKind::Sound:
374  {
375  std::unique_ptr<SgaObject> pObj = AcquireObject( nPos );
376 
377  if( pObj )
378  {
379  rGraphic = pObj->GetThumbBmp();
380  //Bitmap aBmp( pObj->GetThumbBmp() );
381  //aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
382  //rGraphic = aBmp;
383  bRet = true;
384  }
385  }
386  break;
387 
388  default:
389  break;
390  }
391  }
392 
393  return bRet;
394 }
395 
396 bool GalleryTheme::InsertGraphic(const Graphic& rGraphic, sal_uInt32 nInsertPos)
397 {
398  bool bRet = false;
399 
400  if( rGraphic.GetType() != GraphicType::NONE )
401  {
402  ConvertDataFormat nExportFormat = ConvertDataFormat::Unknown;
403  const GfxLink aGfxLink( rGraphic.GetGfxLink() );
404 
405  if( aGfxLink.GetDataSize() )
406  {
407  switch( aGfxLink.GetType() )
408  {
409  case GfxLinkType::EpsBuffer: nExportFormat = ConvertDataFormat::SVM; break;
410  case GfxLinkType::NativeGif: nExportFormat = ConvertDataFormat::GIF; break;
411 
412  // #i15508# added BMP type
413  // could not find/trigger a call to this, but should do no harm
414  case GfxLinkType::NativeBmp: nExportFormat = ConvertDataFormat::BMP; break;
415 
416  case GfxLinkType::NativeJpg: nExportFormat = ConvertDataFormat::JPG; break;
417  case GfxLinkType::NativePng: nExportFormat = ConvertDataFormat::PNG; break;
418  case GfxLinkType::NativeTif: nExportFormat = ConvertDataFormat::TIF; break;
419  case GfxLinkType::NativeWmf: nExportFormat = ConvertDataFormat::WMF; break;
420  case GfxLinkType::NativeMet: nExportFormat = ConvertDataFormat::MET; break;
421  case GfxLinkType::NativePct: nExportFormat = ConvertDataFormat::PCT; break;
422  case GfxLinkType::NativeSvg: nExportFormat = ConvertDataFormat::SVG; break;
423  default:
424  break;
425  }
426  }
427  else
428  {
429  if( rGraphic.GetType() == GraphicType::Bitmap )
430  {
431  if( rGraphic.IsAnimated() )
432  nExportFormat = ConvertDataFormat::GIF;
433  else
434  nExportFormat = ConvertDataFormat::PNG;
435  }
436  else
437  nExportFormat = ConvertDataFormat::SVM;
438  }
439 
440  const SgaObjectBmp aObjBmp = mpGalleryStorageEngine->insertGraphic(rGraphic, aGfxLink, nExportFormat, GetParent()->GetUserURL());
441 
442  if (aObjBmp.IsValid())
443  bRet = InsertObject(aObjBmp, nInsertPos);
444  }
445 
446  return bRet;
447 }
448 
449 bool GalleryTheme::GetModel(sal_uInt32 nPos, SdrModel& rModel)
450 {
452  bool bRet = false;
453 
454  if( pObject && ( SgaObjKind::SvDraw == pObject->eObjKind ) )
455  {
456  bRet = mpGalleryStorageEngine->readModel(pObject, rModel);
457  }
458 
459  return bRet;
460 }
461 
462 bool GalleryTheme::InsertModel(const FmFormModel& rModel, sal_uInt32 nInsertPos)
463 {
464  bool bRet = false;
465  SgaObjectSvDraw aObjSvDraw = mpGalleryStorageEngine->insertModel(rModel, GetParent()->GetUserURL());
466  if(aObjSvDraw.IsValid())
467  bRet = InsertObject( aObjSvDraw, nInsertPos );
468  return bRet;
469 }
470 
471 bool GalleryTheme::GetModelStream(sal_uInt32 nPos, tools::SvRef<SotStorageStream> const & rxModelStream)
472 {
474  bool bRet = false;
475 
476  if( pObject && ( SgaObjKind::SvDraw == pObject->eObjKind ) )
477  {
478  bRet = mpGalleryStorageEngine->readModelStream(pObject, rxModelStream);
479  }
480 
481  return bRet;
482 }
483 
484 bool GalleryTheme::InsertModelStream(const tools::SvRef<SotStorageStream>& rxModelStream, sal_uInt32 nInsertPos)
485 {
486  bool bRet = false;
487 
488  const SgaObjectSvDraw aObjSvDraw = mpGalleryStorageEngine->insertModelStream(rxModelStream, GetParent()->GetUserURL());
489  if(aObjSvDraw.IsValid())
490  bRet = InsertObject( aObjSvDraw, nInsertPos );
491 
492  return bRet;
493 }
494 
495 bool GalleryTheme::GetURL(sal_uInt32 nPos, INetURLObject& rURL)
496 {
498  bool bRet = false;
499 
500  if( pObject )
501  {
502  rURL = ImplGetURL( pObject );
503  bRet = true;
504  }
505 
506  return bRet;
507 }
508 
509 bool GalleryTheme::InsertURL(const INetURLObject& rURL, sal_uInt32 nInsertPos)
510 {
511  Graphic aGraphic;
512  OUString aFormat;
513  std::unique_ptr<SgaObject> pNewObj;
514  const GalleryGraphicImportRet nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat );
515  bool bRet = false;
516 
517  if( nImportRet != GalleryGraphicImportRet::IMPORT_NONE )
518  {
519  if ( aGraphic.IsAnimated() )
520  pNewObj.reset(new SgaObjectAnim( aGraphic, rURL ));
521  else
522  pNewObj.reset(new SgaObjectBmp( aGraphic, rURL ));
523  }
524 #if HAVE_FEATURE_AVMEDIA
526  pNewObj.reset(new SgaObjectSound( rURL ));
527 #endif
528  if( pNewObj && InsertObject( *pNewObj, nInsertPos ) )
529  bRet = true;
530 
531  return bRet;
532 }
533 
534 bool GalleryTheme::InsertFileOrDirURL(const INetURLObject& rFileOrDirURL, sal_uInt32 nInsertPos)
535 {
536  bool bRet = false;
537  std::vector< INetURLObject > aURLVector;
538  GalleryBinaryEngine::insertFileOrDirURL(rFileOrDirURL, aURLVector);
539 
540  for( const auto& rURL : aURLVector )
541  bRet = bRet || InsertURL( rURL, nInsertPos );
542 
543  return bRet;
544 }
545 
546 bool GalleryTheme::InsertTransferable(const uno::Reference< datatransfer::XTransferable >& rxTransferable, sal_uInt32 nInsertPos)
547 {
548  bool bRet = false;
549 
550  if( rxTransferable.is() )
551  {
552  TransferableDataHelper aDataHelper( rxTransferable );
553  std::unique_ptr<Graphic> pGraphic;
554 
555  if( aDataHelper.HasFormat( SotClipboardFormatId::DRAWING ) )
556  {
558 
559  if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::DRAWING, xModelStm ) )
560  bRet = InsertModelStream( xModelStm, nInsertPos );
561  }
562  else if( aDataHelper.HasFormat( SotClipboardFormatId::FILE_LIST ) ||
563  aDataHelper.HasFormat( SotClipboardFormatId::SIMPLE_FILE ) )
564  {
565  FileList aFileList;
566 
567  if( aDataHelper.HasFormat( SotClipboardFormatId::FILE_LIST ) )
568  aDataHelper.GetFileList( SotClipboardFormatId::FILE_LIST, aFileList );
569  else
570  {
571  OUString aFile;
572  if (aDataHelper.GetString(SotClipboardFormatId::SIMPLE_FILE, aFile) && !aFile.isEmpty())
573  aFileList.AppendFile( aFile );
574  }
575 
576  for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i )
577  {
578  const OUString aFile( aFileList.GetFile( i ) );
579  INetURLObject aURL( aFile );
580 
581  if( aURL.GetProtocol() == INetProtocol::NotValid )
582  {
583  OUString aLocalURL;
584 
585  if( osl::FileBase::getFileURLFromSystemPath( aFile, aLocalURL ) == osl::FileBase::E_None )
586  aURL = INetURLObject( aLocalURL );
587  }
588 
589  if( aURL.GetProtocol() != INetProtocol::NotValid )
590  bRet = InsertFileOrDirURL( aURL, nInsertPos );
591  }
592  }
593  else
594  {
595  Graphic aGraphic;
596  SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
597 
598  if( aDataHelper.HasFormat( SotClipboardFormatId::SVXB ) )
599  nFormat = SotClipboardFormatId::SVXB;
600  else if( aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) )
601  nFormat = SotClipboardFormatId::GDIMETAFILE;
602  else if( aDataHelper.HasFormat( SotClipboardFormatId::BITMAP ) )
603  nFormat = SotClipboardFormatId::BITMAP;
604 
605  if( nFormat != SotClipboardFormatId::NONE && aDataHelper.GetGraphic( nFormat, aGraphic ) )
606  pGraphic.reset(new Graphic( aGraphic ));
607  }
608 
609  if( pGraphic )
610  {
611  bRet = false;
612 
613  if( aDataHelper.HasFormat( SotClipboardFormatId::SVIM ) )
614  {
615 
616  ImageMap aImageMap;
617 
618  // according to KA we don't need a BaseURL here
619  if( aDataHelper.GetImageMap( SotClipboardFormatId::SVIM, aImageMap ) )
620  {
621  SvxGalleryDrawModel aModel;
622 
623  if( aModel.GetModel() )
624  {
625  SdrPage* pPage = aModel.GetModel()->GetPage(0);
626  SdrGrafObj* pGrafObj = new SdrGrafObj(*aModel.GetModel(), *pGraphic );
627 
628  pGrafObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SgaIMapInfo( aImageMap )) );
629  pPage->InsertObject( pGrafObj );
630  bRet = InsertModel( *aModel.GetModel(), nInsertPos );
631  }
632  }
633  }
634 
635  if( !bRet )
636  bRet = InsertGraphic( *pGraphic, nInsertPos );
637  }
638  }
639 
640  return bRet;
641 }
642 
643 void GalleryTheme::CopyToClipboard(sal_uInt32 nPos)
644 {
645  GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false );
646  pTransferable->CopyToClipboard(GetSystemClipboard());
647 }
648 
650 {
651  return mpGalleryStorageEngine->getModificationDate();
652 }
653 
655 {
656  sal_uInt32 nCount;
657  sal_uInt16 nVersion;
658 
659  rIStm.ReadUInt16( nVersion );
661  rIStm.ReadUInt32( nCount );
662 
663  if( nVersion >= 0x0004 )
664  {
665  sal_uInt16 nTmp16;
666  rIStm.ReadUInt16( nTmp16 );
667  }
668 
669  if( nCount <= ( 1 << 14 ) )
670  {
671  INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
672  INetURLObject aRelURL2( GetParent()->GetUserURL() );
673  sal_uInt32 nId1, nId2;
674  bool bRel;
675 
677  {
678  GalleryObject* pObj = i.get();
680  i.reset();
681  }
683 
684  for( sal_uInt32 i = 0; i < nCount; i++ )
685  {
686  std::unique_ptr<GalleryObject> pObj(new GalleryObject);
687 
688  OUString aFileName;
689  sal_uInt16 nTemp;
690 
691  rIStm.ReadCharAsBool( bRel );
692  OString aTempFileName = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm);
693  rIStm.ReadUInt32( pObj->nOffset );
694  rIStm.ReadUInt16( nTemp ); pObj->eObjKind = static_cast<SgaObjKind>(nTemp);
695 
696  aFileName = OStringToOUString(aTempFileName, osl_getThreadTextEncoding());
697 
698  pObj->m_pGalleryObjectStorage.reset();
699  pObj->m_pGalleryObjectStorage = std::make_unique<GalleryObjectBinaryStorage>();
700 
701  if( bRel )
702  {
703  aFileName = aFileName.replaceAll( "\\", "/" );
704  OUString aPath = aRelURL1.GetMainURL( INetURLObject::DecodeMechanism::NONE );
705 
706  if( aFileName[ 0 ] != '/' )
707  aPath += "/";
708 
709  aPath += aFileName;
710 
711  pObj->m_pGalleryObjectStorage->setURL(INetURLObject(aPath));
712 
713  if (!FileExists(pObj->getURL()))
714  {
716 
717  if( aFileName[0] != '/' )
718  aPath += "/";
719 
720  aPath += aFileName;
721 
722  // assign this URL, even in the case it is not valid (#94482)
723  pObj->m_pGalleryObjectStorage->setURL(INetURLObject(aPath));
724  }
725  }
726  else
727  {
728  if( SgaObjKind::SvDraw == pObj->eObjKind )
729  {
730  OUString aDummyURL = "gallery/svdraw/" + aFileName;
731  pObj->m_pGalleryObjectStorage->setURL(INetURLObject(aDummyURL, INetProtocol::PrivSoffice));
732  }
733  else
734  {
735  OUString aLocalURL;
736 
737  pObj->m_pGalleryObjectStorage->setURL(INetURLObject(aFileName));
738 
739  if( ( pObj->getURL().GetProtocol() == INetProtocol::NotValid ) &&
740  osl::FileBase::getFileURLFromSystemPath( aFileName, aLocalURL ) == osl::FileBase::E_None )
741  {
742  pObj->m_pGalleryObjectStorage->setURL(INetURLObject(aLocalURL));
743  }
744  }
745  }
746  maGalleryObjectCollection.getObjectList().push_back( std::move(pObj) );
747  }
748 
749  rIStm.ReadUInt32( nId1 ).ReadUInt32( nId2 );
750 
751  // In newer versions a 512 byte reserve buffer is located at the end,
752  // the data is located at the beginning of this buffer and are clamped
753  // by a VersionCompat.
754  if( !rIStm.eof() &&
755  nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
756  nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
757  {
758  VersionCompat aCompat( rIStm, StreamMode::READ );
759  sal_uInt32 nTemp32;
760  bool bThemeNameFromResource = false;
761 
762  rIStm.ReadUInt32( nTemp32 );
763 
764  if( aCompat.GetVersion() >= 2 )
765  {
766  rIStm.ReadCharAsBool( bThemeNameFromResource );
767  }
768 
769  SetId( nTemp32, bThemeNameFromResource );
770  }
771  }
772  else
773  rIStm.SetError( SVSTREAM_READ_ERROR );
774 
775  ImplSetModified( false );
776 
777  return rIStm;
778 }
779 
780 void GalleryTheme::ImplSetModified( bool bModified )
781 {
782  pThm->SetModified(bModified);
783 }
784 
785 sal_uInt32 GalleryTheme::GetId() const { return pThm->GetId(); }
786 void GalleryTheme::SetId( sal_uInt32 nNewId, bool bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); }
787 bool GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); }
788 bool GalleryTheme::IsDefault() const { return pThm->IsDefault(); }
789 
790 const OUString& GalleryTheme::GetName() const { return pThm->GetThemeName(); }
791 
792 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bool GetGraphic(SotClipboardFormatId nFormat, Graphic &rGraphic)
URL aURL
std::unique_ptr< GalleryBinaryEngine > mpGalleryStorageEngine
Definition: galtheme.hxx:61
bool InsertObject(const SgaObject &rObj, sal_uInt32 nPos=SAL_MAX_UINT32)
Definition: galtheme.cxx:131
void Update(sal_Int32 nVal, sal_Int32 nMaxVal)
Definition: galmisc.cxx:350
bool IsModified() const
Definition: gallery1.hxx:71
bool IsDefault() const
Definition: galtheme.cxx:788
sal_uInt32 GetId() const
Definition: galtheme.cxx:785
bool InsertGraphic(const Graphic &rGraphic, sal_uInt32 nInsertPos)
Definition: galtheme.cxx:396
bool CreateIMapGraphic(const FmFormModel &rModel, Graphic &rGraphic, ImageMap &rImageMap)
Definition: galmisc.cxx:120
SvStream & ReadUInt16(sal_uInt16 &rUInt16)
sal_uInt32 mnBroadcasterLockCount
Definition: galtheme.hxx:66
SAL_DLLPRIVATE Gallery * GetParent() const
Definition: galtheme.hxx:119
sal_uInt32 mnThemeLockCount
Definition: galtheme.hxx:65
std::vector< std::unique_ptr< GalleryObject > > & getObjectList()
#define SVSTREAM_READ_ERROR
SAL_DLLPRIVATE bool InsertModelStream(const tools::SvRef< SotStorageStream > &rModelStream, sal_uInt32 nInsertPos)
Definition: galtheme.cxx:484
SvStream & ReadCharAsBool(bool &rBool)
sal_Int64 n
void RemoveObject(sal_uInt32 nPos)
Definition: galtheme.cxx:180
const INetURLObject & getURL() const
css::uno::Reference< css::datatransfer::clipboard::XClipboard > VCL_DLLPUBLIC GetSystemClipboard()
SAL_DLLPRIVATE void SetPreviewBitmapExAndStrings(sal_uInt32 nPos, const BitmapEx &rBitmapEx, const Size &rSize, const OUString &rTitle, const OUString &rPath)
Definition: galtheme.cxx:170
FmFormModel * GetModel() const
bool IsReadOnly() const
Definition: gallery1.hxx:66
virtual void InsertObject(SdrObject *pObj, size_t nPos=SAL_MAX_SIZE)
Definition: svdpage.cxx:343
EmbeddedObjectRef * pObject
bool HasFormat(SotClipboardFormatId nFormat) const
void Clear()
OString read_uInt16_lenPrefixed_uInt8s_ToOString(SvStream &rStrm)
SAL_DLLPRIVATE bool GetURL(sal_uInt32 nPos, INetURLObject &rURL)
Definition: galtheme.cxx:495
bool eof() const
INetURLObject ImplGetURL(const GalleryObject *pObject)
Definition: galmisc.cxx:554
int nCount
GalleryThemeEntry * pThm
Definition: galtheme.hxx:64
std::unique_ptr< GalleryObject > & get(sal_uInt32 nPos)
SAL_DLLPRIVATE SvStream & ReadData(SvStream &rIn)
Definition: galtheme.cxx:654
SotClipboardFormatId
virtual SAL_DLLPRIVATE ~GalleryTheme() override
Definition: galtheme.cxx:77
SAL_DLLPRIVATE void LockBroadcaster()
Definition: galtheme.hxx:106
bool IsAnimated() const
SvStream & ReadUInt32(sal_uInt32 &rUInt32)
SgaObjKind
Definition: galmisc.hxx:55
sal_uInt32 GetId() const
Definition: gallery1.hxx:77
GalleryTheme(GalleryTheme const &)=delete
SAL_DLLPRIVATE bool InsertFileOrDirURL(const INetURLObject &rFileOrDirURL, sal_uInt32 nInsertPos)
Definition: galtheme.cxx:534
#define DBG_ASSERT(sCon, aError)
int i
GalleryGraphicImportRet GalleryGraphicImport(const INetURLObject &rURL, Graphic &rGraphic, OUString &rFilterName)
Definition: galmisc.cxx:51
bool InsertURL(const INetURLObject &rURL, sal_uInt32 nInsertPos=SAL_MAX_UINT32)
Definition: galtheme.cxx:509
GraphicType GetType() const
static void insertFileOrDirURL(const INetURLObject &rFileOrDirURL, std::vector< INetURLObject > &rURLVector)
void SetModified(bool bSet)
Definition: gallery1.hxx:72
sal_uInt32 COMPAT_FORMAT(char char1, char char2, char char3, char char4)
void Actualize(const Link< const INetURLObject &, void > &rActualizeLink, GalleryProgress *pProgress=nullptr)
Definition: galtheme.cxx:216
bool GetString(SotClipboardFormatId nFormat, OUString &rStr)
ConvertDataFormat
void hideMarkHandles()
Definition: svdmrkv.cxx:566
SAL_DLLPRIVATE void GetPreviewBitmapExAndStrings(sal_uInt32 nPos, BitmapEx &rBitmapEx, Size &rSize, OUString &rTitle, OUString &rPath)
Definition: galtheme.cxx:160
bool ChangeObjectPos(sal_uInt32 nOldPos, sal_uInt32 nNewPos)
Definition: galtheme.cxx:195
const SdrPage * GetPage(sal_uInt16 nPgNum) const
Definition: svdmodel.cxx:1904
void SetDestDir(const OUString &rDestDir, bool bRelative)
Definition: galtheme.cxx:92
OUString GetFile(size_t nIndex) const
void SetError(ErrCode nErrorCode)
SAL_DLLPRIVATE bool InsertTransferable(const css::uno::Reference< css::datatransfer::XTransferable > &rxTransferable, sal_uInt32 nInsertPos)
Definition: galtheme.cxx:546
SAL_DLLPRIVATE sal_uInt32 GetObjectCount() const
Definition: galtheme.hxx:84
GalleryGraphicImportRet
Definition: galmisc.hxx:69
bool GetGraphic(sal_uInt32 nPos, Graphic &rGraphic)
Definition: galtheme.cxx:324
void CopyToClipboard(const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rClipboard) const
This class represents an embedded or linked bitmap graphic object.
Definition: svdograf.hxx:77
sal_Int16 nVersion
GfxLink GetGfxLink() const
size_t Count() const
void AppendFile(const OUString &rStr)
SAL_DLLPRIVATE bool IsBroadcasterLocked() const
Definition: galtheme.hxx:108
static bool isMediaURL(const OUString &rURL, const OUString &rReferer, bool bDeep=false, Size *pPreferredSizePixel=nullptr)
void UnlockBroadcaster()
Definition: galtheme.cxx:123
SAL_DLLPRIVATE void ImplBroadcast(sal_uInt32 nUpdatePos)
Definition: galtheme.cxx:97
void AppendUserData(std::unique_ptr< SdrObjUserData > pData)
Definition: svdobj.cxx:2621
bool GetSotStorageStream(SotClipboardFormatId nFormat, tools::SvRef< SotStorageStream > &rStreamRef)
bool GetImageMap(SotClipboardFormatId nFormat, ImageMap &rIMap)
GalleryObjectCollection maGalleryObjectCollection
Definition: galtheme.hxx:62
bool IsDefault() const
Definition: gallery1.cxx:719
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
SAL_DLLPRIVATE bool GetModelStream(sal_uInt32 nPos, tools::SvRef< SotStorageStream > const &rModelStreamRef)
Definition: galtheme.cxx:471
DateTime getModificationDate() const
Definition: galtheme.cxx:649
bool GetModel(sal_uInt32 nPos, SdrModel &rModel)
Definition: galtheme.cxx:449
SAL_DLLPRIVATE void CopyToClipboard(sal_uInt32 nPos)
Definition: galtheme.cxx:643
static bool FileExists(const INetURLObject &rURL, const OUString &rExt)
void Broadcast(const SfxHint &rHint)
std::unique_ptr< GalleryBinaryEngine > createGalleryStorageEngine(GalleryObjectCollection &mrGalleryObjectCollection)
Definition: gallery1.cxx:176
const GalleryObject * getForPosition(sal_uInt32 nPos) const
void SetId(sal_uInt32 nNewId, bool bResetThemeName)
Definition: gallery1.cxx:200
SAL_DLLPRIVATE bool GetThumb(sal_uInt32 nPos, BitmapEx &rBmp)
Definition: galtheme.cxx:310
bool GetFileList(SotClipboardFormatId nFormat, FileList &rFileList)
bool bAbortActualize
Definition: galtheme.hxx:69
SAL_DLLPRIVATE void ImplSetModified(bool bModified)
Definition: galtheme.cxx:780
SAL_DLLPRIVATE void SetId(sal_uInt32 nNewId, bool bResetThemeName)
Definition: galtheme.cxx:786
const OUString & GetName() const
Definition: galtheme.cxx:790
A SdrPage contains exactly one SdrObjList and a description of the physical page dimensions (size / m...
Definition: svdpage.hxx:365
SAL_DLLPRIVATE bool UnlockTheme()
Definition: galtheme.cxx:108
bool IsReadOnly() const
Definition: galtheme.cxx:787
bool InsertModel(const FmFormModel &rModel, sal_uInt32 nInsertPos)
Definition: galtheme.cxx:462
const OUString & GetThemeName() const
Definition: gallery1.hxx:64
std::unique_ptr< SgaObject > AcquireObject(sal_uInt32 nPos)
Definition: galtheme.cxx:155