summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dtrans/source/win32/dtobj/DOTransferable.cxx47
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) &&