blob: 705e57378b8ecf5f59c0a3c2f36d249fde8d4fb0 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"
#include <pptexsoundcollection.hxx>
#include "epptdef.hxx"
#include <tools/urlobj.hxx>
#ifndef _UCBHELPER_CONTENT_HXX_
#include <ucbhelper/content.hxx>
#endif
#ifndef _UCBHELPER_CONTENTBROKER_HXX_
#include <ucbhelper/contentbroker.hxx>
#endif
#ifndef _CPPUHELPER_PROPTYPEHLP_HXX_
#include <cppuhelper/proptypehlp.hxx>
#endif
#include <unotools/ucbstreamhelper.hxx>
namespace ppt
{
ExSoundEntry::ExSoundEntry( const String& rString )
: nFileSize( 0 )
, aSoundURL( rString )
{
try
{
::ucbhelper::Content aCnt( aSoundURL,
::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() );
sal_Int64 nVal = 0;
::cppu::convertPropertyValue( nVal, aCnt.getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Size" ) ) ) );
nFileSize = (sal_uInt32)nVal;
}
catch( ::com::sun::star::uno::Exception& )
{
}
};
String ExSoundEntry::ImplGetName() const
{
INetURLObject aTmp( aSoundURL );
return aTmp.GetName();
}
String ExSoundEntry::ImplGetExtension() const
{
INetURLObject aTmp( aSoundURL );
String aExtension( aTmp.GetExtension() );
if ( aExtension.Len() )
aExtension.Insert( (sal_Unicode)'.', 0 );
return aExtension;
}
sal_Bool ExSoundEntry::IsSameURL( const String& rURL ) const
{
return ( rURL == aSoundURL );
}
sal_uInt32 ExSoundEntry::GetSize( sal_uInt32 nId ) const
{
String aName( ImplGetName() );
String aExtension( ImplGetExtension() );
sal_uInt32 nSize = 8; // SoundContainer Header
if ( aName.Len() ) // String Atom ( instance 0 - name of sound )
nSize += aName.Len() * 2 + 8;
if ( aExtension.Len() ) // String Atom ( instance 1 - extension of sound )
nSize += aExtension.Len() * 2 + 8;
String aId( String::CreateFromInt32( nId ) ); // String Atom ( instance 2 - reference id )
nSize += 2 * aId.Len() + 8;
nSize += nFileSize + 8; // SoundData Atom
return nSize;
}
void ExSoundEntry::Write( SvStream& rSt, sal_uInt32 nId )
{
try
{
::ucbhelper::Content aCnt( aSoundURL,
::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() );
// create SoundContainer
rSt << (sal_uInt32)( ( EPP_Sound << 16 ) | 0xf ) << (sal_uInt32)( GetSize( nId ) - 8 );
String aSoundName( ImplGetName() );
sal_uInt16 i, nSoundNameLen = aSoundName.Len();
if ( nSoundNameLen )
{
// name of sound ( instance 0 )
rSt << (sal_uInt32)( EPP_CString << 16 ) << (sal_uInt32)( nSoundNameLen * 2 );
for ( i = 0; i < nSoundNameLen; i++ )
rSt << aSoundName.GetChar( i );
}
String aExtension( ImplGetExtension() );
sal_uInt32 nExtensionLen = aExtension.Len();
if ( nExtensionLen )
{
// extension of sound ( instance 1 )
rSt << (sal_uInt32)( ( EPP_CString << 16 ) | 16 ) << (sal_uInt32)( nExtensionLen * 2 );
for ( i = 0; i < nExtensionLen; i++ )
rSt << aExtension.GetChar( i );
}
// id of sound ( instance 2 )
String aId( String::CreateFromInt32( nId ) );
sal_uInt32 nIdLen = aId.Len();
rSt << (sal_uInt32)( ( EPP_CString << 16 ) | 32 ) << (sal_uInt32)( nIdLen * 2 );
for ( i = 0; i < nIdLen; i++ )
rSt << aId.GetChar( i );
rSt << (sal_uInt32)( EPP_SoundData << 16 ) << (sal_uInt32)( nFileSize );
sal_uInt32 nBytesLeft = nFileSize;
SvStream* pSourceFile = ::utl::UcbStreamHelper::CreateStream( aSoundURL, STREAM_READ );
if ( pSourceFile )
{
sal_uInt8* pBuf = new sal_uInt8[ 0x10000 ]; // 64 kB Buffer
while ( nBytesLeft )
{
sal_uInt32 nToDo = ( nBytesLeft > 0x10000 ) ? 0x10000 : nBytesLeft;
pSourceFile->Read( pBuf, nToDo );
rSt.Write( pBuf, nToDo );
nBytesLeft -= nToDo;
}
delete pSourceFile;
delete[] pBuf;
}
}
catch( ::com::sun::star::uno::Exception& )
{
}
}
ExSoundCollection::~ExSoundCollection()
{
for( void* pPtr = List::First(); pPtr; pPtr = List::Next() )
delete (ExSoundEntry*)pPtr;
}
sal_uInt32 ExSoundCollection::GetId( const String& rString )
{
sal_uInt32 nSoundId = 0;
if( rString.Len() )
{
const sal_uInt32 nSoundCount = Count();
for( ; nSoundId < nSoundCount; nSoundId++ )
if( ImplGetByIndex( nSoundId )->IsSameURL( rString ) )
break;
if ( nSoundId++ == nSoundCount )
{
ExSoundEntry* pEntry = new ExSoundEntry( rString );
if ( pEntry->GetFileSize() )
List::Insert( pEntry, LIST_APPEND );
else
{
nSoundId = 0; // only insert sounds that are accessible
delete pEntry;
}
}
}
return nSoundId;
}
const ExSoundEntry* ExSoundCollection::ImplGetByIndex( sal_uInt32 nIndex ) const
{
return (ExSoundEntry*)List::GetObject( nIndex );
}
sal_uInt32 ExSoundCollection::GetSize() const
{
sal_uInt32 nSize = 0;
sal_uInt32 i, nSoundCount = Count();
if ( nSoundCount )
{
nSize += 8 + 12; // size of SoundCollectionContainerHeader + SoundCollAtom
for ( i = 0; i < nSoundCount; i++ )
nSize += ImplGetByIndex( i )->GetSize( i + 1 );
}
return nSize;
}
void ExSoundCollection::Write( SvStream& rSt )
{
sal_uInt32 i, nSoundCount = Count();
if ( nSoundCount )
{
// create SoundCollection Container
rSt << (sal_uInt16)0xf << (sal_uInt16)EPP_SoundCollection << (sal_uInt32)( GetSize() - 8 );
// create SoundCollAtom ( reference to the next free SoundId );
rSt << (sal_uInt32)( EPP_SoundCollAtom << 16 ) << (sal_uInt32)4 << nSoundCount;
for ( i = 0; i < nSoundCount; i++ )
((ExSoundEntry*)List::GetObject( i ))->Write( rSt, i + 1 );
}
}
} // namespace ppt;