diff options
author | Michael Stahl <mstahl@redhat.com> | 2013-12-10 15:14:00 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2013-12-10 15:28:53 +0100 |
commit | cc407e50e8a1a74f9d1ed29d444dce9bd2e9167a (patch) | |
tree | c7ef90848446a9c961f694e0a2f772a17198319f /xmloff/source/text | |
parent | 1235e694c21f6e3e000e24a176123c386ea91df1 (diff) |
sax, xmloff: fix ODF import/export of text:time/text:time-value
The value written for an Impress time field is something like
text:time-value="0000-00-00T23:28:07" (in LO 3.5+) or
text:time-value="0-00-00T23:28:07" (in OOo 3.3) which contains an
invalid all-zero date. Such values are actually rejected by the
ODF import since commit ae3e2f170045a1525f67e9f3e9b7e03d94f2b56b.
Actually there was no real support to read the RelaxNG type
timeOrDateTime before.
So fix that by:
- adding convertTimeOrDateTime/parseTimeOrDateTime functions to
sax::Converter
- recognizing and ignoring the 2 invalid all-zero values written by
LO 3.5 and historic OOo respectively
- writing a bare "time" in text:time-value if the DateTime struct
contains zero Date members
(Older OOo versions and AOO cannot actually read that, but everything
they _can_ read is invalid ODF...)
Change-Id: I754076caee74a5163ed3f972af0f23796aa14f9f
Diffstat (limited to 'xmloff/source/text')
-rw-r--r-- | xmloff/source/text/txtflde.cxx | 22 | ||||
-rw-r--r-- | xmloff/source/text/txtfldi.cxx | 4 |
2 files changed, 21 insertions, 5 deletions
diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index e52160f9f2e1..0d43008030a1 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -1261,17 +1261,17 @@ void XMLTextFieldExport::ExportFieldHelper( if (xPropSetInfo->hasPropertyByName(sPropertyDateTimeValue)) { // no value -> current time - ProcessDateTime(XML_TIME_VALUE, + ProcessTimeOrDateTime(XML_TIME_VALUE, GetDateTimeProperty(sPropertyDateTimeValue, rPropSet), - sal_False ); + XML_NAMESPACE_TEXT); } if (xPropSetInfo->hasPropertyByName(sPropertyDateTime)) { // no value -> current time - ProcessDateTime(XML_TIME_VALUE, + ProcessTimeOrDateTime(XML_TIME_VALUE, GetDateTimeProperty(sPropertyDateTime,rPropSet), - sal_False ); + XML_NAMESPACE_TEXT); } if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed)) { @@ -2674,6 +2674,20 @@ void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName, } } +/// export a time or dateTime +void XMLTextFieldExport::ProcessTimeOrDateTime(enum XMLTokenEnum eName, + const util::DateTime& rTime, + sal_uInt16 nPrefix) +{ + OUStringBuffer aBuffer; + + // date/time value + ::sax::Converter::convertTimeOrDateTime(aBuffer, rTime, 0); + + // output attribute + ProcessString(eName, aBuffer.makeStringAndClear(), sal_True, nPrefix); +} + SvXMLEnumMapEntry const aBibliographyDataTypeMap[] = { diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx index 90553d6ac276..bea669e5bbca 100644 --- a/xmloff/source/text/txtfldi.cxx +++ b/xmloff/source/text/txtfldi.cxx @@ -1095,6 +1095,7 @@ void XMLTimeFieldImportContext::ProcessAttribute( { case XML_TOK_TEXTFIELD_TIME_VALUE: { + // FIXME double appears unused? double fTmp; if (GetImport().GetMM100UnitConverter(). convertDateTime(fTmp, sAttrValue)) @@ -1103,7 +1104,8 @@ void XMLTimeFieldImportContext::ProcessAttribute( bTimeOK = sal_True; } - if (::sax::Converter::parseDateTime(aDateTimeValue, 0, sAttrValue)) + if (::sax::Converter::parseTimeOrDateTime(aDateTimeValue, 0, + sAttrValue)) { bTimeOK = sal_True; } |