sw/qa/extras/rtfexport/data/tdf100961_fixedDateTime.rtf |   38 ++++++++++++++++
 sw/qa/extras/rtfexport/rtfexport3.cxx                   |   12 +++++
 writerfilter/inc/dmapper/resourcemodel.hxx              |    1 
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx   |    1 
 writerfilter/source/rtftok/rtfdispatchdestination.cxx   |    1 
 writerfilter/source/rtftok/rtfdispatchflag.cxx          |    6 ++
 writerfilter/source/rtftok/rtfdocumentimpl.cxx          |    4 +
 writerfilter/source/rtftok/rtfdocumentimpl.hxx          |    3 +
 8 files changed, 65 insertions(+), 1 deletion(-)

New commits:
commit 4ed7a2c8af03bc0f45df1f03fd160ccbf045ed4f
Author:     Justin Luth <[email protected]>
AuthorDate: Tue Apr 13 17:57:58 2021 +0200
Commit:     Justin Luth <[email protected]>
CommitDate: Wed Apr 14 12:23:25 2021 +0200

    tdf#100961 rtf import: fldlock is FIXEDFLD
    
    This depends on another fix in this bug report for
    exporting.
    
    I'm not sure why I even bother trying to work
    on RTF stuff. I'm not really into black magic.
    
    Change-Id: If596cae011a261a80ca13962932bf25561c0f63f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114062
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <[email protected]>

diff --git a/sw/qa/extras/rtfexport/data/tdf100961_fixedDateTime.rtf 
b/sw/qa/extras/rtfexport/data/tdf100961_fixedDateTime.rtf
new file mode 100644
index 000000000000..95f28e34ddbb
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/tdf100961_fixedDateTime.rtf
@@ -0,0 +1,38 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff1\deff0\stshfdbch42\stshfloch41\stshfhich41\stshfbi1\deflang2057\deflangfe2057{\fonttbl{\f1\fswiss\fcharset0\fprq2{\*\panose
 020b0604020202020204}Arial;}{\f36\fswiss\fcharset0\fprq2{\*\panose 
020b0604020202020204}Liberation Sans{\*\falt Arial};}
+{\f41\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Liberation 
Serif{\*\falt Times New Roman};}{\f42\fmodern\fcharset134\fprq1{\*\panose 
02010609030101010101}NSimSun;}{\f43\fswiss\fcharset134\fprq2{\*\panose 
020b0503020204020204}Microsoft YaHei;}
+{\f72\fmodern\fcharset134\fprq1{\*\panose 
00000000000000000000}@NSimSun;}{\f73\fswiss\fcharset134\fprq2{\*\panose 
00000000000000000000}@Microsoft YaHei;}{\f84\fswiss\fcharset238\fprq2 Arial 
CE;}{\f85\fswiss\fcharset204\fprq2 Arial Cyr;}
+{\f87\fswiss\fcharset161\fprq2 Arial Greek;}{\f88\fswiss\fcharset162\fprq2 
Arial Tur;}{\f89\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f90\fbidi 
\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f91\fswiss\fcharset186\fprq2 Arial 
Baltic;}
+{\f92\fswiss\fcharset163\fprq2 Arial 
(Vietnamese);}{\f434\fswiss\fcharset238\fprq2 Liberation Sans CE{\*\falt 
Arial};}{\f435\fswiss\fcharset204\fprq2 Liberation Sans Cyr{\*\falt Arial};}
+{\f437\fswiss\fcharset161\fprq2 Liberation Sans Greek{\*\falt 
Arial};}{\f438\fswiss\fcharset162\fprq2 Liberation Sans Tur{\*\falt 
Arial};}{\f439\fbidi \fswiss\fcharset177\fprq2 Liberation Sans (Hebrew){\*\falt 
Arial};}
+{\f441\fswiss\fcharset186\fprq2 Liberation Sans Baltic{\*\falt 
Arial};}{\f442\fswiss\fcharset163\fprq2 Liberation Sans (Vietnamese){\*\falt 
Arial};}{\f484\froman\fcharset238\fprq2 Liberation Serif CE{\*\falt Times New 
Roman};}
+{\f485\froman\fcharset204\fprq2 Liberation Serif Cyr{\*\falt Times New 
Roman};}{\f487\froman\fcharset161\fprq2 Liberation Serif Greek{\*\falt Times 
New Roman};}{\f488\froman\fcharset162\fprq2 Liberation Serif Tur{\*\falt Times 
New Roman};}
+{\f489\fbidi \froman\fcharset177\fprq2 Liberation Serif (Hebrew){\*\falt Times 
New Roman};}{\f491\froman\fcharset186\fprq2 Liberation Serif Baltic{\*\falt 
Times New Roman};}
+{\f492\froman\fcharset163\fprq2 Liberation Serif (Vietnamese){\*\falt Times 
New Roman};}{\f74\froman\fcharset238\fprq2 Times New Roman 
CE;}{\f75\froman\fcharset204\fprq2 Times New Roman 
Cyr;}{\f77\froman\fcharset161\fprq2 Times New Roman Greek;}
+{\f78\froman\fcharset162\fprq2 Times New Roman Tur;}{\f79\fbidi 
\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f80\fbidi 
\froman\fcharset178\fprq2 Times New Roman 
(Arabic);}{\f81\froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\f82\froman\fcharset163\fprq2 Times New Roman 
(Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
+\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
+\ql 
\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \af1\afs24\alang1081 \ltrch\fcs0 
\fs24\lang1049\langfe2052\kerning2\loch\f41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 \snext0 Normal;}{\*\cs10 
+\additive \ssemihidden Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
 
+\ql 
\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \af1\afs20 \ltrch\fcs0 
\fs20\lang1024\langfe1024\loch\f41\hich\af41\dbch\af42\cgrid\langnp1024\langfenp1024
 \snext11 \ssemihidden Normal Table;}{
+\s15\ql 
\li0\ri0\sb240\sa120\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \af1\afs28\alang1081 \ltrch\fcs0 
\fs28\lang1049\langfe2052\kerning2\loch\f36\hich\af36\dbch\af43\cgrid\langnp1049\langfenp2052
 
+\sbasedon0 \snext16 Heading;}{\s16\ql 
\li0\ri0\sa140\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \af1\afs24\alang1081 \ltrch\fcs0 
+\fs24\lang1049\langfe2052\kerning2\loch\f41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 \sbasedon0 \snext16 Body Text;}{\s17\ql 
\li0\ri0\sa140\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 
+\af1\afs24\alang1081 \ltrch\fcs0 
\fs24\lang1049\langfe2052\kerning2\loch\f41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 \sbasedon16 \snext17 List;}{
+\s18\ql 
\li0\ri0\sb120\sa120\widctlpar\noline\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \ai\af1\afs24\alang1081 \ltrch\fcs0 
\i\fs24\lang1049\langfe2052\kerning2\loch\f41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 
+\sbasedon0 \snext18 caption;}{\s19\ql 
\li0\ri0\widctlpar\noline\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 \rtlch\fcs1 \af1\afs24\alang1081 \ltrch\fcs0 
+\fs24\lang1049\langfe2052\kerning2\loch\f41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 \sbasedon0 \snext19 
Index;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl 
\rsid336885\rsid2430917\rsid2647374\rsid4946236}{\*\generator Microsoft Word 
+11.0.0000;}{\info{\title 05}{\author Mike Kaganski}{\operator 
JLAutoBuild}{\creatim\yr2021\mo4\dy13\hr10\min21}{\revtim\yr2021\mo4\dy13\hr10\min21}{\version2}{\edmins1}{\nofpages1}{\nofwords8}{\nofchars50}{\nofcharsws57}{\vern24611}{\*\password
 00000000}}
+{\*\xmlnstbl {\xmlns1 
http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1134\margr1134\margt1134\margb1134\gutter0\ltrsect
 
+\deftab709\widowctrl\ftnbj\aenddoc\donotembedsysfont1\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin
+\dghspace180\dgvspace180\dghorigin1134\dgvorigin1134\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
+\asianbrkrule\rsidroot2647374\newtblstyruls\nogrowautofit 
\fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd 
\ltrsect\linex0\endnhere\sectunlocked1\sectexpand32768\sectlinegrid600\sectdefaultcl\sftnbj
 {\*\pnseclvl1
+\pnucrm\pnqc\pnstart1\pnindent720\pnhang {\pntxta 
.}}{\*\pnseclvl2\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta 
.}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta 
.}}{\*\pnseclvl4\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta )}}
+{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta 
)}}{\*\pnseclvl6\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta 
)}}{\*\pnseclvl7\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta 
)}}{\*\pnseclvl8
+\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta 
)}}{\*\pnseclvl9\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta 
)}}\pard\plain \ltrpar\ql 
\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
 
+\rtlch\fcs1 \af1\afs24\alang1081 \ltrch\fcs0 
\fs24\lang1049\langfe2052\kerning2\loch\af41\hich\af41\dbch\af42\cgrid\langnp1049\langfenp2052
 {\field\fldlock{\*\fldinst {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid336885 
\hich\af41\dbch\af42\loch\f41 DATE \\
+@"dd.MM.yy"}}{\fldrslt {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid336885 
\hich\af41\dbch\af42\loch\f41 05.01.19}}}\sectd 
\ltrsect\linex0\endnhere\sectunlocked1\sectexpand32768\sectlinegrid600\sectdefaultcl\sftnbj
 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid336885 
+\hich\af41\dbch\af42\loch\f41  }{\field\fldlock{\*\fldinst {\rtlch\fcs1 \af1 
\ltrch\fcs0 \insrsid336885 \hich\af41\dbch\af42\loch\f41 TIME 
\\@"HH:mm:ss"}}{\fldrslt {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid336885 
\hich\af41\dbch\af42\loch\f41 04:06:08}}}
+\sectd 
\ltrsect\linex0\endnhere\sectunlocked1\sectexpand32768\sectlinegrid600\sectdefaultcl\sftnbj
 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2647374 
+\par }}
\ No newline at end of file
diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx 
b/sw/qa/extras/rtfexport/rtfexport3.cxx
index 6f801bc3f8cc..4468a97650b5 100644
--- a/sw/qa/extras/rtfexport/rtfexport3.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport3.cxx
@@ -14,6 +14,8 @@
 #include <com/sun/star/text/TextContentAnchorType.hpp>
 #include <com/sun/star/awt/FontWeight.hpp>
 #include <com/sun/star/text/XEndnotesSupplier.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XTextFieldsSupplier.hpp>
 #include <com/sun/star/text/XTextTablesSupplier.hpp>
 #include <com/sun/star/text/XTextTable.hpp>
 #include <com/sun/star/text/XTextDocument.hpp>
@@ -33,6 +35,16 @@ public:
     }
 };
 
+DECLARE_RTFEXPORT_TEST(testTdf100961_fixedDateTime, 
"tdf100961_fixedDateTime.rtf")
+{
+    // This should be a fixed date/time field, not the current time.
+    getParagraph(1, "05.01.19 04:06:08");
+
+    uno::Reference<text::XTextFieldsSupplier> xTFS(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> 
xFields(xTFS->getTextFields()->createEnumeration());
+    CPPUNIT_ASSERT_MESSAGE("constant time", 
getProperty<bool>(xFields->nextElement(), "IsFixed"));
+}
+
 DECLARE_RTFEXPORT_TEST(testTdf108949, "tdf108949_footnoteCharFormat.odt")
 {
     CPPUNIT_ASSERT_EQUAL(1, getPages());
diff --git a/writerfilter/inc/dmapper/resourcemodel.hxx 
b/writerfilter/inc/dmapper/resourcemodel.hxx
index 2a9833f7ea2f..fce90839d520 100644
--- a/writerfilter/inc/dmapper/resourcemodel.hxx
+++ b/writerfilter/inc/dmapper/resourcemodel.hxx
@@ -171,6 +171,7 @@ protected:
     ~BinaryObj() {}
 };
 
+const sal_uInt8 cFieldLock = 0x8;
 const sal_uInt8 cFieldStart = 0x13;
 const sal_uInt8 cFieldSep = 0x14;
 const sal_uInt8 cFieldEnd = 0x15;
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx 
b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index e4bd09130c69..0263196e6d8c 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -48,7 +48,6 @@ const sal_Unicode uNoBreakHyphen = 0x2011;
 const sal_Unicode uSoftHyphen = 0xAD;
 
 const sal_uInt8 cFtnEdnCont = 0x4;
-const sal_uInt8 cFieldLock = 0x8;
 
 namespace writerfilter::ooxml
 {
diff --git a/writerfilter/source/rtftok/rtfdispatchdestination.cxx 
b/writerfilter/source/rtftok/rtfdispatchdestination.cxx
index 2f7975073a37..11db48a0ec6d 100644
--- a/writerfilter/source/rtftok/rtfdispatchdestination.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchdestination.cxx
@@ -63,6 +63,7 @@ RTFError RTFDocumentImpl::dispatchDestination(RTFKeyword 
nKeyword)
                 break;
             case RTFKeyword::FIELD:
                 m_aStates.top().setDestination(Destination::FIELD);
+                m_aStates.top().setFieldLocked(false);
                 break;
             case RTFKeyword::FLDINST:
             {
diff --git a/writerfilter/source/rtftok/rtfdispatchflag.cxx 
b/writerfilter/source/rtftok/rtfdispatchflag.cxx
index c56124106eb2..7bfa56d42d7c 100644
--- a/writerfilter/source/rtftok/rtfdispatchflag.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchflag.cxx
@@ -1234,6 +1234,12 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword 
nKeyword)
                                                   new RTFValue(1));
         }
         break;
+        case RTFKeyword::FLDLOCK:
+        {
+            if (m_aStates.top().getDestination() == Destination::FIELD)
+                m_aStates.top().setFieldLocked(true);
+        }
+        break;
         default:
         {
             SAL_INFO("writerfilter", "TODO handle flag '" << 
keywordToString(nKeyword) << "'");
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx 
b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 7066c7b5c53e..f4a66c5c3c98 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -2223,6 +2223,9 @@ RTFError RTFDocumentImpl::beforePopState(RTFParserState& 
rState)
             }
             m_aFormfieldAttributes.clear();
             m_aFormfieldSprms.clear();
+
+            if (m_aStates.top().isFieldLocked())
+                singleChar(cFieldLock);
             singleChar(cFieldSep);
         }
         break;
@@ -3642,6 +3645,7 @@ RTFParserState::RTFParserState(RTFDocumentImpl* 
pDocumentImpl)
     , m_nInternalState(RTFInternalState::NORMAL)
     , m_eDestination(Destination::NORMAL)
     , m_eFieldStatus(RTFFieldStatus::NONE)
+    , m_bFieldLocked(false)
     , m_nBorderState(RTFBorderState::NONE)
     , m_nCurrentEncoding(rtl_getTextEncodingFromWindowsCharset(0))
     , m_nUc(1)
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx 
b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 991cca90a562..b7f7335eb7d9 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -516,6 +516,8 @@ public:
     RTFBorderState getBorderState() const { return m_nBorderState; }
     void setFieldStatus(RTFFieldStatus eFieldStatus) { m_eFieldStatus = 
eFieldStatus; }
     RTFFieldStatus getFieldStatus() const { return m_eFieldStatus; }
+    void setFieldLocked(bool bSet) { m_bFieldLocked = bSet; }
+    bool isFieldLocked() { return m_bFieldLocked; }
     void setDestination(Destination eDestination) { m_eDestination = 
eDestination; }
     Destination getDestination() const { return m_eDestination; }
     void setInternalState(RTFInternalState nInternalState) { m_nInternalState 
= nInternalState; }
@@ -527,6 +529,7 @@ private:
     RTFInternalState m_nInternalState;
     Destination m_eDestination;
     RTFFieldStatus m_eFieldStatus;
+    bool m_bFieldLocked;
     RTFBorderState m_nBorderState;
     // font table, stylesheet table
     RTFSprms m_aTableSprms;
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to