office-gobmx/svx/source/gallery2/galtheme.cxx
Julien Nabet e799a47983 coverity#738979 Use after free
Change-Id: I843556f18542ac601fd7e16c6f51218ef913de31
Reviewed-on: https://gerrit.libreoffice.org/2766
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
2013-03-15 23:28:30 +00:00

1578 lines
51 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "sal/config.h"
#include <comphelper/processfactory.hxx>
#include <tools/urlobj.hxx>
#include <tools/vcompat.hxx>
#include <unotools/streamwrap.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <unotools/tempfile.hxx>
#include <unotools/localfilehelper.hxx>
#include <ucbhelper/content.hxx>
#include <sot/storage.hxx>
#include <sot/formats.hxx>
#include <sot/filelist.hxx>
#include <vcl/virdev.hxx>
#include <vcl/cvtgrf.hxx>
#include <svl/itempool.hxx>
#include <sfx2/docfile.hxx>
#include <avmedia/mediawindow.hxx>
#include <svx/svdograf.hxx>
#include <svx/fmpage.hxx>
#include "codec.hxx"
#include <svx/unomodel.hxx>
#include <svx/fmmodel.hxx>
#include <svx/fmview.hxx>
#include "svx/galmisc.hxx"
#include "svx/galtheme.hxx"
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/ucb/XContentAccess.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include "galobj.hxx"
#include <svx/gallery1.hxx>
#include "galtheme.hrc"
#include <vcl/lstbox.hxx>
#include "gallerydrawmodel.hxx"
// --------------
// - Namespaces -
// --------------
using namespace ::rtl;
using namespace ::com::sun::star;
// ------------
// - SgaTheme -
// ------------
DBG_NAME(GalleryTheme)
GalleryTheme::GalleryTheme( Gallery* pGallery, GalleryThemeEntry* pThemeEntry ) :
pParent ( pGallery ),
pThm ( pThemeEntry ),
mnThemeLockCount ( 0 ),
mnBroadcasterLockCount( 0 ),
nDragPos ( 0 ),
bDragging ( sal_False )
{
DBG_CTOR(GalleryTheme,NULL);
ImplCreateSvDrawStorage();
}
// ------------------------------------------------------------------------
GalleryTheme::~GalleryTheme()
{
ImplWrite();
for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
{
GalleryObject* pEntry = aObjectList[ i ];
Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
delete pEntry;
}
aObjectList.clear();
DBG_DTOR(GalleryTheme,NULL);
}
// ------------------------------------------------------------------------
void GalleryTheme::ImplCreateSvDrawStorage()
{
aSvDrawStorageRef = new SvStorage( sal_False, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), pThm->IsReadOnly() ? STREAM_READ : STREAM_STD_READWRITE );
// #i50423# ReadOnly may not been set though the file can't be written (because of security reasons)
if ( ( aSvDrawStorageRef->GetError() != ERRCODE_NONE ) && !pThm->IsReadOnly() )
aSvDrawStorageRef = new SvStorage( sal_False, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
}
// ------------------------------------------------------------------------
sal_Bool GalleryTheme::ImplWriteSgaObject( const SgaObject& rObj, size_t nPos, GalleryObject* pExistentEntry )
{
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
sal_Bool bRet = sal_False;
if( pOStm )
{
const sal_uInt32 nOffset = pOStm->Seek( STREAM_SEEK_TO_END );
rObj.WriteData( *pOStm, m_aDestDir );
if( !pOStm->GetError() )
{
GalleryObject* pEntry;
if( !pExistentEntry )
{
pEntry = new GalleryObject;
if ( nPos < aObjectList.size() )
{
GalleryObjectList::iterator it = aObjectList.begin();
::std::advance( it, nPos );
aObjectList.insert( it, pEntry );
}
else
aObjectList.push_back( pEntry );
}
else
pEntry = pExistentEntry;
pEntry->aURL = rObj.GetURL();
pEntry->nOffset = nOffset;
pEntry->eObjKind = rObj.GetObjKind();
bRet = sal_True;
}
delete pOStm;
}
return bRet;
}
// ------------------------------------------------------------------------
SgaObject* GalleryTheme::ImplReadSgaObject( GalleryObject* pEntry )
{
SgaObject* pSgaObj = NULL;
if( pEntry )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
sal_uInt32 nInventor;
// Ueberpruefen, ob das File ein gueltiges SGA-File ist
pIStm->Seek( pEntry->nOffset );
*pIStm >> nInventor;
if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) )
{
pIStm->Seek( pEntry->nOffset );
switch( pEntry->eObjKind )
{
case( SGA_OBJ_BMP ): pSgaObj = new SgaObjectBmp(); break;
case( SGA_OBJ_ANIM ): pSgaObj = new SgaObjectAnim(); break;
case( SGA_OBJ_INET ): pSgaObj = new SgaObjectINet(); break;
case( SGA_OBJ_SVDRAW ): pSgaObj = new SgaObjectSvDraw(); break;
case( SGA_OBJ_SOUND ): pSgaObj = new SgaObjectSound(); break;
default:
break;
}
if( pSgaObj )
{
*pIStm >> *pSgaObj;
pSgaObj->ImplUpdateURL( pEntry->aURL );
}
}
delete pIStm;
}
}
return pSgaObj;
}
// ------------------------------------------------------------------------
void GalleryTheme::ImplWrite()
{
if( IsModified() )
{
INetURLObject aPathURL( GetThmURL() );
aPathURL.removeSegment();
aPathURL.removeFinalSlash();
DBG_ASSERT( aPathURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
if( FileExists( aPathURL ) || CreateDir( aPathURL ) )
{
#ifdef UNX
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_COPY_ON_SYMLINK | STREAM_TRUNC );
#else
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
#endif
if( pOStm )
{
*pOStm << *this;
delete pOStm;
}
ImplSetModified( sal_False );
}
}
}
// ------------------------------------------------------------------------
const GalleryObject* GalleryTheme::ImplGetGalleryObject( const INetURLObject& rURL )
{
for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
if ( aObjectList[ i ]->aURL == rURL )
return aObjectList[ i ];
return NULL;
}
// ------------------------------------------------------------------------
INetURLObject GalleryTheme::ImplGetURL( const GalleryObject* pObject ) const
{
INetURLObject aURL;
if( pObject )
aURL = pObject->aURL;
return aURL;
}
// ------------------------------------------------------------------------
INetURLObject GalleryTheme::ImplCreateUniqueURL( SgaObjKind eObjKind, sal_uIntPtr nFormat )
{
INetURLObject aDir( GetParent()->GetUserURL() );
INetURLObject aInfoFileURL( GetParent()->GetUserURL() );
INetURLObject aNewURL;
sal_uInt32 nNextNumber = 1999;
sal_Char const* pExt = NULL;
sal_Bool bExists;
aDir.Append( String( RTL_CONSTASCII_USTRINGPARAM( "dragdrop" ) ) );
CreateDir( aDir );
aInfoFileURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "sdddndx1" ) ) );
// read next possible number
if( FileExists( aInfoFileURL ) )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
*pIStm >> nNextNumber;
delete pIStm;
}
}
// create extension
if( nFormat )
{
switch( nFormat )
{
case( CVT_BMP ): pExt = ".bmp"; break;
case( CVT_GIF ): pExt = ".gif"; break;
case( CVT_JPG ): pExt = ".jpg"; break;
case( CVT_MET ): pExt = ".met"; break;
case( CVT_PCT ): pExt = ".pct"; break;
case( CVT_PNG ): pExt = ".png"; break;
case( CVT_SVM ): pExt = ".svm"; break;
case( CVT_TIF ): pExt = ".tif"; break;
case( CVT_WMF ): pExt = ".wmf"; break;
case( CVT_EMF ): pExt = ".emf"; break;
default:
pExt = ".grf";
break;
}
}
do
{
// get URL
if( SGA_OBJ_SVDRAW == eObjKind )
{
String aFileName( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/dd" ) );
aNewURL = INetURLObject( aFileName += OUString::number( ++nNextNumber % 99999999 ), INET_PROT_PRIV_SOFFICE );
bExists = sal_False;
for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
if ( aObjectList[ i ]->aURL == aNewURL )
{
bExists = sal_True;
break;
}
}
else
{
String aFileName( RTL_CONSTASCII_USTRINGPARAM( "dd" ) );
aFileName += OUString::number( ++nNextNumber % 999999 );
aFileName += String( pExt, RTL_TEXTENCODING_ASCII_US );
aNewURL = aDir;
aNewURL.Append( aFileName );
bExists = FileExists( aNewURL );
}
}
while( bExists );
// write updated number
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
if( pOStm )
{
*pOStm << nNextNumber;
delete pOStm;
}
return aNewURL;
}
// ------------------------------------------------------------------------
void GalleryTheme::ImplBroadcast( sal_uIntPtr nUpdatePos )
{
if( !IsBroadcasterLocked() )
{
if( GetObjectCount() && ( nUpdatePos >= GetObjectCount() ) )
nUpdatePos = GetObjectCount() - 1;
Broadcast( GalleryHint( GALLERY_HINT_THEME_UPDATEVIEW, GetName(), nUpdatePos ) );
}
}
// ------------------------------------------------------------------------
sal_Bool GalleryTheme::UnlockTheme()
{
DBG_ASSERT( mnThemeLockCount, "Theme is not locked" );
sal_Bool bRet = sal_False;
if( mnThemeLockCount )
{
--mnThemeLockCount;
bRet = sal_True;
}
return bRet;
}
// ------------------------------------------------------------------------
void GalleryTheme::UnlockBroadcaster( sal_uIntPtr nUpdatePos )
{
DBG_ASSERT( mnBroadcasterLockCount, "Broadcaster is not locked" );
if( mnBroadcasterLockCount && !--mnBroadcasterLockCount )
ImplBroadcast( nUpdatePos );
}
// ------------------------------------------------------------------------
bool GalleryTheme::InsertObject( const SgaObject& rObj, sal_uIntPtr nInsertPos )
{
sal_Bool bRet = sal_False;
if( rObj.IsValid() )
{
GalleryObject* pFoundEntry = NULL;
size_t iFoundPos = 0;
for ( size_t n = aObjectList.size(); iFoundPos < n; ++iFoundPos )
{
if ( aObjectList[ iFoundPos ]->aURL == rObj.GetURL() )
{
pFoundEntry = aObjectList[ iFoundPos ];
break;
}
}
if( pFoundEntry )
{
GalleryObject aNewEntry;
// update title of new object if necessary
if( !rObj.GetTitle().Len() )
{
SgaObject* pOldObj = ImplReadSgaObject( pFoundEntry );
if( pOldObj )
{
( (SgaObject&) rObj ).SetTitle( pOldObj->GetTitle() );
delete pOldObj;
}
}
else if( rObj.GetTitle() == String( RTL_CONSTASCII_USTRINGPARAM( "__<empty>__" ) ) )
( (SgaObject&) rObj ).SetTitle( String() );
ImplWriteSgaObject( rObj, nInsertPos, &aNewEntry );
pFoundEntry->nOffset = aNewEntry.nOffset;
}
else
ImplWriteSgaObject( rObj, nInsertPos, NULL );
ImplSetModified( bRet = sal_True );
ImplBroadcast( pFoundEntry ? iFoundPos : nInsertPos );
}
return bRet;
}
// ------------------------------------------------------------------------
SgaObject* GalleryTheme::AcquireObject( size_t nPos )
{
return ImplReadSgaObject( aObjectList[ nPos ] );
}
// ------------------------------------------------------------------------
void GalleryTheme::ReleaseObject( SgaObject* pObject )
{
delete pObject;
}
// ------------------------------------------------------------------------
bool GalleryTheme::RemoveObject( size_t nPos )
{
GalleryObject* pEntry = NULL;
if ( nPos < aObjectList.size() )
{
GalleryObjectList::iterator it = aObjectList.begin();
::std::advance( it, nPos );
pEntry = *it;
aObjectList.erase( it );
}
if( aObjectList.empty() )
KillFile( GetSdgURL() );
if( pEntry )
{
if( SGA_OBJ_SVDRAW == pEntry->eObjKind )
aSvDrawStorageRef->Remove( pEntry->aURL.GetMainURL( INetURLObject::NO_DECODE ) );
Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
delete pEntry;
Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
ImplSetModified( sal_True );
ImplBroadcast( nPos );
}
return( pEntry != NULL );
}
// ------------------------------------------------------------------------
bool GalleryTheme::ChangeObjectPos( size_t nOldPos, size_t nNewPos )
{
sal_Bool bRet = sal_False;
if( nOldPos != nNewPos
&& nOldPos < aObjectList.size()
)
{
GalleryObject* pEntry = aObjectList[ nOldPos ];
GalleryObjectList::iterator it = aObjectList.begin();
::std::advance( it, nNewPos );
aObjectList.insert( it, pEntry );
if( nNewPos < nOldPos ) nOldPos++;
it = aObjectList.begin();
::std::advance( it, nOldPos );
aObjectList.erase( it );
ImplSetModified( bRet = sal_True );
ImplBroadcast( ( nNewPos < nOldPos ) ? nNewPos : ( nNewPos - 1 ) );
}
return bRet;
}
// ------------------------------------------------------------------------
void GalleryTheme::Actualize( const Link& rActualizeLink, GalleryProgress* pProgress )
{
if( !IsReadOnly() )
{
Graphic aGraphic;
String aFormat;
GalleryObject* pEntry;
const size_t nCount = aObjectList.size();
LockBroadcaster();
bAbortActualize = sal_False;
// LoeschFlag zuruecksetzen
for (size_t i = 0; i < nCount; i++)
aObjectList[ i ]->bDummy = sal_False;
for(size_t i = 0; ( i < nCount ) && !bAbortActualize; i++)
{
if( pProgress )
pProgress->Update( i, nCount - 1 );
pEntry = aObjectList[ i ];
const INetURLObject aURL( pEntry->aURL );
rActualizeLink.Call( (void*) &aURL );
// SvDraw-Objekte werden spaeter aktualisiert
if( pEntry->eObjKind != SGA_OBJ_SVDRAW )
{
// Hier muss noch etwas eingebaut werden,
// das Files auf den ensprechenden Eintrag matched
// Grafiken als Grafik-Objekte in die Gallery aufnehmen
if( pEntry->eObjKind == SGA_OBJ_SOUND )
{
SgaObjectSound aObjSound( aURL );
if( !InsertObject( aObjSound ) )
pEntry->bDummy = sal_True;
}
else
{
aGraphic.Clear();
if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) )
{
SgaObject* pNewObj;
if ( SGA_OBJ_INET == pEntry->eObjKind )
pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, aURL, aFormat );
else if ( aGraphic.IsAnimated() )
pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, aURL, aFormat );
else
pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, aURL, aFormat );
if( !InsertObject( *pNewObj ) )
pEntry->bDummy = sal_True;
delete pNewObj;
}
else
pEntry->bDummy = sal_True; // Loesch-Flag setzen
}
}
else
{
if ( aSvDrawStorageRef.Is() )
{
const String aStmName( GetSvDrawStreamNameFromURL( pEntry->aURL ) );
SvStorageStreamRef pIStm = aSvDrawStorageRef->OpenSotStream( aStmName, STREAM_READ );
if( pIStm && !pIStm->GetError() )
{
pIStm->SetBufferSize( 16384 );
SgaObjectSvDraw aNewObj( *pIStm, pEntry->aURL );
if( !InsertObject( aNewObj ) )
pEntry->bDummy = sal_True;
pIStm->SetBufferSize( 0L );
}
}
}
}
// remove all entries with set flag
for ( size_t i = 0; i < aObjectList.size(); )
{
pEntry = aObjectList[ i ];
if( pEntry->bDummy )
{
Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uLong >( pEntry ) ) );
GalleryObjectList::iterator it = aObjectList.begin();
::std::advance( it, i );
aObjectList.erase( it );
delete pEntry;
}
else ++i;
}
// update theme
::utl::TempFile aTmp;
INetURLObject aInURL( GetSdgURL() );
INetURLObject aTmpURL( aTmp.GetURL() );
DBG_ASSERT( aInURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
DBG_ASSERT( aTmpURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
SvStream* pTmpStm = ::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
if( pIStm && pTmpStm )
{
for ( size_t i = 0, n = aObjectList.size(); i < n; ++i )
{
pEntry = aObjectList[ i ];
SgaObject* pObj;
switch( pEntry->eObjKind )
{
case( SGA_OBJ_BMP ): pObj = new SgaObjectBmp(); break;
case( SGA_OBJ_ANIM ): pObj = new SgaObjectAnim(); break;
case( SGA_OBJ_INET ): pObj = new SgaObjectINet(); break;
case( SGA_OBJ_SVDRAW ): pObj = new SgaObjectSvDraw(); break;
case (SGA_OBJ_SOUND): pObj = new SgaObjectSound(); break;
default:
pObj = NULL;
break;
}
if( pObj )
{
pIStm->Seek( pEntry->nOffset );
*pIStm >> *pObj;
pEntry->nOffset = pTmpStm->Tell();
*pTmpStm << *pObj;
delete pObj;
}
}
}
else
{
OSL_FAIL( "File(s) could not be opened" );
}
delete pIStm;
delete pTmpStm;
CopyFile( aTmpURL, aInURL );
KillFile( aTmpURL );
sal_uIntPtr nStorErr = 0;
{
SvStorageRef aTempStorageRef( new SvStorage( sal_False, aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ) );
aSvDrawStorageRef->CopyTo( aTempStorageRef );
nStorErr = aSvDrawStorageRef->GetError();
}
if( !nStorErr )
{
aSvDrawStorageRef.Clear();
CopyFile( aTmpURL, GetSdvURL() );
ImplCreateSvDrawStorage();
}
KillFile( aTmpURL );
ImplSetModified( sal_True );
ImplWrite();
UnlockBroadcaster();
}
}
// ------------------------------------------------------------------------
GalleryThemeEntry* GalleryTheme::CreateThemeEntry( const INetURLObject& rURL, sal_Bool bReadOnly )
{
DBG_ASSERT( rURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
GalleryThemeEntry* pRet = NULL;
if( FileExists( rURL ) )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( rURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
String aThemeName;
sal_uInt16 nVersion;
sal_Bool bThemeNameFromResource = sal_False;
*pIStm >> nVersion;
if( nVersion <= 0x00ff )
{
sal_uInt32 nThemeId = 0;
rtl::OString aTmpStr = read_lenPrefixed_uInt8s_ToOString<sal_uInt16>(*pIStm);
aThemeName = rtl::OStringToOUString(aTmpStr, RTL_TEXTENCODING_UTF8);
// Charakterkonvertierung durchfuehren
if( nVersion >= 0x0004 )
{
sal_uInt32 nCount;
sal_uInt16 nTemp16;
*pIStm >> nCount >> nTemp16;
pIStm->Seek( STREAM_SEEK_TO_END );
// pruefen, ob es sich um eine neuere Version handelt;
// daher um 520Bytes (8Bytes Kennung + 512Bytes Reserverpuffer ) zurueckspringen,
// falls dies ueberhaupt moeglich ist
if( pIStm->Tell() >= 520 )
{
sal_uInt32 nId1, nId2;
pIStm->SeekRel( -520 );
*pIStm >> nId1 >> nId2;
if( nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
{
VersionCompat* pCompat = new VersionCompat( *pIStm, STREAM_READ );
*pIStm >> nThemeId;
if( pCompat->GetVersion() >= 2 )
{
*pIStm >> bThemeNameFromResource;
}
delete pCompat;
}
}
}
INetURLObject aPathURL( rURL );
aPathURL.removeSegment();
aPathURL.removeFinalSlash();
pRet = new GalleryThemeEntry( aPathURL, aThemeName,
String(rURL.GetBase()).Copy( 2, 6 ).ToInt32(),
bReadOnly, sal_False, nThemeId,
bThemeNameFromResource );
}
delete pIStm;
}
}
return pRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::GetThumb( sal_uIntPtr nPos, Bitmap& rBmp, sal_Bool )
{
SgaObject* pObj = AcquireObject( nPos );
sal_Bool bRet = sal_False;
if( pObj )
{
rBmp = pObj->GetThumbBmp();
ReleaseObject( pObj );
bRet = sal_True;
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::GetGraphic( sal_uIntPtr nPos, Graphic& rGraphic, sal_Bool bProgress )
{
const GalleryObject* pObject = ImplGetGalleryObject( nPos );
sal_Bool bRet = sal_False;
if( pObject )
{
const INetURLObject aURL( ImplGetURL( pObject ) );
switch( pObject->eObjKind )
{
case( SGA_OBJ_BMP ):
case( SGA_OBJ_ANIM ):
case( SGA_OBJ_INET ):
{
String aFilterDummy;
bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy, bProgress ) != SGA_IMPORT_NONE );
}
break;
case( SGA_OBJ_SVDRAW ):
{
SvxGalleryDrawModel aModel;
if( aModel.GetModel() )
{
if( GetModel( nPos, *aModel.GetModel(), bProgress ) )
{
ImageMap aIMap;
if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) )
bRet = sal_True;
else
{
VirtualDevice aVDev;
aVDev.SetMapMode( MapMode( MAP_100TH_MM ) );
FmFormView aView( aModel.GetModel(), &aVDev );
aView.hideMarkHandles();
aView.ShowSdrPage(aView.GetModel()->GetPage(0));
aView.MarkAll();
rGraphic = aView.GetAllMarkedGraphic();
bRet = sal_True;
}
}
}
}
break;
case( SGA_OBJ_SOUND ):
{
SgaObject* pObj = AcquireObject( nPos );
if( pObj )
{
Bitmap aBmp( pObj->GetThumbBmp() );
aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
rGraphic = aBmp;
ReleaseObject( pObj );
bRet = sal_True;
}
}
break;
default:
break;
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertGraphic( const Graphic& rGraphic, sal_uIntPtr nInsertPos )
{
sal_Bool bRet = sal_False;
if( rGraphic.GetType() != GRAPHIC_NONE )
{
sal_uIntPtr nExportFormat = CVT_UNKNOWN;
const GfxLink aGfxLink( ( (Graphic&) rGraphic ).GetLink() );
if( aGfxLink.GetDataSize() )
{
switch( aGfxLink.GetType() )
{
case( GFX_LINK_TYPE_EPS_BUFFER ): nExportFormat = CVT_SVM; break;
case( GFX_LINK_TYPE_NATIVE_GIF ): nExportFormat = CVT_GIF; break;
case( GFX_LINK_TYPE_NATIVE_JPG ): nExportFormat = CVT_JPG; break;
case( GFX_LINK_TYPE_NATIVE_PNG ): nExportFormat = CVT_PNG; break;
case( GFX_LINK_TYPE_NATIVE_TIF ): nExportFormat = CVT_TIF; break;
case( GFX_LINK_TYPE_NATIVE_WMF ): nExportFormat = CVT_WMF; break;
case( GFX_LINK_TYPE_NATIVE_MET ): nExportFormat = CVT_MET; break;
case( GFX_LINK_TYPE_NATIVE_PCT ): nExportFormat = CVT_PCT; break;
case( GFX_LINK_TYPE_NATIVE_SVG ): nExportFormat = CVT_SVG; break;
default:
break;
}
}
else
{
if( rGraphic.GetType() == GRAPHIC_BITMAP )
{
if( rGraphic.IsAnimated() )
nExportFormat = CVT_GIF;
else
nExportFormat = CVT_PNG;
}
else
nExportFormat = CVT_SVM;
}
const INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_BMP, nExportFormat ) );
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
if( pOStm )
{
pOStm->SetVersion( SOFFICE_FILEFORMAT_50 );
if( CVT_SVM == nExportFormat )
{
GDIMetaFile aMtf( rGraphic.GetGDIMetaFile() );
aMtf.Write( *pOStm );
bRet = ( pOStm->GetError() == ERRCODE_NONE );
}
else
{
if( aGfxLink.GetDataSize() && aGfxLink.GetData() )
{
pOStm->Write( aGfxLink.GetData(), aGfxLink.GetDataSize() );
bRet = ( pOStm->GetError() == ERRCODE_NONE );
}
else
bRet = ( GraphicConverter::Export( *pOStm, rGraphic, nExportFormat ) == ERRCODE_NONE );
}
delete pOStm;
}
if( bRet )
{
const SgaObjectBmp aObjBmp( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
InsertObject( aObjBmp, nInsertPos );
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::GetModel( sal_uIntPtr nPos, SdrModel& rModel, sal_Bool )
{
const GalleryObject* pObject = ImplGetGalleryObject( nPos );
sal_Bool bRet = sal_False;
if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
{
const INetURLObject aURL( ImplGetURL( pObject ) );
SvStorageRef xStor( GetSvDrawStorage() );
if( xStor.Is() )
{
const String aStmName( GetSvDrawStreamNameFromURL( aURL ) );
SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
if( xIStm.Is() && !xIStm->GetError() )
{
xIStm->SetBufferSize( STREAMBUF_SIZE );
bRet = GallerySvDrawImport( *xIStm, rModel );
xIStm->SetBufferSize( 0L );
}
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertModel( const FmFormModel& rModel, sal_uIntPtr nInsertPos )
{
INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
SvStorageRef xStor( GetSvDrawStorage() );
sal_Bool bRet = sal_False;
if( xStor.Is() )
{
const String aStmName( GetSvDrawStreamNameFromURL( aURL ) );
SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
if( xOStm.Is() && !xOStm->GetError() )
{
SvMemoryStream aMemStm( 65535, 65535 );
FmFormModel* pFormModel = (FmFormModel*) &rModel;
pFormModel->BurnInStyleSheetAttributes();
{
uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( aMemStm ) );
if( xDocOut.is() )
SvxDrawingLayerExport( pFormModel, xDocOut );
}
aMemStm.Seek( 0 );
xOStm->SetBufferSize( 16348 );
GalleryCodec aCodec( *xOStm );
aCodec.Write( aMemStm );
if( !xOStm->GetError() )
{
SgaObjectSvDraw aObjSvDraw( rModel, aURL );
bRet = InsertObject( aObjSvDraw, nInsertPos );
}
xOStm->SetBufferSize( 0L );
xOStm->Commit();
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::GetModelStream( sal_uIntPtr nPos, SotStorageStreamRef& rxModelStream, sal_Bool )
{
const GalleryObject* pObject = ImplGetGalleryObject( nPos );
sal_Bool bRet = sal_False;
if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
{
const INetURLObject aURL( ImplGetURL( pObject ) );
SvStorageRef xStor( GetSvDrawStorage() );
if( xStor.Is() )
{
const String aStmName( GetSvDrawStreamNameFromURL( aURL ) );
SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
if( xIStm.Is() && !xIStm->GetError() )
{
sal_uInt32 nVersion = 0;
xIStm->SetBufferSize( 16348 );
if( GalleryCodec::IsCoded( *xIStm, nVersion ) )
{
SvxGalleryDrawModel aModel;
if( aModel.GetModel() )
{
if( GallerySvDrawImport( *xIStm, *aModel.GetModel() ) )
{
aModel.GetModel()->BurnInStyleSheetAttributes();
{
uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxModelStream ) );
if( SvxDrawingLayerExport( aModel.GetModel(), xDocOut ) )
rxModelStream->Commit();
}
}
bRet = ( rxModelStream->GetError() == ERRCODE_NONE );
}
}
xIStm->SetBufferSize( 0 );
}
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertModelStream( const SotStorageStreamRef& rxModelStream, sal_uIntPtr nInsertPos )
{
INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
SvStorageRef xStor( GetSvDrawStorage() );
sal_Bool bRet = sal_False;
if( xStor.Is() )
{
const String aStmName( GetSvDrawStreamNameFromURL( aURL ) );
SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
if( xOStm.Is() && !xOStm->GetError() )
{
GalleryCodec aCodec( *xOStm );
SvMemoryStream aMemStm( 65535, 65535 );
xOStm->SetBufferSize( 16348 );
aCodec.Write( *rxModelStream );
if( !xOStm->GetError() )
{
xOStm->Seek( 0 );
SgaObjectSvDraw aObjSvDraw( *xOStm, aURL );
bRet = InsertObject( aObjSvDraw, nInsertPos );
}
xOStm->SetBufferSize( 0L );
xOStm->Commit();
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::GetURL( sal_uIntPtr nPos, INetURLObject& rURL, sal_Bool )
{
const GalleryObject* pObject = ImplGetGalleryObject( nPos );
sal_Bool bRet = sal_False;
if( pObject )
{
rURL = INetURLObject( ImplGetURL( pObject ) );
bRet = sal_True;
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertURL( const INetURLObject& rURL, sal_uIntPtr nInsertPos )
{
Graphic aGraphic;
String aFormat;
SgaObject* pNewObj = NULL;
const sal_uInt16 nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat );
sal_Bool bRet = sal_False;
if( nImportRet != SGA_IMPORT_NONE )
{
if ( SGA_IMPORT_INET == nImportRet )
pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, rURL, aFormat );
else if ( aGraphic.IsAnimated() )
pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, rURL, aFormat );
else
pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, rURL, aFormat );
}
else if( ::avmedia::MediaWindow::isMediaURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) )
pNewObj = (SgaObject*) new SgaObjectSound( rURL );
if( pNewObj && InsertObject( *pNewObj, nInsertPos ) )
bRet = sal_True;
delete pNewObj;
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertFileOrDirURL( const INetURLObject& rFileOrDirURL, sal_uIntPtr nInsertPos )
{
INetURLObject aURL;
::std::vector< INetURLObject > aURLVector;
sal_Bool bRet = sal_False;
try
{
::ucbhelper::Content aCnt( rFileOrDirURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
sal_Bool bFolder = false;
aCnt.getPropertyValue( OUString("IsFolder") ) >>= bFolder;
if( bFolder )
{
uno::Sequence< OUString > aProps( 1 );
aProps.getArray()[ 0 ] = OUString("Url");
uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
if( xContentAccess.is() )
{
while( xResultSet->next() )
{
aURL.SetSmartURL( xContentAccess->queryContentIdentifierString() );
aURLVector.push_back( aURL );
}
}
}
else
aURLVector.push_back( rFileOrDirURL );
}
catch( const ucb::ContentCreationException& )
{
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
::std::vector< INetURLObject >::const_iterator aIter( aURLVector.begin() ), aEnd( aURLVector.end() );
while( aIter != aEnd )
bRet = bRet || InsertURL( *aIter++, nInsertPos );
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryTheme::InsertTransferable( const uno::Reference< datatransfer::XTransferable >& rxTransferable, sal_uIntPtr nInsertPos )
{
sal_Bool bRet = sal_False;
if( rxTransferable.is() )
{
TransferableDataHelper aDataHelper( rxTransferable );
Graphic* pGraphic = NULL;
if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) )
{
SotStorageStreamRef xModelStm;
if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xModelStm ) )
bRet = InsertModelStream( xModelStm, nInsertPos );
}
else if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ||
aDataHelper.HasFormat( FORMAT_FILE ) )
{
FileList aFileList;
if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) )
aDataHelper.GetFileList( SOT_FORMAT_FILE_LIST, aFileList );
else
{
String aFile;
aDataHelper.GetString( FORMAT_FILE, aFile );
if( aFile.Len() )
aFileList.AppendFile( aFile );
}
for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i )
{
const String aFile( aFileList.GetFile( i ) );
INetURLObject aURL( aFile );
if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
{
rtl::OUString aLocalURL;
if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFile, aLocalURL ) )
aURL = INetURLObject( aLocalURL );
}
if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
bRet = InsertFileOrDirURL( aURL, nInsertPos );
}
}
else
{
Graphic aGraphic;
sal_uIntPtr nFormat = 0;
if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) )
nFormat = SOT_FORMATSTR_ID_SVXB;
else if( aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) )
nFormat = FORMAT_GDIMETAFILE;
else if( aDataHelper.HasFormat( FORMAT_BITMAP ) )
nFormat = FORMAT_BITMAP;
if( nFormat && aDataHelper.GetGraphic( nFormat, aGraphic ) )
pGraphic = new Graphic( aGraphic );
}
if( pGraphic )
{
bRet = sal_False;
if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVIM ) )
{
ImageMap aImageMap;
// according to KA we don't need a BaseURL here
if( aDataHelper.GetImageMap( SOT_FORMATSTR_ID_SVIM, aImageMap ) )
{
SvxGalleryDrawModel aModel;
if( aModel.GetModel() )
{
SgaUserDataFactory aFactory;
SdrPage* pPage = aModel.GetModel()->GetPage(0);
SdrGrafObj* pGrafObj = new SdrGrafObj( *pGraphic );
pGrafObj->AppendUserData( new SgaIMapInfo( aImageMap ) );
pPage->InsertObject( pGrafObj );
bRet = InsertModel( *aModel.GetModel(), nInsertPos );
}
}
}
if( !bRet )
bRet = InsertGraphic( *pGraphic, nInsertPos );
delete pGraphic;
}
}
return bRet;
}
// -----------------------------------------------------------------------------
void GalleryTheme::CopyToClipboard( Window* pWindow, sal_uIntPtr nPos )
{
GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false );
pTransferable->CopyToClipboard( pWindow );
}
// -----------------------------------------------------------------------------
void GalleryTheme::StartDrag( Window* pWindow, sal_uIntPtr nPos )
{
GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, true );
pTransferable->StartDrag( pWindow, DND_ACTION_COPY | DND_ACTION_LINK );
}
// -----------------------------------------------------------------------------
SvStream& GalleryTheme::WriteData( SvStream& rOStm ) const
{
const INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
const INetURLObject aRelURL2( GetParent()->GetUserURL() );
INetURLObject aNewURL, aTempURL;
sal_uInt32 nCount = GetObjectCount();
sal_Bool bRel;
rOStm << (sal_uInt16) 0x0004;
write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStm, GetRealName(), RTL_TEXTENCODING_UTF8);
rOStm << nCount << (sal_uInt16) osl_getThreadTextEncoding();
for( sal_uInt32 i = 0; i < nCount; i++ )
{
const GalleryObject* pObj = ImplGetGalleryObject( i );
String aPath;
if( SGA_OBJ_SVDRAW == pObj->eObjKind )
{
aPath = GetSvDrawStreamNameFromURL( pObj->aURL );
bRel = sal_False;
}
else
{
aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ) ));
if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
{
aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) );
}
else
{
aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ) ));
if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
{
aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) );
}
else
aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
}
}
aPath.SearchAndReplace(m_aDestDir, String());
rOStm << bRel;
write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStm, aPath, RTL_TEXTENCODING_UTF8);
rOStm << pObj->nOffset << (sal_uInt16) pObj->eObjKind;
}
// neuerdings wird ein 512-Byte-Reservepuffer gechrieben;
// um diesen zu erkennen werden zwei sal_uIntPtr-Ids geschrieben
rOStm << COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) << COMPAT_FORMAT( 'E', 'S', 'R', 'V' );
const long nReservePos = rOStm.Tell();
VersionCompat* pCompat = new VersionCompat( rOStm, STREAM_WRITE, 2 );
rOStm << (sal_uInt32) GetId() << IsThemeNameFromResource(); // ab Version 2
delete pCompat;
// Rest des Puffers auffuellen
const long nRest = Max( 512L - ( (long) rOStm.Tell() - nReservePos ), 0L );
if( nRest )
{
char* pReserve = new char[ nRest ];
memset( pReserve, 0, nRest );
rOStm.Write( pReserve, nRest );
delete[] pReserve;
}
return rOStm;
}
// ------------------------------------------------------------------------
SvStream& GalleryTheme::ReadData( SvStream& rIStm )
{
sal_uInt32 nCount;
sal_uInt16 nVersion;
String aThemeName;
rtl_TextEncoding nTextEncoding;
rIStm >> nVersion;
rtl::OString aTmpStr = read_lenPrefixed_uInt8s_ToOString<sal_uInt16>(rIStm);
rIStm >> nCount;
if( nVersion >= 0x0004 )
{
sal_uInt16 nTmp16;
rIStm >> nTmp16;
nTextEncoding = (rtl_TextEncoding) nTmp16;
}
else
nTextEncoding = RTL_TEXTENCODING_UTF8;
aThemeName = rtl::OStringToOUString(aTmpStr, nTextEncoding);
if( nCount <= ( 1L << 14 ) )
{
GalleryObject* pObj;
INetURLObject aRelURL1( GetParent()->GetRelativeURL() );
INetURLObject aRelURL2( GetParent()->GetUserURL() );
sal_uInt32 nId1, nId2;
sal_Bool bRel;
for( size_t i = 0, n = aObjectList.size(); i < n; ++i )
{
pObj = aObjectList[ i ];
Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
delete pObj;
Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
}
aObjectList.clear();
for( sal_uInt32 i = 0; i < nCount; i++ )
{
pObj = new GalleryObject;
String aFileName;
String aPath;
sal_uInt16 nTemp;
rIStm >> bRel;
rtl::OString aTempFileName = read_lenPrefixed_uInt8s_ToOString<sal_uInt16>(rIStm);
rIStm >> pObj->nOffset;
rIStm >> nTemp; pObj->eObjKind = (SgaObjKind) nTemp;
aFileName = rtl::OStringToOUString(aTempFileName, osl_getThreadTextEncoding());
if( bRel )
{
aFileName.SearchAndReplaceAll( '\\', '/' );
aPath = aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
if( aFileName.GetChar( 0 ) != '/' )
aPath += '/';
aPath += aFileName;
pObj->aURL = INetURLObject( aPath );
if( !FileExists( pObj->aURL ) )
{
aPath = aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
if( aFileName.GetChar( 0 ) != '/' )
aPath += '/';
aPath += aFileName;
// assign this URL, even in the case it is not valid (#94482)
pObj->aURL = INetURLObject( aPath );
}
}
else
{
if( SGA_OBJ_SVDRAW == pObj->eObjKind )
{
const static String aBaseURLStr( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/" ) );
String aDummyURL( aBaseURLStr );
pObj->aURL = INetURLObject( aDummyURL += aFileName, INET_PROT_PRIV_SOFFICE );
}
else
{
rtl::OUString aLocalURL;
pObj->aURL = INetURLObject( aFileName );
if( ( pObj->aURL.GetProtocol() == INET_PROT_NOT_VALID ) &&
::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aLocalURL ) )
{
pObj->aURL = INetURLObject( aLocalURL );
}
}
}
aObjectList.push_back( pObj );
}
rIStm >> nId1 >> nId2;
// in neueren Versionen befindet sich am Ende ein 512-Byte-Reservepuffer;
// die Daten befinden sich am Anfang dieses Puffers und
// sind durch eine VersionCompat geklammert
if( !rIStm.IsEof() &&
nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
{
VersionCompat* pCompat = new VersionCompat( rIStm, STREAM_READ );
sal_uInt32 nTemp32;
sal_Bool bThemeNameFromResource = sal_False;
rIStm >> nTemp32;
if( pCompat->GetVersion() >= 2 )
{
rIStm >> bThemeNameFromResource;
}
SetId( nTemp32, bThemeNameFromResource );
delete pCompat;
}
}
else
rIStm.SetError( SVSTREAM_READ_ERROR );
ImplSetModified( sal_False );
return rIStm;
}
// ------------------------------------------------------------------------
SvStream& operator<<( SvStream& rOut, const GalleryTheme& rTheme )
{
return rTheme.WriteData( rOut );
}
// ------------------------------------------------------------------------
SvStream& operator>>( SvStream& rIn, GalleryTheme& rTheme )
{
return rTheme.ReadData( rIn );
}
void GalleryTheme::ImplSetModified( sal_Bool bModified )
{ pThm->SetModified( bModified ); }
const rtl::OUString& GalleryTheme::GetRealName() const { return pThm->GetThemeName(); }
const INetURLObject& GalleryTheme::GetThmURL() const { return pThm->GetThmURL(); }
const INetURLObject& GalleryTheme::GetSdgURL() const { return pThm->GetSdgURL(); }
const INetURLObject& GalleryTheme::GetSdvURL() const { return pThm->GetSdvURL(); }
sal_uInt32 GalleryTheme::GetId() const { return pThm->GetId(); }
void GalleryTheme::SetId( sal_uInt32 nNewId, sal_Bool bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); }
sal_Bool GalleryTheme::IsThemeNameFromResource() const { return pThm->IsNameFromResource(); }
sal_Bool GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); }
sal_Bool GalleryTheme::IsDefault() const { return pThm->IsDefault(); }
sal_Bool GalleryTheme::IsModified() const { return pThm->IsModified(); }
const rtl::OUString& GalleryTheme::GetName() const { return pThm->GetThemeName(); }
void GalleryTheme::InsertAllThemes( ListBox& rListBox )
{
for( sal_uInt16 i = RID_GALLERYSTR_THEME_FIRST; i <= RID_GALLERYSTR_THEME_LAST; i++ )
rListBox.InsertEntry(GAL_RESSTR(i));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */