63f0e84
From ed23329485dfdda07f444bd61276a2f630da31a4 Mon Sep 17 00:00:00 2001
63f0e84
From: Michael Stahl <mstahl@redhat.com>
63f0e84
Date: Fri, 5 Dec 2014 18:04:39 +0100
63f0e84
Subject: [PATCH 3/5] fdo#86795: xmloff: ODF import: do not import checkbox
63f0e84
 fieldmark ...
63f0e84
63f0e84
... if it has start/end, because Writer will become grumpy and crash.
63f0e84
63f0e84
(cherry picked from commit 25fd11e78279aef5a6b7656347758e5c67a9c45a)
63f0e84
63f0e84
Conflicts:
63f0e84
	xmloff/source/text/XMLTextMarkImportContext.cxx
63f0e84
63f0e84
Change-Id: I6024051249eeac6ed9e43856fa77db969287f888
63f0e84
Reviewed-on: https://gerrit.libreoffice.org/13319
63f0e84
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
63f0e84
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
63f0e84
(cherry picked from commit b903e2a7ac730865d9a6ee48fb0392ecff2c7d30)
63f0e84
---
63f0e84
 xmloff/source/text/XMLTextMarkImportContext.cxx | 49 +++++++++++++++++--------
63f0e84
 1 file changed, 34 insertions(+), 15 deletions(-)
63f0e84
63f0e84
diff --git a/xmloff/source/text/XMLTextMarkImportContext.cxx b/xmloff/source/text/XMLTextMarkImportContext.cxx
63f0e84
index 73ee88d..7720533 100644
63f0e84
--- a/xmloff/source/text/XMLTextMarkImportContext.cxx
63f0e84
+++ b/xmloff/source/text/XMLTextMarkImportContext.cxx
63f0e84
@@ -143,7 +143,7 @@ static const char *lcl_getFormFieldmarkName(OUString &name)
63f0e84
         return NULL;
63f0e84
 }
63f0e84
 
63f0e84
-static OUString lcl_getFieldmarkName(OUString &name)
63f0e84
+static OUString lcl_getFieldmarkName(OUString const& name)
63f0e84
 {
63f0e84
     static const char sFormtext[]=ODF_FORMTEXT;
63f0e84
     if (name.equalsAscii("msoffice.field.FORMTEXT") ||
63f0e84
@@ -288,19 +288,40 @@ void XMLTextMarkImportContext::EndElement()
63f0e84
 
63f0e84
                             bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && m_rHelper.hasCurrentFieldCtx());
63f0e84
 
63f0e84
-                            // insert reference
63f0e84
-                            const Reference<XInterface> xContent(
63f0e84
-                                CreateAndInsertMark(GetImport(),
63f0e84
-                                                (bImportAsField?sAPI_fieldmark:sAPI_bookmark),
63f0e84
-                                    m_sBookmarkName,
63f0e84
-                                    xInsertionCursor,
63f0e84
-                                    m_sXmlId) );
63f0e84
-                            if (pRDFaAttributes)
63f0e84
+                            // fdo#86795 check if it's actually a checkbox first
63f0e84
+                            bool isInvalid(false);
63f0e84
+                            OUString fieldmarkTypeName;
63f0e84
+                            if (bImportAsField && m_rHelper.hasCurrentFieldCtx())
63f0e84
                             {
63f0e84
-                                const Reference<rdf::XMetadatable>
63f0e84
-                                    xMeta(xContent, UNO_QUERY);
63f0e84
-                                GetImport().GetRDFaImportHelper().AddRDFa(
63f0e84
-                                    xMeta, pRDFaAttributes);
63f0e84
+
63f0e84
+                                OUString const type(m_rHelper.getCurrentFieldType());
63f0e84
+                                fieldmarkTypeName = lcl_getFieldmarkName(type);
63f0e84
+                                if (fieldmarkTypeName == ODF_FORMCHECKBOX ||
63f0e84
+                                    fieldmarkTypeName == ODF_FORMDROPDOWN)
63f0e84
+                                {   // sw can't handle checkbox with start+end
63f0e84
+                                    SAL_INFO("xmloff.text", "invalid fieldmark-start/fieldmark-end ignored");
63f0e84
+                                    isInvalid = true;
63f0e84
+                                }
63f0e84
+                            }
63f0e84
+
63f0e84
+                            Reference<XInterface> xContent;
63f0e84
+                            if (!isInvalid)
63f0e84
+                            {
63f0e84
+                                // insert reference
63f0e84
+                                xContent = CreateAndInsertMark(GetImport(),
63f0e84
+                                        (bImportAsField
63f0e84
+                                            ? OUString(sAPI_fieldmark)
63f0e84
+                                            : OUString(sAPI_bookmark)),
63f0e84
+                                        m_sBookmarkName,
63f0e84
+                                        xInsertionCursor,
63f0e84
+                                        m_sXmlId);
63f0e84
+                                if (pRDFaAttributes)
63f0e84
+                                {
63f0e84
+                                    const Reference<rdf::XMetadatable>
63f0e84
+                                        xMeta(xContent, UNO_QUERY);
63f0e84
+                                    GetImport().GetRDFaImportHelper().AddRDFa(
63f0e84
+                                        xMeta, pRDFaAttributes);
63f0e84
+                                }
63f0e84
                             }
63f0e84
 
63f0e84
                             if ((lcl_MarkType)nTmp==TypeFieldmarkEnd) {
63f0e84
@@ -308,8 +329,6 @@ void XMLTextMarkImportContext::EndElement()
63f0e84
                                     // setup fieldmark...
63f0e84
                                     Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY);
63f0e84
                                     if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) {
63f0e84
-                                        OUString givenTypeName=m_rHelper.getCurrentFieldType();
63f0e84
-                                        OUString fieldmarkTypeName=lcl_getFieldmarkName(givenTypeName);
63f0e84
 
63f0e84
                                         xFormField->setFieldType(fieldmarkTypeName);
63f0e84
                                         m_rHelper.setCurrentFieldParamsTo(xFormField);
63f0e84
-- 
63f0e84
1.9.3
63f0e84