diff options
-rw-r--r-- | dtrans/source/win32/dtobj/DOTransferable.cxx | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/dtrans/source/win32/dtobj/DOTransferable.cxx b/dtrans/source/win32/dtobj/DOTransferable.cxx index afa705abfc56..c331b1d95b90 100644 --- a/dtrans/source/win32/dtobj/DOTransferable.cxx +++ b/dtrans/source/win32/dtobj/DOTransferable.cxx @@ -20,6 +20,7 @@ #include <sal/types.h> #include <rtl/process.h> #include <osl/diagnose.h> +#include <sal/log.hxx> #include "DOTransferable.hxx" #include "../misc/ImplHelper.hxx" @@ -59,6 +60,7 @@ namespace void clipDataToByteStream( CLIPFORMAT cf, STGMEDIUM stgmedium, CDOTransferable::ByteSequence_t& aByteSequence ) { CStgTransferHelper memTransferHelper; + LPSTREAM pStream = nullptr; switch( stgmedium.tymed ) { @@ -75,7 +77,7 @@ void clipDataToByteStream( CLIPFORMAT cf, STGMEDIUM stgmedium, CDOTransferable:: break; case TYMED_ISTREAM: - //TODO: Has to be implemented + pStream = stgmedium.pstm; break; default: @@ -83,6 +85,41 @@ void clipDataToByteStream( CLIPFORMAT cf, STGMEDIUM stgmedium, CDOTransferable:: break; } + if (pStream) + { + // We have a stream, read from it. + STATSTG aStat; + HRESULT hr = pStream->Stat(&aStat, STATFLAG_NONAME); + if (FAILED(hr)) + { + SAL_WARN("dtrans", "clipDataToByteStream: Stat() failed"); + return; + } + + size_t nMemSize = aStat.cbSize.QuadPart; + aByteSequence.realloc(nMemSize); + LARGE_INTEGER li; + li.QuadPart = 0; + hr = pStream->Seek(li, STREAM_SEEK_SET, NULL); + if (FAILED(hr)) + { + SAL_WARN("dtrans", "clipDataToByteStream: Seek() failed"); + } + + ULONG nRead = 0; + hr = pStream->Read(aByteSequence.getArray(), nMemSize, &nRead); + if (FAILED(hr)) + { + SAL_WARN("dtrans", "clipDataToByteStream: Read() failed"); + } + if (nRead < nMemSize) + { + SAL_WARN("dtrans", "clipDataToByteStream: Read() was partial"); + } + + return; + } + int nMemSize = memTransferHelper.memSize( cf ); aByteSequence.realloc( nMemSize ); memTransferHelper.read( aByteSequence.getArray( ), nMemSize ); @@ -393,6 +430,14 @@ CDOTransferable::ByteSequence_t CDOTransferable::getClipboardData( CFormatEtc& a hr = m_rDataObject->GetData( aTempFormat, &stgmedium ); } + if (FAILED(hr) && aFormatEtc.getTymed() == TYMED_HGLOBAL) + { + // Handle type is not memory, try stream. + CFormatEtc aTempFormat(aFormatEtc); + aTempFormat.setTymed(TYMED_ISTREAM); + hr = m_rDataObject->GetData(aTempFormat, &stgmedium); + } + if ( FAILED( hr ) ) { OSL_ASSERT( (hr != E_INVALIDARG) && |