1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_dtrans.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir //------------------------------------------------------------------------ 32*cdf0e10cSrcweir // includes 33*cdf0e10cSrcweir //------------------------------------------------------------------------ 34*cdf0e10cSrcweir #include <rtl/ustring.h> 35*cdf0e10cSrcweir #include <osl/diagnose.h> 36*cdf0e10cSrcweir #include "DTransHelper.hxx" 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir //------------------------------------------------------------------------ 39*cdf0e10cSrcweir // implementation 40*cdf0e10cSrcweir //------------------------------------------------------------------------ 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir CStgTransferHelper::CStgTransferHelper( sal_Bool bAutoInit, 43*cdf0e10cSrcweir HGLOBAL hGlob, 44*cdf0e10cSrcweir sal_Bool bDelStgOnRelease ) : 45*cdf0e10cSrcweir m_lpStream( NULL ), 46*cdf0e10cSrcweir m_bDelStgOnRelease( bDelStgOnRelease ) 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir if ( bAutoInit ) 49*cdf0e10cSrcweir init( hGlob, m_bDelStgOnRelease ); 50*cdf0e10cSrcweir } 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir //------------------------------------------------------------------------ 53*cdf0e10cSrcweir // dtor 54*cdf0e10cSrcweir //------------------------------------------------------------------------ 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir CStgTransferHelper::~CStgTransferHelper( ) 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir if ( m_lpStream ) 60*cdf0e10cSrcweir m_lpStream->Release( ); 61*cdf0e10cSrcweir } 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir //------------------------------------------------------------------------ 64*cdf0e10cSrcweir // TransferData into the 65*cdf0e10cSrcweir //------------------------------------------------------------------------ 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::write( const void* lpData, ULONG cb, ULONG* cbWritten ) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir HRESULT hr = E_FAIL; 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir if ( m_lpStream ) 72*cdf0e10cSrcweir hr = m_lpStream->Write( lpData, cb, cbWritten ); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir if ( FAILED( hr ) ) 75*cdf0e10cSrcweir throw CStgTransferException( hr ); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 78*cdf0e10cSrcweir HGLOBAL hGlob; 79*cdf0e10cSrcweir hr = GetHGlobalFromStream( m_lpStream, &hGlob ); 80*cdf0e10cSrcweir OSL_ASSERT( SUCCEEDED( hr ) ); 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir /*DWORD dwSize =*/ GlobalSize( hGlob ); 83*cdf0e10cSrcweir /*LPVOID lpdbgData =*/ GlobalLock( hGlob ); 84*cdf0e10cSrcweir GlobalUnlock( hGlob ); 85*cdf0e10cSrcweir #endif 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir //------------------------------------------------------------------------ 89*cdf0e10cSrcweir // read 90*cdf0e10cSrcweir //------------------------------------------------------------------------ 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::read( LPVOID pv, ULONG cb, ULONG* pcbRead ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir HRESULT hr = E_FAIL; 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir if ( m_lpStream ) 97*cdf0e10cSrcweir hr = m_lpStream->Read( pv, cb , pcbRead ); 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir if ( FAILED( hr ) ) 100*cdf0e10cSrcweir throw CStgTransferException( hr ); 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir //------------------------------------------------------------------------ 104*cdf0e10cSrcweir // GetHGlobal 105*cdf0e10cSrcweir //------------------------------------------------------------------------ 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir HGLOBAL SAL_CALL CStgTransferHelper::getHGlobal( ) const 108*cdf0e10cSrcweir { 109*cdf0e10cSrcweir OSL_ASSERT( m_lpStream ); 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir HGLOBAL hGlob = NULL; 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir if ( m_lpStream ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir HRESULT hr = GetHGlobalFromStream( m_lpStream, &hGlob ); 116*cdf0e10cSrcweir if ( FAILED( hr ) ) 117*cdf0e10cSrcweir hGlob = NULL; 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir return hGlob; 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir //------------------------------------------------------------------------ 124*cdf0e10cSrcweir // getIStream 125*cdf0e10cSrcweir //------------------------------------------------------------------------ 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::getIStream( LPSTREAM* ppStream ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir OSL_ASSERT( ppStream ); 130*cdf0e10cSrcweir *ppStream = m_lpStream; 131*cdf0e10cSrcweir if ( *ppStream ) 132*cdf0e10cSrcweir static_cast< LPUNKNOWN >( *ppStream )->AddRef( ); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir //------------------------------------------------------------------------ 136*cdf0e10cSrcweir // Init 137*cdf0e10cSrcweir //------------------------------------------------------------------------ 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::init( SIZE_T newSize, 140*cdf0e10cSrcweir sal_uInt32 uiFlags, 141*cdf0e10cSrcweir sal_Bool bDelStgOnRelease ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir cleanup( ); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir m_bDelStgOnRelease = bDelStgOnRelease; 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir HGLOBAL hGlob = GlobalAlloc( uiFlags, newSize ); 148*cdf0e10cSrcweir if ( NULL == hGlob ) 149*cdf0e10cSrcweir throw CStgTransferException( STG_E_MEDIUMFULL ); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir HRESULT hr = CreateStreamOnHGlobal( hGlob, m_bDelStgOnRelease, &m_lpStream ); 152*cdf0e10cSrcweir if ( FAILED( hr ) ) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir GlobalFree( hGlob ); 155*cdf0e10cSrcweir m_lpStream = NULL; 156*cdf0e10cSrcweir throw CStgTransferException( hr ); 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 160*cdf0e10cSrcweir STATSTG statstg; 161*cdf0e10cSrcweir hr = m_lpStream->Stat( &statstg, STATFLAG_DEFAULT ); 162*cdf0e10cSrcweir OSL_ASSERT( SUCCEEDED( hr ) ); 163*cdf0e10cSrcweir #endif 164*cdf0e10cSrcweir } 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir //------------------------------------------------------------------------ 167*cdf0e10cSrcweir // Init 168*cdf0e10cSrcweir //------------------------------------------------------------------------ 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::init( HGLOBAL hGlob, 171*cdf0e10cSrcweir sal_Bool bDelStgOnRelease ) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir cleanup( ); 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir m_bDelStgOnRelease = bDelStgOnRelease; 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir HRESULT hr = CreateStreamOnHGlobal( hGlob, m_bDelStgOnRelease, &m_lpStream ); 178*cdf0e10cSrcweir if ( FAILED( hr ) ) 179*cdf0e10cSrcweir throw CStgTransferException( hr ); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir //------------------------------------------------------------------------ 183*cdf0e10cSrcweir // free the global memory and invalidate the stream pointer 184*cdf0e10cSrcweir //------------------------------------------------------------------------ 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir void SAL_CALL CStgTransferHelper::cleanup( ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir if ( m_lpStream && !m_bDelStgOnRelease ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir HGLOBAL hGlob; 191*cdf0e10cSrcweir GetHGlobalFromStream( m_lpStream, &hGlob ); 192*cdf0e10cSrcweir GlobalFree( hGlob ); 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir if ( m_lpStream ) 196*cdf0e10cSrcweir { 197*cdf0e10cSrcweir m_lpStream->Release( ); 198*cdf0e10cSrcweir m_lpStream = NULL; 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir //------------------------------------------------------------------------ 203*cdf0e10cSrcweir // return the size of memory we point to 204*cdf0e10cSrcweir //------------------------------------------------------------------------ 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir sal_uInt32 SAL_CALL CStgTransferHelper::memSize( CLIPFORMAT cf ) const 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir DWORD dwSize = 0; 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir if ( NULL != m_lpStream ) 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir HGLOBAL hGlob; 213*cdf0e10cSrcweir GetHGlobalFromStream( m_lpStream, &hGlob ); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir if ( CF_TEXT == cf || RegisterClipboardFormat( "HTML Format" ) == cf ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir sal_Char* pText = static_cast< sal_Char* >( GlobalLock( hGlob ) ); 218*cdf0e10cSrcweir if ( pText ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir dwSize = strlen(pText) + 1; // strlen + trailing '\0' 221*cdf0e10cSrcweir GlobalUnlock( hGlob ); 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir else if ( CF_UNICODETEXT == cf ) 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir sal_Unicode* pText = static_cast< sal_Unicode* >( GlobalLock( hGlob ) ); 227*cdf0e10cSrcweir if ( pText ) 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir dwSize = rtl_ustr_getLength( pText ) * sizeof( sal_Unicode ); 230*cdf0e10cSrcweir GlobalUnlock( hGlob ); 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir else 234*cdf0e10cSrcweir dwSize = GlobalSize( hGlob ); 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir return dwSize; 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir 240