oox/source/export/shapes.cxx | 27 ++++++++++++++++++--------- oox/source/export/vmlexport.cxx | 15 +++++++++------ 2 files changed, 27 insertions(+), 15 deletions(-)
New commits: commit 8e6df40db6e52b4ea657e5d81a32a7fdb006b00a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Sep 13 15:55:34 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Sep 13 20:49:46 2022 +0200 crashtesting: FastSaxSerializer::endDocument assert on export of ooo26868-1.doc to ooo26868-1.docx since: commit 17e27b4a19f22b912460f090b754d11f9a32fb7f Date: Tue Sep 6 14:28:22 2022 +0200 tdf#150756 - Assertion when opening report for editing but that commit looks blameless to me. Avoid the problem by checking for an empty Any for "TextBox" here as is common elsewhere Change-Id: I5f390952763044498d944a081703d0665cbb0444 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139867 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 90e4ad86926f..74dadd5da473 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -2010,21 +2010,30 @@ ShapeExport& ShapeExport::WriteShape( const Reference< XShape >& xShape ) return *this; } +static bool lcl_isTextBox(const Reference<XInterface>& xIface) +{ + uno::Reference<beans::XPropertySet> xPropertySet(xIface, uno::UNO_QUERY); + if (!xPropertySet.is()) + return false; + uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo(); + if (!xPropertySetInfo->hasPropertyByName("TextBox")) + return false; + css::uno::Any aTextBox(xPropertySet->getPropertyValue("TextBox")); + if (!aTextBox.hasValue()) + return false; + return aTextBox.get<bool>(); +} + ShapeExport& ShapeExport::WriteTextBox( const Reference< XInterface >& xIface, sal_Int32 nXmlNamespace, bool bWritePropertiesAsLstStyles ) { // In case this shape has an associated textbox, then export that, and we're done. if (GetDocumentType() == DOCUMENT_DOCX && !mbUserShapes && GetTextExport()) { - uno::Reference<beans::XPropertySet> xPropertySet(xIface, uno::UNO_QUERY); - if (xPropertySet.is()) + if (lcl_isTextBox(xIface)) { - uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo(); - if (xPropertySetInfo->hasPropertyByName("TextBox") && xPropertySet->getPropertyValue("TextBox").get<bool>()) - { - GetTextExport()->WriteTextBox(uno::Reference<drawing::XShape>(xIface, uno::UNO_QUERY_THROW)); - WriteText( xIface, /*bBodyPr=*/true, /*bText=*/false, /*nXmlNamespace=*/nXmlNamespace ); - return *this; - } + GetTextExport()->WriteTextBox(uno::Reference<drawing::XShape>(xIface, uno::UNO_QUERY_THROW)); + WriteText( xIface, /*bBodyPr=*/true, /*bText=*/false, /*nXmlNamespace=*/nXmlNamespace ); + return *this; } } diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx index fa21068cf4b6..5d6f244bb42f 100644 --- a/oox/source/export/vmlexport.cxx +++ b/oox/source/export/vmlexport.cxx @@ -1151,12 +1151,15 @@ static std::vector<OString> lcl_getShapeTypes() static bool lcl_isTextBox(const SdrObject* pSdrObject) { uno::Reference<beans::XPropertySet> xPropertySet(const_cast<SdrObject*>(pSdrObject)->getUnoShape(), uno::UNO_QUERY); - if (xPropertySet.is()) - { - uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo(); - return xPropertySetInfo->hasPropertyByName("TextBox") && xPropertySet->getPropertyValue("TextBox").get<bool>(); - } - return false; + if (!xPropertySet.is()) + return false; + uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo(); + if (!xPropertySetInfo->hasPropertyByName("TextBox")) + return false; + css::uno::Any aTextBox(xPropertySet->getPropertyValue("TextBox")); + if (!aTextBox.hasValue()) + return false; + return aTextBox.get<bool>(); } static OUString lcl_getAnchorIdFromGrabBag(const SdrObject* pSdrObject)