blob: 81f42836ff5588a8f4def5d833235f9c7b40895d [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_dtrans.hxx"
//------------------------------------------------------------------------
// includes
//------------------------------------------------------------------------
#include <rtl/ustring.h>
#include <osl/diagnose.h>
#include "DTransHelper.hxx"
//------------------------------------------------------------------------
// implementation
//------------------------------------------------------------------------
CStgTransferHelper::CStgTransferHelper( sal_Bool bAutoInit,
HGLOBAL hGlob,
sal_Bool bDelStgOnRelease ) :
m_lpStream( NULL ),
m_bDelStgOnRelease( bDelStgOnRelease )
{
if ( bAutoInit )
init( hGlob, m_bDelStgOnRelease );
}
//------------------------------------------------------------------------
// dtor
//------------------------------------------------------------------------
CStgTransferHelper::~CStgTransferHelper( )
{
if ( m_lpStream )
m_lpStream->Release( );
}
//------------------------------------------------------------------------
// TransferData into the
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::write( const void* lpData, ULONG cb, ULONG* cbWritten )
{
HRESULT hr = E_FAIL;
if ( m_lpStream )
hr = m_lpStream->Write( lpData, cb, cbWritten );
if ( FAILED( hr ) )
throw CStgTransferException( hr );
#if OSL_DEBUG_LEVEL > 0
HGLOBAL hGlob;
hr = GetHGlobalFromStream( m_lpStream, &hGlob );
OSL_ASSERT( SUCCEEDED( hr ) );
/*DWORD dwSize =*/ GlobalSize( hGlob );
/*LPVOID lpdbgData =*/ GlobalLock( hGlob );
GlobalUnlock( hGlob );
#endif
}
//------------------------------------------------------------------------
// read
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::read( LPVOID pv, ULONG cb, ULONG* pcbRead )
{
HRESULT hr = E_FAIL;
if ( m_lpStream )
hr = m_lpStream->Read( pv, cb , pcbRead );
if ( FAILED( hr ) )
throw CStgTransferException( hr );
}
//------------------------------------------------------------------------
// GetHGlobal
//------------------------------------------------------------------------
HGLOBAL SAL_CALL CStgTransferHelper::getHGlobal( ) const
{
OSL_ASSERT( m_lpStream );
HGLOBAL hGlob = NULL;
if ( m_lpStream )
{
HRESULT hr = GetHGlobalFromStream( m_lpStream, &hGlob );
if ( FAILED( hr ) )
hGlob = NULL;
}
return hGlob;
}
//------------------------------------------------------------------------
// getIStream
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::getIStream( LPSTREAM* ppStream )
{
OSL_ASSERT( ppStream );
*ppStream = m_lpStream;
if ( *ppStream )
static_cast< LPUNKNOWN >( *ppStream )->AddRef( );
}
//------------------------------------------------------------------------
// Init
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::init( SIZE_T newSize,
sal_uInt32 uiFlags,
sal_Bool bDelStgOnRelease )
{
cleanup( );
m_bDelStgOnRelease = bDelStgOnRelease;
HGLOBAL hGlob = GlobalAlloc( uiFlags, newSize );
if ( NULL == hGlob )
throw CStgTransferException( STG_E_MEDIUMFULL );
HRESULT hr = CreateStreamOnHGlobal( hGlob, m_bDelStgOnRelease, &m_lpStream );
if ( FAILED( hr ) )
{
GlobalFree( hGlob );
m_lpStream = NULL;
throw CStgTransferException( hr );
}
#if OSL_DEBUG_LEVEL > 0
STATSTG statstg;
hr = m_lpStream->Stat( &statstg, STATFLAG_DEFAULT );
OSL_ASSERT( SUCCEEDED( hr ) );
#endif
}
//------------------------------------------------------------------------
// Init
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::init( HGLOBAL hGlob,
sal_Bool bDelStgOnRelease )
{
cleanup( );
m_bDelStgOnRelease = bDelStgOnRelease;
HRESULT hr = CreateStreamOnHGlobal( hGlob, m_bDelStgOnRelease, &m_lpStream );
if ( FAILED( hr ) )
throw CStgTransferException( hr );
}
//------------------------------------------------------------------------
// free the global memory and invalidate the stream pointer
//------------------------------------------------------------------------
void SAL_CALL CStgTransferHelper::cleanup( )
{
if ( m_lpStream && !m_bDelStgOnRelease )
{
HGLOBAL hGlob;
GetHGlobalFromStream( m_lpStream, &hGlob );
GlobalFree( hGlob );
}
if ( m_lpStream )
{
m_lpStream->Release( );
m_lpStream = NULL;
}
}
//------------------------------------------------------------------------
// return the size of memory we point to
//------------------------------------------------------------------------
sal_uInt32 SAL_CALL CStgTransferHelper::memSize( CLIPFORMAT cf ) const
{
DWORD dwSize = 0;
if ( NULL != m_lpStream )
{
HGLOBAL hGlob;
GetHGlobalFromStream( m_lpStream, &hGlob );
if ( CF_TEXT == cf || RegisterClipboardFormat( "HTML Format" ) == cf )
{
sal_Char* pText = static_cast< sal_Char* >( GlobalLock( hGlob ) );
if ( pText )
{
dwSize = strlen(pText) + 1; // strlen + trailing '\0'
GlobalUnlock( hGlob );
}
}
else if ( CF_UNICODETEXT == cf )
{
sal_Unicode* pText = static_cast< sal_Unicode* >( GlobalLock( hGlob ) );
if ( pText )
{
dwSize = rtl_ustr_getLength( pText ) * sizeof( sal_Unicode );
GlobalUnlock( hGlob );
}
}
else
dwSize = GlobalSize( hGlob );
}
return dwSize;
}