summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2023-10-10 15:59:04 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2023-10-11 06:14:17 +0200
commit3191b322b59cab22ec4c67c0d83520ff577f7ae8 (patch)
tree4ecbd2f6776f19974046b3ab6649742d06e62c98 /vcl
parentcb46ad4c4602fbb6aeab482e9370e31495e12cfe (diff)
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>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/treelist/transfer.cxx41
1 files changed, 41 insertions, 0 deletions
diff --git a/vcl/source/treelist/transfer.cxx b/vcl/source/treelist/transfer.cxx
index 812b9609b07f..4ca968e84b8d 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;
}
}