Files
loongoffice/embeddedobj
Miklos Vajna fb4dc0f178 embeddedobj: fix lost native data when updating it via OLE fails
How to reproduce the problem:

1) Create an ODT file which has an OLE object, where the native data is
an OLE2 container, containing a Package stream, containing a DOCX file.

2) Install some external application on Windows which registers itself
as a handler for the DOCX CSLID [ this is where writing a testcase for
this bug is challenging ].

3) Open this document via Java, using URP. Load the document with
Hidden=true and OnMainThread=true.

4) Dispatch .uno:UpdateAll

5) Save the document using XStorable.store()

Expected result: the native data is there.

Actual result: the native data is sometimes missing (0 bytes). Typically
happens at least once if you perform the steps 4 times in a row.

The root cause is that GetUserClassID() Win32 API fails in some cases,
and re-trying a few times after a small sleep doesn't help.

Handle this error better by detecting this situation in
OleEmbeddedObject::SwitchOwnPersistence() and reusing the old native
data, similar to how svt::EmbeddedObjectRef::GetReplacement() updates
the preview image in a transactional way (only delete the old one when
we have a one one).

Finally, detect a broken OLE2 preview during reqif export, this way the
reqif export result's embedded object is editable in Word, while
\objdata was simply empty previously.

Change-Id: I4dd34ebe6ad892a14cdcfb82acc82d9edf790fb3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113814
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2021-04-08 19:18:09 +02:00
..
2020-12-29 16:42:33 +01:00

Embedding Objects Into LibreOffice

Code for embedding objects into LibreOffice (reverse of embedserv module).