tdf#133870: read OBJECTDESCRIPTOR from clipboard
This extends commit 8ad0c29f56e5069a3679560d404b603332dcf38a
(sw: prefer ODF over RTF when pasting from Writer, 2020-04-22).
To see that the clipboard contains a matching EMBED_SOURCE from
another instance of the program, the content of OBJECTDESCRIPTOR
needs to be read into mxObjDesc of TransferableDataHelper.
Change-Id: Ic4bf4ba8b077550336be231451cf2e86c42f112b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157791
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/vcl/source/treelist/transfer.cxx b/vcl/source/treelist/transfer.cxx
index 812b960..4ca968e 100644
--- a/vcl/source/treelist/transfer.cxx
+++ b/vcl/source/treelist/transfer.cxx
@@ -41,6 +41,7 @@
#include <vcl/window.hxx>
#include <comphelper/fileformat.h>
#include <comphelper/processfactory.hxx>
#include <comphelper/scopeguard.hxx>
#include <comphelper/servicehelper.hxx>
#include <comphelper/sequence.hxx>
#include <sot/filelist.hxx>
@@ -109,6 +110,43 @@ SvStream& WriteTransferableObjectDescriptor( SvStream& rOStm, const Transferable
return rOStm;
}
static void TryReadTransferableObjectDescriptor(SvStream& rIStm,
TransferableObjectDescriptor& rObjDesc)
{
auto nStartPos = rIStm.Tell();
comphelper::ScopeGuard streamPosRestore([nStartPos, &rIStm] { rIStm.Seek(nStartPos); });
sal_uInt32 size;
rIStm.ReadUInt32(size);
SvGlobalName className;
rIStm >> className;
sal_uInt32 viewAspect;
rIStm.ReadUInt32(viewAspect);
sal_Int32 width, height;
rIStm.ReadInt32(width).ReadInt32(height);
sal_Int32 dragStartPosX, dragStartPosY;
rIStm.ReadInt32(dragStartPosX).ReadInt32(dragStartPosY);
const OUString typeName = rIStm.ReadUniOrByteString(osl_getThreadTextEncoding());
const OUString displayName = rIStm.ReadUniOrByteString(osl_getThreadTextEncoding());
sal_uInt32 nSig1, nSig2;
rIStm.ReadUInt32(nSig1).ReadUInt32(nSig2);
if (!rIStm.good() || rIStm.Tell() - nStartPos != size || nSig1 != TOD_SIG1 || nSig2 != TOD_SIG2)
return;
rObjDesc.maClassName = className;
rObjDesc.mnViewAspect = viewAspect;
rObjDesc.maSize = Size(width, height);
rObjDesc.maDragStartPos = Point(dragStartPosX, dragStartPosY);
rObjDesc.maTypeName = typeName;
rObjDesc.maDisplayName = displayName;
}
// the reading of the parameter is done using the special service css::datatransfer::MimeContentType,
// a similar approach should be implemented for creation of the mimetype string;
@@ -1279,6 +1317,9 @@ void TransferableDataHelper::InitFormats()
if( SotClipboardFormatId::OBJECTDESCRIPTOR == format.mnSotId )
{
ImplSetParameterString(*mxObjDesc, format);
auto data = GetSequence(format, {});
SvMemoryStream aSrcStm(data.getArray(), data.getLength(), StreamMode::READ);
TryReadTransferableObjectDescriptor(aSrcStm, *mxObjDesc);
break;
}
}