Blob Blame History Raw
From ed23329485dfdda07f444bd61276a2f630da31a4 Mon Sep 17 00:00:00 2001
From: Michael Stahl <mstahl@redhat.com>
Date: Fri, 5 Dec 2014 18:04:39 +0100
Subject: [PATCH 3/5] fdo#86795: xmloff: ODF import: do not import checkbox
 fieldmark ...

... if it has start/end, because Writer will become grumpy and crash.

(cherry picked from commit 25fd11e78279aef5a6b7656347758e5c67a9c45a)

Conflicts:
	xmloff/source/text/XMLTextMarkImportContext.cxx

Change-Id: I6024051249eeac6ed9e43856fa77db969287f888
Reviewed-on: https://gerrit.libreoffice.org/13319
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit b903e2a7ac730865d9a6ee48fb0392ecff2c7d30)
---
 xmloff/source/text/XMLTextMarkImportContext.cxx | 49 +++++++++++++++++--------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/xmloff/source/text/XMLTextMarkImportContext.cxx b/xmloff/source/text/XMLTextMarkImportContext.cxx
index 73ee88d..7720533 100644
--- a/xmloff/source/text/XMLTextMarkImportContext.cxx
+++ b/xmloff/source/text/XMLTextMarkImportContext.cxx
@@ -143,7 +143,7 @@ static const char *lcl_getFormFieldmarkName(OUString &name)
         return NULL;
 }
 
-static OUString lcl_getFieldmarkName(OUString &name)
+static OUString lcl_getFieldmarkName(OUString const& name)
 {
     static const char sFormtext[]=ODF_FORMTEXT;
     if (name.equalsAscii("msoffice.field.FORMTEXT") ||
@@ -288,19 +288,40 @@ void XMLTextMarkImportContext::EndElement()
 
                             bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && m_rHelper.hasCurrentFieldCtx());
 
-                            // insert reference
-                            const Reference<XInterface> xContent(
-                                CreateAndInsertMark(GetImport(),
-                                                (bImportAsField?sAPI_fieldmark:sAPI_bookmark),
-                                    m_sBookmarkName,
-                                    xInsertionCursor,
-                                    m_sXmlId) );
-                            if (pRDFaAttributes)
+                            // fdo#86795 check if it's actually a checkbox first
+                            bool isInvalid(false);
+                            OUString fieldmarkTypeName;
+                            if (bImportAsField && m_rHelper.hasCurrentFieldCtx())
                             {
-                                const Reference<rdf::XMetadatable>
-                                    xMeta(xContent, UNO_QUERY);
-                                GetImport().GetRDFaImportHelper().AddRDFa(
-                                    xMeta, pRDFaAttributes);
+
+                                OUString const type(m_rHelper.getCurrentFieldType());
+                                fieldmarkTypeName = lcl_getFieldmarkName(type);
+                                if (fieldmarkTypeName == ODF_FORMCHECKBOX ||
+                                    fieldmarkTypeName == ODF_FORMDROPDOWN)
+                                {   // sw can't handle checkbox with start+end
+                                    SAL_INFO("xmloff.text", "invalid fieldmark-start/fieldmark-end ignored");
+                                    isInvalid = true;
+                                }
+                            }
+
+                            Reference<XInterface> xContent;
+                            if (!isInvalid)
+                            {
+                                // insert reference
+                                xContent = CreateAndInsertMark(GetImport(),
+                                        (bImportAsField
+                                            ? OUString(sAPI_fieldmark)
+                                            : OUString(sAPI_bookmark)),
+                                        m_sBookmarkName,
+                                        xInsertionCursor,
+                                        m_sXmlId);
+                                if (pRDFaAttributes)
+                                {
+                                    const Reference<rdf::XMetadatable>
+                                        xMeta(xContent, UNO_QUERY);
+                                    GetImport().GetRDFaImportHelper().AddRDFa(
+                                        xMeta, pRDFaAttributes);
+                                }
                             }
 
                             if ((lcl_MarkType)nTmp==TypeFieldmarkEnd) {
@@ -308,8 +329,6 @@ void XMLTextMarkImportContext::EndElement()
                                     // setup fieldmark...
                                     Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY);
                                     if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) {
-                                        OUString givenTypeName=m_rHelper.getCurrentFieldType();
-                                        OUString fieldmarkTypeName=lcl_getFieldmarkName(givenTypeName);
 
                                         xFormField->setFieldType(fieldmarkTypeName);
                                         m_rHelper.setCurrentFieldParamsTo(xFormField);
-- 
1.9.3