diff options
23 files changed, 206 insertions, 116 deletions
diff --git a/include/sax/tools/converter.hxx b/include/sax/tools/converter.hxx index 615308c9e418..1e89d2cea057 100644 --- a/include/sax/tools/converter.hxx +++ b/include/sax/tools/converter.hxx @@ -22,6 +22,8 @@ #include "sax/saxdllapi.h" +#include <boost/optional/optional.hpp> + #include <sal/types.h> #include <rtl/ustring.hxx> #include <rtl/ustrbuf.hxx> @@ -36,6 +38,8 @@ namespace com { namespace sun { namespace star { namespace util { struct Date; struct DateTime; + struct DateWithTimeZone; + struct DateTimeWithTimeZone; struct Duration; } } } } @@ -153,23 +157,33 @@ public: /** convert util::Date to ISO "date" string */ static void convertDate( OUStringBuffer& rBuffer, - const com::sun::star::util::Date& rDate ); + const com::sun::star::util::Date& rDate, + sal_Int16 const* pTimeZoneOffset); /** convert util::DateTime to ISO "date" or "dateTime" string */ static void convertDateTime( OUStringBuffer& rBuffer, const com::sun::star::util::DateTime& rDateTime, + sal_Int16 const* pTimeZoneOffset, bool bAddTimeIf0AM = false ); + static void convertDateTZ( OUStringBuffer& rBuffer, + com::sun::star::util::DateWithTimeZone const& rDate ); + + static void convertDateTimeTZ( OUStringBuffer& rBuffer, + com::sun::star::util::DateTimeWithTimeZone const& rDateTime ); + /** convert ISO "date" or "dateTime" string to util::DateTime */ - static bool convertDateTime( com::sun::star::util::DateTime& rDateTime, + static bool parseDateTime( com::sun::star::util::DateTime& rDateTime, + boost::optional<sal_Int16> * pTimeZoneOffset, const OUString& rString ); /** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ - static bool convertDateOrDateTime( - com::sun::star::util::Date & rDate, + static bool parseDateOrDateTime( + com::sun::star::util::Date * pDate, com::sun::star::util::DateTime & rDateTime, bool & rbDateTime, + boost::optional<sal_Int16> * pTimeZoneOffset, const OUString & rString ); /** gets the position of the first comma after npos in the string diff --git a/include/sfx2/dinfdlg.hxx b/include/sfx2/dinfdlg.hxx index c0758b56bc00..5752b2c4c09b 100644 --- a/include/sfx2/dinfdlg.hxx +++ b/include/sfx2/dinfdlg.hxx @@ -16,8 +16,10 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifndef _SFX_DINFDLG_HXX -#define _SFX_DINFDLG_HXX +#ifndef SFX_DINFDLG_HXX +#define SFX_DINFDLG_HXX + +#include <boost/optional/optional.hpp> #include "sal/config.h" #include "sfx2/dllapi.h" @@ -285,6 +287,8 @@ private: CustomPropertyLine* m_pLine; public: + ::boost::optional<sal_Int16> m_TZ; + inline CustomPropertiesDateField( Window* pParent, const ResId& rResId, CustomPropertyLine* pLine ) : DateField( pParent, rResId ), m_pLine( pLine ) {} @@ -297,9 +301,11 @@ private: CustomPropertyLine* m_pLine; public: + bool m_isUTC; + inline CustomPropertiesTimeField( Window* pParent, const ResId& rResId, CustomPropertyLine* pLine ) : - TimeField( pParent, rResId ), m_pLine( pLine ) {} + TimeField( pParent, rResId ), m_pLine( pLine ), m_isUTC(false) {} inline CustomPropertyLine* GetLine() const { return m_pLine; } }; diff --git a/sax/qa/cppunit/test_converter.cxx b/sax/qa/cppunit/test_converter.cxx index cfda248adf6c..b1cb070f8bbc 100644 --- a/sax/qa/cppunit/test_converter.cxx +++ b/sax/qa/cppunit/test_converter.cxx @@ -168,12 +168,12 @@ static void doTest(util::DateTime const & rdt, char const*const pis, OUString is(OUString::createFromAscii(pis)); util::DateTime odt; SAL_INFO("sax.cppunit","about to convert '" << is << "'"); - bool bSuccess( Converter::convertDateTime(odt, is) ); + bool bSuccess( Converter::parseDateTime(odt, 0, is) ); SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << " M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds << " UTC: " << (bool)odt.IsUTC); CPPUNIT_ASSERT(bSuccess); CPPUNIT_ASSERT(eqDateTime(rdt, odt)); OUStringBuffer buf; - Converter::convertDateTime(buf, odt, true); + Converter::convertDateTime(buf, odt, 0, true); SAL_INFO("sax.cppunit","" << buf.getStr()); CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(pos), buf.makeStringAndClear()); @@ -182,7 +182,7 @@ static void doTest(util::DateTime const & rdt, char const*const pis, static void doTestDateTimeF(char const*const pis) { util::DateTime odt; - bool bSuccess = Converter::convertDateTime(odt, + bool bSuccess = Converter::parseDateTime(odt, 0, OUString::createFromAscii(pis)); SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << "H M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds); CPPUNIT_ASSERT(!bSuccess); diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx index e99690e91546..911de8a26287 100644 --- a/sax/source/tools/converter.cxx +++ b/sax/source/tools/converter.cxx @@ -22,6 +22,8 @@ #include <com/sun/star/i18n/UnicodeType.hpp> #include <com/sun/star/util/DateTime.hpp> #include <com/sun/star/util/Date.hpp> +#include <com/sun/star/util/DateTimeWithTimeZone.hpp> +#include <com/sun/star/util/DateWithTimeZone.hpp> #include <com/sun/star/util/Duration.hpp> #include <com/sun/star/util/Time.hpp> #include <com/sun/star/uno/Sequence.hxx> @@ -1221,20 +1223,34 @@ lcl_AppendTimezone(OUStringBuffer & i_rBuffer, sal_Int16 const nOffset) } } +void Converter::convertDateTZ( OUStringBuffer& rBuffer, + com::sun::star::util::DateWithTimeZone const& rDate) +{ + convertDate(rBuffer, rDate.DateInTZ, &rDate.Timezone); +} + +void Converter::convertDateTimeTZ( OUStringBuffer& rBuffer, + com::sun::star::util::DateTimeWithTimeZone const& rDateTime) +{ + convertDateTime(rBuffer, rDateTime.DateTimeInTZ, &rDateTime.Timezone); +} + /** convert util::Date to ISO "date" string */ void Converter::convertDate( OUStringBuffer& i_rBuffer, - const util::Date& i_rDate) + const util::Date& i_rDate, + sal_Int16 const*const pTimeZoneOffset) { const util::DateTime dt(0, 0, 0, 0, i_rDate.Day, i_rDate.Month, i_rDate.Year, false); - convertDateTime(i_rBuffer, dt, false); + convertDateTime(i_rBuffer, dt, pTimeZoneOffset, false); } /** convert util::DateTime to ISO "date" or "dateTime" string */ void Converter::convertDateTime( OUStringBuffer& i_rBuffer, const com::sun::star::util::DateTime& i_rDateTime, + sal_Int16 const*const pTimeZoneOffset, bool i_bAddTimeIf0AM ) { const sal_Unicode dash('-'); @@ -1297,10 +1313,9 @@ void Converter::convertDateTime( } } - sal_uInt16 * pTimezone(0); // FIXME pass this as parameter - if (pTimezone) + if (pTimeZoneOffset) { - lcl_AppendTimezone(i_rBuffer, *pTimezone); + lcl_AppendTimezone(i_rBuffer, *pTimeZoneOffset); } else if (i_rDateTime.IsUTC) { @@ -1310,33 +1325,13 @@ void Converter::convertDateTime( } /** convert ISO "date" or "dateTime" string to util::DateTime */ -bool Converter::convertDateTime( util::DateTime& rDateTime, +bool Converter::parseDateTime( util::DateTime& rDateTime, + boost::optional<sal_Int16> *const pTimeZoneOffset, const OUString& rString ) { bool isDateTime; - util::Date date; - if (convertDateOrDateTime(date, rDateTime, isDateTime, rString)) - { - if (!isDateTime) - { - rDateTime.Year = date.Year; - rDateTime.Month = date.Month; - rDateTime.Day = date.Day; - rDateTime.Hours = 0; - rDateTime.Minutes = 0; - rDateTime.Seconds = 0; - rDateTime.NanoSeconds = 0; - // FIXME -#if 0 - rDateTime.IsUTC = date.IsUTC; -#endif - } - return true; - } - else - { - return false; - } + return parseDateOrDateTime(0, rDateTime, isDateTime, pTimeZoneOffset, + rString); } static bool lcl_isLeapYear(const sal_uInt32 nYear) @@ -1456,9 +1451,11 @@ readDateTimeComponent(const OUString & rString, /** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ -bool Converter::convertDateOrDateTime( - util::Date & rDate, util::DateTime & rDateTime, - bool & rbDateTime, const OUString & rString ) +bool Converter::parseDateOrDateTime( + util::Date *const pDate, util::DateTime & rDateTime, + bool & rbDateTime, + boost::optional<sal_Int16> *const pTimeZoneOffset, + const OUString & rString ) { bool bSuccess = true; bool isNegative(false); @@ -1655,10 +1652,9 @@ bool Converter::convertDateOrDateTime( if (bSuccess) { - sal_uInt16 * pTimezone(0); // FIXME pass this as parameter sal_Int16 const nTimezoneOffset = ((bHaveTimezoneMinus) ? (-1) : (+1)) * ((nTimezoneHours * 60) + nTimezoneMinutes); - if (bHaveTime) // time is optional + if (!pDate || bHaveTime) // time is optional { rDateTime.Year = ((isNegative) ? (-1) : (+1)) * static_cast<sal_Int16>(nYear); @@ -1670,9 +1666,9 @@ bool Converter::convertDateOrDateTime( rDateTime.NanoSeconds = static_cast<sal_uInt32>(nNanoSeconds); if (bHaveTimezone) { - if (pTimezone) + if (pTimeZoneOffset) { - *pTimezone = nTimezoneOffset; + *pTimeZoneOffset = nTimezoneOffset; rDateTime.IsUTC = (0 == nTimezoneOffset); } else @@ -1685,21 +1681,25 @@ bool Converter::convertDateOrDateTime( } else { + if (pTimeZoneOffset) + { + pTimeZoneOffset->reset(); + } rDateTime.IsUTC = false; } - rbDateTime = true; + rbDateTime = bHaveTime; } else { - rDate.Year = + pDate->Year = ((isNegative) ? (-1) : (+1)) * static_cast<sal_Int16>(nYear); - rDate.Month = static_cast<sal_uInt16>(nMonth); - rDate.Day = static_cast<sal_uInt16>(nDay); + pDate->Month = static_cast<sal_uInt16>(nMonth); + pDate->Day = static_cast<sal_uInt16>(nDay); if (bHaveTimezone) { - if (pTimezone) + if (pTimeZoneOffset) { - *pTimezone = nTimezoneOffset; + *pTimeZoneOffset = nTimezoneOffset; } else { @@ -1707,6 +1707,13 @@ bool Converter::convertDateOrDateTime( SAL_INFO("sax", "dropping timezone"); } } + else + { + if (pTimeZoneOffset) + { + pTimeZoneOffset->reset(); + } + } rbDateTime = false; } } @@ -2447,7 +2454,7 @@ bool Converter::convertAny(OUStringBuffer& rsValue, aTempValue.Seconds = 0; aTempValue.Minutes = 0; aTempValue.Hours = 0; - ::sax::Converter::convertDateTime(rsValue, aTempValue); + ::sax::Converter::convertDateTime(rsValue, aTempValue, 0); } else if (rValue >>= aTime) @@ -2469,7 +2476,7 @@ bool Converter::convertAny(OUStringBuffer& rsValue, { rsType.appendAscii("date"); bConverted = true; - ::sax::Converter::convertDateTime(rsValue, aDateTime); + ::sax::Converter::convertDateTime(rsValue, aDateTime, 0); } } break; diff --git a/sc/source/filter/xml/XMLCalculationSettingsContext.cxx b/sc/source/filter/xml/XMLCalculationSettingsContext.cxx index 104707b4cf51..c85644748435 100644 --- a/sc/source/filter/xml/XMLCalculationSettingsContext.cxx +++ b/sc/source/filter/xml/XMLCalculationSettingsContext.cxx @@ -171,7 +171,7 @@ ScXMLNullDateContext::ScXMLNullDateContext( ScXMLImport& rImport, if (nPrefix == XML_NAMESPACE_TABLE && IsXMLToken(aLocalName, XML_DATE_VALUE)) { util::DateTime aDateTime; - ::sax::Converter::convertDateTime(aDateTime, sValue); + ::sax::Converter::parseDateTime(aDateTime, 0, sValue); util::Date aDate; aDate.Day = aDateTime.Day; aDate.Month = aDateTime.Month; diff --git a/sc/source/filter/xml/XMLConverter.cxx b/sc/source/filter/xml/XMLConverter.cxx index da1259218492..4d8b7dbad014 100644 --- a/sc/source/filter/xml/XMLConverter.cxx +++ b/sc/source/filter/xml/XMLConverter.cxx @@ -341,7 +341,7 @@ void ScXMLConverter::ConvertDateTimeToString(const DateTime& aDateTime, OUString { util::DateTime aAPIDateTime; ConvertCoreToAPIDateTime(aDateTime, aAPIDateTime); - ::sax::Converter::convertDateTime(sDate, aAPIDateTime); + ::sax::Converter::convertDateTime(sDate, aAPIDateTime, 0); } void ScXMLConverter::ConvertCoreToAPIDateTime(const DateTime& aDateTime, util::DateTime& rDateTime) diff --git a/sc/source/filter/xml/XMLTrackedChangesContext.cxx b/sc/source/filter/xml/XMLTrackedChangesContext.cxx index 625e66b2e876..b66b08131724 100644 --- a/sc/source/filter/xml/XMLTrackedChangesContext.cxx +++ b/sc/source/filter/xml/XMLTrackedChangesContext.cxx @@ -681,7 +681,7 @@ SvXMLImportContext *ScXMLChangeInfoContext::CreateChildContext( sal_uInt16 nPref void ScXMLChangeInfoContext::EndElement() { aInfo.sUser = sAuthorBuffer.makeStringAndClear(); - ::sax::Converter::convertDateTime(aInfo.aDateTime, + ::sax::Converter::parseDateTime(aInfo.aDateTime, 0, sDateTimeBuffer.makeStringAndClear()); aInfo.sComment = sCommentBuffer.makeStringAndClear(); pChangeTrackingImportHelper->SetActionInfo(aInfo); diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx index c741c3959e4a..33c968d94e6d 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -41,7 +41,8 @@ #include <com/sun/star/beans/XPropertyContainer.hpp> #include <com/sun/star/util/DateTime.hpp> #include <com/sun/star/util/Date.hpp> -#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/util/DateTimeWithTimezone.hpp> +#include <com/sun/star/util/DateWithTimezone.hpp> #include <com/sun/star/util/Duration.hpp> #include <com/sun/star/document/XDocumentProperties.hpp> @@ -1715,6 +1716,8 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) OUString sTmpValue; util::DateTime aTmpDateTime; util::Date aTmpDate; + util::DateTimeWithTimezone aTmpDateTimeTZ; + util::DateWithTimezone aTmpDateTZ; util::Duration aTmpDuration; SvtSysLocale aSysLocale; const LocaleDataWrapper& rLocaleWrapper = aSysLocale.GetLocaleData(); @@ -1741,22 +1744,38 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) } else if ( rAny >>= aTmpDate ) { - nType = CUSTOM_TYPE_DATE; pNewLine->m_aDateField.SetDate( Date( aTmpDate.Day, aTmpDate.Month, aTmpDate.Year ) ); - - } - else if ( rAny >>= aTmpDuration ) - { - nType = CUSTOM_TYPE_DURATION; - pNewLine->m_aDurationField.SetDuration( aTmpDuration ); + nType = CUSTOM_TYPE_DATE; } else if ( rAny >>= aTmpDateTime ) { pNewLine->m_aDateField.SetDate( Date( aTmpDateTime.Day, aTmpDateTime.Month, aTmpDateTime.Year ) ); pNewLine->m_aTimeField.SetTime( Time( aTmpDateTime.Hours, aTmpDateTime.Minutes, aTmpDateTime.Seconds, aTmpDateTime.NanoSeconds ) ); - + pNewLine->m_aTimeField.m_isUTC = aTmpDateTime.IsUTC; nType = CUSTOM_TYPE_DATETIME; } + else if ( rAny >>= aTmpDateTZ ) + { + pNewLine->m_aDateField.SetDate( Date( aTmpDateTZ.DateInTZ.Day, + aTmpDateTZ.DateInTZ.Month, aTmpDateTZ.DateInTZ.Year ) ); + pNewLine->m_aDateField.m_TZ = aTmpDateTZ.Timezone; + nType = CUSTOM_TYPE_DATE; + } + else if ( rAny >>= aTmpDateTimeTZ ) + { + util::DateTime const& rDT(aTmpDateTimeTZ.DateTimeInTZ); + pNewLine->m_aDateField.SetDate( Date( rDT.Day, rDT.Month, rDT.Year ) ); + pNewLine->m_aTimeField.SetTime( Time( rDT.Hours, rDT.Minutes, + rDT.Seconds, rDT.NanoSeconds ) ); + pNewLine->m_aTimeField.m_isUTC = rDT.IsUTC; + pNewLine->m_aDateField.m_TZ = aTmpDateTimeTZ.Timezone; + nType = CUSTOM_TYPE_DATETIME; + } + else if ( rAny >>= aTmpDuration ) + { + nType = CUSTOM_TYPE_DURATION; + pNewLine->m_aDurationField.SetDuration( aTmpDuration ); + } if ( nType != CUSTOM_TYPE_UNKNOWN ) { @@ -1870,20 +1889,35 @@ Sequence< beans::PropertyValue > CustomPropertiesWindow::GetCustomProperties() c util::DateTime const aDateTime(aTmpTime.GetNanoSec(), aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear(), - false); - aPropertiesSeq[i].Value <<= aDateTime; - } - else if ( CUSTOM_TYPE_DURATION == nType ) - { - aPropertiesSeq[i].Value <<= pLine->m_aDurationField.GetDuration(); + pLine->m_aTimeField.m_isUTC); + if (pLine->m_aDateField.m_TZ.is_initialized()) + { + aPropertiesSeq[i].Value <<= util::DateTimeWithTimezone( + aDateTime, pLine->m_aDateField.m_TZ.get()); + } + else + { + aPropertiesSeq[i].Value <<= aDateTime; + } } else if ( CUSTOM_TYPE_DATE == nType ) { Date aTmpDate = pLine->m_aDateField.GetDate(); util::Date const aDate(aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear()); - aPropertiesSeq[i].Value <<= aDate; - + if (pLine->m_aDateField.m_TZ.is_initialized()) + { + aPropertiesSeq[i].Value <<= util::DateWithTimezone( + aDate, pLine->m_aDateField.m_TZ.get()); + } + else + { + aPropertiesSeq[i].Value <<= aDate; + } + } + else if ( CUSTOM_TYPE_DURATION == nType ) + { + aPropertiesSeq[i].Value <<= pLine->m_aDurationField.GetDuration(); } else { diff --git a/sfx2/source/doc/SfxDocumentMetaData.cxx b/sfx2/source/doc/SfxDocumentMetaData.cxx index 520db84f3e12..f1fe1233b4a0 100644 --- a/sfx2/source/doc/SfxDocumentMetaData.cxx +++ b/sfx2/source/doc/SfxDocumentMetaData.cxx @@ -54,6 +54,8 @@ #include "com/sun/star/xml/xpath/XPathAPI.hpp" #include "com/sun/star/util/Date.hpp" #include "com/sun/star/util/Time.hpp" +#include "com/sun/star/util/DateWithTimezone.hpp" +#include "com/sun/star/util/DateTimeWithTimezone.hpp" #include "com/sun/star/util/Duration.hpp" #include "SfxDocumentMetaData.hxx" @@ -530,10 +532,11 @@ OUString SAL_CALL getNameSpace(const char* i_qname) throw () bool SAL_CALL textToDateOrDateTime(css::util::Date & io_rd, css::util::DateTime & io_rdt, - bool & o_rIsDateTime, OUString i_text) throw () + bool & o_rIsDateTime, boost::optional<sal_Int16> & o_rTimeZone, + OUString i_text) throw () { - if (::sax::Converter::convertDateOrDateTime( - io_rd, io_rdt, o_rIsDateTime, i_text)) { + if (::sax::Converter::parseDateOrDateTime( + &io_rd, io_rdt, o_rIsDateTime, &o_rTimeZone, i_text)) { return true; } else { DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", @@ -546,7 +549,7 @@ textToDateOrDateTime(css::util::Date & io_rd, css::util::DateTime & io_rdt, bool SAL_CALL textToDateTime(css::util::DateTime & io_rdt, OUString i_text) throw () { - if (::sax::Converter::convertDateTime(io_rdt, i_text)) { + if (::sax::Converter::parseDateTime(io_rdt, 0, i_text)) { return true; } else { DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", @@ -567,11 +570,12 @@ textToDateTimeDefault(OUString i_text) throw () // convert date to string OUString SAL_CALL -dateToText(css::util::Date const& i_rd) throw () +dateToText(css::util::Date const& i_rd, + sal_Int16 const*const pTimeZone = 0) throw () { if (isValidDate(i_rd)) { OUStringBuffer buf; - ::sax::Converter::convertDate(buf, i_rd); + ::sax::Converter::convertDate(buf, i_rd, pTimeZone); return buf.makeStringAndClear(); } else { return OUString(); @@ -581,11 +585,12 @@ dateToText(css::util::Date const& i_rd) throw () // convert date/time to string OUString SAL_CALL -dateTimeToText(css::util::DateTime const& i_rdt) throw () +dateTimeToText(css::util::DateTime const& i_rdt, + sal_Int16 const*const pTimeZone = 0) throw () { if (isValidDateTime(i_rdt)) { OUStringBuffer buf; - ::sax::Converter::convertDateTime(buf, i_rdt, true); + ::sax::Converter::convertDateTime(buf, i_rdt, pTimeZone, true); return buf.makeStringAndClear(); } else { return OUString(); @@ -960,6 +965,18 @@ propsToStrings(css::uno::Reference<css::beans::XPropertySet> const & i_xPropSet) values.push_back(dateToText(d)); as.push_back(std::make_pair(vt, OUString("date"))); + } else if (type == ::cppu::UnoType<css::util::DateTimeWithTimezone>::get()) { + css::util::DateTimeWithTimezone dttz; + any >>= dttz; + values.push_back(dateTimeToText(dttz.DateTimeInTZ, &dttz.Timezone)); + as.push_back(std::make_pair(vt, + OUString("date"))); + } else if (type == ::cppu::UnoType<css::util::DateWithTimezone>::get()) { + css::util::DateWithTimezone dtz; + any >>= dtz; + values.push_back(dateToText(dtz.DateInTZ, &dtz.Timezone)); + as.push_back(std::make_pair(vt, + OUString("date"))); } else if (type == ::cppu::UnoType<css::util::Time>::get()) { // #i97029#: replaced by Duration // Time is supported for backward compatibility with OOo 3.x, x<=2 @@ -1293,11 +1310,21 @@ void SAL_CALL SfxDocumentMetaData::init( bool isDateTime; css::util::Date d; css::util::DateTime dt; - if (textToDateOrDateTime(d, dt, isDateTime, text)) { + boost::optional<sal_Int16> nTimeZone; + if (textToDateOrDateTime(d, dt, isDateTime, nTimeZone, text)) { if (isDateTime) { - any <<= dt; + if (nTimeZone.is_initialized()) { + any <<= css::util::DateTimeWithTimezone(dt, + nTimeZone.get()); + } else { + any <<= dt; + } } else { - any <<= d; + if (nTimeZone.is_initialized()) { + any <<= css::util::DateWithTimezone(d, nTimeZone.get()); + } else { + any <<= d; + } } } else { DBG_WARNING1("SfxDocumentMetaData: invalid date: %s", @@ -2261,19 +2288,21 @@ void SfxDocumentMetaData::createUserDefined() // values of allowed types if ( !m_xUserDefined.is() ) { - css::uno::Sequence<css::uno::Type> types(11); - types[0] = ::cppu::UnoType<bool>::get(); - types[1] = ::cppu::UnoType< OUString>::get(); - types[2] = ::cppu::UnoType<css::util::DateTime>::get(); - types[3] = ::cppu::UnoType<css::util::Date>::get(); - types[4] = ::cppu::UnoType<css::util::Duration>::get(); - types[5] = ::cppu::UnoType<float>::get(); - types[6] = ::cppu::UnoType<double>::get(); - types[7] = ::cppu::UnoType<sal_Int16>::get(); - types[8] = ::cppu::UnoType<sal_Int32>::get(); - types[9] = ::cppu::UnoType<sal_Int64>::get(); + css::uno::Sequence<css::uno::Type> types(13); + types[ 0] = ::cppu::UnoType<bool>::get(); + types[ 1] = ::cppu::UnoType< OUString>::get(); + types[ 2] = ::cppu::UnoType<css::util::DateTime>::get(); + types[ 3] = ::cppu::UnoType<css::util::Date>::get(); + types[ 4] = ::cppu::UnoType<css::util::DateTimeWithTimezone>::get(); + types[ 5] = ::cppu::UnoType<css::util::DateWithTimezone>::get(); + types[ 6] = ::cppu::UnoType<css::util::Duration>::get(); + types[ 7] = ::cppu::UnoType<float>::get(); + types[ 8] = ::cppu::UnoType<double>::get(); + types[ 9] = ::cppu::UnoType<sal_Int16>::get(); + types[10] = ::cppu::UnoType<sal_Int32>::get(); + types[11] = ::cppu::UnoType<sal_Int64>::get(); // Time is supported for backward compatibility with OOo 3.x, x<=2 - types[10] = ::cppu::UnoType<css::util::Time>::get(); + types[12] = ::cppu::UnoType<css::util::Time>::get(); // #i94175#: ODF allows empty user-defined property names! m_xUserDefined.set( css::beans::PropertyBag::createWithTypes( m_xContext, types, sal_True/*AllowEmptyPropertyName*/, sal_False/*AutomaticAddition*/ ), diff --git a/xmloff/source/chart/SchXMLCalculationSettingsContext.cxx b/xmloff/source/chart/SchXMLCalculationSettingsContext.cxx index 33971e260969..b875aa727151 100644 --- a/xmloff/source/chart/SchXMLCalculationSettingsContext.cxx +++ b/xmloff/source/chart/SchXMLCalculationSettingsContext.cxx @@ -53,7 +53,7 @@ SchXMLCalculationSettingsContext::SchXMLCalculationSettingsContext( SvXMLImport& { util::DateTime aNullDate; const OUString sValue = xAttrList->getValueByIndex( i ); - ::sax::Converter::convertDateTime(aNullDate, sValue); + ::sax::Converter::parseDateTime(aNullDate, 0, sValue); m_aNullDate <<= aNullDate; } } diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx index 5602ea6d62a4..f66f062dfe14 100644 --- a/xmloff/source/chart/SchXMLExport.cxx +++ b/xmloff/source/chart/SchXMLExport.cxx @@ -1212,7 +1212,7 @@ void SchXMLExportHelper_Impl::parseDocument( Reference< chart::XChartDocument >& SvXMLElementExport aSet( mrExport, XML_NAMESPACE_TABLE, XML_CALCULATION_SETTINGS, sal_True, sal_True ); { OUStringBuffer sBuffer; - ::sax::Converter::convertDateTime(sBuffer, aNullDate); + ::sax::Converter::convertDateTime(sBuffer, aNullDate, 0); mrExport.AddAttribute( XML_NAMESPACE_TABLE,XML_DATE_VALUE,sBuffer.makeStringAndClear()); SvXMLElementExport aNull( mrExport, XML_NAMESPACE_TABLE, XML_NULL_DATE, sal_True, sal_True ); } diff --git a/xmloff/source/core/DocumentSettingsContext.cxx b/xmloff/source/core/DocumentSettingsContext.cxx index f0a40fe87e06..b741d51e796d 100644 --- a/xmloff/source/core/DocumentSettingsContext.cxx +++ b/xmloff/source/core/DocumentSettingsContext.cxx @@ -631,7 +631,7 @@ void XMLConfigItemContext::EndElement() else if (IsXMLToken(msType, XML_DATETIME)) { util::DateTime aDateTime; - ::sax::Converter::convertDateTime(aDateTime, msValue); + ::sax::Converter::parseDateTime(aDateTime, 0, msValue); mrAny <<= aDateTime; } else if (IsXMLToken(msType, XML_BASE64BINARY)) diff --git a/xmloff/source/core/SettingsExportHelper.cxx b/xmloff/source/core/SettingsExportHelper.cxx index 1f0fbf0a1045..a2ff42abfe07 100644 --- a/xmloff/source/core/SettingsExportHelper.cxx +++ b/xmloff/source/core/SettingsExportHelper.cxx @@ -267,7 +267,7 @@ void XMLSettingsExportHelper::exportDateTime(const util::DateTime& aValue, const m_rContext.AddAttribute( XML_NAME, rName ); m_rContext.AddAttribute( XML_TYPE, XML_DATETIME ); OUStringBuffer sBuffer; - ::sax::Converter::convertDateTime(sBuffer, aValue); + ::sax::Converter::convertDateTime(sBuffer, aValue, 0); m_rContext.StartElement( XML_CONFIG_ITEM, sal_True ); m_rContext.Characters( sBuffer.makeStringAndClear() ); m_rContext.EndElement( sal_False ); diff --git a/xmloff/source/core/xmluconv.cxx b/xmloff/source/core/xmluconv.cxx index 0026161f3f12..efa5ba6b047e 100644 --- a/xmloff/source/core/xmluconv.cxx +++ b/xmloff/source/core/xmluconv.cxx @@ -428,7 +428,7 @@ sal_Bool SvXMLUnitConverter::convertDateTime( double& fDateTime, const OUString& rString, const com::sun::star::util::Date& aTempNullDate) { com::sun::star::util::DateTime aDateTime; - sal_Bool bSuccess = ::sax::Converter::convertDateTime(aDateTime, rString); + bool bSuccess = ::sax::Converter::parseDateTime(aDateTime, 0, rString); if (bSuccess) { diff --git a/xmloff/source/draw/sdxmlexp.cxx b/xmloff/source/draw/sdxmlexp.cxx index e2b9c29c77b8..34beb140cd4b 100644 --- a/xmloff/source/draw/sdxmlexp.cxx +++ b/xmloff/source/draw/sdxmlexp.cxx @@ -2773,7 +2773,7 @@ void SdXMLExport::exportAnnotations( const Reference<XDrawPage>& xDrawPage ) { // date time com::sun::star::util::DateTime aDate( xAnnotation->getDateTime() ); - ::sax::Converter::convertDateTime(sStringBuffer, aDate, true); + ::sax::Converter::convertDateTime(sStringBuffer, aDate, 0, true); SvXMLElementExport aDateElem( *this, XML_NAMESPACE_DC, XML_DATE, sal_True, sal_False ); Characters(sStringBuffer.makeStringAndClear()); } diff --git a/xmloff/source/draw/ximppage.cxx b/xmloff/source/draw/ximppage.cxx index 3c42b2d0a48a..f56af25022c0 100644 --- a/xmloff/source/draw/ximppage.cxx +++ b/xmloff/source/draw/ximppage.cxx @@ -192,7 +192,7 @@ void DrawAnnotationContext::EndElement() mxAnnotation->setAuthor( maAuthorBuffer.makeStringAndClear() ); util::DateTime aDateTime; - if (::sax::Converter::convertDateTime(aDateTime, + if (::sax::Converter::parseDateTime(aDateTime, 0, maDateBuffer.makeStringAndClear())) { mxAnnotation->setDateTime(aDateTime); diff --git a/xmloff/source/forms/handler/vcl_date_handler.cxx b/xmloff/source/forms/handler/vcl_date_handler.cxx index b306a65ce04b..a1ac74ec265b 100644 --- a/xmloff/source/forms/handler/vcl_date_handler.cxx +++ b/xmloff/source/forms/handler/vcl_date_handler.cxx @@ -66,7 +66,7 @@ namespace xmloff aDateTime.Year = aVCLDate.GetYear(); OUStringBuffer aBuffer; - ::sax::Converter::convertDateTime( aBuffer, aDateTime, false ); + ::sax::Converter::convertDateTime( aBuffer, aDateTime, 0, false ); return aBuffer.makeStringAndClear(); } @@ -76,7 +76,7 @@ namespace xmloff sal_Int32 nVCLDate(0); DateTime aDateTime; - if (::sax::Converter::convertDateTime( aDateTime, i_attributeValue )) + if (::sax::Converter::parseDateTime( aDateTime, 0, i_attributeValue )) { ::Date aVCLDate( aDateTime.Day, aDateTime.Month, aDateTime.Year ); nVCLDate = aVCLDate.GetDate(); diff --git a/xmloff/source/text/XMLChangedRegionImportContext.cxx b/xmloff/source/text/XMLChangedRegionImportContext.cxx index bb4e45167098..541554a45a12 100644 --- a/xmloff/source/text/XMLChangedRegionImportContext.cxx +++ b/xmloff/source/text/XMLChangedRegionImportContext.cxx @@ -162,7 +162,7 @@ void XMLChangedRegionImportContext::SetChangeInfo( const OUString& rDate) { util::DateTime aDateTime; - if (::sax::Converter::convertDateTime(aDateTime, rDate)) + if (::sax::Converter::parseDateTime(aDateTime, 0, rDate)) { GetImport().GetTextImport()->RedlineAdd( rType, sID, rAuthor, rComment, aDateTime, bMergeLastPara); diff --git a/xmloff/source/text/XMLRedlineExport.cxx b/xmloff/source/text/XMLRedlineExport.cxx index 6cc8f2d74c36..7508dcc4eee2 100644 --- a/xmloff/source/text/XMLRedlineExport.cxx +++ b/xmloff/source/text/XMLRedlineExport.cxx @@ -484,7 +484,7 @@ void XMLRedlineExport::ExportChangeInfo( aAny >>= aDateTime; { OUStringBuffer sBuf; - ::sax::Converter::convertDateTime(sBuf, aDateTime); + ::sax::Converter::convertDateTime(sBuf, aDateTime, 0); SvXMLElementExport aDateElem( rExport, XML_NAMESPACE_DC, XML_DATE, sal_True, sal_False ); @@ -525,7 +525,7 @@ void XMLRedlineExport::ExportChangeInfo( util::DateTime aDateTime; rVal.Value >>= aDateTime; OUStringBuffer sBuf; - ::sax::Converter::convertDateTime(sBuf, aDateTime); + ::sax::Converter::convertDateTime(sBuf, aDateTime, 0); rExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_CHG_DATE_TIME, sBuf.makeStringAndClear()); } diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index b034cba289c1..2adbfafc9953 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -1745,7 +1745,7 @@ void XMLTextFieldExport::ExportFieldHelper( util::DateTime aDate( GetDateTimeProperty(sPropertyDateTimeValue, rPropSet) ); { OUStringBuffer aBuffer; - ::sax::Converter::convertDateTime(aBuffer, aDate, true); + ::sax::Converter::convertDateTime(aBuffer, aDate, 0, true); SvXMLElementExport aDateElem( GetExport(), XML_NAMESPACE_DC, XML_DATE, sal_True, sal_False ); @@ -2652,7 +2652,7 @@ void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName, } // date/time value - ::sax::Converter::convertDateTime(aBuffer, aDateTime); + ::sax::Converter::convertDateTime(aBuffer, aDateTime, 0); // output attribute ProcessString(eName, aBuffer.makeStringAndClear(), sal_True, nPrefix); diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx index c4af925d8143..d793ab66d8e7 100644 --- a/xmloff/source/text/txtfldi.cxx +++ b/xmloff/source/text/txtfldi.cxx @@ -1114,7 +1114,7 @@ void XMLTimeFieldImportContext::ProcessAttribute( bTimeOK = sal_True; } - if (::sax::Converter::convertDateTime(aDateTimeValue, sAttrValue)) + if (::sax::Converter::parseDateTime(aDateTimeValue, 0, sAttrValue)) { bTimeOK = sal_True; } @@ -1255,7 +1255,7 @@ void XMLDateFieldImportContext::ProcessAttribute( bTimeOK = sal_True; } - if (::sax::Converter::convertDateTime(aDateTimeValue, sAttrValue)) + if (::sax::Converter::parseDateTime(aDateTimeValue, 0, sAttrValue)) { bTimeOK = sal_True; } @@ -3820,7 +3820,7 @@ void XMLAnnotationImportContext::PrepareField( xPropertySet->setPropertyValue(sPropertyInitials, makeAny(sInitials)); util::DateTime aDateTime; - if (::sax::Converter::convertDateTime(aDateTime, + if (::sax::Converter::parseDateTime(aDateTime, 0, aDateBuffer.makeStringAndClear())) { /* diff --git a/xmloff/source/xforms/SchemaRestrictionContext.cxx b/xmloff/source/xforms/SchemaRestrictionContext.cxx index 34b64ae12fcb..ad3b9a4c228c 100644 --- a/xmloff/source/xforms/SchemaRestrictionContext.cxx +++ b/xmloff/source/xforms/SchemaRestrictionContext.cxx @@ -201,7 +201,7 @@ Any xforms_date( const OUString& rValue ) Any xforms_dateTime( const OUString& rValue ) { util::DateTime aDateTime; - bool const bSuccess = ::sax::Converter::convertDateTime(aDateTime, rValue); + bool const bSuccess = ::sax::Converter::parseDateTime(aDateTime, 0, rValue); return bSuccess ? makeAny( aDateTime ) : Any(); } diff --git a/xmloff/source/xforms/xformsexport.cxx b/xmloff/source/xforms/xformsexport.cxx index 9f8ccabe5c77..424baf490933 100644 --- a/xmloff/source/xforms/xformsexport.cxx +++ b/xmloff/source/xforms/xformsexport.cxx @@ -693,7 +693,7 @@ void xforms_formatTime( OUStringBuffer& aBuffer, const com::sun::star::util::Tim void xforms_formatDateTime( OUStringBuffer& aBuffer, const util::DateTime& aDateTime ) { - ::sax::Converter::convertDateTime( aBuffer, aDateTime ); + ::sax::Converter::convertDateTime(aBuffer, aDateTime, 0); } OUString xforms_whitespace( const Any& rAny ) |