From 9830fd36dbdb72c79703b0c61efc027fba793c5a Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane Date: Sun, 17 Mar 2013 08:36:26 +0100 Subject: [PATCH] date/time IDL datatypes incompatible change - nanosecond precision - signed (allowed negative) year Also: assorted improvements / bugfixes in date/time handling code. Some factorisation of copy/pasted code. Change-Id: I761a1b0b8731c82f19a0c37acbcf43d3c06d6cd6 --- basic/source/runtime/methods.cxx | 2 +- comphelper/source/misc/anycompare.cxx | 4 +- comphelper/source/misc/types.cxx | 4 +- .../inc/connectivity/dbconversion.hxx | 10 +- connectivity/source/commontools/FValue.cxx | 8 +- .../source/commontools/dbconversion.cxx | 154 ++++--- connectivity/source/drivers/calc/CTable.cxx | 20 +- connectivity/source/drivers/dbase/DTable.cxx | 2 +- .../source/drivers/file/FDateFunctions.cxx | 4 +- .../source/drivers/jdbc/ConnectionLog.cxx | 8 +- .../source/drivers/kab/KResultSet.cxx | 2 +- .../source/drivers/macab/macabutilities.hxx | 2 +- .../odbcbase/ODatabaseMetaDataResultSet.cxx | 2 +- .../drivers/odbcbase/OPreparedStatement.cxx | 45 +- .../source/drivers/odbcbase/OResultSet.cxx | 2 +- .../source/drivers/postgresql/pq_tools.cxx | 21 +- connectivity/source/inc/odbc/OTools.hxx | 3 +- editeng/source/items/flditem.cxx | 2 +- editeng/source/uno/unofield.cxx | 4 +- extensions/source/logging/csvformatter.cxx | 4 +- extensions/source/logging/logrecord.cxx | 2 +- .../source/logging/plaintextformatter.cxx | 4 +- .../source/propctrlr/formcomponenthandler.cxx | 4 +- .../source/propctrlr/standardcontrol.cxx | 4 +- filter/source/msfilter/svdfppt.cxx | 5 +- forms/qa/integration/forms/TimeValidator.java | 4 +- forms/source/component/Time.cxx | 13 +- forms/source/xforms/convert.cxx | 102 +--- forms/source/xforms/datatypes.cxx | 13 +- framework/source/jobs/jobdata.cxx | 1 + .../DevelopersGuide/Forms/TimeValidator.java | 4 +- offapi/com/sun/star/util/Date.idl | 2 +- offapi/com/sun/star/util/DateTime.idl | 9 +- offapi/com/sun/star/util/DateTimeRange.idl | 13 +- offapi/com/sun/star/util/Duration.idl | 4 +- offapi/com/sun/star/util/Time.idl | 4 +- offapi/type_reference/types.rdb | Bin 7439872 -> 7439360 bytes oox/source/core/xmlfilterbase.cxx | 6 +- oox/source/dump/dumperbase.cxx | 10 +- oox/source/ppt/comments.cxx | 24 +- .../tests/java/mod/_forms/ODatabaseForm.java | 4 +- .../libreoffice/report/SDBCReportData.java | 2 +- .../source/filter/xml/xmlControlProperty.cxx | 10 +- sax/qa/cppunit/test_converter.cxx | 47 +- sax/source/tools/converter.cxx | 204 ++++---- sc/inc/chgtrack.hxx | 8 +- sc/source/core/data/dbdocutl.cxx | 12 +- sc/source/core/data/dpobject.cxx | 14 +- sc/source/core/tool/chgtrack.cxx | 4 +- sc/source/core/tool/chgviset.cxx | 2 +- sc/source/core/tool/interpr2.cxx | 19 +- sc/source/filter/html/htmlexp.cxx | 2 +- sc/source/filter/oox/unitconverter.cxx | 4 +- sc/source/filter/xcl97/XclExpChangeTrack.cxx | 6 +- sc/source/filter/xcl97/XclImpChangeTrack.cxx | 2 +- .../xml/XMLChangeTrackingImportHelper.cxx | 12 +- sc/source/filter/xml/XMLConverter.cxx | 4 +- sc/source/ui/docshell/docsh3.cxx | 12 +- sc/source/ui/miscdlgs/sharedocdlg.cxx | 2 +- sc/source/ui/unoobj/fielduno.cxx | 6 +- sc/source/ui/view/viewfun6.cxx | 8 +- scripting/source/pyprov/pythonscript.py | 2 +- sd/source/filter/eppt/eppt.cxx | 3 +- sd/source/filter/eppt/pptx-epptooxml.cxx | 2 +- .../ui/annotations/annotationmanager.cxx | 2 +- sd/source/ui/dlg/animobjs.cxx | 2 +- sfx2/qa/complex/sfx2/DocumentProperties.java | 10 +- sfx2/source/appl/sfxpicklist.cxx | 2 +- sfx2/source/bastyp/frmhtmlw.cxx | 4 +- sfx2/source/dialog/dinfdlg.cxx | 16 +- sfx2/source/dialog/versdlg.cxx | 2 +- sfx2/source/doc/SfxDocumentMetaData.cxx | 8 +- sfx2/source/doc/objcont.cxx | 8 +- sfx2/source/doc/oleprops.cxx | 6 +- sfx2/source/view/viewprn.cxx | 2 +- svl/source/items/dateitem.cxx | 4 +- svl/source/misc/fstathelper.cxx | 2 +- svtools/source/contnr/DocumentInfoPreview.cxx | 2 +- svtools/source/contnr/contentenumeration.cxx | 2 +- svtools/source/misc/templatefoldercache.cxx | 8 +- svtools/source/svhtml/parhtml.cxx | 2 +- svtools/source/table/cellvalueconversion.cxx | 4 +- svx/source/fmcomp/gridcell.cxx | 2 +- sw/source/core/doc/doccomp.cxx | 2 +- sw/source/core/doc/docglbl.cxx | 2 +- sw/source/core/doc/docredln.cxx | 2 +- sw/source/core/fields/docufld.cxx | 14 +- sw/source/core/fields/flddat.cxx | 4 +- sw/source/core/unocore/swunohelper.cxx | 2 +- sw/source/core/unocore/unoredline.cxx | 2 +- sw/source/filter/ww8/wrtww8.cxx | 6 +- sw/source/filter/ww8/ww8par.cxx | 2 +- .../filter/xml/XMLRedlineImportHelper.cxx | 2 +- tools/Library_tl.mk | 6 + tools/inc/tools/datetime.hxx | 4 +- tools/inc/tools/time.hxx | 50 +- tools/source/datetime/datetime.cxx | 18 +- tools/source/datetime/ttime.cxx | 250 ++++++---- tools/source/inet/inetmsg.cxx | 6 +- tools/source/rc/rc.cxx | 5 +- ucb/source/sorter/sortresult.cxx | 8 +- ucb/source/ucp/cmis/cmis_content.cxx | 10 +- ucb/source/ucp/file/shell.cxx | 2 +- ucb/source/ucp/ftp/ftpdirp.cxx | 6 +- ucb/source/ucp/ftp/ftpdirp.hxx | 8 +- unotools/inc/unotools/datetime.hxx | 6 + unotools/source/i18n/localedatawrapper.cxx | 32 +- unotools/source/misc/datetime.cxx | 434 +++++++++++++++++- unotools/source/ucbhelper/ucbhelper.cxx | 2 +- vcl/source/control/field2.cxx | 16 +- .../sun/star/wizards/common/JavaTools.java | 2 +- xmloff/source/core/xmluconv.cxx | 11 +- xmloff/source/draw/animationimport.cxx | 2 +- xmloff/source/draw/propimp0.cxx | 5 +- xmloff/source/forms/elementexport.cxx | 2 +- xmloff/source/forms/elementimport.cxx | 2 +- .../source/forms/handler/vcl_time_handler.cxx | 4 +- xmloff/source/forms/propertyexport.cxx | 12 +- xmloff/source/forms/propertyimport.cxx | 20 +- xmloff/source/style/durationhdl.cxx | 5 +- xmloff/source/text/txtflde.cxx | 2 +- .../xforms/SchemaRestrictionContext.cxx | 2 +- xmloff/source/xforms/xformsexport.cxx | 2 +- .../component/documentdigitalsignatures.cxx | 2 +- .../source/dialogs/resourcemanager.cxx | 2 +- .../source/helper/xmlsignaturehelper.cxx | 2 +- xmlsecurity/source/helper/xsecctl.cxx | 206 +-------- xmlsecurity/source/helper/xsecctl.hxx | 4 - xmlsecurity/source/helper/xsecverify.cxx | 3 +- .../mscrypt/x509certificate_mscryptimpl.cxx | 5 +- .../xmlsec/nss/x509certificate_nssimpl.cxx | 5 +- 131 files changed, 1311 insertions(+), 900 deletions(-) diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 0f5f76da4dce..b5da3b18c9af 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -3051,7 +3051,7 @@ RTLFUNC(FileDateTime) try { util::DateTime aUnoDT = xSFI->getDateTimeModified( aPath ); - aTime = Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.HundredthSeconds ); + aTime = Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.NanoSeconds ); aDate = Date( aUnoDT.Day, aUnoDT.Month, aUnoDT.Year ); } catch(const Exception & ) diff --git a/comphelper/source/misc/anycompare.cxx b/comphelper/source/misc/anycompare.cxx index 470be26794ce..775386e9c083 100644 --- a/comphelper/source/misc/anycompare.cxx +++ b/comphelper/source/misc/anycompare.cxx @@ -116,7 +116,7 @@ namespace comphelper if ( lhs.Seconds > rhs.Seconds ) return false; - if ( lhs.HundredthSeconds < rhs.HundredthSeconds ) + if ( lhs.NanoSeconds < rhs.NanoSeconds ) return true; return false; } @@ -166,7 +166,7 @@ namespace comphelper if ( lhs.Seconds > rhs.Seconds ) return false; - if ( lhs.HundredthSeconds < rhs.HundredthSeconds ) + if ( lhs.NanoSeconds < rhs.NanoSeconds ) return true; return false; } diff --git a/comphelper/source/misc/types.cxx b/comphelper/source/misc/types.cxx index e77176fb2351..fbf49f3a9408 100644 --- a/comphelper/source/misc/types.cxx +++ b/comphelper/source/misc/types.cxx @@ -44,7 +44,7 @@ using namespace ::com::sun::star::lang; //------------------------------------------------------------------------- sal_Bool operator ==(const DateTime& _rLeft, const DateTime& _rRight) { - return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) && + return ( _rLeft.NanoSeconds == _rRight.NanoSeconds) && ( _rLeft.Seconds == _rRight.Seconds) && ( _rLeft.Minutes == _rRight.Minutes) && ( _rLeft.Hours == _rRight.Hours) && @@ -64,7 +64,7 @@ sal_Bool operator ==(const Date& _rLeft, const Date& _rRight) //------------------------------------------------------------------------- sal_Bool operator ==(const Time& _rLeft, const Time& _rRight) { - return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) && + return ( _rLeft.NanoSeconds == _rRight.NanoSeconds) && ( _rLeft.Seconds == _rRight.Seconds) && ( _rLeft.Minutes == _rRight.Minutes) && ( _rLeft.Hours == _rRight.Hours) ; diff --git a/connectivity/inc/connectivity/dbconversion.hxx b/connectivity/inc/connectivity/dbconversion.hxx index e8516d1fcd35..9536c799ec81 100644 --- a/connectivity/inc/connectivity/dbconversion.hxx +++ b/connectivity/inc/connectivity/dbconversion.hxx @@ -111,7 +111,9 @@ namespace dbtools static ::com::sun::star::util::DateTime toDateTime(const OUString& _sSQLDate); + // TODO: consider removing getMsFromTime static sal_Int32 getMsFromTime(const ::com::sun::star::util::Time& rVal); + static sal_Int64 getNsFromTime(const ::com::sun::star::util::Time& rVal); static sal_Int32 toDays(const ::com::sun::star::util::Date& _rVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); @@ -120,10 +122,10 @@ namespace dbtools static double toDouble(const ::com::sun::star::util::DateTime& rVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); static sal_Int32 toINT32(const ::com::sun::star::util::Date& rVal); - static sal_Int32 toINT32(const ::com::sun::star::util::Time& rVal); + static sal_Int64 toINT64(const ::com::sun::star::util::Time& rVal); static ::com::sun::star::util::Date toDate(sal_Int32 _nVal); - static ::com::sun::star::util::Time toTime(sal_Int32 _nVal); + static ::com::sun::star::util::Time toTime(sal_Int64 _nVal); /** convert a double which is a date value relative to a given fixed date into a date value relative to the standard db null date. @@ -139,9 +141,9 @@ namespace dbtools // return the date in the format %04d-%02d-%02d static OUString toDateString(const ::com::sun::star::util::Date& rDate); - // return the time in the format %02d:%02d:%02d + // return the time in the format %02d:%02d:%02d.%09d static OUString toTimeString(const ::com::sun::star::util::Time& rTime); - // return the DateTime in the format %04d-%02d-%02d %02d:%02d:%02d + // return the DateTime in the format %04d-%02d-%02d %02d:%02d:%02d.%09d static OUString toDateTimeString(const ::com::sun::star::util::DateTime& _rDateTime); // return the any in an sql standard format static OUString toSQLString(sal_Int32 eType, const ::com::sun::star::uno::Any& _rVal, sal_Bool bQuote, diff --git a/connectivity/source/commontools/FValue.cxx b/connectivity/source/commontools/FValue.cxx index ef968fb9261e..770b34ea43c9 100644 --- a/connectivity/source/commontools/FValue.cxx +++ b/connectivity/source/commontools/FValue.cxx @@ -746,14 +746,14 @@ bool operator==(const Date& _rLH,const Date& _rRH) bool operator==(const Time& _rLH,const Time& _rRH) { - return _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.HundredthSeconds == _rRH.HundredthSeconds; + return _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.NanoSeconds == _rRH.NanoSeconds; } // ------------------------------------------------------------------------- bool operator==(const DateTime& _rLH,const DateTime& _rRH) { return _rLH.Day == _rRH.Day && _rLH.Month == _rRH.Month && _rLH.Year == _rRH.Year && - _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.HundredthSeconds == _rRH.HundredthSeconds; + _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.NanoSeconds == _rRH.NanoSeconds; } // ------------------------------------------------------------------------- @@ -2020,7 +2020,7 @@ Sequence ORowSetValue::getSequence() const case DataType::TIMESTAMP: { ::com::sun::star::util::DateTime* pDateTime = static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue); - aValue.HundredthSeconds = pDateTime->HundredthSeconds; + aValue.NanoSeconds = pDateTime->NanoSeconds; aValue.Seconds = pDateTime->Seconds; aValue.Minutes = pDateTime->Minutes; aValue.Hours = pDateTime->Hours; @@ -2073,7 +2073,7 @@ Sequence ORowSetValue::getSequence() const case DataType::TIME: { ::com::sun::star::util::Time* pTime = static_cast< ::com::sun::star::util::Time*>(m_aValue.m_pValue); - aValue.HundredthSeconds = pTime->HundredthSeconds; + aValue.NanoSeconds = pTime->NanoSeconds; aValue.Seconds = pTime->Seconds; aValue.Minutes = pTime->Minutes; aValue.Hours = pTime->Hours; diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx index 0af54185befd..cb8715102864 100644 --- a/connectivity/source/commontools/dbconversion.cxx +++ b/connectivity/source/commontools/dbconversion.cxx @@ -31,6 +31,20 @@ #define MAX_DAYS 3636532 +namespace +{ + const double fMilliSecondsPerDay = 86400000.0; + const sal_Int64 nanoSecInSec = 1000000000; + const sal_Int16 secInMin = 60; + const sal_Int16 minInHour = 60; + + const sal_Int64 secMask = 1000000000; + const sal_Int64 minMask = 100000000000; + const sal_Int64 hourMask = 10000000000000; + + const double fNanoSecondsPerDay = nanoSecInSec * secInMin * minInHour * 24.0; +} + //......................................................................... namespace dbtools { @@ -68,14 +82,15 @@ namespace dbtools //------------------------------------------------------------------ OUString DBTypeConversion::toTimeString(const Time& rTime) { - sal_Char s[9]; + const size_t buflen = 19; + sal_Char s[buflen]; snprintf(s, - sizeof(s), - "%02d:%02d:%02d", - (int)rTime.Hours, - (int)rTime.Minutes, - (int)rTime.Seconds); - s[8] = 0; + buflen, + "%02d:%02d:%02d.%09d", + rTime.Hours, + rTime.Minutes, + rTime.Seconds, + rTime.NanoSeconds); return OUString::createFromAscii(s); } @@ -85,10 +100,8 @@ namespace dbtools Date aDate(_rDateTime.Day,_rDateTime.Month,_rDateTime.Year); OUStringBuffer aTemp(toDateString(aDate)); aTemp.appendAscii(" "); - Time aTime(0,_rDateTime.Seconds,_rDateTime.Minutes,_rDateTime.Hours); + Time aTime(_rDateTime.NanoSeconds,_rDateTime.Seconds,_rDateTime.Minutes,_rDateTime.Hours); aTemp.append( toTimeString(aTime) ); - aTemp.appendAscii("."); - aTemp.append( static_cast(_rDateTime.HundredthSeconds)); return aTemp.makeStringAndClear(); } //------------------------------------------------------------------------------ @@ -102,17 +115,17 @@ namespace dbtools } //------------------------------------------------------------------------------ - Time DBTypeConversion::toTime(sal_Int32 _nVal) + Time DBTypeConversion::toTime(sal_Int64 _nVal) { Time aReturn; - aReturn.Hours = (sal_uInt16)(((sal_uInt32)(_nVal >= 0 ? _nVal : _nVal*-1)) / 1000000); - aReturn.Minutes = (sal_uInt16)((((sal_uInt32)(_nVal >= 0 ? _nVal : _nVal*-1)) / 10000) % 100); - aReturn.Seconds = (sal_uInt16)((((sal_uInt32)(_nVal >= 0 ? _nVal : _nVal*-1)) / 100) % 100); - aReturn.HundredthSeconds = (sal_uInt16)(((sal_uInt32)(_nVal >= 0 ? _nVal : _nVal*-1)) % 100); + sal_uInt64 unVal = static_cast(_nVal >= 0 ? _nVal : -_nVal); + aReturn.Hours = unVal / hourMask; + aReturn.Minutes = (unVal / minMask) % 100; + aReturn.Seconds = (unVal / secMask) % 100; + aReturn.NanoSeconds = unVal % secMask; return aReturn; } - const double fMilliSecondsPerDay = 86400000.0; //------------------------------------------------------------------------------ sal_Int32 DBTypeConversion::toINT32(const Date& rVal) { @@ -122,18 +135,21 @@ namespace dbtools } //------------------------------------------------------------------------------ - sal_Int32 DBTypeConversion::toINT32(const Time& rVal) + sal_Int64 DBTypeConversion::toINT64(const Time& rVal) { // normalize time - sal_Int32 nSeconds = rVal.Seconds + rVal.HundredthSeconds / 100; - sal_Int32 nHundredthSeconds = rVal.HundredthSeconds % 100; - sal_Int32 nMinutes = rVal.Minutes + nSeconds / 60; - nSeconds = nSeconds % 60; - sal_Int32 nHours = rVal.Hours + nMinutes / 60; - nMinutes = nMinutes % 60; + sal_Int32 nSeconds = rVal.Seconds + rVal.NanoSeconds / nanoSecInSec; + sal_Int32 nNanoSeconds = rVal.NanoSeconds % nanoSecInSec; + sal_Int32 nMinutes = rVal.Minutes + nSeconds / secInMin; + nSeconds = nSeconds % secInMin; + sal_Int32 nHours = rVal.Hours + nMinutes / minInHour; + nMinutes = nMinutes % minInHour; // assemble time - return (sal_Int32)(nHundredthSeconds + (nSeconds*100) + (nMinutes*10000) + (nHours*1000000)); + return nNanoSeconds + + nSeconds * secMask + + nMinutes * minMask + + nHours * hourMask; } //------------------------------------------------------------------------------ @@ -142,9 +158,23 @@ namespace dbtools sal_Int32 nHour = rVal.Hours; sal_Int32 nMin = rVal.Minutes; sal_Int32 nSec = rVal.Seconds; - sal_Int32 n100Sec = rVal.HundredthSeconds; + sal_Int32 nNanoSec = rVal.NanoSeconds; - return ((nHour*3600000)+(nMin*60000)+(nSec*1000)+(n100Sec*10)); + return ((nHour*3600000)+(nMin*60000)+(nSec*1000)+(nNanoSec/1000000)); + } + + //------------------------------------------------------------------------------ + sal_Int64 DBTypeConversion::getNsFromTime(const Time& rVal) + { + sal_Int32 nHour = rVal.Hours; + sal_Int32 nMin = rVal.Minutes; + sal_Int32 nSec = rVal.Seconds; + sal_Int32 nNanoSec = rVal.NanoSeconds; + + return nNanoSec + + nSec * nanoSecInSec + + nMin * (secInMin * nanoSecInSec) + + nHour * (minInHour * secInMin * nanoSecInSec); } //------------------------------------------------------------------------------ @@ -195,7 +225,7 @@ namespace dbtools return nDays; } //------------------------------------------------------------------------------ - static void implBuildFromRelative( sal_Int32 nDays, sal_uInt16& rDay, sal_uInt16& rMonth, sal_uInt16& rYear) + static void implBuildFromRelative( sal_Int32 nDays, sal_uInt16& rDay, sal_uInt16& rMonth, sal_Int16& rYear) { sal_Int32 nTempDays; sal_Int32 i = 0; @@ -250,7 +280,7 @@ namespace dbtools //------------------------------------------------------------------------------ double DBTypeConversion::toDouble(const Time& rVal) { - return (double)getMsFromTime(rVal) / fMilliSecondsPerDay; + return (double)getNsFromTime(rVal) / fNanoSecondsPerDay; } //------------------------------------------------------------------------------ @@ -262,7 +292,7 @@ namespace dbtools aTimePart.Hours = _rVal.Hours; aTimePart.Minutes = _rVal.Minutes; aTimePart.Seconds = _rVal.Seconds; - aTimePart.HundredthSeconds = _rVal.HundredthSeconds; + aTimePart.NanoSeconds = _rVal.NanoSeconds; return ((double)nTime) + toDouble(aTimePart); } @@ -325,12 +355,12 @@ namespace dbtools Time DBTypeConversion::toTime(double dVal) { sal_Int32 nDays = (sal_Int32)dVal; - sal_Int32 nMS = sal_Int32((dVal - (double)nDays) * fMilliSecondsPerDay + 0.5); + sal_Int32 nNS = sal_Int32((dVal - (double)nDays) * fNanoSecondsPerDay + 0.5); sal_Int16 nSign; - if ( nMS < 0 ) + if ( nNS < 0 ) { - nMS *= -1; + nNS *= -1; nSign = -1; } else @@ -339,24 +369,28 @@ namespace dbtools Time xRet; // normalize time // we have to sal_Int32 here because otherwise we get an overflow - sal_Int32 nHundredthSeconds = nMS/10; - sal_Int32 nSeconds = nHundredthSeconds / 100; - sal_Int32 nMinutes = nSeconds / 60; + sal_Int32 nNanoSeconds = nNS; + sal_Int32 nSeconds = nNanoSeconds / nanoSecInSec; + sal_Int32 nMinutes = nSeconds / secInMin; - xRet.HundredthSeconds = (sal_uInt16)(nHundredthSeconds % 100); - xRet.Seconds = (sal_uInt16)(nSeconds % 60); - xRet.Hours = (sal_uInt16)(nMinutes / 60); - xRet.Minutes = (sal_uInt16)(nMinutes % 60); + xRet.NanoSeconds = nNanoSeconds % nanoSecInSec; + xRet.Seconds = nSeconds % secInMin; + xRet.Hours = nMinutes / minInHour; + xRet.Minutes = nMinutes % minInHour; // assemble time - sal_Int32 nTime = (sal_Int32)(xRet.HundredthSeconds + (xRet.Seconds*100) + (xRet.Minutes*10000) + (xRet.Hours*1000000)) * nSign; + sal_Int64 nTime = nSign * + (xRet.NanoSeconds + + xRet.Seconds * secMask + + xRet.Minutes * minMask + + xRet.Hours * hourMask); if(nTime < 0) { - xRet.HundredthSeconds = 99; - xRet.Minutes = 59; - xRet.Seconds = 59; - xRet.Hours = 23; + xRet.NanoSeconds = nanoSecInSec-1; + xRet.Seconds = secInMin-1; + xRet.Minutes = minInHour-1; + xRet.Hours = 23; } return xRet; } @@ -368,14 +402,14 @@ namespace dbtools DateTime xRet; - xRet.Day = aDate.Day; - xRet.Month = aDate.Month; - xRet.Year = aDate.Year; + xRet.Day = aDate.Day; + xRet.Month = aDate.Month; + xRet.Year = aDate.Year; - xRet.HundredthSeconds = aTime.HundredthSeconds; - xRet.Minutes = aTime.Minutes; - xRet.Seconds = aTime.Seconds; - xRet.Hours = aTime.Hours; + xRet.NanoSeconds = aTime.NanoSeconds; + xRet.Minutes = aTime.Minutes; + xRet.Seconds = aTime.Seconds; + xRet.Hours = aTime.Hours; return xRet; @@ -415,7 +449,8 @@ namespace dbtools if ( -1 != nSeparation ) aTime = toTime( _sSQLString.copy( nSeparation ) ); - return DateTime(aTime.HundredthSeconds,aTime.Seconds,aTime.Minutes,aTime.Hours,aDate.Day,aDate.Month,aDate.Year); + return DateTime(aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, + aDate.Day, aDate.Month, aDate.Year); } //----------------------------------------------------------------------------- @@ -426,8 +461,8 @@ namespace dbtools sal_Int32 nIndex = 0; sal_uInt16 nHour = 0, nMinute = 0, - nSecond = 0, - nHundredthSeconds = 0; + nSecond = 0; + sal_uInt32 nNanoSeconds = 0; nHour = (sal_uInt16)_sSQLString.getToken(0,sTimeSep,nIndex).toInt32(); if(nIndex != -1) { @@ -437,17 +472,10 @@ namespace dbtools nSecond = (sal_uInt16)_sSQLString.getToken(0,sTimeSep,nIndex).toInt32(); nIndex = 0; OUString sNano(_sSQLString.getToken(1,'.',nIndex)); - if ( !sNano.isEmpty() ) - { - // our time struct only supports hundredth seconds - sNano = sNano.copy(0,::std::min(sNano.getLength(),2)); - const static OUString s_Zeros("00"); - sNano += s_Zeros.copy(0,s_Zeros.getLength() - sNano.getLength()); - nHundredthSeconds = static_cast(sNano.toInt32()); - } + nNanoSeconds = sNano.toInt32(); } } - return Time(nHundredthSeconds,nSecond,nMinute,nHour); + return Time(nNanoSeconds, nSecond, nMinute, nHour); } //......................................................................... diff --git a/connectivity/source/drivers/calc/CTable.cxx b/connectivity/source/drivers/calc/CTable.cxx index 1e37cc38ecc3..b509065cf68c 100644 --- a/connectivity/source/drivers/calc/CTable.cxx +++ b/connectivity/source/drivers/calc/CTable.cxx @@ -370,12 +370,12 @@ static void lcl_SetValue( ORowSetValue& rValue, const Reference& x { double fCellVal = xCell->getValue(); double fTime = fCellVal - rtl::math::approxFloor( fCellVal ); - long nIntTime = (long)rtl::math::round( fTime * 8640000.0 ); - if ( nIntTime == 8640000 ) - nIntTime = 0; // 23:59:59.995 and above is 00:00:00.00 + sal_Int64 nIntTime = static_cast(rtl::math::round( fTime * static_cast(::Time::nanoSecPerDay) )); + if ( nIntTime == ::Time::nanoSecPerDay) + nIntTime = 0; // 23:59:59.9999999995 and above is 00:00:00.00 ::com::sun::star::util::Time aTime; - aTime.HundredthSeconds = (sal_uInt16)( nIntTime % 100 ); - nIntTime /= 100; + aTime.NanoSeconds = (sal_uInt32)( nIntTime % ::Time::nanoSecPerSec ); + nIntTime /= ::Time::nanoSecPerSec; aTime.Seconds = (sal_uInt16)( nIntTime % 60 ); nIntTime /= 60; aTime.Minutes = (sal_uInt16)( nIntTime % 60 ); @@ -394,17 +394,17 @@ static void lcl_SetValue( ORowSetValue& rValue, const Reference& x double fDays = ::rtl::math::approxFloor( fCellVal ); double fTime = fCellVal - fDays; long nIntDays = (long)fDays; - long nIntTime = (long)::rtl::math::round( fTime * 8640000.0 ); - if ( nIntTime == 8640000 ) + sal_Int64 nIntTime = ::rtl::math::round( fTime * static_cast(::Time::nanoSecPerDay) ); + if ( nIntTime == ::Time::nanoSecPerDay ) { - nIntTime = 0; // 23:59:59.995 and above is 00:00:00.00 + nIntTime = 0; // 23:59:59.9999999995 and above is 00:00:00.00 ++nIntDays; // (next day) } ::com::sun::star::util::DateTime aDateTime; - aDateTime.HundredthSeconds = (sal_uInt16)( nIntTime % 100 ); - nIntTime /= 100; + aDateTime.NanoSeconds = (sal_uInt16)( nIntTime % ::Time::nanoSecPerSec ); + nIntTime /= ::Time::nanoSecPerSec; aDateTime.Seconds = (sal_uInt16)( nIntTime % 60 ); nIntTime /= 60; aDateTime.Minutes = (sal_uInt16)( nIntTime % 60 ); diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 61f3c8d01e71..7eef298f8f51 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -108,7 +108,7 @@ void lcl_CalcJulDate(sal_Int32& _nJulianDate,sal_Int32& _nJulianTime,const com:: aDateTime.Month++; } - _nJulianTime = ((aDateTime.Hours*3600000)+(aDateTime.Minutes*60000)+(aDateTime.Seconds*1000)+(aDateTime.HundredthSeconds*10)); + _nJulianTime = ((aDateTime.Hours*3600000)+(aDateTime.Minutes*60000)+(aDateTime.Seconds*1000)+(aDateTime.NanoSeconds/1000000)); /* conversion factors */ sal_uInt16 iy0; sal_uInt16 im0; diff --git a/connectivity/source/drivers/file/FDateFunctions.cxx b/connectivity/source/drivers/file/FDateFunctions.cxx index 03256f7ab7cc..a24c46d5c153 100644 --- a/connectivity/source/drivers/file/FDateFunctions.cxx +++ b/connectivity/source/drivers/file/FDateFunctions.cxx @@ -263,7 +263,7 @@ ORowSetValue OOp_CurTime::operate(const ::std::vector& lhs) const return ORowSetValue(); Time aCurTime( Time::SYSTEM ); - return ::com::sun::star::util::Time(aCurTime.Get100Sec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour()); + return ::com::sun::star::util::Time(aCurTime.GetNanoSec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour()); } //------------------------------------------------------------------ ORowSetValue OOp_Now::operate(const ::std::vector& lhs) const @@ -272,7 +272,7 @@ ORowSetValue OOp_Now::operate(const ::std::vector& lhs) const return ORowSetValue(); DateTime aCurTime( DateTime::SYSTEM ); - return ::com::sun::star::util::DateTime(aCurTime.Get100Sec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour(), + return ::com::sun::star::util::DateTime(aCurTime.GetNanoSec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour(), aCurTime.GetDay(),aCurTime.GetMonth(),aCurTime.GetYear()); } //------------------------------------------------------------------ diff --git a/connectivity/source/drivers/jdbc/ConnectionLog.cxx b/connectivity/source/drivers/jdbc/ConnectionLog.cxx index 550db58ec1ec..0216ad23186a 100644 --- a/connectivity/source/drivers/jdbc/ConnectionLog.cxx +++ b/connectivity/source/drivers/jdbc/ConnectionLog.cxx @@ -97,8 +97,8 @@ namespace comphelper { namespace log { namespace convert { char buffer[ 30 ]; const size_t buffer_size = sizeof( buffer ); - snprintf( buffer, buffer_size, "%02i:%02i:%02i.%02i", - (int)_rTime.Hours, (int)_rTime.Minutes, (int)_rTime.Seconds, (int)_rTime.HundredthSeconds ); + snprintf( buffer, buffer_size, "%02i:%02i:%02i.%09i", + (int)_rTime.Hours, (int)_rTime.Minutes, (int)_rTime.Seconds, (int)_rTime.NanoSeconds ); return OUString::createFromAscii( buffer ); } @@ -107,9 +107,9 @@ namespace comphelper { namespace log { namespace convert { char buffer[ 30 ]; const size_t buffer_size = sizeof( buffer ); - snprintf( buffer, buffer_size, "%04i-%02i-%02i %02i:%02i:%02i.%02i", + snprintf( buffer, buffer_size, "%04i-%02i-%02i %02i:%02i:%02i.%09i", (int)_rDateTime.Year, (int)_rDateTime.Month, (int)_rDateTime.Day, - (int)_rDateTime.Hours, (int)_rDateTime.Minutes, (int)_rDateTime.Seconds, (int)_rDateTime.HundredthSeconds ); + (int)_rDateTime.Hours, (int)_rDateTime.Minutes, (int)_rDateTime.Seconds, (int)_rDateTime.NanoSeconds ); return OUString::createFromAscii( buffer ); } diff --git a/connectivity/source/drivers/kab/KResultSet.cxx b/connectivity/source/drivers/kab/KResultSet.cxx index 0ba7e01518c4..faf61bc9a96c 100644 --- a/connectivity/source/drivers/kab/KResultSet.cxx +++ b/connectivity/source/drivers/kab/KResultSet.cxx @@ -344,7 +344,7 @@ DateTime SAL_CALL KabResultSet::getTimestamp(sal_Int32 columnIndex) throw(SQLExc nRet.Hours = nRevision.time().hour(); nRet.Minutes = nRevision.time().minute(); nRet.Seconds = nRevision.time().second(); - nRet.HundredthSeconds = nRevision.time().msec() / 10; + nRet.NanoSeconds = nRevision.time().msec() * ::Time::nanoPerMilli; return nRet; } } diff --git a/connectivity/source/drivers/macab/macabutilities.hxx b/connectivity/source/drivers/macab/macabutilities.hxx index b6afd1cbbe5f..a17bda266458 100644 --- a/connectivity/source/drivers/macab/macabutilities.hxx +++ b/connectivity/source/drivers/macab/macabutilities.hxx @@ -92,7 +92,7 @@ namespace connectivity nRet.Hours = ptm->tm_hour; nRet.Minutes = ptm->tm_min; nRet.Seconds = ptm->tm_sec; - nRet.HundredthSeconds = 0; + nRet.NanoSeconds = 0; return nRet; } diff --git a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx index 4e5a11350221..fec060d556c1 100644 --- a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx +++ b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx @@ -436,7 +436,7 @@ OUString SAL_CALL ODatabaseMetaDataResultSet::getString( sal_Int32 columnIndex ) OTools::getValue(m_pConnection,m_aStatementHandle,columnIndex,m_pConnection->useOldDateFormat() ? SQL_C_TIMESTAMP : SQL_C_TYPE_TIMESTAMP,m_bWasNull,**this,&aTime,sizeof aTime); else m_bWasNull = sal_True; - return DateTime((sal_uInt16)aTime.fraction/ODBC_FRACTION_UNITS_PER_HSECOND,aTime.second,aTime.minute,aTime.hour,aTime.day,aTime.month,aTime.year); + return DateTime(aTime.fraction,aTime.second,aTime.minute,aTime.hour,aTime.day,aTime.month,aTime.year); } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx b/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx index 9cca1903fe17..5d234c445ea4 100644 --- a/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx +++ b/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx @@ -411,14 +411,27 @@ void SAL_CALL OPreparedStatement::setDate( sal_Int32 parameterIndex, const Date& void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& aVal ) throw(SQLException, RuntimeException) { - const sal_uInt16 hundredths (aVal.HundredthSeconds); SQLULEN nColSize; - if(hundredths == 0) + if(aVal.NanoSeconds == 0) nColSize = 8; - else if(hundredths % 10 == 0) + else if(aVal.NanoSeconds % 100000000 == 0) nColSize = 10; - else + else if(aVal.NanoSeconds % 10000000 == 0) nColSize = 11; + else if(aVal.NanoSeconds % 1000000 == 0) + nColSize = 12; + else if(aVal.NanoSeconds % 100000 == 0) + nColSize = 13; + else if(aVal.NanoSeconds % 10000 == 0) + nColSize = 14; + else if(aVal.NanoSeconds % 1000 == 0) + nColSize = 15; + else if(aVal.NanoSeconds % 100 == 0) + nColSize = 16; + else if(aVal.NanoSeconds % 10 == 0) + nColSize = 17; + else + nColSize = 18; TIME_STRUCT x(OTools::TimeToOdbcTime(aVal)); setScalarParameter(parameterIndex, DataType::TIME, nColSize, x); } @@ -426,20 +439,32 @@ void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& void SAL_CALL OPreparedStatement::setTimestamp( sal_Int32 parameterIndex, const DateTime& aVal ) throw(SQLException, RuntimeException) { - sal_uInt16 s(aVal.Seconds); - sal_uInt16 hundredths(aVal.HundredthSeconds); SQLULEN nColSize; - if(hundredths == 0) + if(aVal.NanoSeconds == 0) { - if (s == 0) + if (aVal.Seconds == 0) nColSize=16; else nColSize=19; } - else if(hundredths % 10 == 0) + else if(aVal.NanoSeconds % 100000000 == 0) nColSize = 21; - else + else if(aVal.NanoSeconds % 10000000 == 0) nColSize = 22; + else if(aVal.NanoSeconds % 1000000 == 0) + nColSize = 23; + else if(aVal.NanoSeconds % 100000 == 0) + nColSize = 24; + else if(aVal.NanoSeconds % 10000 == 0) + nColSize = 25; + else if(aVal.NanoSeconds % 1000 == 0) + nColSize = 26; + else if(aVal.NanoSeconds % 100 == 0) + nColSize = 27; + else if(aVal.NanoSeconds % 10 == 0) + nColSize = 28; + else + nColSize = 29; TIMESTAMP_STRUCT x(OTools::DateTimeToTimestamp(aVal)); setScalarParameter(parameterIndex, DataType::TIMESTAMP, nColSize, x); diff --git a/connectivity/source/drivers/odbcbase/OResultSet.cxx b/connectivity/source/drivers/odbcbase/OResultSet.cxx index dcc7c88909b5..211ba70703ee 100644 --- a/connectivity/source/drivers/odbcbase/OResultSet.cxx +++ b/connectivity/source/drivers/odbcbase/OResultSet.cxx @@ -663,7 +663,7 @@ DateTime OResultSet::impl_getTimestamp( sal_Int32 columnIndex ) throw(SQLExcepti TIMESTAMP_STRUCT aTime = impl_getValue< TIMESTAMP_STRUCT > ( columnIndex, m_pStatement->getOwnConnection()->useOldDateFormat() ? SQL_C_TIMESTAMP : SQL_C_TYPE_TIMESTAMP ); - return DateTime(static_cast(aTime.fraction/ODBC_FRACTION_UNITS_PER_HSECOND), + return DateTime(aTime.fraction, aTime.second, aTime.minute, aTime.hour, diff --git a/connectivity/source/drivers/postgresql/pq_tools.cxx b/connectivity/source/drivers/postgresql/pq_tools.cxx index ccce76f018c1..a9be424d9b34 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.cxx +++ b/connectivity/source/drivers/postgresql/pq_tools.cxx @@ -107,6 +107,7 @@ namespace pq_sdbc_driver OUString date2String( const com::sun::star::util::Date & x ) { + // TODO FIXME: replace by DBTypeConversion::toDateString char buffer[64]; sprintf( buffer, "%d-%02d-%02d", x.Year, x.Month, x.Day ); return OUString::createFromAscii( buffer ); @@ -114,6 +115,7 @@ OUString date2String( const com::sun::star::util::Date & x ) com::sun::star::util::Date string2Date( const OUString &date ) { + // TODO FIXME: replace by DBTypeConversion::toDate (if it parses the same format) // Format: Year-Month-Day com::sun::star::util::Date ret; @@ -135,15 +137,17 @@ com::sun::star::util::Date string2Date( const OUString &date ) OUString time2String( const com::sun::star::util::Time & x ) { - char buffer[64]; - sprintf( buffer, "%02d:%02d:%02d.%02d", x.Hours, x.Minutes, x.Seconds, x.HundredthSeconds ); + // TODO FIXME: replace by DBTypeConversion::toTimeString + const size_t buflen = 19; + char buffer[buflen]; + snprintf( buffer, buflen, "%02d:%02d:%02d.%09d", x.Hours, x.Minutes, x.Seconds, x.NanoSeconds ); return OUString::createFromAscii( buffer ); - } com::sun::star::util::Time string2Time( const OUString & time ) { + // TODO FIXME: replace by DBTypeConversion::toTime com::sun::star::util::Time ret; sal_Unicode temp[4]; @@ -163,7 +167,8 @@ com::sun::star::util::Time string2Time( const OUString & time ) if( time.getLength() >9 ) { - ret.HundredthSeconds = (sal_Int32)rtl_ustr_toInt32( &time.getStr()[9] , 10 ); + // FIXME does not take into account shorter precision + ret.NanoSeconds = (sal_Int32)rtl_ustr_toInt32( &time.getStr()[9] , 10 ); } return ret; @@ -173,16 +178,18 @@ com::sun::star::util::Time string2Time( const OUString & time ) OUString dateTime2String( const com::sun::star::util::DateTime & x ) { + // TODO FIXME: replace by DBTypeConversion::toDateTimeString char buffer[128]; - sprintf( buffer, "%d-%02d-%02d %02d:%02d:%02d.%02d", + sprintf( buffer, "%d-%02d-%02d %02d:%02d:%02d.%09d", x.Year, x.Month, x.Day, - x.Hours, x.Minutes, x.Seconds, x.HundredthSeconds ); + x.Hours, x.Minutes, x.Seconds, x.NanoSeconds ); return OUString::createFromAscii( buffer ); } com::sun::star::util::DateTime string2DateTime( const OUString & dateTime ) { + // TODO FIXME: replace by DBTypeConversion::toDateTime (if same format) int space = dateTime.indexOf( ' ' ); com::sun::star::util::DateTime ret; @@ -197,7 +204,7 @@ com::sun::star::util::DateTime string2DateTime( const OUString & dateTime ) ret.Hours = time.Hours; ret.Minutes = time.Minutes; ret.Seconds = time.Seconds; - ret.HundredthSeconds = time.HundredthSeconds; + ret.NanoSeconds = time.NanoSeconds; } return ret; } diff --git a/connectivity/source/inc/odbc/OTools.hxx b/connectivity/source/inc/odbc/OTools.hxx index 79be84caf0d2..015e5f2a13ec 100644 --- a/connectivity/source/inc/odbc/OTools.hxx +++ b/connectivity/source/inc/odbc/OTools.hxx @@ -91,7 +91,6 @@ namespace connectivity { class OConnection; - const sal_uInt32 ODBC_FRACTION_UNITS_PER_HSECOND = 10000000L; const sal_Int32 MAX_PUT_DATA_LENGTH = 2000; class OOO_DLLPUBLIC_ODBCBASE OTools @@ -166,7 +165,7 @@ namespace connectivity aVal.hour = x.Hours; aVal.minute = x.Minutes; aVal.second = x.Seconds; - aVal.fraction = x.HundredthSeconds * ODBC_FRACTION_UNITS_PER_HSECOND; + aVal.fraction = x.NanoSeconds; return aVal; } /** diff --git a/editeng/source/items/flditem.cxx b/editeng/source/items/flditem.cxx index 0f4e2aeab093..bc67903341eb 100644 --- a/editeng/source/items/flditem.cxx +++ b/editeng/source/items/flditem.cxx @@ -85,7 +85,7 @@ SvxFieldData* SvxFieldData::Create(const uno::Reference& xTe if (nFieldType != text::textfield::Type::TIME && nFieldType != text::textfield::Type::DATE) { util::DateTime aDateTime = xPropSet->getPropertyValue(UNO_TC_PROP_DATE_TIME).get(); - Time aTime(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.HundredthSeconds); + Time aTime(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.NanoSeconds); sal_Bool bIsFixed = false; xPropSet->getPropertyValue(UNO_TC_PROP_IS_FIXED) >>= bIsFixed; diff --git a/editeng/source/uno/unofield.cxx b/editeng/source/uno/unofield.cxx index 9aa5b0b2b334..86a039b89f47 100644 --- a/editeng/source/uno/unofield.cxx +++ b/editeng/source/uno/unofield.cxx @@ -208,7 +208,7 @@ static util::DateTime getTime( long nTime ) Time aTempTime( nTime ); - aTime.HundredthSeconds = aTempTime.Get100Sec(); + aTime.NanoSeconds = aTempTime.GetNanoSec(); aTime.Seconds = aTempTime.GetSec(); aTime.Minutes = aTempTime.GetMin(); aTime.Hours = aTempTime.GetHour(); @@ -218,7 +218,7 @@ static util::DateTime getTime( long nTime ) inline Time setTime( util::DateTime& rDate ) { - return Time( rDate.Hours, rDate.Minutes, rDate.Seconds, rDate.HundredthSeconds ); + return Time( rDate.Hours, rDate.Minutes, rDate.Seconds, rDate.NanoSeconds ); } // ==================================================================== diff --git a/extensions/source/logging/csvformatter.cxx b/extensions/source/logging/csvformatter.cxx index 19b2a2b2b692..7bf518813c33 100644 --- a/extensions/source/logging/csvformatter.cxx +++ b/extensions/source/logging/csvformatter.cxx @@ -263,14 +263,14 @@ namespace logging // ISO 8601 char buffer[ 30 ]; const size_t buffer_size = sizeof( buffer ); - snprintf( buffer, buffer_size, "%04i-%02i-%02iT%02i:%02i:%02i.%02i", + snprintf( buffer, buffer_size, "%04i-%02i-%02iT%02i:%02i:%02i.%09i", (int)record.LogTime.Year, (int)record.LogTime.Month, (int)record.LogTime.Day, (int)record.LogTime.Hours, (int)record.LogTime.Minutes, (int)record.LogTime.Seconds, - (int)record.LogTime.HundredthSeconds ); + (int)record.LogTime.NanoSeconds ); aLogEntry.appendAscii( buffer ); aLogEntry.append(comma_char); } diff --git a/extensions/source/logging/logrecord.cxx b/extensions/source/logging/logrecord.cxx index ce9c8ba8d036..dfd0cb8f21d1 100644 --- a/extensions/source/logging/logrecord.cxx +++ b/extensions/source/logging/logrecord.cxx @@ -68,7 +68,7 @@ namespace logging aTimeStamp.Hours = aDateTime.Hours; aTimeStamp.Minutes = aDateTime.Minutes; aTimeStamp.Seconds = aDateTime.Seconds; - aTimeStamp.HundredthSeconds = ::sal::static_int_cast< sal_Int16 >( aDateTime.NanoSeconds / 10000000 ); + aTimeStamp.NanoSeconds = aDateTime.NanoSeconds; return LogRecord( _rLoggerName, diff --git a/extensions/source/logging/plaintextformatter.cxx b/extensions/source/logging/plaintextformatter.cxx index 7396263b8a24..7ce48752cc85 100644 --- a/extensions/source/logging/plaintextformatter.cxx +++ b/extensions/source/logging/plaintextformatter.cxx @@ -129,9 +129,9 @@ namespace logging aLogEntry.appendAscii( buffer ); aLogEntry.appendAscii( " " ); - snprintf( buffer, buffer_size, "%04i-%02i-%02i %02i:%02i:%02i.%02i", + snprintf( buffer, buffer_size, "%04i-%02i-%02i %02i:%02i:%02i.%09i", (int)_rRecord.LogTime.Year, (int)_rRecord.LogTime.Month, (int)_rRecord.LogTime.Day, - (int)_rRecord.LogTime.Hours, (int)_rRecord.LogTime.Minutes, (int)_rRecord.LogTime.Seconds, (int)_rRecord.LogTime.HundredthSeconds ); + (int)_rRecord.LogTime.Hours, (int)_rRecord.LogTime.Minutes, (int)_rRecord.LogTime.Seconds, (int)_rRecord.LogTime.NanoSeconds ); aLogEntry.appendAscii( buffer ); aLogEntry.appendAscii( " " ); diff --git a/extensions/source/propctrlr/formcomponenthandler.cxx b/extensions/source/propctrlr/formcomponenthandler.cxx index 2b68425ae3af..773a4e6e199d 100644 --- a/extensions/source/propctrlr/formcomponenthandler.cxx +++ b/extensions/source/propctrlr/formcomponenthandler.cxx @@ -590,7 +590,7 @@ namespace pcr { util::Time aTime; OSL_VERIFY( _rControlValue >>= aTime ); - aPropertyValue <<= (sal_Int32)DBTypeConversion::toINT32( aTime ); + aPropertyValue <<= DBTypeConversion::toINT64( aTime ); } break; @@ -726,7 +726,7 @@ namespace pcr case PROPERTY_ID_DEFAULT_TIME: case PROPERTY_ID_TIME: { - sal_Int32 nTime = 0; + sal_Int64 nTime = 0; OSL_VERIFY( _rPropertyValue >>= nTime ); aControlValue <<= DBTypeConversion::toTime( nTime ); } diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx index f9caaae10131..60f533ac9df1 100644 --- a/extensions/source/propctrlr/standardcontrol.cxx +++ b/extensions/source/propctrlr/standardcontrol.cxx @@ -87,7 +87,7 @@ namespace pcr } else { - ::Time aTime( aUNOTime.Hours, aUNOTime.Minutes, aUNOTime.Seconds, aUNOTime.HundredthSeconds ); + ::Time aTime( aUNOTime.Hours, aUNOTime.Minutes, aUNOTime.Seconds, aUNOTime.NanoSeconds ); getTypedControlWindow()->SetTime( aTime ); } } @@ -99,7 +99,7 @@ namespace pcr if ( !getTypedControlWindow()->GetText().isEmpty() ) { ::Time aTime( getTypedControlWindow()->GetTime() ); - util::Time aUNOTime( aTime.Get100Sec(), aTime.GetSec(), aTime.GetMin(), aTime.GetHour() ); + util::Time aUNOTime( aTime.GetNanoSec(), aTime.GetSec(), aTime.GetMin(), aTime.GetHour() ); aPropValue <<= aUNOTime; } return aPropValue; diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 104db58723a7..b8b680bfe67a 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -118,6 +118,7 @@ #include #include #include +#include // PPT ColorScheme Slots #define PPT_COLSCHEME (0x08000000) @@ -2673,11 +2674,11 @@ void ImportComment10( SvxMSDffManager& rMan, SvStream& rStCtrl, SdrPage* pPage, >> aDateTime.Hours >> aDateTime.Minutes >> aDateTime.Seconds - >> aDateTime.HundredthSeconds + >> aDateTime.NanoSeconds >> nPosX >> nPosY; - aDateTime.HundredthSeconds /= 10; + aDateTime.NanoSeconds *= ::Time::nanoPerMilli; } break; } diff --git a/forms/qa/integration/forms/TimeValidator.java b/forms/qa/integration/forms/TimeValidator.java index ab9f036c2b67..36d1ae8f6e90 100644 --- a/forms/qa/integration/forms/TimeValidator.java +++ b/forms/qa/integration/forms/TimeValidator.java @@ -70,11 +70,11 @@ public class TimeValidator extends integration.forms.ControlValidator private boolean isInvalidTime( com.sun.star.util.Time timeValue ) { - return ( timeValue.Hours == -1 ) && ( timeValue.Minutes == -1 ) && ( timeValue.Seconds == -1 ) && ( timeValue.HundredthSeconds == -1 ); + return ( timeValue.Hours == -1 ) && ( timeValue.Minutes == -1 ) && ( timeValue.Seconds == -1 ) && ( timeValue.NanoSeconds == -1 ); } private boolean isFullHour( com.sun.star.util.Time timeValue ) { - return ( timeValue.Minutes == 0 ) && ( timeValue.Seconds == 0 ) && ( timeValue.HundredthSeconds == 0 ); + return ( timeValue.Minutes == 0 ) && ( timeValue.Seconds == 0 ) && ( timeValue.NanoSeconds == 0 ); } } diff --git a/forms/source/component/Time.cxx b/forms/source/component/Time.cxx index 7b7b56c2821c..420a317fcefd 100644 --- a/forms/source/component/Time.cxx +++ b/forms/source/component/Time.cxx @@ -246,7 +246,7 @@ sal_Bool OTimeModel::commitControlValueToDbColumn( bool /*_bPostReset*/ ) util::Time aTime; if ( !( aControlValue >>= aTime ) ) { - sal_Int32 nAsInt(0); + sal_Int64 nAsInt(0); aControlValue >>= nAsInt; aTime = DBTypeConversion::toTime(nAsInt); } @@ -256,7 +256,7 @@ sal_Bool OTimeModel::commitControlValueToDbColumn( bool /*_bPostReset*/ ) else { util::DateTime aDateTime = m_xColumn->getTimestamp(); - aDateTime.HundredthSeconds = aTime.HundredthSeconds; + aDateTime.NanoSeconds = aTime.NanoSeconds; aDateTime.Seconds = aTime.Seconds; aDateTime.Minutes = aTime.Minutes; aDateTime.Hours = aTime.Hours; @@ -279,7 +279,7 @@ void OTimeModel::impl_translateControlValueToUNOTime( Any& _rUNOValue ) const _rUNOValue = getControlValue(); if ( _rUNOValue.hasValue() ) { - sal_Int32 nTime = 0; + sal_Int64 nTime = 0; OSL_VERIFY( _rUNOValue >>= nTime ); if ( nTime == ::Time( 99, 99, 99 ).GetTime() ) // "invalid time" in VCL is different from "invalid time" in UNO @@ -305,7 +305,7 @@ Any OTimeModel::translateExternalValueToControlValue( const Any& _rExternalValue { util::Time aTime; OSL_VERIFY( _rExternalValue >>= aTime ); - aControlValue <<= DBTypeConversion::toINT32( aTime ); + aControlValue <<= DBTypeConversion::toINT64( aTime ); } return aControlValue; } @@ -325,8 +325,9 @@ Any OTimeModel::translateDbColumnToControlValue() if ( m_xColumn->wasNull() ) m_aSaveValue.clear(); else - // the aggregated set expects an Int32 as value ... - m_aSaveValue <<= DBTypeConversion::toINT32( aTime ); + // TODO FIXME: "the aggregated set expects an Int32 as value ..." + // need to fix it for int64 + m_aSaveValue <<= DBTypeConversion::toINT64( aTime ); return m_aSaveValue; } diff --git a/forms/source/xforms/convert.cxx b/forms/source/xforms/convert.cxx index b440f4b3705f..6dac9298aa6a 100644 --- a/forms/source/xforms/convert.cxx +++ b/forms/source/xforms/convert.cxx @@ -33,13 +33,14 @@ #include #include #include +#include using xforms::Convert; using com::sun::star::uno::Any; using com::sun::star::uno::makeAny; -using com::sun::star::util::Time; using namespace std; using namespace o3tl; +using namespace utl; typedef com::sun::star::util::Date UNODate; typedef com::sun::star::util::Time UNOTime; @@ -279,30 +280,7 @@ namespace UNODate aDate( 1, 1, 1900 ); - sal_Int32 nToken = 0; - StringTokenizer aTokenizer( rString, '-' ); - while ( aTokenizer.hasNextToken() ) - { - sal_Int32 nTokenValue = 0; - if ( !aTokenizer.getNextToken().toInt32( nTokenValue ) ) - { - bWellformed = false; - break; - } - - if ( nToken == 0 ) - aDate.Year = (sal_uInt16)nTokenValue; - else if ( nToken == 1 ) - aDate.Month = (sal_uInt16)nTokenValue; - else if ( nToken == 2 ) - aDate.Day = (sal_uInt16)nTokenValue; - else - { - bWellformed = false; - break; - } - ++nToken; - } + bWellformed = ISO8601parseDate(rString, aDate); // sanity checks if ( ( aDate.Year > 9999 ) || ( aDate.Month < 1 ) || ( aDate.Month > 12 ) || ( aDate.Day < 1 ) || ( aDate.Day > 31 ) ) @@ -337,10 +315,15 @@ namespace lcl_appendInt32ToBuffer( rTime.Minutes, sInfo, 2 ); sInfo.appendAscii( ":" ); lcl_appendInt32ToBuffer( rTime.Seconds, sInfo, 2 ); - if ( rTime.HundredthSeconds ) + if ( rTime.NanoSeconds != 0 ) { - sInfo.appendAscii( "." ); - lcl_appendInt32ToBuffer( rTime.HundredthSeconds, sInfo, 2 ); + OSL_ENSURE(rTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); + sInfo.append('.'); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << rTime.NanoSeconds; + sInfo.append(OUString::createFromAscii(ostr.str().c_str())); } return sInfo.makeStringAndClear(); @@ -361,62 +344,7 @@ namespace UNOTime aTime( 0, 0, 0, 0 ); - OUString sString( rString ); - // see if there's a decimal separator for the seconds, - // and if so, handle it separately - sal_Int32 nDecimalSepPos = rString.indexOf( '.' ); - if ( nDecimalSepPos == -1 ) - // ISO 8601 allows for both a comma and a dot - nDecimalSepPos = rString.indexOf( ',' ); - if ( nDecimalSepPos != -1 ) - { - // handle fractional seconds - OUString sFractional = sString.copy( nDecimalSepPos + 1 ); - if ( sFractional.getLength() > 2 ) - // our precision is HundrethSeconds - it's all a css.util.Time can hold - sFractional = sFractional.copy( 0, 2 ); - if ( !sFractional.isEmpty() ) - { - sal_Int32 nFractional = 0; - if ( StringTokenizer( sFractional, 0 ).getNextToken().toInt32( nFractional ) ) - { - aTime.HundredthSeconds = (sal_uInt16)nFractional; - if ( nFractional < 10 ) - aTime.HundredthSeconds *= 10; - } - else - bWellformed = false; - } - - // strip the fraction before further processing - sString = sString.copy( 0, nDecimalSepPos ); - } - - // split into the tokens which are separated by colon - sal_Int32 nToken = 0; - StringTokenizer aTokenizer( sString, ':' ); - while ( aTokenizer.hasNextToken() ) - { - sal_Int32 nTokenValue = 0; - if ( !aTokenizer.getNextToken().toInt32( nTokenValue ) ) - { - bWellformed = false; - break; - } - - if ( nToken == 0 ) - aTime.Hours = (sal_uInt16)nTokenValue; - else if ( nToken == 1 ) - aTime.Minutes = (sal_uInt16)nTokenValue; - else if ( nToken == 2 ) - aTime.Seconds = (sal_uInt16)nTokenValue; - else - { - bWellformed = false; - break; - } - ++nToken; - } + bWellformed = ISO8601parseTime(rString, aTime); // sanity checks // note that Seconds == 60 denotes leap seconds. Normally, they're not allowed everywhere, @@ -431,7 +359,7 @@ namespace && ( aTime.Hours == 24 ) && ( ( aTime.Minutes != 0 ) || ( aTime.Seconds != 0 ) - || ( aTime.HundredthSeconds != 0 ) + || ( aTime.NanoSeconds != 0 ) ) ) bWellformed = false; @@ -458,7 +386,7 @@ namespace UNODate aDate( aDateTime.Day, aDateTime.Month, aDateTime.Year ); OUString sDate = lcl_toXSD_UNODate_typed( aDate ); - UNOTime aTime( aDateTime.HundredthSeconds, aDateTime.Seconds, aDateTime.Minutes, aDateTime.Hours ); + UNOTime aTime( aDateTime.NanoSeconds, aDateTime.Seconds, aDateTime.Minutes, aDateTime.Hours ); OUString sTime = lcl_toXSD_UNOTime_typed( aTime ); OUStringBuffer sInfo; @@ -489,7 +417,7 @@ namespace aTime = lcl_toUNOTime( rString.copy( nDateTimeSep + 1 ) ); } UNODateTime aDateTime( - aTime.HundredthSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, + aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, aDate.Day, aDate.Month, aDate.Year ); return makeAny( aDateTime ); diff --git a/forms/source/xforms/datatypes.cxx b/forms/source/xforms/datatypes.cxx index e1fcdebecf24..66dbd907856a 100644 --- a/forms/source/xforms/datatypes.cxx +++ b/forms/source/xforms/datatypes.cxx @@ -829,7 +829,14 @@ namespace xforms if ( !( aTypedValue >>= aValue ) ) return false; - ::Time aToolsTime( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.HundredthSeconds ); + ::Time aToolsTime( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.NanoSeconds ); + // no loss/rounding; IEEE 754 double-precision floating-point + // has a mantissa of 53 bits; we need at the very most 50 bits: + // format of aToolsTime.GetTime() is (in decimal) hhmmssnnnnnnnnn + // and 999999999999999 = 0x38D7EA4C67FFF + // in reality I doubt we need (much) more than + // 240000000000000 = 0x0DA475ABF0000 + // that is 48 bits fValue = aToolsTime.GetTime(); return true; } @@ -846,7 +853,7 @@ namespace xforms { Time aValue; OSL_VERIFY( _rValue >>= aValue ); - ::Time aToolsTime( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.HundredthSeconds ); + ::Time aToolsTime( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.NanoSeconds ); _rDoubleValue = aToolsTime.GetTime(); } @@ -869,7 +876,7 @@ namespace xforms { ::DateTime aToolsValue( ::Date( _rValue.Day, _rValue.Month, _rValue.Year ), - ::Time( _rValue.Hours, _rValue.Minutes, _rValue.Seconds, _rValue.HundredthSeconds ) + ::Time( _rValue.Hours, _rValue.Minutes, _rValue.Seconds, _rValue.NanoSeconds ) ); double fValue = 0; diff --git a/framework/source/jobs/jobdata.cxx b/framework/source/jobs/jobdata.cxx index a39114d82a7c..051fd7a5d093 100644 --- a/framework/source/jobs/jobdata.cxx +++ b/framework/source/jobs/jobdata.cxx @@ -567,6 +567,7 @@ sal_Bool isEnabled( const OUString& sAdminTime , // We check for "isEnabled()" here only. // Note further: ISO8601 formated strings can be compared as strings directly! + // FIXME: this is not true! "T1215" is the same time as "T12:15" or "T121500" return ( (!bValidAdmin && !bValidUser ) || ( bValidAdmin && bValidUser && sAdminTime>=sUserTime) diff --git a/odk/examples/DevelopersGuide/Forms/TimeValidator.java b/odk/examples/DevelopersGuide/Forms/TimeValidator.java index 81042294441a..333e7c95dc5e 100644 --- a/odk/examples/DevelopersGuide/Forms/TimeValidator.java +++ b/odk/examples/DevelopersGuide/Forms/TimeValidator.java @@ -70,11 +70,11 @@ public class TimeValidator extends ControlValidator private boolean isInvalidTime( com.sun.star.util.Time timeValue ) { - return ( timeValue.Hours == -1 ) && ( timeValue.Minutes == -1 ) && ( timeValue.Seconds == -1 ) && ( timeValue.HundredthSeconds == -1 ); + return ( timeValue.Hours == -1 ) && ( timeValue.Minutes == -1 ) && ( timeValue.Seconds == -1 ) && ( timeValue.NanoSeconds == -1 ); } private boolean isFullHour( com.sun.star.util.Time timeValue ) { - return ( timeValue.Minutes == 0 ) && ( timeValue.Seconds == 0 ) && ( timeValue.HundredthSeconds == 0 ); + return ( timeValue.Minutes == 0 ) && ( timeValue.Seconds == 0 ) && ( timeValue.NanoSeconds == 0 ); } } diff --git a/offapi/com/sun/star/util/Date.idl b/offapi/com/sun/star/util/Date.idl index d881fd4077b4..ecbda5a8b307 100644 --- a/offapi/com/sun/star/util/Date.idl +++ b/offapi/com/sun/star/util/Date.idl @@ -40,7 +40,7 @@ published struct Date /** contains the year. */ - unsigned short Year; + short Year; }; diff --git a/offapi/com/sun/star/util/DateTime.idl b/offapi/com/sun/star/util/DateTime.idl index 11f672ba1f5f..312589f9eb73 100644 --- a/offapi/com/sun/star/util/DateTime.idl +++ b/offapi/com/sun/star/util/DateTime.idl @@ -28,10 +28,9 @@ module com { module sun { module star { module util { */ published struct DateTime { - /** contains the hundredth seconds (0-99). + /** contains the nanoseconds (0 - 999 999 999). */ - unsigned short HundredthSeconds; - + unsigned long NanoSeconds; /** contains the seconds (0-59). */ @@ -60,7 +59,9 @@ published struct DateTime /** is the year. */ - unsigned short Year; + short Year; + + /** TODO: timezone **/ }; diff --git a/offapi/com/sun/star/util/DateTimeRange.idl b/offapi/com/sun/star/util/DateTimeRange.idl index 94e005a37c59..b56a0484e494 100644 --- a/offapi/com/sun/star/util/DateTimeRange.idl +++ b/offapi/com/sun/star/util/DateTimeRange.idl @@ -28,9 +28,9 @@ module com { module sun { module star { module util { */ published struct DateTimeRange { - /** contains the start hundredth seconds (0-99) for the range. + /** contains the start nanoseconds (0 - 999 999 999) for the range. */ - unsigned short StartHundredthSeconds; + unsigned long StartNanoSeconds; /** contains the start seconds (0-59) for the range. */ @@ -54,11 +54,11 @@ published struct DateTimeRange /** contains the start year for the range. */ - unsigned short StartYear; + short StartYear; - /** contains the end hundredth seconds (0-99) for the range. + /** contains the end nanoseconds (0 - 999 999 999) for the range. */ - unsigned short EndHundredthSeconds; + unsigned long EndNanoSeconds; /** contains the end seconds (0-59) for the range. */ @@ -82,8 +82,9 @@ published struct DateTimeRange /** contains the end year for the range. */ - unsigned short EndYear; + short EndYear; + /** TODO timezones **/ }; diff --git a/offapi/com/sun/star/util/Duration.idl b/offapi/com/sun/star/util/Duration.idl index 6b373ddb853c..519e837fef1a 100644 --- a/offapi/com/sun/star/util/Duration.idl +++ b/offapi/com/sun/star/util/Duration.idl @@ -69,9 +69,9 @@ struct Duration */ unsigned short Seconds; - /** contains the milliseconds. + /** contains the nanoseconds. */ - unsigned short MilliSeconds; + unsigned long NanoSeconds; }; diff --git a/offapi/com/sun/star/util/Time.idl b/offapi/com/sun/star/util/Time.idl index 51cbd7e6c197..1ac850f31797 100644 --- a/offapi/com/sun/star/util/Time.idl +++ b/offapi/com/sun/star/util/Time.idl @@ -28,9 +28,9 @@ module com { module sun { module star { module util { */ published struct Time { - /** contains the hundredth seconds (0-99). + /** contains the nanoseconds (0 - 999 999 999). */ - unsigned short HundredthSeconds; + unsigned long NanoSeconds; /** contains the seconds (0-59). */ diff --git a/offapi/type_reference/types.rdb b/offapi/type_reference/types.rdb index f43806a7a4f30fd0218027567a7fd4ff444c1d3a..ecd1b60cac5862fdfd8a875612e8cb32248e35dd 100644 GIT binary patch delta 232983 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 z⪙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 mDoV5~3*t=KKPE~T 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 z%0D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 delta 232840 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 Q#v*E-!?GwM3vHMCKM^Z}sQ>@~ diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index 73d223eec1bc..28d47c2374c2 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -482,10 +482,12 @@ writeElement( FSHelperPtr pDoc, sal_Int32 nXmlElement, const util::DateTime& rTi FSEND ); char pStr[200]; - snprintf( pStr, sizeof( pStr ), "%d-%02d-%02dT%02d:%02d:%02d.%02dZ", + // FIXME: my guess is that precision greater than millisecond in undesirable + // (forbidden by the standard???) + snprintf( pStr, sizeof( pStr ), "%d-%02d-%02dT%02d:%02d:%02d.%09dZ", rTime.Year, rTime.Month, rTime.Day, rTime.Hours, rTime.Minutes, rTime.Seconds, - rTime.HundredthSeconds ); + rTime.NanoSeconds); pDoc->write( pStr ); diff --git a/oox/source/dump/dumperbase.cxx b/oox/source/dump/dumperbase.cxx index dfa19ba4c013..867a66f1f4e3 100644 --- a/oox/source/dump/dumperbase.cxx +++ b/oox/source/dump/dumperbase.cxx @@ -2285,11 +2285,11 @@ util::DateTime InputObjectBase::dumpFileTime( const String& rName ) } // the day aDateTime.Day = static_cast< sal_uInt16 >( nDaysInYear + 1 ); - // number of 1/100 seconds in the day - sal_Int64 nTimeInDay = nFileTime % sal_Int64( 360000 * 24 ); - // 1/100 seconds - aDateTime.HundredthSeconds = static_cast< sal_uInt16 >( nTimeInDay % 100 ); - nTimeInDay /= 100; + // number of nanoseconds in the day + sal_Int64 nTimeInDay = nFileTime % sal_Int64( 86400000000000 ); + // nanoseconds + aDateTime.NanoSeconds = static_cast< sal_uInt32 >( nTimeInDay % 1000000000 ); + nTimeInDay /= 1000000000; // seconds aDateTime.Seconds = static_cast< sal_uInt16 >( nTimeInDay % 60 ); nTimeInDay /= 60; diff --git a/oox/source/ppt/comments.cxx b/oox/source/ppt/comments.cxx index 26725ffdf0f6..bf598c7e3386 100644 --- a/oox/source/ppt/comments.cxx +++ b/oox/source/ppt/comments.cxx @@ -9,6 +9,7 @@ #include "oox/ppt/comments.hxx" #include +#include namespace oox { namespace ppt { @@ -37,7 +38,28 @@ void Comment::setDateTime (OUString datetime) datetime = datetime.getToken(1,'T'); aDateTime.Hours = datetime.getToken(0,':').toInt32(); aDateTime.Minutes = datetime.getToken(1,':').toInt32(); - aDateTime.HundredthSeconds = int(datetime.getToken(2,':').toDouble() + .5); + double seconds = datetime.getToken(2,':').toDouble(); + aDateTime.Seconds = floor(seconds); + seconds -= aDateTime.Seconds; + aDateTime.NanoSeconds = ::rtl::math::round(seconds * 1000000000); + const int secondsOverFlow = (aDateTime.Seconds == 60) ? 61 : 60; + // normalise time part of aDateTime + if (aDateTime.NanoSeconds == 1000000000) + { + aDateTime.NanoSeconds = 0; + ++aDateTime.Seconds; + } + if (aDateTime.Seconds == secondsOverFlow) + { + aDateTime.Seconds = 0; + ++aDateTime.Minutes; + } + if (aDateTime.Minutes == 60) + { + aDateTime.Minutes = 0; + ++aDateTime.Hours; + } + // if overflow goes into date, I give up } OUString Comment::getAuthor ( const CommentAuthorList& list ) diff --git a/qadevOOo/tests/java/mod/_forms/ODatabaseForm.java b/qadevOOo/tests/java/mod/_forms/ODatabaseForm.java index 3b9bd8284ca7..9c884d95720c 100644 --- a/qadevOOo/tests/java/mod/_forms/ODatabaseForm.java +++ b/qadevOOo/tests/java/mod/_forms/ODatabaseForm.java @@ -636,11 +636,11 @@ public class ODatabaseForm extends TestCase { d.Day = 26; d.Month = 1; d.Year = 2001; params.add(d) ; Time t = new Time(); - t.Hours = 1; t.HundredthSeconds = 12; t.Minutes = 25; t.Seconds = 14; + t.Hours = 1; t.NanoSeconds = 123456789; t.Minutes = 25; t.Seconds = 14; params.add(t) ; DateTime dt = new DateTime(); dt.Day = 26; dt.Month = 1; dt.Year = 2001; dt.Hours = 1; - dt.HundredthSeconds = 12; dt.Minutes = 25; dt.Seconds = 14; + dt.NanoSeconds = 123456789; dt.Minutes = 25; dt.Seconds = 14; params.add(dt) ; tEnv.addObjRelation("XParameters.ParamValues", params); diff --git a/reportbuilder/java/org/libreoffice/report/SDBCReportData.java b/reportbuilder/java/org/libreoffice/report/SDBCReportData.java index 6019d94c8cb6..c05d6b8e4178 100644 --- a/reportbuilder/java/org/libreoffice/report/SDBCReportData.java +++ b/reportbuilder/java/org/libreoffice/report/SDBCReportData.java @@ -264,7 +264,7 @@ public class SDBCReportData implements DataSource str.append(' '); str.append(getTimeString(unoTs.Hours, unoTs.Minutes, unoTs.Seconds)); str.append('.'); - str.append(unoTs.HundredthSeconds); + str.append(String.format("%09d", unoTs.NanoSeconds)); ts = java.sql.Timestamp.valueOf(str.toString()); } else diff --git a/reportdesign/source/filter/xml/xmlControlProperty.cxx b/reportdesign/source/filter/xml/xmlControlProperty.cxx index aca8453b511d..7d4ec150a661 100644 --- a/reportdesign/source/filter/xml/xmlControlProperty.cxx +++ b/reportdesign/source/filter/xml/xmlControlProperty.cxx @@ -34,6 +34,7 @@ #include #include #include +#include #define TYPE_DATE 1 #define TYPE_TIME 2 @@ -301,7 +302,7 @@ Any OXMLControlProperty::convertString(const ::com::sun::star::uno::Type& _rExpe ::com::sun::star::util::Date aDate = implGetDate(nValue); ::com::sun::star::util::DateTime aDateTime; - aDateTime.HundredthSeconds = aTime.HundredthSeconds; + aDateTime.NanoSeconds = aTime.NanoSeconds; aDateTime.Seconds = aTime.Seconds; aDateTime.Minutes = aTime.Minutes; aDateTime.Hours = aTime.Hours; @@ -329,10 +330,9 @@ Any OXMLControlProperty::convertString(const ::com::sun::star::uno::Type& _rExpe ::com::sun::star::util::Time OXMLControlProperty::implGetTime(double _nValue) { ::com::sun::star::util::Time aTime; - sal_uInt32 nIntValue = sal_Int32(_nValue * 8640000); - nIntValue *= 8640000; - aTime.HundredthSeconds = (sal_uInt16)( nIntValue % 100 ); - nIntValue /= 100; + sal_uInt64 nIntValue = ::rtl::math::round(_nValue * 86400000000000.0); + aTime.NanoSeconds = (sal_uInt16)( nIntValue % 1000000000 ); + nIntValue /= 1000000000; aTime.Seconds = (sal_uInt16)( nIntValue % 60 ); nIntValue /= 60; aTime.Minutes = (sal_uInt16)( nIntValue % 60 ); diff --git a/sax/qa/cppunit/test_converter.cxx b/sax/qa/cppunit/test_converter.cxx index 84d4da03db75..31e96bcf6cba 100644 --- a/sax/qa/cppunit/test_converter.cxx +++ b/sax/qa/cppunit/test_converter.cxx @@ -88,7 +88,7 @@ static bool eqDuration(util::Duration a, util::Duration b) { return a.Years == b.Years && a.Months == b.Months && a.Days == b.Days && a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.MilliSeconds == b.MilliSeconds + && a.NanoSeconds == b.NanoSeconds && a.Negative == b.Negative; } @@ -97,9 +97,10 @@ static void doTest(util::Duration const & rid, char const*const pis, { char const*const pos((i_pos) ? i_pos : pis); util::Duration od; - OUString is(OUString::createFromAscii(pis)); + OUString is(::rtl::OUString::createFromAscii(pis)); + SAL_INFO("sax.cppunit","about to convert '" << is << "'"); bool bSuccess = Converter::convertDuration(od, is); - SAL_INFO("sax.cppunit","" << od.Negative << " " << od.Years << "Y " << od.Months << "M " << od.Days << "D " << od.Hours << "H " << od.Minutes << "M " << od.Seconds << "S " << od.MilliSeconds << "m"); + SAL_INFO("sax.cppunit","" << (od.Negative ? "-" : "+") << " " << od.Years << "Y " << od.Months << "M " << od.Days << "D " << od.Hours << "H " << od.Minutes << "M " << od.Seconds << "S " << od.NanoSeconds << "n"); CPPUNIT_ASSERT(bSuccess); CPPUNIT_ASSERT(eqDuration(rid, od)); OUStringBuffer buf; @@ -113,7 +114,7 @@ static void doTestDurationF(char const*const pis) util::Duration od; bool bSuccess = Converter::convertDuration(od, OUString::createFromAscii(pis)); - SAL_INFO("sax.cppunit","" << od.Negative << " " << od.Years << "Y " << od.Months << "M " << od.Days << "D " << od.Hours << "H " << od.Minutes << "M " << od.Seconds << "S " << od.MilliSeconds << "H"); + SAL_INFO("sax.cppunit","" << (od.Negative ? "-" : "+") << " " << od.Years << "Y " << od.Months << "M " << od.Days << "D " << od.Hours << "H " << od.Minutes << "M " << od.Seconds << "S " << od.NanoSeconds << "n"); CPPUNIT_ASSERT(!bSuccess); } @@ -126,14 +127,15 @@ void ConverterTest::testDuration() doTest( util::Duration(false, 0, 0, 0, 52, 0, 0, 0), "PT52H" ); doTest( util::Duration(false, 0, 0, 0, 0, 717, 0, 0), "PT717M" ); doTest( util::Duration(false, 0, 0, 0, 0, 0, 121, 0), "PT121S" ); - doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 190), "PT0.19S" ); - doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 90), "PT0.09S" ); - doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 9), "PT0.009S" ); - doTest( util::Duration(false, 0, 0, 0, 0, 0, 9, 999), - "PT9.999999999999999999999999999999S", "PT9.999S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 190000000), "PT0.19S", "PT0.190000000S"); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 90000000), "PT0.09S", "PT0.090000000S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 9000000), "PT0.009S", "PT0.009000000S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 9), "PT0.000000009S", "PT0.000000009S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 9, 999999999), + "PT9.999999999999999999999999999999S", "PT9.999999999S" ); doTest( util::Duration(true , 0, 0, 9999, 0, 0, 0, 0), "-P9999D" ); - doTest( util::Duration(true , 7, 6, 5, 4, 3, 2, 10), - "-P7Y6M5DT4H3M2.01S" ); + doTest( util::Duration(true , 7, 6, 5, 4, 3, 2, 10000000), + "-P7Y6M5DT4H3M2.01S", "-P7Y6M5DT4H3M2.010000000S" ); doTest( util::Duration(false, 0, 6, 0, 0, 3, 0, 0), "P6MT3M" ); doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 0), "P0D" ); doTestDurationF("1Y1M"); // invalid: no ^P @@ -155,7 +157,7 @@ static bool eqDateTime(util::DateTime a, util::DateTime b) { return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day && a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.HundredthSeconds == b.HundredthSeconds; + && a.NanoSeconds == b.NanoSeconds; } static void doTest(util::DateTime const & rdt, char const*const pis, @@ -164,8 +166,9 @@ static void doTest(util::DateTime const & rdt, char const*const pis, char const*const pos((i_pos) ? i_pos : pis); OUString is(OUString::createFromAscii(pis)); util::DateTime odt; + SAL_INFO("sax.cppunit","about to convert '" << is << "'"); bool bSuccess( Converter::convertDateTime(odt, is) ); - SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << " M:" << odt.Minutes << " S:" << odt.Seconds << " H:" << odt.HundredthSeconds); + 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); CPPUNIT_ASSERT(bSuccess); CPPUNIT_ASSERT(eqDateTime(rdt, odt)); OUStringBuffer buf; @@ -179,7 +182,7 @@ static void doTestDateTimeF(char const*const pis) util::DateTime odt; bool bSuccess = Converter::convertDateTime(odt, 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 << " H:" << odt.HundredthSeconds); + 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); } @@ -201,16 +204,16 @@ void ConverterTest::testDateTime() doTest( util::DateTime(0, 0, 0, 0, 2, 1, 1)/*(0, 0, 12, 0, 1, 1, 1)*/, "0001-01-02T00:00:00+12:00", "0001-01-02T00:00:00" ); // "0001-01-01T12:00:00" ); - doTest( util::DateTime(99, 59, 59, 23, 31, 12, 9999), - "9999-12-31T23:59:59.99" ); - doTest( util::DateTime(99, 59, 59, 23, 31, 12, 9999), - "9999-12-31T23:59:59.99Z", "9999-12-31T23:59:59.99" ); - doTest( util::DateTime(99, 59, 59, 23, 31, 12, 9999), + doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999), + "9999-12-31T23:59:59.99", "9999-12-31T23:59:59.990000000" ); + doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999), + "9999-12-31T23:59:59.99Z", "9999-12-31T23:59:59.990000000" ); + doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999), "9999-12-31T23:59:59.9999999999999999999999999999999999999", - "9999-12-31T23:59:59.99" ); - doTest( util::DateTime(99, 59, 59, 23, 31, 12, 9999), + "9999-12-31T23:59:59.999999999" ); + doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999), "9999-12-31T23:59:59.9999999999999999999999999999999999999Z", - "9999-12-31T23:59:59.99" ); + "9999-12-31T23:59:59.999999999" ); doTest( util::DateTime(0, 0, 0, 0, 29, 2, 2000), // leap year "2000-02-29T00:00:00-00:00", "2000-02-29T00:00:00" ); doTest( util::DateTime(0, 0, 0, 0, 29, 2, 1600), // leap year diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx index 22fa9060b154..6b88e10fbc51 100644 --- a/sax/source/tools/converter.cxx +++ b/sax/source/tools/converter.cxx @@ -29,6 +29,8 @@ #include #include +#include + using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::util; @@ -43,8 +45,7 @@ static const sal_Char* gpsPT = "pt"; static const sal_Char* gpsINCH = "in"; static const sal_Char* gpsPC = "pc"; -const sal_Int8 XML_MAXDIGITSCOUNT_TIME = 11; -const sal_Int8 XML_MAXDIGITSCOUNT_DATETIME = 6; +const sal_Int8 XML_MAXDIGITSCOUNT_TIME = 14; /** convert string to measure using optional min and max values*/ bool Converter::convertMeasure( sal_Int32& rValue, @@ -658,15 +659,15 @@ void Converter::convertDuration(OUStringBuffer& rBuffer, fValue *= 60; double fSecsValue = ::rtl::math::approxFloor (fValue); fValue -= fSecsValue; - double f100SecsValue; - if (fValue > 0.00001) - f100SecsValue = ::rtl::math::round( fValue, XML_MAXDIGITSCOUNT_TIME - 5); + double fNanoSecsValue; + if (fValue > 0.00000000001) + fNanoSecsValue = ::rtl::math::round( fValue, XML_MAXDIGITSCOUNT_TIME - 5); else - f100SecsValue = 0.0; + fNanoSecsValue = 0.0; - if (f100SecsValue == 1.0) + if (fNanoSecsValue == 1.0) { - f100SecsValue = 0.0; + fNanoSecsValue = 0.0; fSecsValue += 1.0; } if (fSecsValue >= 60.0) @@ -691,15 +692,15 @@ void Converter::convertDuration(OUStringBuffer& rBuffer, if (fSecsValue < 10) rBuffer.append( sal_Unicode('0')); rBuffer.append( sal_Int32( fSecsValue)); - if (f100SecsValue > 0.0) + if (fNanoSecsValue > 0.0) { - OUString a100th( ::rtl::math::doubleToUString( fValue, + OUString aNS( ::rtl::math::doubleToUString( fValue, rtl_math_StringFormat_F, XML_MAXDIGITSCOUNT_TIME - 5, '.', true)); - if ( a100th.getLength() > 2 ) + if ( aNS.getLength() > 2 ) { rBuffer.append( sal_Unicode('.')); - rBuffer.append( a100th.copy( 2 ) ); // strip 0. + rBuffer.append( aNS.copy( 2 ) ); // strip "0." } } rBuffer.append( sal_Unicode('S')); @@ -816,12 +817,10 @@ bool Converter::convertDuration(double& rfTime, double fHour = nHours; double fMin = nMins; double fSec = nSecs; - double fSec100 = 0.0; double fFraction = sDoubleStr.toDouble(); fTempTime = fHour / 24; fTempTime += fMin / (24 * 60); fTempTime += fSec / (24 * 60 * 60); - fTempTime += fSec100 / (24 * 60 * 60 * 60); fTempTime += fFraction / (24 * 60 * 60); // negative duration? @@ -835,7 +834,7 @@ bool Converter::convertDuration(double& rfTime, return bSuccess; } -/** convert util::Duration to ISO "duration" string */ +/** convert util::Duration to ISO8601 "duration" string */ void Converter::convertDuration(OUStringBuffer& rBuffer, const ::util::Duration& rDuration) { @@ -844,9 +843,9 @@ void Converter::convertDuration(OUStringBuffer& rBuffer, rBuffer.append(sal_Unicode('-')); } rBuffer.append(sal_Unicode('P')); - const bool bHaveDate(static_cast(rDuration.Years) - +static_cast(rDuration.Months) - +static_cast(rDuration.Days)); + const bool bHaveDate(rDuration.Years != 0 || + rDuration.Months != 0 || + rDuration.Days != 0); if (rDuration.Years) { rBuffer.append(static_cast(rDuration.Years)); @@ -862,10 +861,10 @@ void Converter::convertDuration(OUStringBuffer& rBuffer, rBuffer.append(static_cast(rDuration.Days)); rBuffer.append(sal_Unicode('D')); } - const sal_Int32 nMSecs(static_cast(rDuration.Seconds) - + static_cast(rDuration.MilliSeconds)); - if (static_cast(rDuration.Hours) + - static_cast(rDuration.Minutes) + nMSecs) + if ( rDuration.Hours != 0 + || rDuration.Minutes != 0 + || rDuration.Seconds != 0 + || rDuration.NanoSeconds != 0 ) { rBuffer.append(sal_Unicode('T')); // time separator if (rDuration.Hours) @@ -878,37 +877,19 @@ void Converter::convertDuration(OUStringBuffer& rBuffer, rBuffer.append(static_cast(rDuration.Minutes)); rBuffer.append(sal_Unicode('M')); } - if (nMSecs) + if (rDuration.Seconds != 0 || rDuration.NanoSeconds != 0) { // seconds must not be omitted (i.e. ".42S" is not valid) rBuffer.append(static_cast(rDuration.Seconds)); - if (rDuration.MilliSeconds) + if (rDuration.NanoSeconds) { - rBuffer.append(sal_Unicode('.')); - const sal_Int32 nMilliSeconds(rDuration.MilliSeconds % 1000); - if (nMilliSeconds < 100) - { - rBuffer.append(sal_Unicode('0')); - } - if (nMilliSeconds < 10) - { - rBuffer.append(sal_Unicode('0')); - } - if (0 == (nMilliSeconds % 10)) - { - if (0 == (nMilliSeconds % 100)) - { - rBuffer.append(nMilliSeconds / 100); - } - else - { - rBuffer.append(nMilliSeconds / 10); - } - } - else - { - rBuffer.append(nMilliSeconds); - } + OSL_ENSURE(rDuration.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); + rBuffer.append('.'); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << rDuration.NanoSeconds; + rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); } rBuffer.append(sal_Unicode('S')); } @@ -928,7 +909,7 @@ readUnsignedNumber(const OUString & rString, sal_Int32 & io_rnPos, sal_Int32 & o_rNumber) { bool bOverflow(false); - sal_Int32 nTemp(0); + sal_Int64 nTemp(0); sal_Int32 nPos(io_rnPos); while (nPos < rString.getLength()) @@ -938,7 +919,7 @@ readUnsignedNumber(const OUString & rString, { nTemp *= 10; nTemp += (c - sal_Unicode('0')); - if (nTemp >= SAL_MAX_INT16) + if (nTemp >= SAL_MAX_INT32) { bOverflow = true; } @@ -961,6 +942,50 @@ readUnsignedNumber(const OUString & rString, return (bOverflow) ? R_OVERFLOW : R_SUCCESS; } +static Result +readUnsignedNumberMaxDigits(int maxDigits, + const ::rtl::OUString & rString, sal_Int32 & io_rnPos, + sal_Int32 & o_rNumber) +{ + bool bOverflow(false); + sal_Int64 nTemp(0); + sal_Int32 nPos(io_rnPos); + OSL_ENSURE(maxDigits >= 0, "negative amount of digits makes no sense"); + + while (nPos < rString.getLength()) + { + const sal_Unicode c = rString[nPos]; + if ((sal_Unicode('0') <= c) && (c <= sal_Unicode('9'))) + { + if (maxDigits > 0) + { + nTemp *= 10; + nTemp += (c - sal_Unicode('0')); + if (nTemp >= SAL_MAX_INT32) + { + bOverflow = true; + } + --maxDigits; + } + } + else + { + break; + } + ++nPos; + } + + if (io_rnPos == nPos) // read something? + { + o_rNumber = -1; + return R_NOTHING; + } + + io_rnPos = nPos; + o_rNumber = nTemp; + return (bOverflow) ? R_OVERFLOW : R_SUCCESS; +} + static bool readDurationT(const OUString & rString, sal_Int32 & io_rnPos) { @@ -1003,7 +1028,7 @@ readDurationComponent(const OUString & rString, return true; } -/** convert ISO "duration" string to util::Duration */ +/** convert ISO8601 "duration" string to util::Duration */ bool Converter::convertDuration(util::Duration& rDuration, const OUString& rString) { @@ -1035,7 +1060,7 @@ bool Converter::convertDuration(util::Duration& rDuration, sal_Int32 nHours(0); sal_Int32 nMinutes(0); sal_Int32 nSeconds(0); - sal_Int32 nMilliSeconds(0); + sal_Int32 nNanoSeconds(0); bTimePart = readDurationT(string, nPos); bSuccess = (R_SUCCESS == readUnsignedNumber(string, nPos, nTemp)); @@ -1080,7 +1105,8 @@ bool Converter::convertDuration(util::Duration& rDuration, // eeek! seconds are icky. if ((nPos < string.getLength()) && bSuccess) { - if (sal_Unicode('.') == string[nPos]) + if (string[nPos] == sal_Unicode('.') || + string[nPos] == sal_Unicode(',')) { ++nPos; if (-1 != nTemp) @@ -1088,27 +1114,15 @@ bool Converter::convertDuration(util::Duration& rDuration, nSeconds = nTemp; nTemp = -1; const sal_Int32 nStart(nPos); - bSuccess = - (R_NOTHING != readUnsignedNumber(string, nPos, nTemp)); + bSuccess = readUnsignedNumberMaxDigits(9, string, nPos, nTemp) == R_SUCCESS; if ((nPos < string.getLength()) && bSuccess) { if (-1 != nTemp) { - nTemp = -1; - const sal_Int32 nDigits = nPos - nStart; - OSL_ENSURE(nDigits > 0, "bad code monkey"); - const sal_Unicode cZero('0'); - nMilliSeconds = 100 * (string[nStart] - cZero); - if (nDigits >= 2) - { - nMilliSeconds += 10 * - (string[nStart+1] - cZero); - if (nDigits >= 3) - { - nMilliSeconds += (string[nStart+2] - cZero); - } - } - + const sal_Int32 nDigits = std::min(nPos - nStart, 9); + OSL_ENSURE(nDigits > 0, "bad code monkey: negative digits"); + nNanoSeconds=static_cast(nTemp)*(1000000000.0/pow(10.0,nDigits)); + nTemp=-1; if (sal_Unicode('S') == string[nPos]) { ++nPos; @@ -1164,7 +1178,7 @@ bool Converter::convertDuration(util::Duration& rDuration, rDuration.Hours = static_cast(nHours); rDuration.Minutes = static_cast(nMinutes); rDuration.Seconds = static_cast(nSeconds); - rDuration.MilliSeconds = static_cast(nMilliSeconds); + rDuration.NanoSeconds = static_cast(nNanoSeconds); } return bSuccess; @@ -1232,13 +1246,14 @@ void Converter::convertDateTime( i_rBuffer.append(zero); } i_rBuffer.append( static_cast(i_rDateTime.Seconds) ); - if( i_rDateTime.HundredthSeconds > 0 ) { + if( i_rDateTime.NanoSeconds > 0 ) { + OSL_ENSURE(i_rDateTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); i_rBuffer.append(dot); - if( i_rDateTime.HundredthSeconds < 10 ) { - i_rBuffer.append(zero); - } - i_rBuffer.append( - static_cast(i_rDateTime.HundredthSeconds) ); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << i_rDateTime.NanoSeconds; + i_rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); } } } @@ -1259,7 +1274,7 @@ bool Converter::convertDateTime( util::DateTime& rDateTime, rDateTime.Hours = 0; rDateTime.Minutes = 0; rDateTime.Seconds = 0; - rDateTime.HundredthSeconds = 0; + rDateTime.NanoSeconds = 0; } return true; } @@ -1381,7 +1396,7 @@ bool Converter::convertDateOrDateTime( sal_Int32 nHours(0); sal_Int32 nMinutes(0); sal_Int32 nSeconds(0); - sal_Int32 nMilliSeconds(0); + sal_Int32 nNanoSeconds(0); if (bSuccess && bHaveTime) { { @@ -1419,37 +1434,26 @@ bool Converter::convertDateOrDateTime( bSuccess &= (0 <= nSeconds) && (nSeconds < 60); } if (bSuccess && (nPos < string.getLength()) && - (sal_Unicode('.') == string[nPos])) // fraction separator + (sal_Unicode('.') == string[nPos] || sal_Unicode(',') == string[nPos])) // fraction separator { ++nPos; const sal_Int32 nStart(nPos); sal_Int32 nTemp(0); - if (R_NOTHING == readUnsignedNumber(string, nPos, nTemp)) + if (R_NOTHING == readUnsignedNumberMaxDigits(9, string, nPos, nTemp)) { bSuccess = false; } if (bSuccess) { - // cannot use nTemp because of possible leading zeros - // and possible overflow => read digits directly - const sal_Int32 nDigits(nPos - nStart); + const sal_Int32 nDigits = std::min(nPos - nStart, 9); OSL_ENSURE(nDigits > 0, "bad code monkey"); - const sal_Unicode cZero('0'); - nMilliSeconds = 100 * (string[nStart] - cZero); - if (nDigits >= 2) - { - nMilliSeconds += 10 * (string[nStart+1] - cZero); - if (nDigits >= 3) - { - nMilliSeconds += (string[nStart+2] - cZero); - } - } + nNanoSeconds=static_cast(nTemp)*(1000000000.0/pow(10.0,nDigits)); } } if (bSuccess && (nHours == 24)) { - if (!((0 == nMinutes) && (0 == nSeconds) && (0 == nMilliSeconds))) + if (!((0 == nMinutes) && (0 == nSeconds) && (0 == nNanoSeconds))) { bSuccess = false; // only 24:00:00 is valid } @@ -1533,9 +1537,7 @@ bool Converter::convertDateOrDateTime( rDateTime.Hours = static_cast(nHours); rDateTime.Minutes = static_cast(nMinutes); rDateTime.Seconds = static_cast(nSeconds); - // util::DateTime does not support 3 decimal digits of precision! - rDateTime.HundredthSeconds = - static_cast(nMilliSeconds / 10); + rDateTime.NanoSeconds = static_cast(nNanoSeconds); rbDateTime = true; } else @@ -2279,7 +2281,7 @@ bool Converter::convertAny(OUStringBuffer& rsValue, aTempValue.Day = aDate.Day; aTempValue.Month = aDate.Month; aTempValue.Year = aDate.Year; - aTempValue.HundredthSeconds = 0; + aTempValue.NanoSeconds = 0; aTempValue.Seconds = 0; aTempValue.Minutes = 0; aTempValue.Hours = 0; @@ -2294,7 +2296,7 @@ bool Converter::convertAny(OUStringBuffer& rsValue, aTempValue.Days = 0; aTempValue.Months = 0; aTempValue.Years = 0; - aTempValue.MilliSeconds = aTime.HundredthSeconds * 10; + aTempValue.NanoSeconds = aTime.NanoSeconds; aTempValue.Seconds = aTime.Seconds; aTempValue.Minutes = aTime.Minutes; aTempValue.Hours = aTime.Hours; diff --git a/sc/inc/chgtrack.hxx b/sc/inc/chgtrack.hxx index 38b683c50d5d..aef13cf562c8 100644 --- a/sc/inc/chgtrack.hxx +++ b/sc/inc/chgtrack.hxx @@ -925,7 +925,7 @@ class ScChangeTrack : public utl::ConfigurationListener bool bInDeleteTop:1; bool bInPasteCut:1; bool bUseFixDateTime:1; - bool bTime100thSeconds:1; + bool bTimeNanoSeconds:1; // not implemented, prevent usage ScChangeTrack( const ScChangeTrack& ); @@ -1235,9 +1235,9 @@ public: // If time stamps of actions of this // ChangeTrack and a second one are to be - // compared including 100th seconds. - void SetTime100thSeconds( bool bVal ) { bTime100thSeconds = bVal; } - bool IsTime100thSeconds() const { return bTime100thSeconds; } + // compared including nanoseconds. + void SetTimeNanoSeconds( bool bVal ) { bTimeNanoSeconds = bVal; } + bool IsTimeNanoSeconds() const { return bTimeNanoSeconds; } void AppendCloned( ScChangeAction* pAppend ); SC_DLLPUBLIC ScChangeTrack* Clone( ScDocument* pDocument ) const; diff --git a/sc/source/core/data/dbdocutl.cxx b/sc/source/core/data/dbdocutl.cxx index eb244f779eb3..a03250aae21e 100644 --- a/sc/source/core/data/dbdocutl.cxx +++ b/sc/source/core/data/dbdocutl.cxx @@ -109,8 +109,10 @@ void ScDatabaseDocUtil::PutData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB NUMBERFORMAT_TIME, ScGlobal::eLnge ); util::Time aTime = xRow->getTime(nRowPos); - nVal = ( aTime.Hours * 3600 + aTime.Minutes * 60 + - aTime.Seconds + aTime.HundredthSeconds / 100.0 ) / DATE_TIME_FACTOR; + nVal = aTime.Hours / static_cast(::Time::hourPerDay) + + aTime.Minutes / static_cast(::Time::minutePerDay) + + aTime.Seconds / static_cast(::Time::secondPerDay) + + aTime.NanoSeconds / static_cast(::Time::nanoSecPerDay); bEmptyFlag = xRow->wasNull(); bValue = sal_True; } @@ -125,8 +127,10 @@ void ScDatabaseDocUtil::PutData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB util::DateTime aStamp = xRow->getTimestamp(nRowPos); nVal = ( Date( aStamp.Day, aStamp.Month, aStamp.Year ) - *pFormTable->GetNullDate() ) + - ( aStamp.Hours * 3600 + aStamp.Minutes * 60 + - aStamp.Seconds + aStamp.HundredthSeconds / 100.0 ) / DATE_TIME_FACTOR; + aStamp.Hours / static_cast(::Time::hourPerDay) + + aStamp.Minutes / static_cast(::Time::minutePerDay) + + aStamp.Seconds / static_cast(::Time::secondPerDay) + + aStamp.NanoSeconds / static_cast(::Time::nanoSecPerDay); bEmptyFlag = xRow->wasNull(); bValue = sal_True; } diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index c8f3fffbe923..703317003fd3 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -104,8 +104,6 @@ using ::com::sun::star::beans::XPropertySet; namespace { -const double D_TIMEFACTOR = 86400.0; - /** * Database connection implementation for UNO database API. Note that in * the UNO database API, column index is 1-based, whereas the interface @@ -220,8 +218,10 @@ void DBConnector::getValue(long nCol, ScDPItemData &rData, short& rNumType) cons rNumType = NUMBERFORMAT_TIME; util::Time aTime = mxRow->getTime(nCol+1); - fValue = ( aTime.Hours * 3600 + aTime.Minutes * 60 + - aTime.Seconds + aTime.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; + fValue = aTime.Hours / static_cast(::Time::hourPerDay) + + aTime.Minutes / static_cast(::Time::minutePerDay) + + aTime.Seconds / static_cast(::Time::secondPerDay) + + aTime.NanoSeconds / static_cast(::Time::nanoSecPerDay); rData.SetValue(fValue); break; } @@ -231,8 +231,10 @@ void DBConnector::getValue(long nCol, ScDPItemData &rData, short& rNumType) cons util::DateTime aStamp = mxRow->getTimestamp(nCol+1); fValue = ( Date( aStamp.Day, aStamp.Month, aStamp.Year ) - maNullDate ) + - ( aStamp.Hours * 3600 + aStamp.Minutes * 60 + - aStamp.Seconds + aStamp.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; + aStamp.Hours / static_cast(::Time::hourPerDay) + + aStamp.Minutes / static_cast(::Time::minutePerDay) + + aStamp.Seconds / static_cast(::Time::secondPerDay) + + aStamp.NanoSeconds / static_cast(::Time::nanoSecPerDay); rData.SetValue(fValue); break; } diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx index 5425056769e0..254e423832b7 100644 --- a/sc/source/core/tool/chgtrack.cxx +++ b/sc/source/core/tool/chgtrack.cxx @@ -2232,7 +2232,7 @@ void ScChangeTrack::Init() bInDeleteUndo = false; bInPasteCut = false; bUseFixDateTime = false; - bTime100thSeconds = true; + bTimeNanoSeconds = true; const SvtUserOptions& rUserOpt = SC_MOD()->GetUserOptions(); OUStringBuffer aBuf; @@ -4556,7 +4556,7 @@ ScChangeTrack* ScChangeTrack::Clone( ScDocument* pDocument ) const } ScChangeTrack* pClonedTrack = new ScChangeTrack( pDocument ); - pClonedTrack->SetTime100thSeconds( IsTime100thSeconds() ); + pClonedTrack->SetTimeNanoSeconds( IsTimeNanoSeconds() ); // clone generated actions ::std::stack< const ScChangeAction* > aGeneratedStack; diff --git a/sc/source/core/tool/chgviset.cxx b/sc/source/core/tool/chgviset.cxx index 06f1f292f9c0..e924a06053d4 100644 --- a/sc/source/core/tool/chgviset.cxx +++ b/sc/source/core/tool/chgviset.cxx @@ -138,7 +138,7 @@ void ScChangeViewSettings::AdjustDateMode( const ScDocument& rDoc ) // all together during the gap between those two times. aFirstDateTime += Time( 0, 1 ); aFirstDateTime.SetSec(0); - aFirstDateTime.Set100Sec(0); + aFirstDateTime.SetNanoSec(0); } } if ( !pLast ) diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index ad4daa7443e8..5743f1d5f2f2 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -51,6 +51,7 @@ using namespace formula; #define SCdEpsilon 1.0E-7 +#define D_TIMEFACTOR static_cast(::Time::secondPerDay) //----------------------------------------------------------------------------- // Datum und Zeit @@ -113,10 +114,10 @@ void ScInterpreter::ScGetActTime() Date aActDate( Date::SYSTEM ); long nDiff = aActDate - *(pFormatter->GetNullDate()); Time aActTime( Time::SYSTEM ); - double nTime = ((double)aActTime.Get100Sec() / 100 + - (double)(aActTime.GetSec() + - (aActTime.GetMin() * 60) + - (aActTime.GetHour() * 3600))) / DATE_TIME_FACTOR; + double nTime = aActTime.GetHour() / static_cast(::Time::hourPerDay) + + aActTime.GetMin() / static_cast(::Time::minutePerDay) + + aActTime.GetSec() / static_cast(::Time::secondPerDay) + + aActTime.GetNanoSec() / static_cast(::Time::nanoSecPerDay); PushDouble( (double) nDiff + nTime ); } @@ -149,8 +150,8 @@ void ScInterpreter::ScGetMin() RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScGetMin" ); double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // Datumsanteil weg - long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) % 3600; - PushDouble( (double) (nVal/60) ); + long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) % ::Time::secondPerHour; + PushDouble( (double) (nVal / ::Time::secondPerMinute) ); } void ScInterpreter::ScGetSec() @@ -158,7 +159,7 @@ void ScInterpreter::ScGetSec() RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScGetSec" ); double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // Datumsanteil weg - long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) % 60; + long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) % ::Time::secondPerMinute; PushDouble( (double) nVal ); } @@ -167,7 +168,7 @@ void ScInterpreter::ScGetHour() RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScGetHour" ); double fTime = GetDouble(); fTime -= ::rtl::math::approxFloor(fTime); // Datumsanteil weg - long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) / 3600; + long nVal = (long)::rtl::math::approxFloor(fTime*DATE_TIME_FACTOR+0.5) / ::Time::secondPerHour; PushDouble((double) nVal); } @@ -288,7 +289,7 @@ void ScInterpreter::ScGetTime() double nSec = GetDouble(); double nMin = GetDouble(); double nHour = GetDouble(); - double fTime = fmod( (nHour * 3600) + (nMin * 60) + nSec, DATE_TIME_FACTOR) / DATE_TIME_FACTOR; + double fTime = fmod( (nHour * ::Time::secondPerHour) + (nMin * ::Time::secondPerMinute) + nSec, DATE_TIME_FACTOR) / DATE_TIME_FACTOR; if (fTime < 0) PushIllegalArgument(); else diff --git a/sc/source/filter/html/htmlexp.cxx b/sc/source/filter/html/htmlexp.cxx index cb4b1645df07..d7dd473e23ea 100644 --- a/sc/source/filter/html/htmlexp.cxx +++ b/sc/source/filter/html/htmlexp.cxx @@ -169,7 +169,7 @@ static void lcl_AddStamp( String& rStr, const String& rName, { Date aD(rDateTime.Day, rDateTime.Month, rDateTime.Year); Time aT(rDateTime.Hours, rDateTime.Minutes, rDateTime.Seconds, - rDateTime.HundredthSeconds); + rDateTime.NanoSeconds); DateTime aDateTime(aD,aT); String aStrDate = rLoc.getDate( aDateTime ); diff --git a/sc/source/filter/oox/unitconverter.cxx b/sc/source/filter/oox/unitconverter.cxx index 632103b05135..20d9c487258c 100644 --- a/sc/source/filter/oox/unitconverter.cxx +++ b/sc/source/filter/oox/unitconverter.cxx @@ -58,10 +58,10 @@ inline sal_Int32 lclIsLeapYear( sal_Int32 nYear ) return ((nYear % 4) == 0) && (((nYear % 100) != 0) || ((nYear % 400) == 0)); } -void lclSkipYearBlock( sal_Int32& ornDays, sal_uInt16& ornYear, sal_Int32 nDaysInBlock, sal_Int32 nYearsPerBlock, sal_Int32 nMaxBlocks ) +void lclSkipYearBlock( sal_Int32& ornDays, sal_Int16& ornYear, sal_Int32 nDaysInBlock, sal_Int32 nYearsPerBlock, sal_Int32 nMaxBlocks ) { sal_Int32 nBlocks = ::std::min< sal_Int32 >( ornDays / nDaysInBlock, nMaxBlocks ); - ornYear = static_cast< sal_uInt16 >( ornYear + nYearsPerBlock * nBlocks ); + ornYear = static_cast< sal_Int16 >( ornYear + nYearsPerBlock * nBlocks ); ornDays -= nBlocks * nDaysInBlock; } diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx index 9b0767aadfbb..708d7642e853 100644 --- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx +++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx @@ -49,10 +49,10 @@ static OString lcl_DateTimeToOString( const DateTime& rDateTime ) { char sBuf[ 200 ]; snprintf( sBuf, sizeof( sBuf ), - "%d-%02d-%02dT%02d:%02d:%02d.%02dZ", + "%d-%02d-%02dT%02d:%02d:%02d.%09dZ", rDateTime.GetYear(), rDateTime.GetMonth(), rDateTime.GetDay(), rDateTime.GetHour(), rDateTime.GetMin(), rDateTime.GetSec(), - rDateTime.Get100Sec() ); + rDateTime.GetNanoSec() ); return OString( sBuf ); } @@ -624,7 +624,7 @@ XclExpChTrAction::XclExpChTrAction( bForceInfo( false ) { aDateTime.SetSec( 0 ); - aDateTime.Set100Sec( 0 ); + aDateTime.SetNanoSec( 0 ); } XclExpChTrAction::~XclExpChTrAction() diff --git a/sc/source/filter/xcl97/XclImpChangeTrack.cxx b/sc/source/filter/xcl97/XclImpChangeTrack.cxx index 976c1f83d451..948543a595eb 100644 --- a/sc/source/filter/xcl97/XclImpChangeTrack.cxx +++ b/sc/source/filter/xcl97/XclImpChangeTrack.cxx @@ -128,7 +128,7 @@ void XclImpChangeTrack::ReadDateTime( DateTime& rDateTime ) rDateTime.SetHour( nHour ); rDateTime.SetMin( nMin ); rDateTime.SetSec( nSec ); - rDateTime.Set100Sec( 0 ); + rDateTime.SetNanoSec( 0 ); } sal_Bool XclImpChangeTrack::CheckRecord( sal_uInt16 nOpCode ) diff --git a/sc/source/filter/xml/XMLChangeTrackingImportHelper.cxx b/sc/source/filter/xml/XMLChangeTrackingImportHelper.cxx index 6caf7b05c81d..a28dd7725153 100644 --- a/sc/source/filter/xml/XMLChangeTrackingImportHelper.cxx +++ b/sc/source/filter/xml/XMLChangeTrackingImportHelper.cxx @@ -428,13 +428,13 @@ void ScXMLChangeTrackingImportHelper::EndChangeAction() void ScXMLChangeTrackingImportHelper::ConvertInfo(const ScMyActionInfo& aInfo, String& rUser, DateTime& aDateTime) { Date aDate(aInfo.aDateTime.Day, aInfo.aDateTime.Month, aInfo.aDateTime.Year); - Time aTime(aInfo.aDateTime.Hours, aInfo.aDateTime.Minutes, aInfo.aDateTime.Seconds, aInfo.aDateTime.HundredthSeconds); + Time aTime(aInfo.aDateTime.Hours, aInfo.aDateTime.Minutes, aInfo.aDateTime.Seconds, aInfo.aDateTime.NanoSeconds); aDateTime.SetDate( aDate.GetDate() ); aDateTime.SetTime( aTime.GetTime() ); - // old files didn't store 100th seconds, enable again - if ( aInfo.aDateTime.HundredthSeconds ) - pTrack->SetTime100thSeconds( true ); + // old files didn't store nanoseconds, enable again + if ( aInfo.aDateTime.NanoSeconds ) + pTrack->SetTimeNanoSeconds( true ); const std::set& rUsers = pTrack->GetUserCollection(); std::set::const_iterator it = rUsers.find(aInfo.sUser); @@ -795,8 +795,8 @@ void ScXMLChangeTrackingImportHelper::CreateChangeTrack(ScDocument* pTempDoc) if (pDoc) { pTrack = new ScChangeTrack(pDoc, aUsers); - // old files didn't store 100th seconds, disable until encountered - pTrack->SetTime100thSeconds( false ); + // old files didn't store nanoseconds, disable until encountered + pTrack->SetTimeNanoSeconds( false ); ScMyActions::iterator aItr(aActions.begin()); ScMyActions::iterator aEndItr(aActions.end()); diff --git a/sc/source/filter/xml/XMLConverter.cxx b/sc/source/filter/xml/XMLConverter.cxx index a705c0a55d0f..ae58ceff0e31 100644 --- a/sc/source/filter/xml/XMLConverter.cxx +++ b/sc/source/filter/xml/XMLConverter.cxx @@ -349,13 +349,13 @@ void ScXMLConverter::ConvertCoreToAPIDateTime(const DateTime& aDateTime, util::D rDateTime.Hours = aDateTime.GetHour(); rDateTime.Minutes = aDateTime.GetMin(); rDateTime.Seconds = aDateTime.GetSec(); - rDateTime.HundredthSeconds = aDateTime.Get100Sec(); + rDateTime.NanoSeconds = aDateTime.GetNanoSec(); } void ScXMLConverter::ConvertAPIToCoreDateTime(const util::DateTime& aDateTime, DateTime& rDateTime) { Date aDate(aDateTime.Day, aDateTime.Month, aDateTime.Year); - Time aTime(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.HundredthSeconds); + Time aTime(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.NanoSeconds); DateTime aTempDateTime (aDate, aTime); rDateTime = aTempDateTime; } diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx index d64966bc9299..afa49ba356b0 100644 --- a/sc/source/ui/docshell/docsh3.cxx +++ b/sc/source/ui/docshell/docsh3.cxx @@ -743,7 +743,7 @@ static inline sal_Bool lcl_Equal( const ScChangeAction* pA, const ScChangeAction pA->GetType() == pB->GetType() && pA->GetUser() == pB->GetUser() && (bIgnore100Sec ? - pA->GetDateTimeUTC().IsEqualIgnore100Sec( pB->GetDateTimeUTC() ) : + pA->GetDateTimeUTC().IsEqualIgnoreNanoSec( pB->GetDateTimeUTC() ) : pA->GetDateTimeUTC() == pB->GetDateTimeUTC()); // State nicht vergleichen, falls eine alte Aenderung akzeptiert wurde } @@ -762,7 +762,7 @@ static bool lcl_FindAction( ScDocument* pDoc, const ScChangeAction* pAction, ScD if ( pAction->GetType() == pA->GetType() && pAction->GetUser() == pA->GetUser() && (bIgnore100Sec ? - pAction->GetDateTimeUTC().IsEqualIgnore100Sec( pA->GetDateTimeUTC() ) : + pAction->GetDateTimeUTC().IsEqualIgnoreNanoSec( pA->GetDateTimeUTC() ) : pAction->GetDateTimeUTC() == pA->GetDateTimeUTC() ) && pAction->GetBigRange() == pA->GetBigRange() ) { @@ -807,9 +807,9 @@ void ScDocShell::MergeDocument( ScDocument& rOtherDoc, bool bShared, bool bCheck } } - // include 100th seconds in compare? - sal_Bool bIgnore100Sec = !pSourceTrack->IsTime100thSeconds() || - !pThisTrack->IsTime100thSeconds(); + // include Nano seconds in compare? + sal_Bool bIgnore100Sec = !pSourceTrack->IsTimeNanoSeconds() || + !pThisTrack->IsTimeNanoSeconds(); // gemeinsame Ausgangsposition suchen sal_uLong nFirstNewNumber = 0; @@ -1189,7 +1189,7 @@ bool ScDocShell::MergeSharedDocument( ScDocShell* pSharedDocShell ) aDocument.SetChangeViewSettings( aChangeViewSet ); // find first merge action in this document - sal_Bool bIgnore100Sec = !pThisTrack->IsTime100thSeconds() || !pSharedTrack->IsTime100thSeconds(); + sal_Bool bIgnore100Sec = !pThisTrack->IsTimeNanoSeconds() || !pSharedTrack->IsTimeNanoSeconds(); ScChangeAction* pThisAction = pThisTrack->GetFirst(); ScChangeAction* pSharedAction = pSharedTrack->GetFirst(); while ( lcl_Equal( pThisAction, pSharedAction, bIgnore100Sec ) ) diff --git a/sc/source/ui/miscdlgs/sharedocdlg.cxx b/sc/source/ui/miscdlgs/sharedocdlg.cxx index 12a72e0ee82d..86fc0a5583f8 100644 --- a/sc/source/ui/miscdlgs/sharedocdlg.cxx +++ b/sc/source/ui/miscdlgs/sharedocdlg.cxx @@ -209,7 +209,7 @@ void ScShareDocumentDlg::UpdateView() util::DateTime uDT(xDocProps->getModificationDate()); Date d(uDT.Day, uDT.Month, uDT.Year); - Time t(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time t(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); DateTime aDateTime(d,t); aString += ScGlobal::pLocaleData->getDate( aDateTime ); diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx index c42c119990ca..9fd7f1c81fb3 100644 --- a/sc/source/ui/unoobj/fielduno.cxx +++ b/sc/source/ui/unoobj/fielduno.cxx @@ -950,7 +950,7 @@ void ScEditFieldObj::setPropertyValueDateTime(const OUString& rName, const uno:: else if (rName == SC_UNONAME_DATETIME) { maDateTime = rVal.get(); - Time aTime(maDateTime.Hours, maDateTime.Minutes, maDateTime.Seconds, maDateTime.HundredthSeconds); + Time aTime(maDateTime.Hours, maDateTime.Minutes, maDateTime.Seconds, maDateTime.NanoSeconds); p->SetFixTime(aTime); } else if (rName == SC_UNONAME_NUMFMT) @@ -1012,7 +1012,7 @@ uno::Any ScEditFieldObj::getPropertyValueDateTime(const OUString& rName) maDateTime.Hours = 0; maDateTime.Minutes = 0; maDateTime.Seconds = 0; - maDateTime.HundredthSeconds = 0; + maDateTime.NanoSeconds = 0; return uno::makeAny(maDateTime); } @@ -1056,7 +1056,7 @@ uno::Any ScEditFieldObj::getPropertyValueDateTime(const OUString& rName) maDateTime.Hours = aT.GetHour(); maDateTime.Minutes = aT.GetMin(); maDateTime.Seconds = aT.GetSec(); - maDateTime.HundredthSeconds = aT.Get100Sec(); + maDateTime.NanoSeconds = aT.GetNanoSec(); return uno::makeAny(maDateTime); } diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx index ec0f6d421c90..b61c9fffe0a6 100644 --- a/sc/source/ui/view/viewfun6.cxx +++ b/sc/source/ui/view/viewfun6.cxx @@ -250,10 +250,10 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr) Date aActDate( Date::SYSTEM ); double fDate = aActDate - *pFormatter->GetNullDate(); Time aActTime( Time::SYSTEM ); - double fTime = - aActTime.Get100Sec() / 100.0 + aActTime.GetSec() + - (aActTime.GetMin() * 60.0) + (aActTime.GetHour() * 3600.0); - fTime /= DATE_TIME_FACTOR; + double fTime = aActTime.GetHour() / static_cast(::Time::hourPerDay) + + aActTime.GetMin() / static_cast(::Time::minutePerDay) + + aActTime.GetSec() / static_cast(::Time::secondPerDay) + + aActTime.GetNanoSec() / static_cast(::Time::nanoSecPerDay); pUndoMgr->EnterListAction(rUndoStr, rUndoStr); pDocSh->GetDocFunc().SetValueCell(aCurPos, fDate+fTime, true); diff --git a/scripting/source/pyprov/pythonscript.py b/scripting/source/pyprov/pythonscript.py index cab985177cc1..52ae89bbb295 100755 --- a/scripting/source/pyprov/pythonscript.py +++ b/scripting/source/pyprov/pythonscript.py @@ -226,7 +226,7 @@ def hasChanged( oldDate, newDate ): newDate.Hours > oldDate.Hours or \ newDate.Minutes > oldDate.Minutes or \ newDate.Seconds > oldDate.Seconds or \ - newDate.HundredthSeconds > oldDate.HundredthSeconds + newDate.NanoSeconds > oldDate.NanoSeconds def ensureSourceState( code ): if code.endswith(b"\n"): diff --git a/sd/source/filter/eppt/eppt.cxx b/sd/source/filter/eppt/eppt.cxx index 7bd42c74802c..dc0593837b2a 100644 --- a/sd/source/filter/eppt/eppt.cxx +++ b/sd/source/filter/eppt/eppt.cxx @@ -53,6 +53,7 @@ #include #include #include +#include using namespace com::sun::star; using namespace ::com::sun::star::uno; @@ -1124,7 +1125,7 @@ void ImplExportComments( uno::Reference< drawing::XDrawPage > xPage, SvMemoryStr if ( !sInitials.isEmpty() ) PPTWriter::WriteCString( rBinaryTagData10Atom, sInitials, 2 ); - sal_Int16 nMilliSeconds = aDateTime.HundredthSeconds * 10; + sal_Int16 nMilliSeconds = static_cast(::rtl::math::round(static_cast(aDateTime.NanoSeconds) / 1000000000.0)); EscherExAtom aCommentAtom10( rBinaryTagData10Atom, EPP_CommentAtom10 ); rBinaryTagData10Atom << nIndex++ << aDateTime.Year diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 724acfe6edfa..da791f33e2f9 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -1314,7 +1314,7 @@ bool PowerPointExport::WriteComments( sal_uInt32 nPageNum ) sal_Int32 nId = GetAuthorIdAndLastIndex ( xAnnotation->getAuthor(), nLastIndex ); char cDateTime[32]; - snprintf(cDateTime, 31, "%02d-%02d-%02dT%02d:%02d:%02d.%03d", aDateTime.Year, aDateTime.Month, aDateTime.Day, aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.HundredthSeconds); + snprintf(cDateTime, 31, "%02d-%02d-%02dT%02d:%02d:%02d.%09d", aDateTime.Year, aDateTime.Month, aDateTime.Day, aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.NanoSeconds); pFS->startElementNS( XML_p, XML_cm, XML_authorId, I32S( nId ), diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx index e3fe236b591d..2153af4c2e7f 100644 --- a/sd/source/ui/annotations/annotationmanager.cxx +++ b/sd/source/ui/annotations/annotationmanager.cxx @@ -165,7 +165,7 @@ OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotatio else if (aDate.IsValidAndGregorian() ) sRet = rLocalData.getDate(aDate); - Time aTime( aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.HundredthSeconds ); + Time aTime( aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.NanoSeconds ); if(aTime.GetTime() != 0) sRet = sRet + " " + rLocalData.getTime( aTime,false ); } diff --git a/sd/source/ui/dlg/animobjs.cxx b/sd/source/ui/dlg/animobjs.cxx index 8735f44edc4b..e1e46157253a 100644 --- a/sd/source/ui/dlg/animobjs.cxx +++ b/sd/source/ui/dlg/animobjs.cxx @@ -1062,7 +1062,7 @@ void AnimationWindow::CreateAnimObj (::sd::View& rView ) for (size_t i = 0; i < nCount; ++i) { Time *const pTime = m_FrameList[i].second; - long nTime = pTime->Get100Sec(); + long nTime = pTime->GetNanoSec(); nTime += pTime->GetSec() * 100; BitmapEx const*const pBitmapEx = m_FrameList[i].first; diff --git a/sfx2/qa/complex/sfx2/DocumentProperties.java b/sfx2/qa/complex/sfx2/DocumentProperties.java index 17faed72d440..5db9174d7a23 100644 --- a/sfx2/qa/complex/sfx2/DocumentProperties.java +++ b/sfx2/qa/complex/sfx2/DocumentProperties.java @@ -349,7 +349,7 @@ public class DocumentProperties dur.Hours = 777; dur.Minutes = 666; dur.Seconds = 555; - dur.MilliSeconds = 444; + dur.NanoSeconds = 444444444; udpc.addProperty("Frobnicate", PropertyAttribute.REMOVABLE, b); udpc.addProperty("FrobDuration", PropertyAttribute.REMOVABLE, dur); @@ -426,7 +426,7 @@ public class DocumentProperties // this is now a Duration! Duration t_dur = new Duration(false, (short)0, (short)0, (short)0, t.Hours, t.Minutes, t.Seconds, - (short)(10 * t.HundredthSeconds)); + t.NanoSeconds); assertTrue("UserDefined time", eqDuration(t_dur, (Duration) udps.getPropertyValue("FrobDuration2"))); assertTrue("UserDefined date", eqDate(date, (Date) @@ -476,7 +476,7 @@ public class DocumentProperties return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day && a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.HundredthSeconds == b.HundredthSeconds; + && a.NanoSeconds == b.NanoSeconds; } boolean eqDate(Date a, Date b) { @@ -486,14 +486,14 @@ public class DocumentProperties boolean eqTime(Time a, Time b) { return a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.HundredthSeconds == b.HundredthSeconds; + && a.NanoSeconds == b.NanoSeconds; } boolean eqDuration(Duration a, Duration b) { return a.Years == b.Years && a.Months == b.Months && a.Days == b.Days && a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.MilliSeconds == b.MilliSeconds + && a.NanoSeconds == b.NanoSeconds && a.Negative == b.Negative; } diff --git a/sfx2/source/appl/sfxpicklist.cxx b/sfx2/source/appl/sfxpicklist.cxx index 1da4614d1255..f18b1db0b3da 100644 --- a/sfx2/source/appl/sfxpicklist.cxx +++ b/sfx2/source/appl/sfxpicklist.cxx @@ -365,7 +365,7 @@ void SfxPickList::Notify( SfxBroadcaster&, const SfxHint& rHint ) xDocProps->setAuthor( SvtUserOptions().GetFullName() ); ::DateTime now( ::DateTime::SYSTEM ); xDocProps->setCreationDate( util::DateTime( - now.Get100Sec(), now.GetSec(), now.GetMin(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ) ); } diff --git a/sfx2/source/bastyp/frmhtmlw.cxx b/sfx2/source/bastyp/frmhtmlw.cxx index 1f24a5952288..e822d9d7dc0d 100644 --- a/sfx2/source/bastyp/frmhtmlw.cxx +++ b/sfx2/source/bastyp/frmhtmlw.cxx @@ -172,7 +172,7 @@ void SfxFrameHTMLWriter::Out_DocInfo( SvStream& rStrm, const String& rBaseURL, // created ::util::DateTime uDT = i_xDocProps->getCreationDate(); Date aD(uDT.Day, uDT.Month, uDT.Year); - Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); String sOut = OUString::number(aD.GetDate()); sOut += ';'; sOut += OUString::number(aT.GetTime()); @@ -188,7 +188,7 @@ void SfxFrameHTMLWriter::Out_DocInfo( SvStream& rStrm, const String& rBaseURL, // changed uDT = i_xDocProps->getModificationDate(); Date aD2(uDT.Day, uDT.Month, uDT.Year); - Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); sOut = OUString::number(aD2.GetDate()); sOut += ';'; sOut += OUString::number(aT2.GetTime()); diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx index b198ca24822b..e13e557241cb 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -99,7 +99,7 @@ bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight) && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.HundredthSeconds == i_rRight.HundredthSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; } // STATIC DATA ----------------------------------------------------------- @@ -174,7 +174,7 @@ String ConvertDateTime_Impl( const String& rName, const util::DateTime& uDT, const LocaleDataWrapper& rWrapper ) { Date aD(uDT.Day, uDT.Month, uDT.Year); - Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); const String pDelim ( ", " ); String aStr( rWrapper.getDate( aD ) ); aStr += pDelim; @@ -352,7 +352,7 @@ void SfxDocumentInfoItem::resetUserData(const OUString & i_rAuthor) setAuthor(i_rAuthor); DateTime now( DateTime::SYSTEM ); setCreationDate( util::DateTime( - now.Get100Sec(), now.GetSec(), now.GetMin(), now.GetHour(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ) ); setModifiedBy(OUString()); setPrintedBy(OUString()); @@ -798,7 +798,7 @@ IMPL_LINK_NOARG(SfxDocumentPage, DeleteHdl) const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() ); DateTime now( DateTime::SYSTEM ); util::DateTime uDT( - now.Get100Sec(), now.GetSec(), now.GetMin(), now.GetHour(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ); m_pCreateValFt->SetText( ConvertDateTime_Impl( aName, uDT, rLocaleWrapper ) ); OUString aEmpty; @@ -1241,7 +1241,7 @@ DurationDialog_Impl::DurationDialog_Impl( aHourNF.SetValue(rDuration.Hours ); aMinuteNF.SetValue(rDuration.Minutes); aSecondNF.SetValue(rDuration.Seconds); - aMSecondNF.SetValue(rDuration.MilliSeconds); + aMSecondNF.SetValue(rDuration.NanoSeconds); } DurationDialog_Impl::~DurationDialog_Impl() @@ -1258,7 +1258,7 @@ util::Duration DurationDialog_Impl::GetDuration() const aRet.Hours = aHourNF.GetValue( ); aRet.Minutes = aMinuteNF.GetValue(); aRet.Seconds = aSecondNF.GetValue(); - aRet.MilliSeconds = aMSecondNF.GetValue(); + aRet.NanoSeconds = aMSecondNF.GetValue(); return aRet; } @@ -1752,7 +1752,7 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) 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.HundredthSeconds ) ); + pNewLine->m_aTimeField.SetTime( Time( aTmpDateTime.Hours, aTmpDateTime.Minutes, aTmpDateTime.Seconds, aTmpDateTime.NanoSeconds ) ); nType = CUSTOM_TYPE_DATETIME; } @@ -1866,7 +1866,7 @@ Sequence< beans::PropertyValue > CustomPropertiesWindow::GetCustomProperties() c { Date aTmpDate = pLine->m_aDateField.GetDate(); Time aTmpTime = pLine->m_aTimeField.GetTime(); - util::DateTime aDateTime(aTmpTime.Get100Sec(), aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), + util::DateTime aDateTime(aTmpTime.GetNanoSec(), aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear() ); aPropertiesSeq[i].Value <<= aDateTime; } diff --git a/sfx2/source/dialog/versdlg.cxx b/sfx2/source/dialog/versdlg.cxx index 25db61b2d705..41ade0fe68d1 100644 --- a/sfx2/source/dialog/versdlg.cxx +++ b/sfx2/source/dialog/versdlg.cxx @@ -105,7 +105,7 @@ SfxVersionTableDtor::SfxVersionTableDtor( const uno::Sequence < util::RevisionTa pInfo->aAuthor = rInfo[n].Author; Date aDate ( rInfo[n].TimeStamp.Day, rInfo[n].TimeStamp.Month, rInfo[n].TimeStamp.Year ); - Time aTime ( rInfo[n].TimeStamp.Hours, rInfo[n].TimeStamp.Minutes, rInfo[n].TimeStamp.Seconds, rInfo[n].TimeStamp.HundredthSeconds ); + Time aTime ( rInfo[n].TimeStamp.Hours, rInfo[n].TimeStamp.Minutes, rInfo[n].TimeStamp.Seconds, rInfo[n].TimeStamp.NanoSeconds ); pInfo->aCreationDate = DateTime( aDate, aTime ); aTableList.push_back( pInfo ); diff --git a/sfx2/source/doc/SfxDocumentMetaData.cxx b/sfx2/source/doc/SfxDocumentMetaData.cxx index e4a03d0be849..d83b1950dc7d 100644 --- a/sfx2/source/doc/SfxDocumentMetaData.cxx +++ b/sfx2/source/doc/SfxDocumentMetaData.cxx @@ -412,7 +412,7 @@ bool operator== (const css::util::DateTime &i_rLeft, && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.HundredthSeconds == i_rRight.HundredthSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; } // NB: keep these two arrays in sync! @@ -633,7 +633,7 @@ OUString SAL_CALL durationToText(sal_Int32 i_value) throw () ud.Hours = static_cast((i_value % (24 * 3600)) / 3600); ud.Minutes = static_cast((i_value % 3600) / 60); ud.Seconds = static_cast(i_value % 60); - ud.MilliSeconds = 0; + ud.NanoSeconds = 0; return durationToText(ud); } @@ -967,7 +967,7 @@ propsToStrings(css::uno::Reference const & i_xPropSet) ud.Hours = ut.Hours; ud.Minutes = ut.Minutes; ud.Seconds = ut.Seconds; - ud.MilliSeconds = 10 * ut.HundredthSeconds; + ud.NanoSeconds = ut.NanoSeconds; values.push_back(durationToText(ud)); as.push_back(std::make_pair(vt, OUString("time"))); @@ -1837,7 +1837,7 @@ SfxDocumentMetaData::resetUserData(const OUString & the_value) bool bModified( false ); bModified |= setMetaText("meta:initial-creator", the_value); ::DateTime now( ::DateTime::SYSTEM ); - css::util::DateTime uDT(now.Get100Sec(), now.GetSec(), now.GetMin(), + css::util::DateTime uDT(now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear()); bModified |= setMetaText("meta:creation-date", dateTimeToText(uDT)); bModified |= setMetaText("dc:creator", OUString()); diff --git a/sfx2/source/doc/objcont.cxx b/sfx2/source/doc/objcont.cxx index 7f3a31e5213a..86883d10e6b4 100644 --- a/sfx2/source/doc/objcont.cxx +++ b/sfx2/source/doc/objcont.cxx @@ -100,8 +100,8 @@ bool operator> (const util::DateTime& i_rLeft, const util::DateTime& i_rRight) if ( i_rLeft.Seconds != i_rRight.Seconds ) return i_rLeft.Seconds > i_rRight.Seconds; - if ( i_rLeft.HundredthSeconds != i_rRight.HundredthSeconds ) - return i_rLeft.HundredthSeconds > i_rRight.HundredthSeconds; + if ( i_rLeft.NanoSeconds != i_rRight.NanoSeconds ) + return i_rLeft.NanoSeconds > i_rRight.NanoSeconds; return sal_False; } @@ -202,7 +202,7 @@ void SfxObjectShell::UpdateDocInfoForSave() // update ModificationAuthor, revision and editing time ::DateTime now( ::DateTime::SYSTEM ); xDocProps->setModificationDate( util::DateTime( - now.Get100Sec(), now.GetSec(), now.GetMin(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ) ); xDocProps->setModifiedBy( aUserName ); @@ -833,7 +833,7 @@ void SfxObjectShell::ResetFromTemplate( const String& rTemplateName, const Strin ::DateTime now( ::DateTime::SYSTEM ); xDocProps->setTemplateDate( util::DateTime( - now.Get100Sec(), now.GetSec(), now.GetMin(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ) ); diff --git a/sfx2/source/doc/oleprops.cxx b/sfx2/source/doc/oleprops.cxx index 48f19c324a16..6ecc27a05e84 100644 --- a/sfx2/source/doc/oleprops.cxx +++ b/sfx2/source/doc/oleprops.cxx @@ -52,7 +52,7 @@ bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight) && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.HundredthSeconds == i_rRight.HundredthSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; } static @@ -586,7 +586,7 @@ void SfxOleFileTimeProperty::ImplLoad( SvStream& rStrm ) maDateTime.Hours = aDateTime.GetHour(); maDateTime.Minutes = aDateTime.GetMin(); maDateTime.Seconds = aDateTime.GetSec(); - maDateTime.HundredthSeconds = aDateTime.Get100Sec(); + maDateTime.NanoSeconds = aDateTime.GetNanoSec(); } void SfxOleFileTimeProperty::ImplSave( SvStream& rStrm ) @@ -600,7 +600,7 @@ void SfxOleFileTimeProperty::ImplSave( SvStream& rStrm ) static_cast< sal_uIntPtr >( maDateTime.Hours ), static_cast< sal_uIntPtr >( maDateTime.Minutes ), static_cast< sal_uIntPtr >( maDateTime.Seconds ), - static_cast< sal_uIntPtr >( maDateTime.HundredthSeconds ) ) ); + static_cast< sal_uIntPtr >( maDateTime.NanoSeconds ) ) ); // invalid time stamp is not converted to UTC // heuristic to detect editing durations (which we assume to be < 1 year): // check only the year, not the entire date diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx index f518bae40dbb..3c2fff7a146f 100644 --- a/sfx2/source/view/viewprn.cxx +++ b/sfx2/source/view/viewprn.cxx @@ -317,7 +317,7 @@ void SfxPrinterController::jobStarted() ::DateTime now( ::DateTime::SYSTEM ); xDocProps->setPrintDate( util::DateTime( - now.Get100Sec(), now.GetSec(), now.GetMin(), now.GetHour(), + now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear() ) ); SFX_APP()->NotifyEvent( SfxEventHint(SFX_EVENT_PRINTDOC, GlobalEventConfig::GetEventName( STR_EVENT_PRINTDOC ), mpObjectShell ) ); diff --git a/svl/source/items/dateitem.cxx b/svl/source/items/dateitem.cxx index 5dc90ada2fbd..706d373c5371 100644 --- a/svl/source/items/dateitem.cxx +++ b/svl/source/items/dateitem.cxx @@ -163,7 +163,7 @@ bool SfxDateTimeItem::PutValue( const com::sun::star::uno::Any& rVal, Time( aValue.Hours, aValue.Minutes, aValue.Seconds, - aValue.HundredthSeconds ) ); + aValue.NanoSeconds ) ); return true; } @@ -177,7 +177,7 @@ bool SfxDateTimeItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const { nMemberId &= ~CONVERT_TWIPS; - com::sun::star::util::DateTime aValue( aDateTime.Get100Sec(), + com::sun::star::util::DateTime aValue( aDateTime.GetNanoSec(), aDateTime.GetSec(), aDateTime.GetMin(), aDateTime.GetHour(), diff --git a/svl/source/misc/fstathelper.cxx b/svl/source/misc/fstathelper.cxx index f1692f256e18..498d57bb91c7 100644 --- a/svl/source/misc/fstathelper.cxx +++ b/svl/source/misc/fstathelper.cxx @@ -49,7 +49,7 @@ sal_Bool FStatHelper::GetModifiedDateTimeOfFile( const OUString& rURL, *pDate = Date( pDT->Day, pDT->Month, pDT->Year ); if( pTime ) *pTime = Time( pDT->Hours, pDT->Minutes, - pDT->Seconds, pDT->HundredthSeconds ); + pDT->Seconds, pDT->NanoSeconds ); } } catch(...) diff --git a/svtools/source/contnr/DocumentInfoPreview.cxx b/svtools/source/contnr/DocumentInfoPreview.cxx index 3380c14a43e5..2a546077986b 100644 --- a/svtools/source/contnr/DocumentInfoPreview.cxx +++ b/svtools/source/contnr/DocumentInfoPreview.cxx @@ -150,7 +150,7 @@ void ODocumentInfoPreview::insertDateTime( DateTime aToolsDT( Date(value.Day, value.Month, value.Year), Time( - value.Hours, value.Minutes, value.Seconds, value.HundredthSeconds)); + value.Hours, value.Minutes, value.Seconds, value.NanoSeconds)); if (aToolsDT.IsValidAndGregorian()) { const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() ); OUStringBuffer buf(rLocaleWrapper.getDate(aToolsDT)); diff --git a/svtools/source/contnr/contentenumeration.cxx b/svtools/source/contnr/contentenumeration.cxx index 7e62273bf460..decda28f110d 100644 --- a/svtools/source/contnr/contentenumeration.cxx +++ b/svtools/source/contnr/contentenumeration.cxx @@ -57,7 +57,7 @@ namespace svt #define CONVERT_DATETIME( aUnoDT, aToolsDT ) \ aToolsDT = ::DateTime( Date( aUnoDT.Day, aUnoDT.Month, aUnoDT.Year ), \ - Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.HundredthSeconds ) ); + Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.NanoSeconds ) ); using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; diff --git a/svtools/source/misc/templatefoldercache.cxx b/svtools/source/misc/templatefoldercache.cxx index d8103cfcd050..aa2bade43ffd 100644 --- a/svtools/source/misc/templatefoldercache.cxx +++ b/svtools/source/misc/templatefoldercache.cxx @@ -57,7 +57,7 @@ namespace svt //--------------------------------------------------------------------- SvStream& operator << ( SvStream& _rStorage, const util::DateTime& _rDate ) { - _rStorage << _rDate.HundredthSeconds; + _rStorage << _rDate.NanoSeconds; _rStorage << _rDate.Seconds; _rStorage << _rDate.Minutes; _rStorage << _rDate.Hours; @@ -71,7 +71,7 @@ namespace svt //--------------------------------------------------------------------- SvStream& operator >> ( SvStream& _rStorage, util::DateTime& _rDate ) { - _rStorage >> _rDate.HundredthSeconds; + _rStorage >> _rDate.NanoSeconds; _rStorage >> _rDate.Seconds; _rStorage >> _rDate.Minutes; _rStorage >> _rDate.Hours; @@ -85,7 +85,7 @@ namespace svt //--------------------------------------------------------------------- sal_Bool operator == ( const util::DateTime& _rLHS, const util::DateTime& _rRHS ) { - return _rLHS.HundredthSeconds == _rRHS.HundredthSeconds + return _rLHS.NanoSeconds == _rRHS.NanoSeconds && _rLHS.Seconds == _rRHS.Seconds && _rLHS.Minutes == _rRHS.Minutes && _rLHS.Hours == _rRHS.Hours @@ -123,7 +123,7 @@ namespace svt private: inline void implResetDate( ) { - m_aLastModified.HundredthSeconds = m_aLastModified.Seconds = m_aLastModified.Minutes = m_aLastModified.Hours = 0; + m_aLastModified.NanoSeconds = m_aLastModified.Seconds = m_aLastModified.Minutes = m_aLastModified.Hours = 0; m_aLastModified.Day = m_aLastModified.Month = m_aLastModified.Year = 0; } diff --git a/svtools/source/svhtml/parhtml.cxx b/svtools/source/svhtml/parhtml.cxx index dd1b60d9658b..d8d5080fcf92 100644 --- a/svtools/source/svhtml/parhtml.cxx +++ b/svtools/source/svhtml/parhtml.cxx @@ -2170,7 +2170,7 @@ bool HTMLParser::ParseMetaOptionsImpl( Date aDate( (sal_uLong)aContent.GetToken(0).ToInt32() ); Time aTime( (sal_uLong)aContent.GetToken(1).ToInt32() ); DateTime aDateTime( aDate, aTime ); - ::util::DateTime uDT(aDateTime.Get100Sec(), + ::util::DateTime uDT(aDateTime.GetNanoSec(), aDateTime.GetSec(), aDateTime.GetMin(), aDateTime.GetHour(), aDateTime.GetDay(), aDateTime.GetMonth(), aDateTime.GetYear()); diff --git a/svtools/source/table/cellvalueconversion.cxx b/svtools/source/table/cellvalueconversion.cxx index 0f26ab2811fb..d753b5293090 100644 --- a/svtools/source/table/cellvalueconversion.cxx +++ b/svtools/source/table/cellvalueconversion.cxx @@ -239,7 +239,7 @@ namespace svt // time part returnValue += lcl_convertTimeToDays( - aDateTimeValue.Hours, aDateTimeValue.Minutes, aDateTimeValue.Seconds, aDateTimeValue.HundredthSeconds ); + aDateTimeValue.Hours, aDateTimeValue.Minutes, aDateTimeValue.Seconds, aDateTimeValue.NanoSeconds ); // done return returnValue; @@ -300,7 +300,7 @@ namespace svt // convert returnValue += lcl_convertTimeToDays( - aTimeValue.Hours, aTimeValue.Minutes, aTimeValue.Seconds, aTimeValue.HundredthSeconds ); + aTimeValue.Hours, aTimeValue.Minutes, aTimeValue.Seconds, aTimeValue.NanoSeconds ); // done return returnValue; diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx index 1022fbfebc3c..29a4ef641731 100644 --- a/svx/source/fmcomp/gridcell.cxx +++ b/svx/source/fmcomp/gridcell.cxx @@ -2398,7 +2398,7 @@ namespace _rField.SetText( sTime ); else { - _rField.SetTime( ::Time( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.HundredthSeconds ) ); + _rField.SetTime( ::Time( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.NanoSeconds ) ); sTime = _rField.GetText(); } } diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx index fc896f3c4a06..fc5ad2ba4203 100644 --- a/sw/source/core/doc/doccomp.cxx +++ b/sw/source/core/doc/doccomp.cxx @@ -1654,7 +1654,7 @@ void SwCompareData::SetRedlinesToDoc( sal_Bool bUseDocInfo ) ? xDocProps->getCreationDate() : xDocProps->getModificationDate() ); Date d(uDT.Day, uDT.Month, uDT.Year); - Time t(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time t(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); DateTime aDT(d,t); if( aTmp.Len() ) diff --git a/sw/source/core/doc/docglbl.cxx b/sw/source/core/doc/docglbl.cxx index 5c0eb98509cc..58dd0333b0b2 100644 --- a/sw/source/core/doc/docglbl.cxx +++ b/sw/source/core/doc/docglbl.cxx @@ -272,7 +272,7 @@ bool SwDoc::SplitDoc( sal_uInt16 eDocType, const String& rPath, bool bOutline, c OSL_ENSURE(xDocProps.is(), "Doc has no DocumentProperties"); // the GlobalDoc is the template xDocProps->setTemplateName(aEmptyStr); - ::util::DateTime uDT(aTmplDate.Get100Sec(), + ::util::DateTime uDT(aTmplDate.GetNanoSec(), aTmplDate.GetSec(), aTmplDate.GetMin(), aTmplDate.GetHour(), aTmplDate.GetDay(), aTmplDate.GetMonth(), aTmplDate.GetYear()); diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index 5c2cdf00bfad..6f3e18b222ec 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -2994,7 +2994,7 @@ SwRedlineData::SwRedlineData( RedlineType_t eT, sal_uInt16 nAut ) eType( eT ), nAuthor( nAut ), nSeqNo( 0 ) { aStamp.SetSec( 0 ); - aStamp.Set100Sec( 0 ); + aStamp.SetNanoSec( 0 ); } SwRedlineData::SwRedlineData( const SwRedlineData& rCpy, sal_Bool bCpyNext ) diff --git a/sw/source/core/fields/docufld.cxx b/sw/source/core/fields/docufld.cxx index 5783b506aae9..eee6211c0328 100644 --- a/sw/source/core/fields/docufld.cxx +++ b/sw/source/core/fields/docufld.cxx @@ -973,7 +973,7 @@ String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat, String aName( xDocProps->getAuthor() ); util::DateTime uDT( xDocProps->getCreationDate() ); Date aD(uDT.Day, uDT.Month, uDT.Year); - Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); DateTime aDate(aD,aT); if( nSub == DI_CREATE ) ; // das wars schon!! @@ -982,7 +982,7 @@ String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat, aName = xDocProps->getModifiedBy(); uDT = xDocProps->getModificationDate(); Date bD(uDT.Day, uDT.Month, uDT.Year); - Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); DateTime bDate(bD,bT); aDate = bDate; } @@ -991,7 +991,7 @@ String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat, aName = xDocProps->getPrintedBy(); uDT = xDocProps->getPrintDate(); Date bD(uDT.Day, uDT.Month, uDT.Year); - Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); DateTime bDate(bD,bT); aDate = bDate; } @@ -1068,8 +1068,8 @@ SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const template static double lcl_TimeToDouble( const T& rTime ) { - const double fMilliSecondsPerDay = 86400000.0; - return ((rTime.Hours*3600000)+(rTime.Minutes*60000)+(rTime.Seconds*1000)+(rTime.HundredthSeconds*10)) / fMilliSecondsPerDay; + const double fNanoSecondsPerDay = 86400000000000.0; + return ((rTime.Hours*3600000)+(rTime.Minutes*60000)+(rTime.Seconds*1000)+(rTime.NanoSeconds)) / fNanoSecondsPerDay; } template @@ -1904,7 +1904,7 @@ bool SwPostItField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const case FIELD_PROP_DATE_TIME: { util::DateTime DateTimeValue; - DateTimeValue.HundredthSeconds = aDateTime.Get100Sec(); + DateTimeValue.NanoSeconds = aDateTime.GetNanoSec(); DateTimeValue.Seconds = aDateTime.GetSec(); DateTimeValue.Minutes = aDateTime.GetMin(); DateTimeValue.Hours = aDateTime.GetHour(); @@ -1957,7 +1957,7 @@ bool SwPostItField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId ) util::DateTime aDateTimeValue; if(!(rAny >>= aDateTimeValue)) return sal_False; - aDateTime.Set100Sec(aDateTimeValue.HundredthSeconds); + aDateTime.SetNanoSec(aDateTimeValue.NanoSeconds); aDateTime.SetSec(aDateTimeValue.Seconds); aDateTime.SetMin(aDateTimeValue.Minutes); aDateTime.SetHour(aDateTimeValue.Hours); diff --git a/sw/source/core/fields/flddat.cxx b/sw/source/core/fields/flddat.cxx index ddd92926b508..6f9076c6b6fa 100644 --- a/sw/source/core/fields/flddat.cxx +++ b/sw/source/core/fields/flddat.cxx @@ -194,7 +194,7 @@ bool SwDateTimeField::QueryValue( uno::Any& rVal, sal_uInt16 nWhichId ) const DateTime aDateTime(GetDate(), GetTime()); util::DateTime DateTimeValue; - DateTimeValue.HundredthSeconds = aDateTime.Get100Sec(); + DateTimeValue.NanoSeconds = aDateTime.GetNanoSec(); DateTimeValue.Seconds = aDateTime.GetSec(); DateTimeValue.Minutes = aDateTime.GetMin(); DateTimeValue.Hours = aDateTime.GetHour(); @@ -239,7 +239,7 @@ bool SwDateTimeField::PutValue( const uno::Any& rVal, sal_uInt16 nWhichId ) if(!(rVal >>= aDateTimeValue)) return false; DateTime aDateTime( DateTime::EMPTY ); - aDateTime.Set100Sec(aDateTimeValue.HundredthSeconds); + aDateTime.SetNanoSec(aDateTimeValue.NanoSeconds); aDateTime.SetSec(aDateTimeValue.Seconds); aDateTime.SetMin(aDateTimeValue.Minutes); aDateTime.SetHour(aDateTimeValue.Hours); diff --git a/sw/source/core/unocore/swunohelper.cxx b/sw/source/core/unocore/swunohelper.cxx index 98d076bac5e1..63e9027e9854 100644 --- a/sw/source/core/unocore/swunohelper.cxx +++ b/sw/source/core/unocore/swunohelper.cxx @@ -240,7 +240,7 @@ bool UCB_GetFileListOfFolder( const String& rURL, ::Time( aStamp.Hours, aStamp.Minutes, aStamp.Seconds, - aStamp.HundredthSeconds )); + aStamp.NanoSeconds )); pDateTimeList->push_back( pDateTime ); } } diff --git a/sw/source/core/unocore/unoredline.cxx b/sw/source/core/unocore/unoredline.cxx index d891e66c28fc..7870c3886200 100644 --- a/sw/source/core/unocore/unoredline.cxx +++ b/sw/source/core/unocore/unoredline.cxx @@ -204,7 +204,7 @@ static util::DateTime lcl_DateTimeToUno(const DateTime& rDT) aRetDT.Hours = rDT.GetHour(); aRetDT.Minutes = rDT.GetMin(); aRetDT.Seconds = rDT.GetSec(); - aRetDT.HundredthSeconds = rDT.Get100Sec(); + aRetDT.NanoSeconds = rDT.GetNanoSec(); return aRetDT; } diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index a62370fdb3af..de440b04ea30 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -284,15 +284,15 @@ static void WriteDop( WW8Export& rWrt ) { ::util::DateTime uDT = xDocProps->getCreationDate(); Date aD(uDT.Day, uDT.Month, uDT.Year); - Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); rDop.dttmCreated = sw::ms::DateTime2DTTM(DateTime(aD,aT)); uDT = xDocProps->getModificationDate(); Date aD2(uDT.Day, uDT.Month, uDT.Year); - Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); rDop.dttmRevised = sw::ms::DateTime2DTTM(DateTime(aD2,aT2)); uDT = xDocProps->getPrintDate(); Date aD3(uDT.Day, uDT.Month, uDT.Year); - Time aT3(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds); + Time aT3(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds); rDop.dttmLastPrint = sw::ms::DateTime2DTTM(DateTime(aD3,aT3)); } diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index cc00d10f45cc..627f5aa6448f 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1487,7 +1487,7 @@ void SwWW8ImplReader::ImportDop() { DateTime aLastPrinted( msfilter::util::DTTM2DateTime(pWDop->dttmLastPrint)); - ::util::DateTime uDT(aLastPrinted.Get100Sec(), + ::util::DateTime uDT(aLastPrinted.GetNanoSec(), aLastPrinted.GetSec(), aLastPrinted.GetMin(), aLastPrinted.GetHour(), aLastPrinted.GetDay(), aLastPrinted.GetMonth(), aLastPrinted.GetYear()); diff --git a/sw/source/filter/xml/XMLRedlineImportHelper.cxx b/sw/source/filter/xml/XMLRedlineImportHelper.cxx index b2abe8fa8642..00a59c7baa68 100644 --- a/sw/source/filter/xml/XMLRedlineImportHelper.cxx +++ b/sw/source/filter/xml/XMLRedlineImportHelper.cxx @@ -723,7 +723,7 @@ SwRedlineData* XMLRedlineImportHelper::ConvertRedline( aDT.SetHour( pRedlineInfo->aDateTime.Hours ); aDT.SetMin( pRedlineInfo->aDateTime.Minutes ); aDT.SetSec( pRedlineInfo->aDateTime.Seconds ); - aDT.Set100Sec( pRedlineInfo->aDateTime.HundredthSeconds ); + aDT.SetNanoSec( pRedlineInfo->aDateTime.NanoSeconds ); // 3) recursively convert next redline // ( check presence and sanity of hierarchical redline info ) diff --git a/tools/Library_tl.mk b/tools/Library_tl.mk index 9ea13e7e290e..5491b8c90e91 100644 --- a/tools/Library_tl.mk +++ b/tools/Library_tl.mk @@ -97,6 +97,12 @@ $(eval $(call gb_Library_use_externals,tl,\ zlib \ )) +ifeq ($(OS),LINUX) +$(eval $(call gb_Library_add_libs,tl,\ + -lrt \ +)) +endif + ifeq ($(OS),WNT) $(eval $(call gb_Library_use_system_win32_libs,tl,\ diff --git a/tools/inc/tools/datetime.hxx b/tools/inc/tools/datetime.hxx index 0a799343145e..1de0f3d6432c 100644 --- a/tools/inc/tools/datetime.hxx +++ b/tools/inc/tools/datetime.hxx @@ -50,11 +50,11 @@ public: sal_Bool IsBetween( const DateTime& rFrom, const DateTime& rTo ) const; - sal_Bool IsEqualIgnore100Sec( const DateTime& rDateTime ) const + sal_Bool IsEqualIgnoreNanoSec( const DateTime& rDateTime ) const { if ( Date::operator!=( rDateTime ) ) return sal_False; - return Time::IsEqualIgnore100Sec( rDateTime ); + return Time::IsEqualIgnoreNanoSec( rDateTime ); } sal_Bool operator ==( const DateTime& rDateTime ) const diff --git a/tools/inc/tools/time.hxx b/tools/inc/tools/time.hxx index fe585103bb2e..ce6eb42ebe88 100644 --- a/tools/inc/tools/time.hxx +++ b/tools/inc/tools/time.hxx @@ -33,7 +33,7 @@ class ResId; class TOOLS_DLLPUBLIC SAL_WARN_UNUSED Time { private: - sal_Int32 nTime; + sal_Int64 nTime; public: enum TimeInitSystem @@ -46,38 +46,54 @@ public: { EMPTY }; + static const sal_Int64 hourPerDay = 24; + static const sal_Int64 minutePerHour = 60; + static const sal_Int64 secondPerMinute = 60; + static const sal_Int64 nanoSecPerSec = 1000000000; + static const sal_Int64 nanoSecPerMinute = nanoSecPerSec * secondPerMinute; + static const sal_Int64 nanoSecPerHour = nanoSecPerSec * secondPerMinute * minutePerHour; + static const sal_Int64 nanoSecPerDay = nanoSecPerSec * secondPerMinute * minutePerHour * hourPerDay; + static const sal_Int64 secondPerHour = secondPerMinute * minutePerHour; + static const sal_Int64 secondPerDay = secondPerMinute * minutePerHour * hourPerDay; + static const sal_Int64 minutePerDay = minutePerHour * hourPerDay; + static const sal_Int64 nanoPerMicro = 1000; + static const sal_Int64 nanoPerMilli = 1000000; + static const sal_Int64 nanoPerCenti = 10000000; Time( TimeInitEmpty ) { nTime = 0; } Time( TimeInitSystem ); Time( const ResId & rResId ); - Time( sal_Int32 _nTime ) { Time::nTime = _nTime; } + Time( sal_Int64 _nTime ) { Time::nTime = _nTime; } Time( const Time& rTime ); Time( sal_uIntPtr nHour, sal_uIntPtr nMin, - sal_uIntPtr nSec = 0, sal_uIntPtr n100Sec = 0 ); + sal_uIntPtr nSec = 0, sal_uIntPtr nNanoSec = 0 ); - void SetTime( sal_Int32 nNewTime ) { nTime = nNewTime; } - sal_Int32 GetTime() const { return nTime; } + void SetTime( sal_Int64 nNewTime ) { nTime = nNewTime; } + sal_Int64 GetTime() const { return nTime; } void SetHour( sal_uInt16 nNewHour ); void SetMin( sal_uInt16 nNewMin ); void SetSec( sal_uInt16 nNewSec ); - void Set100Sec( sal_uInt16 nNew100Sec ); + void SetNanoSec( sal_uInt32 nNewNanoSec ); sal_uInt16 GetHour() const - { sal_uIntPtr nTempTime = (nTime >= 0) ? nTime : nTime*-1; - return (sal_uInt16)(nTempTime / 1000000); } + { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime; + return static_cast(nTempTime / 10000000000000); } sal_uInt16 GetMin() const - { sal_uIntPtr nTempTime = (nTime >= 0) ? nTime : nTime*-1; - return (sal_uInt16)((nTempTime / 10000) % 100); } + { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime; + return static_cast((nTempTime / 100000000000) % 100); } sal_uInt16 GetSec() const - { sal_uIntPtr nTempTime = (nTime >= 0) ? nTime : nTime*-1; - return (sal_uInt16)((nTempTime / 100) % 100); } - sal_uInt16 Get100Sec() const - { sal_uIntPtr nTempTime = (nTime >= 0) ? nTime : nTime*-1; - return (sal_uInt16)(nTempTime % 100); } + { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime; + return static_cast((nTempTime / 1000000000) % 100); } + sal_uInt32 GetNanoSec() const + { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime; + return static_cast( nTempTime % 1000000000); } + // TODO: consider removing GetMSFromTime and MakeTimeFromMS? sal_Int32 GetMSFromTime() const; void MakeTimeFromMS( sal_Int32 nMS ); + sal_Int64 GetNSFromTime() const; + void MakeTimeFromNS( sal_Int64 nNS ); /// 12 hours == 0.5 days double GetTimeInDays() const; @@ -85,7 +101,7 @@ public: sal_Bool IsBetween( const Time& rFrom, const Time& rTo ) const { return ((nTime >= rFrom.nTime) && (nTime <= rTo.nTime)); } - sal_Bool IsEqualIgnore100Sec( const Time& rTime ) const; + sal_Bool IsEqualIgnoreNanoSec( const Time& rTime ) const; sal_Bool operator ==( const Time& rTime ) const { return (nTime == rTime.nTime); } @@ -108,7 +124,7 @@ public: Time& operator =( const Time& rTime ); Time operator -() const - { return Time( nTime * -1 ); } + { return Time( -nTime ); } Time& operator +=( const Time& rTime ); Time& operator -=( const Time& rTime ); TOOLS_DLLPUBLIC friend Time operator +( const Time& rTime1, const Time& rTime2 ); diff --git a/tools/source/datetime/datetime.cxx b/tools/source/datetime/datetime.cxx index 4027d16fce97..1bf612730bb0 100644 --- a/tools/source/datetime/datetime.cxx +++ b/tools/source/datetime/datetime.cxx @@ -181,8 +181,8 @@ DateTime& DateTime::operator +=( double fTimeInDays ) if ( fFrac ) { Time aTime(0); // default ctor calls system time, we don't need that - fFrac *= 24UL * 60 * 60 * 1000; // time expressed in milliseconds - aTime.MakeTimeFromMS( long(fFrac) ); // method handles negative ms + fFrac *= ::Time::nanoSecPerDay; // time expressed in nanoseconds + aTime.MakeTimeFromNS( static_cast(fFrac) ); // method handles negative ns operator+=( aTime ); } return *this; @@ -198,11 +198,11 @@ DateTime operator +( const DateTime& rDateTime, double fTimeInDays ) double operator -( const DateTime& rDateTime1, const DateTime& rDateTime2 ) { long nDays = (const Date&) rDateTime1 - (const Date&) rDateTime2; - long nTime = rDateTime1.GetMSFromTime() - rDateTime2.GetMSFromTime(); + sal_Int64 nTime = rDateTime1.GetNSFromTime() - rDateTime2.GetNSFromTime(); if ( nTime ) { double fTime = double(nTime); - fTime /= 24UL * 60 * 60 * 1000; // convert from milliseconds to fraction + fTime /= ::Time::nanoSecPerDay; // convert from nanoseconds to fraction if ( nDays < 0 && fTime > 0.0 ) fTime = 1.0 - fTime; return double(nDays) + fTime; @@ -223,10 +223,7 @@ void DateTime::GetWin32FileDateTime( sal_uInt32 & rLower, sal_uInt32 & rUpper ) sal_Int64 aTime = a100nPerDay * nDays + - a100nPerSecond * ( - sal_Int64( GetSec() ) + - 60 * sal_Int64( GetMin() ) + - 60 * 60 * sal_Int64( GetHour() ) ); + GetNSFromTime()/100; rLower = sal_uInt32( aTime % SAL_CONST_UINT64( 0x100000000 ) ); rUpper = sal_uInt32( aTime / SAL_CONST_UINT64( 0x100000000 ) ); @@ -263,8 +260,9 @@ DateTime DateTime::CreateFromWin32FileDateTime( const sal_uInt32 & rLower, const (sal_uInt16)( nDays + 1 ), nMonths, sal::static_int_cast< sal_uInt16 >(nYears + 1601) ); Time _aTime( sal_uIntPtr( ( aTime / ( a100nPerSecond * 60 * 60 ) ) % sal_Int64( 24 ) ), - sal_uIntPtr( ( aTime / ( a100nPerSecond * 60 ) ) % sal_Int64( 60 ) ), - sal_uIntPtr( ( aTime / ( a100nPerSecond ) ) % sal_Int64( 60 ) ) ); + sal_uIntPtr( ( aTime / ( a100nPerSecond * 60 ) ) % sal_Int64( 60 ) ), + sal_uIntPtr( ( aTime / ( a100nPerSecond ) ) % sal_Int64( 60 ) ), + (aTime % a100nPerSecond) * 100 ); return DateTime( _aDate, _aTime ); } diff --git a/tools/source/datetime/ttime.cxx b/tools/source/datetime/ttime.cxx index b32c09078e40..2841bb119173 100644 --- a/tools/source/datetime/ttime.cxx +++ b/tools/source/datetime/ttime.cxx @@ -27,46 +27,61 @@ #endif #include +#ifdef __MACH__ +#include +#include +#endif #include +#include + #if defined(SOLARIS) && defined(__GNUC__) extern long altzone; #endif -static sal_Int32 TimeToSec100( const Time& rTime ) -{ - short nSign = (rTime.GetTime() >= 0) ? +1 : -1; - sal_Int32 nHour = rTime.GetHour(); - sal_Int32 nMin = rTime.GetMin(); - sal_Int32 nSec = rTime.GetSec(); - sal_Int32 n100Sec = rTime.Get100Sec(); +namespace { -// Due to interal compiler error in MSC a little bit more complicated: -// return (n100Sec + (nSec*100) + (nMin*60*100) + (nHour*60*60*100) * nSign); + const sal_Int64 secMask = 1000000000; + const sal_Int64 minMask = 100000000000; + const sal_Int64 hourMask = 10000000000000; - sal_Int32 nRet = n100Sec; - nRet += nSec*100; - nRet += nMin*60*100; - nRet += nHour*60*60*100; + const sal_Int64 nanoSecInSec = 1000000000; + const sal_Int16 secInMin = 60; + const sal_Int16 minInHour = 60; - return (nRet * nSign); -} - -static Time Sec100ToTime( sal_Int32 nSec100 ) -{ - short nSign; - if ( nSec100 < 0 ) + sal_Int64 TimeToNanoSec( const Time& rTime ) { - nSec100 *= -1; - nSign = -1; - } - else - nSign = 1; + short nSign = (rTime.GetTime() >= 0) ? +1 : -1; + sal_Int32 nHour = rTime.GetHour(); + sal_Int32 nMin = rTime.GetMin(); + sal_Int32 nSec = rTime.GetSec(); + sal_Int32 nNanoSec = rTime.GetNanoSec(); - Time aTime( 0, 0, 0, nSec100 ); - aTime.SetTime( aTime.GetTime() * nSign ); - return aTime; -} + sal_Int64 nRet = nNanoSec; + nRet += nSec * nanoSecInSec; + nRet += nMin * secInMin * nanoSecInSec; + nRet += nHour * minInHour * secInMin * nanoSecInSec; + + return (nRet * nSign); + } + + Time NanoSecToTime( sal_Int64 nNanoSec ) + { + short nSign; + if ( nNanoSec < 0 ) + { + nNanoSec *= -1; + nSign = -1; + } + else + nSign = 1; + + Time aTime( 0, 0, 0, nNanoSec ); + aTime.SetTime( aTime.GetTime() * nSign ); + return aTime; + } + +} // anonymous namespace Time::Time( TimeInitSystem ) { @@ -75,27 +90,47 @@ Time::Time( TimeInitSystem ) GetLocalTime( &aDateTime ); // construct time - nTime = (((sal_Int32)aDateTime.wHour)*1000000) + - (((sal_Int32)aDateTime.wMinute)*10000) + - (((sal_Int32)aDateTime.wSecond)*100) + - ((sal_Int32)aDateTime.wMilliseconds/10); + nTime = aDateTime.wHour * hourMask + + aDateTime.wMinute * minMask + + aDateTime.wSecond * secMask + + aDateTime.wMilliseconds * 1000000; #else - time_t nTmpTime; - struct tm aTime; - // determine time - nTmpTime = time( 0 ); + struct timespec tsTime; +#if defined( __MACH__ ) + // OS X does not have clock_gettime, use clock_get_time + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + tsTime.tv_sec = mts.tv_sec; + tsTime.tv_nsec = mts.tv_nsec; +#else + // CLOCK_REALTIME should be supported + // on any modern Unix, but be extra cautious + if (clock_gettime(CLOCK_REALTIME, &tsTime) != 0) + { + struct timeval tvTime; + OSL_VERIFY( gettimeofday(&tvTime, NULL) != 0 ); + tsTime.tv_sec = tvTime.tv_sec; + tsTime.tv_nsec = tvTime.tv_usec * 1000; + } +#endif // __MACH__ // construct time + struct tm aTime; + time_t nTmpTime = tsTime.tv_sec; if ( localtime_r( &nTmpTime, &aTime ) ) { - nTime = (((sal_Int32)aTime.tm_hour)*1000000) + - (((sal_Int32)aTime.tm_min)*10000) + - (((sal_Int32)aTime.tm_sec)*100); + nTime = aTime.tm_hour * hourMask + + aTime.tm_min * minMask + + aTime.tm_sec * secMask + + tsTime.tv_nsec; } else nTime = 0; -#endif +#endif // WNT } Time::Time( const Time& rTime ) @@ -103,43 +138,52 @@ Time::Time( const Time& rTime ) nTime = rTime.nTime; } -Time::Time( sal_uIntPtr nHour, sal_uIntPtr nMin, sal_uIntPtr nSec, sal_uIntPtr n100Sec ) +Time::Time( sal_uIntPtr nHour, sal_uIntPtr nMin, sal_uIntPtr nSec, sal_uIntPtr nNanoSec ) { // normalize time - nSec += n100Sec / 100; - n100Sec = n100Sec % 100; - nMin += nSec / 60; - nSec = nSec % 60; - nHour += nMin / 60; - nMin = nMin % 60; + nSec += nNanoSec / nanoSecInSec; + nNanoSec %= nanoSecInSec; + nMin += nSec / secInMin; + nSec %= secInMin; + nHour += nMin / minInHour; + nMin %= minInHour; // construct time - nTime = (sal_Int32)(n100Sec + (nSec*100) + (nMin*10000) + (nHour*1000000)); + nTime = nNanoSec + + nSec * secMask + + nMin * minMask + + nHour * hourMask; } void Time::SetHour( sal_uInt16 nNewHour ) { - short nSign = (nTime >= 0) ? +1 : -1; + short nSign = (nTime >= 0) ? +1 : -1; sal_Int32 nMin = GetMin(); sal_Int32 nSec = GetSec(); - sal_Int32 n100Sec = Get100Sec(); + sal_Int32 nNanoSec = GetNanoSec(); - nTime = (n100Sec + (nSec*100) + (nMin*10000) + - (((sal_Int32)nNewHour)*1000000)) * nSign; + nTime = nSign * + ( nNanoSec + + nSec * secMask + + nMin * minMask + + nNewHour * hourMask ); } void Time::SetMin( sal_uInt16 nNewMin ) { - short nSign = (nTime >= 0) ? +1 : -1; + short nSign = (nTime >= 0) ? +1 : -1; sal_Int32 nHour = GetHour(); sal_Int32 nSec = GetSec(); - sal_Int32 n100Sec = Get100Sec(); + sal_Int32 nNanoSec = GetNanoSec(); // no overflow - nNewMin = nNewMin % 60; + nNewMin = nNewMin % minInHour; - nTime = (n100Sec + (nSec*100) + (((sal_Int32)nNewMin)*10000) + - (nHour*1000000)) * nSign; + nTime = nSign * + ( nNanoSec + + nSec * secMask + + nNewMin * minMask + + nHour * hourMask ); } void Time::SetSec( sal_uInt16 nNewSec ) @@ -147,16 +191,19 @@ void Time::SetSec( sal_uInt16 nNewSec ) short nSign = (nTime >= 0) ? +1 : -1; sal_Int32 nHour = GetHour(); sal_Int32 nMin = GetMin(); - sal_Int32 n100Sec = Get100Sec(); + sal_Int32 nNanoSec = GetNanoSec(); // no overflow - nNewSec = nNewSec % 60; + nNewSec = nNewSec % secInMin; - nTime = (n100Sec + (((sal_Int32)nNewSec)*100) + (nMin*10000) + - (nHour*1000000)) * nSign; + nTime = nSign * + ( nNanoSec + + nNewSec * secMask + + nMin * minMask + + nHour * hourMask ); } -void Time::Set100Sec( sal_uInt16 nNew100Sec ) +void Time::SetNanoSec( sal_uInt32 nNewNanoSec ) { short nSign = (nTime >= 0) ? +1 : -1; sal_Int32 nHour = GetHour(); @@ -164,10 +211,44 @@ void Time::Set100Sec( sal_uInt16 nNew100Sec ) sal_Int32 nSec = GetSec(); // no overflow - nNew100Sec = nNew100Sec % 100; + nNewNanoSec = nNewNanoSec % nanoSecInSec; - nTime = (((sal_Int32)nNew100Sec) + (nSec*100) + (nMin*10000) + - (nHour*1000000)) * nSign; + nTime = nSign * + ( nNewNanoSec + + nSec * secMask + + nMin * minMask + + nHour * hourMask ); +} + +sal_Int64 Time::GetNSFromTime() const +{ + short nSign = (nTime >= 0) ? +1 : -1; + sal_Int32 nHour = GetHour(); + sal_Int32 nMin = GetMin(); + sal_Int32 nSec = GetSec(); + sal_Int32 nNanoSec = GetNanoSec(); + + return nSign * + ( nNanoSec + + nSec * nanoSecInSec + + nMin * (secInMin * nanoSecInSec) + + nHour * (minInHour * secInMin * nanoSecInSec) ); +} + +void Time::MakeTimeFromNS( sal_Int64 nNS ) +{ + short nSign; + if ( nNS < 0 ) + { + nNS *= -1; + nSign = -1; + } + else + nSign = 1; + + // avoid overflow when sal_uIntPtr is 32 bits + Time aTime( 0, 0, nNS/nanoSecInSec, nNS % nanoSecInSec ); + SetTime( aTime.GetTime() * nSign ); } sal_Int32 Time::GetMSFromTime() const @@ -176,9 +257,13 @@ sal_Int32 Time::GetMSFromTime() const sal_Int32 nHour = GetHour(); sal_Int32 nMin = GetMin(); sal_Int32 nSec = GetSec(); - sal_Int32 n100Sec = Get100Sec(); + sal_Int32 nNanoSec = GetNanoSec(); - return (((nHour*3600000)+(nMin*60000)+(nSec*1000)+(n100Sec*10))*nSign); + return nSign * + ( nNanoSec/1000000 + + nSec * 1000 + + nMin * 60000 + + nHour * 360000 ); } void Time::MakeTimeFromMS( sal_Int32 nMS ) @@ -192,7 +277,8 @@ void Time::MakeTimeFromMS( sal_Int32 nMS ) else nSign = 1; - Time aTime( 0, 0, 0, nMS/10 ); + // avoid overflow when sal_uIntPtr is 32 bits + Time aTime( 0, 0, nMS/1000, (nMS % 1000) * 1000000 ); SetTime( aTime.GetTime() * nSign ); } @@ -202,9 +288,9 @@ double Time::GetTimeInDays() const double nHour = GetHour(); double nMin = GetMin(); double nSec = GetSec(); - double n100Sec = Get100Sec(); + double nNanoSec = GetNanoSec(); - return (nHour+(nMin/60)+(nSec/(60*60))+(n100Sec/(60*60*100))) / 24 * nSign; + return (nHour + (nMin / 60) + (nSec / (minInHour * secInMin)) + (nNanoSec / (minInHour * secInMin * nanoSecInSec))) / 24 * nSign; } Time& Time::operator =( const Time& rTime ) @@ -215,34 +301,34 @@ Time& Time::operator =( const Time& rTime ) Time& Time::operator +=( const Time& rTime ) { - nTime = Sec100ToTime( TimeToSec100( *this ) + - TimeToSec100( rTime ) ).GetTime(); + nTime = NanoSecToTime( TimeToNanoSec( *this ) + + TimeToNanoSec( rTime ) ).GetTime(); return *this; } Time& Time::operator -=( const Time& rTime ) { - nTime = Sec100ToTime( TimeToSec100( *this ) - - TimeToSec100( rTime ) ).GetTime(); + nTime = NanoSecToTime( TimeToNanoSec( *this ) - + TimeToNanoSec( rTime ) ).GetTime(); return *this; } Time operator +( const Time& rTime1, const Time& rTime2 ) { - return Sec100ToTime( TimeToSec100( rTime1 ) + - TimeToSec100( rTime2 ) ); + return NanoSecToTime( TimeToNanoSec( rTime1 ) + + TimeToNanoSec( rTime2 ) ); } Time operator -( const Time& rTime1, const Time& rTime2 ) { - return Sec100ToTime( TimeToSec100( rTime1 ) - - TimeToSec100( rTime2 ) ); + return NanoSecToTime( TimeToNanoSec( rTime1 ) - + TimeToNanoSec( rTime2 ) ); } -sal_Bool Time::IsEqualIgnore100Sec( const Time& rTime ) const +sal_Bool Time::IsEqualIgnoreNanoSec( const Time& rTime ) const { - sal_Int32 n1 = (nTime < 0 ? -Get100Sec() : Get100Sec() ); - sal_Int32 n2 = (rTime.nTime < 0 ? -rTime.Get100Sec() : rTime.Get100Sec() ); + sal_Int32 n1 = (nTime < 0 ? -static_cast(GetNanoSec()) : GetNanoSec() ); + sal_Int32 n2 = (rTime.nTime < 0 ? -static_cast(rTime.GetNanoSec()) : rTime.GetNanoSec() ); return (nTime - n1) == (rTime.nTime - n2); } diff --git a/tools/source/inet/inetmsg.cxx b/tools/source/inet/inetmsg.cxx index 914d59caca82..120a1db0a32c 100644 --- a/tools/source/inet/inetmsg.cxx +++ b/tools/source/inet/inetmsg.cxx @@ -303,7 +303,7 @@ bool INetRFC822Message::ParseDateField ( rDateTime.SetHour (ParseNumber (aDateField, nIndex)); nIndex++; rDateTime.SetMin (ParseNumber (aDateField, nIndex)); nIndex++; rDateTime.SetSec (ParseNumber (aDateField, nIndex)); nIndex++; - rDateTime.Set100Sec (0); + rDateTime.SetNanoSec (0); sal_uInt16 nYear = ParseNumber (aDateField, nIndex); if (nYear < 100) nYear += 1900; @@ -324,7 +324,7 @@ bool INetRFC822Message::ParseDateField ( rDateTime.SetHour (ParseNumber (aDateField, nIndex)); nIndex++; rDateTime.SetMin (ParseNumber (aDateField, nIndex)); nIndex++; rDateTime.SetSec (ParseNumber (aDateField, nIndex)); nIndex++; - rDateTime.Set100Sec (0); + rDateTime.SetNanoSec (0); if ((aDateField[nIndex] == '+') || (aDateField[nIndex] == '-') ) @@ -338,7 +338,7 @@ bool INetRFC822Message::ParseDateField ( aDiff.SetHour (nOffset / 100); aDiff.SetMin (nOffset % 100); aDiff.SetSec (0); - aDiff.Set100Sec (0); + aDiff.SetNanoSec (0); if (bEast) rDateTime -= aDiff; diff --git a/tools/source/rc/rc.cxx b/tools/source/rc/rc.cxx index 87ec7667d4eb..7ebdae058461 100644 --- a/tools/source/rc/rc.cxx +++ b/tools/source/rc/rc.cxx @@ -54,7 +54,10 @@ Time::Time( const ResId& rResId ) if ( 0x04 & nObjMask ) SetSec( (sal_uInt16)pResMgr->ReadShort() ); if ( 0x08 & nObjMask ) - Set100Sec( (sal_uInt16)pResMgr->ReadShort() ); + // TODO: when we change the place that writes this binary resource format to match: + // SetNanoSec( pResMgr->ReadLong() ); + // In the meantime: + SetNanoSec( pResMgr->ReadShort() * ::Time::nanoPerCenti ); } Date::Date( const ResId& rResId ) : nDate(0) diff --git a/ucb/source/sorter/sortresult.cxx b/ucb/source/sorter/sortresult.cxx index 089946a4f7de..4e72d45932ed 100644 --- a/ucb/source/sorter/sortresult.cxx +++ b/ucb/source/sorter/sortresult.cxx @@ -1133,8 +1133,8 @@ long SortedResultSet::CompareImpl( Reference < XResultSet > xResultOne, if ( !nTmp ) { nTmp = (sal_Int32) aTwo.Seconds - (sal_Int32) aOne.Seconds; if ( !nTmp ) - nTmp = (sal_Int32) aTwo.HundredthSeconds - - (sal_Int32) aOne.HundredthSeconds; + nTmp = (sal_Int32) aTwo.NanoSeconds + - (sal_Int32) aOne.NanoSeconds; }} if ( nTmp < 0 ) @@ -1168,8 +1168,8 @@ long SortedResultSet::CompareImpl( Reference < XResultSet > xResultOne, if ( !nTmp ) { nTmp = (sal_Int32) aTwo.Seconds - (sal_Int32) aOne.Seconds; if ( !nTmp ) - nTmp = (sal_Int32) aTwo.HundredthSeconds - - (sal_Int32) aOne.HundredthSeconds; + nTmp = (sal_Int32) aTwo.NanoSeconds + - (sal_Int32) aOne.NanoSeconds; }}}}} if ( nTmp < 0 ) diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index a32fdbbb11d3..3675a706c5e1 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -85,11 +85,13 @@ namespace unoTime.Minutes = boostTime.time_of_day().minutes(); unoTime.Seconds = boostTime.time_of_day().seconds(); - long total_milli = boostTime.time_of_day().total_milliseconds( ); - long milli = total_milli - boostTime.time_of_day().total_seconds( ); - long hundredthSeconds = milli / 10; + // TODO FIXME maybe we should compile with BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG + // to actually get nanosecond precision in boostTime? + // use this way rather than total_nanos to avoid overflows with 32-bit long + const long ticks = boostTime.time_of_day().fractional_seconds(); + long nanoSeconds = ticks * ( 1000000000 / boost::posix_time::time_duration::ticks_per_second()); - unoTime.HundredthSeconds = hundredthSeconds; + unoTime.NanoSeconds = nanoSeconds; return unoTime; } diff --git a/ucb/source/ucp/file/shell.cxx b/ucb/source/ucp/file/shell.cxx index 23221fcb3968..ec7bce87f18a 100644 --- a/ucb/source/ucp/file/shell.cxx +++ b/ucb/source/ucp/file/shell.cxx @@ -2431,7 +2431,7 @@ shell::commit( const shell::ContentMap::iterator& it, osl_getDateTimeFromTimeValue( &myLocalTime, &myDateTime ); util::DateTime aDateTime; - aDateTime.HundredthSeconds = (unsigned short)(myDateTime.NanoSeconds / 10000000); + aDateTime.NanoSeconds = myDateTime.NanoSeconds; aDateTime.Seconds = myDateTime.Seconds; aDateTime.Minutes = myDateTime.Minutes; aDateTime.Hours = myDateTime.Hours; diff --git a/ucb/source/ucp/ftp/ftpdirp.cxx b/ucb/source/ucp/ftp/ftpdirp.cxx index 2e6bece679a9..87f38b88a569 100644 --- a/ucb/source/ucp/ftp/ftpdirp.cxx +++ b/ucb/source/ucp/ftp/ftpdirp.cxx @@ -828,7 +828,7 @@ sal_Bool FTPDirectoryParser::parseVMS ( /* * Parse part and set entry time's minutes, - * seconds (0), and 1/100 seconds (0). + * seconds (0), and nanoseconds (0). */ if (*p < '0' || *p > '5') return sal_False; @@ -840,7 +840,7 @@ sal_Bool FTPDirectoryParser::parseVMS ( nMinute = 10 * nMinute + (*p++ - '0'); rEntry.m_aDate.SetMin(nMinute); rEntry.m_aDate.SetSec(0); - rEntry.m_aDate.Set100Sec(0); + rEntry.m_aDate.SetNanoSec(0); // Skip part: if (*p && (*p != '\t' && *p != ' ')) @@ -1202,7 +1202,7 @@ sal_Bool FTPDirectoryParser::parseUNIX_isTime ( rDateTime.SetHour (nHour); rDateTime.SetMin (nMin); rDateTime.SetSec (0); - rDateTime.Set100Sec (0); + rDateTime.SetNanoSec (0); // Date aCurDate; // if (rDateTime.GetMonth() > aCurDate.GetMonth()) diff --git a/ucb/source/ucp/ftp/ftpdirp.hxx b/ucb/source/ucp/ftp/ftpdirp.hxx index 68dc11879c0b..f8e04b9f138f 100644 --- a/ucb/source/ucp/ftp/ftpdirp.hxx +++ b/ucb/source/ucp/ftp/ftpdirp.hxx @@ -41,14 +41,14 @@ namespace ftp { struct DateTime : public com::sun::star::util::DateTime { - DateTime(const sal_uInt16& hundredthSeconds, + DateTime(const sal_uInt32& nanoSeconds, const sal_uInt16& seconds, const sal_uInt16& minutes, const sal_uInt16& hours, const sal_uInt16& day, const sal_uInt16& month, const sal_uInt16& year) SAL_THROW(()) - : com::sun::star::util::DateTime(hundredthSeconds, + : com::sun::star::util::DateTime(nanoSeconds, seconds, minutes, hours, @@ -60,11 +60,11 @@ namespace ftp { void SetMonth(sal_uInt16 month) { Month = month; } void SetDay(sal_uInt16 day) { Day = day; } // Only zero allowed and used for time-argument - void SetTime(sal_uInt16) { Hours = Minutes = Seconds = HundredthSeconds = 0; } + void SetTime(sal_uInt16) { Hours = Minutes = Seconds = NanoSeconds = 0; } void SetHour(sal_uInt16 hours) { Hours = hours; } void SetMin(sal_uInt16 minutes) { Minutes = minutes; } void SetSec(sal_uInt16 seconds) { Seconds = seconds; } - void Set100Sec(sal_uInt16 hundredthSec) { HundredthSeconds = hundredthSec; } + void SetNanoSec(sal_uInt32 nanoSec) { NanoSeconds = nanoSec; } sal_uInt16 GetMonth(void) { return Month; } }; diff --git a/unotools/inc/unotools/datetime.hxx b/unotools/inc/unotools/datetime.hxx index 042fa737642b..dfc0ab139825 100644 --- a/unotools/inc/unotools/datetime.hxx +++ b/unotools/inc/unotools/datetime.hxx @@ -44,6 +44,12 @@ namespace utl UNOTOOLS_DLLPUBLIC void typeConvert(const DateTime& _rDateTime, starutil::DateTime& _rOut); UNOTOOLS_DLLPUBLIC void typeConvert(const starutil::DateTime& _rDateTime, DateTime& _rOut); + UNOTOOLS_DLLPUBLIC ::rtl::OUString toISO8601(const starutil::DateTime& _rDateTime); + UNOTOOLS_DLLPUBLIC ::rtl::OUString toISO8601(const starutil::Time& _rTime); + UNOTOOLS_DLLPUBLIC bool ISO8601parseDateTime(const ::rtl::OUString &i_rIn, starutil::DateTime& o_rDateTime); + UNOTOOLS_DLLPUBLIC bool ISO8601parseDate(const ::rtl::OUString &i_rIn, starutil::Date& o_rDate); + UNOTOOLS_DLLPUBLIC bool ISO8601parseTime(const ::rtl::OUString &i_rIn, starutil::Time& o_Time); + //......................................................................... } // namespace utl //......................................................................... diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx index 45f24499c70e..493485444dc9 100644 --- a/unotools/source/i18n/localedatawrapper.cxx +++ b/unotools/source/i18n/localedatawrapper.cxx @@ -1140,7 +1140,7 @@ static sal_Unicode* ImplAddUNum( sal_Unicode* pBuf, sal_uInt64 nNumber, int nMin } -static sal_Unicode* ImplAdd2UNum( sal_Unicode* pBuf, sal_uInt16 nNumber, int bLeading ) +static sal_Unicode* ImplAdd2UNum( sal_Unicode* pBuf, sal_uInt16 nNumber, bool bLeading ) { DBG_ASSERT( nNumber < 100, "ImplAdd2UNum() - Number >= 100" ); @@ -1166,6 +1166,24 @@ static sal_Unicode* ImplAdd2UNum( sal_Unicode* pBuf, sal_uInt16 nNumber, int bLe return pBuf; } +static sal_Unicode* ImplAdd9UNum( sal_Unicode* pBuf, sal_uInt32 nNumber, bool bLeading ) +{ + DBG_ASSERT( nNumber < 1000000000, "ImplAdd2UNum() - Number >= 1000000000" ); + + std::ostringstream ostr; + if (bLeading) + { + ostr.fill('0'); + ostr.width(9); + } + ostr << nNumber; + for(const char *pAB=ostr.str().c_str(); *pAB != '\0'; ++pAB, ++pBuf) + { + *pBuf = *pAB; + } + + return pBuf; +} inline sal_Unicode* ImplAddString( sal_Unicode* pBuf, const OUString& rStr ) { @@ -1375,16 +1393,16 @@ OUString LocaleDataWrapper::getTime( const Time& rTime, sal_Bool bSec, sal_Bool pBuf = ImplAdd2UNum( pBuf, nHour, sal_True /* IsTimeLeadingZero() */ ); pBuf = ImplAddString( pBuf, getTimeSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), sal_True ); + pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), true ); if ( bSec ) { pBuf = ImplAddString( pBuf, getTimeSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), sal_True ); + pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), true ); if ( b100Sec ) { pBuf = ImplAddString( pBuf, getTime100SecSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.Get100Sec(), sal_True ); + pBuf = ImplAdd9UNum( pBuf, rTime.GetNanoSec(), true ); } } @@ -1473,16 +1491,16 @@ OUString LocaleDataWrapper::getDuration( const Time& rTime, sal_Bool bSec, sal_B else pBuf = ImplAddUNum( pBuf, rTime.GetHour() ); pBuf = ImplAddString( pBuf, getTimeSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), sal_True ); + pBuf = ImplAdd2UNum( pBuf, rTime.GetMin(), true ); if ( bSec ) { pBuf = ImplAddString( pBuf, getTimeSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), sal_True ); + pBuf = ImplAdd2UNum( pBuf, rTime.GetSec(), true ); if ( b100Sec ) { pBuf = ImplAddString( pBuf, getTime100SecSep() ); - pBuf = ImplAdd2UNum( pBuf, rTime.Get100Sec(), sal_True ); + pBuf = ImplAdd9UNum( pBuf, rTime.GetNanoSec(), true ); } } diff --git a/unotools/source/misc/datetime.cxx b/unotools/source/misc/datetime.cxx index ff4062523dee..cbfb1694e33d 100644 --- a/unotools/source/misc/datetime.cxx +++ b/unotools/source/misc/datetime.cxx @@ -21,6 +21,147 @@ #include #include #include +#include +#include +#include + +namespace +{ + sal_Int32 impl_pow(sal_Int32 x, sal_Int32 y) + { + if (y == 1) + return x; + if ( y % 2 == 0) + { + return impl_pow(x*x, y/2); + } + else + { + return x * impl_pow(x*x, y/2); + } + } + // computes x^y + sal_Int32 pow(sal_Int32 x, sal_Int32 y) + { + if (y < 0) + throw std::invalid_argument("negative power is not defined in integers"); + if (y == 0) + return 1; + return impl_pow(x, y); + } + + /** convert string to number with optional min and max values */ + template + bool convertNumber( T& rValue, + const OUString& rString, + T /*nMin*/ = -1, T /*nMax*/ = -1) + { + sal_Bool bNeg = sal_False; + rValue = 0; + + sal_Int32 nPos = 0L; + sal_Int32 nLen = rString.getLength(); + + // skip white space + while( nPos < nLen && sal_Unicode(' ') == rString[nPos] ) + nPos++; + + if( nPos < nLen && sal_Unicode('-') == rString[nPos] ) + { + bNeg = sal_True; + nPos++; + } + + // get number + while( nPos < nLen && + sal_Unicode('0') <= rString[nPos] && + sal_Unicode('9') >= rString[nPos] ) + { + // TODO: check overflow! + rValue *= 10; + rValue += (rString[nPos] - sal_Unicode('0')); + nPos++; + } + + if( bNeg ) + rValue *= -1; + + return nPos == nLen; + } + + // although the standard calls for fixed-length (zero-padded) tokens + // (in their integer part), we are here liberal and allow shorter tokens + // (when there are separators, else it is ambiguous). + // Note that: + // the token separator is OPTIONAL + // empty string is a valid token! (to recognise hh or hhmm or hh:mm formats) + // returns: success / failure + // in case of failure, no reference argument is changed + // arguments: + // i_str: string to extract token from + // index: index in i_str where to start tokenizing + // after return, start of *next* token (if any) + // if this was the last token, then the value is UNDEFINED + // o_strInt: output; integer part of token + // o_bFraction: output; was there a fractional part? + // o_strFrac: output; fractional part of token + bool impl_getISO8601TimeToken(const OUString &i_str, sal_Int32 &nPos, OUString &resInt, bool &bFraction, OUString &resFrac) + { + bFraction = false; + // all tokens are of length 2 + const sal_Int32 nEndPos = nPos + 2; + const sal_Unicode c0 = '0'; + const sal_Unicode c9 = '9'; + const sal_Unicode sep = ':'; + for (;nPos < nEndPos && nPos < i_str.getLength(); ++nPos) + { + const sal_Unicode c = i_str[nPos]; + if (c == sep) + return true; + if (c < c0 || c > c9) + return false; + resInt += OUString(c); + } + if (nPos == i_str.getLength() || i_str[nPos] == sep) + return true; + if (i_str[nPos] == ',' || i_str[nPos] == '.') + { + bFraction = true; + ++nPos; + for (; nPos < i_str.getLength(); ++nPos) + { + const sal_Unicode c = i_str[nPos]; + if (c == sep) + // fractional part allowed only in *last* token + return false; + if (c < c0 || c > c9) + return false; + resFrac += OUString(c); + } + OSL_ENSURE(nPos == i_str.getLength(), "impl_getISO8601TimeToken internal error; expected to be at end of string"); + return true; + } + else + return false; + } + inline bool getISO8601TimeToken(const OUString &i_str, sal_Int32 &io_index, OUString &o_strInt, bool &o_bFraction, OUString &o_strFrac) + { + OUString resInt; + OUString resFrac; + bool bFraction = false; + sal_Int32 index = io_index; + if(!impl_getISO8601TimeToken(i_str, index, resInt, bFraction, resFrac)) + return false; + else + { + io_index = index+1; + o_strInt = resInt; + o_strFrac = resFrac; + o_bFraction = bFraction; + return true; + } + } +} //......................................................................... namespace utl @@ -48,21 +189,22 @@ void typeConvert(const DateTime& _rDateTime, starutil::DateTime& _rOut) _rOut.Hours = _rDateTime.GetHour(); _rOut.Minutes = _rDateTime.GetMin(); _rOut.Seconds = _rDateTime.GetSec(); - _rOut.HundredthSeconds = _rDateTime.Get100Sec(); + _rOut.NanoSeconds = _rDateTime.GetNanoSec(); } //------------------------------------------------------------------ void typeConvert(const starutil::DateTime& _rDateTime, DateTime& _rOut) { Date aDate(_rDateTime.Day, _rDateTime.Month, _rDateTime.Year); - Time aTime(_rDateTime.Hours, _rDateTime.Minutes, _rDateTime.Seconds, _rDateTime.HundredthSeconds); + Time aTime(_rDateTime.Hours, _rDateTime.Minutes, _rDateTime.Seconds, _rDateTime.NanoSeconds); _rOut = DateTime(aDate, aTime); } +// FIXME: these operators should be.... in toplevel namespace? announced in the .hxx file? //------------------------------------------------------------------------- -sal_Bool operator ==(const starutil::DateTime& _rLeft, const starutil::DateTime& _rRight) +bool operator ==(const starutil::DateTime& _rLeft, const starutil::DateTime& _rRight) { - return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) && + return ( _rLeft.NanoSeconds == _rRight.NanoSeconds) && ( _rLeft.Seconds == _rRight.Seconds) && ( _rLeft.Minutes == _rRight.Minutes) && ( _rLeft.Hours == _rRight.Hours) && @@ -72,7 +214,7 @@ sal_Bool operator ==(const starutil::DateTime& _rLeft, const starutil::DateTi } //------------------------------------------------------------------------- -sal_Bool operator ==(const starutil::Date& _rLeft, const starutil::Date& _rRight) +bool operator ==(const starutil::Date& _rLeft, const starutil::Date& _rRight) { return ( _rLeft.Day == _rRight.Day) && ( _rLeft.Month == _rRight.Month) && @@ -80,14 +222,292 @@ sal_Bool operator ==(const starutil::Date& _rLeft, const starutil::Date& _rRi } //------------------------------------------------------------------------- -sal_Bool operator ==(const starutil::Time& _rLeft, const starutil::Time& _rRight) +bool operator ==(const starutil::Time& _rLeft, const starutil::Time& _rRight) { - return ( _rLeft.HundredthSeconds == _rRight.HundredthSeconds) && + return ( _rLeft.NanoSeconds == _rRight.NanoSeconds) && ( _rLeft.Seconds == _rRight.Seconds) && ( _rLeft.Minutes == _rRight.Minutes) && ( _rLeft.Hours == _rRight.Hours) ; } +OUString toISO8601(const starutil::DateTime& rDateTime) +{ + OUStringBuffer rBuffer; + rBuffer.append((sal_Int32) rDateTime.Year); + rBuffer.append('-'); + if( rDateTime.Month < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rDateTime.Month); + rBuffer.append('-'); + if( rDateTime.Day < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rDateTime.Day); + + if( rDateTime.NanoSeconds != 0 || + rDateTime.Seconds != 0 || + rDateTime.Minutes != 0 || + rDateTime.Hours != 0 ) + { + rBuffer.append('T'); + if( rDateTime.Hours < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rDateTime.Hours); + rBuffer.append(':'); + if( rDateTime.Minutes < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rDateTime.Minutes); + rBuffer.append(':'); + if( rDateTime.Seconds < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rDateTime.Seconds); + if ( rDateTime.NanoSeconds > 0) + { + OSL_ENSURE(rDateTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); + rBuffer.append(','); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << rDateTime.NanoSeconds; + rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); + } + } + return rBuffer.makeStringAndClear(); +} + +OUString toISO8601(const starutil::Time& rTime) +{ + OUStringBuffer rBuffer; + if( rTime.Hours < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rTime.Hours); + rBuffer.append(':'); + if( rTime.Minutes < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rTime.Minutes); + rBuffer.append(':'); + if( rTime.Seconds < 10 ) + rBuffer.append('0'); + rBuffer.append((sal_Int32) rTime.Seconds); + if ( rTime.NanoSeconds > 0) + { + OSL_ENSURE(rTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); + rBuffer.append(','); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << rTime.NanoSeconds; + rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); + } + return rBuffer.makeStringAndClear(); +} + +/** convert ISO8601 DateTime String to util::DateTime */ +bool ISO8601parseDateTime(const OUString &rString, starutil::DateTime& rDateTime) +{ + bool bSuccess = true; + + rtl::OUString aDateStr, aTimeStr; + starutil::Date aDate; + starutil::Time aTime; + sal_Int32 nPos = rString.indexOf( (sal_Unicode) 'T' ); + if ( nPos >= 0 ) + { + aDateStr = rString.copy( 0, nPos ); + aTimeStr = rString.copy( nPos + 1 ); + } + else + aDateStr = rString; // no separator: only date part + + bSuccess = ISO8601parseDate(aDateStr, aDate); + + if ( bSuccess && !aTimeStr.isEmpty() ) // time is optional + { + bSuccess = ISO8601parseTime(aTimeStr, aTime); + } + + if (bSuccess) + { + rDateTime = starutil::DateTime(aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, + aDate.Day, aDate.Month, aDate.Year); + } + + return bSuccess; +} + +/** convert ISO8601 Date String to util::Date */ +// TODO: supports only calendar dates YYYY-MM-DD +// MISSING: calendar dates YYYYMMDD YYYY-MM +// year, week date, ordinal date +bool ISO8601parseDate(const OUString &aDateStr, starutil::Date& rDate) +{ + bool bSuccess = true; + + sal_Int32 nYear = 1899; + sal_Int32 nMonth = 12; + sal_Int32 nDay = 30; + + const sal_Unicode* pStr = aDateStr.getStr(); + sal_Int32 nDateTokens = 1; + while ( *pStr ) + { + if ( *pStr == '-' ) + nDateTokens++; + pStr++; + } + if ( nDateTokens > 3 || aDateStr.isEmpty() ) + bSuccess = false; + else + { + sal_Int32 n = 0; + if ( !convertNumber( nYear, aDateStr.getToken( 0, '-', n ), 0, 9999 ) ) + bSuccess = false; + if ( nDateTokens >= 2 ) + if ( !convertNumber( nMonth, aDateStr.getToken( 0, '-', n ), 0, 12 ) ) + bSuccess = false; + if ( nDateTokens >= 3 ) + if ( !convertNumber( nDay, aDateStr.getToken( 0, '-', n ), 0, 31 ) ) + bSuccess = false; + } + + if (bSuccess) + { + rDate.Year = (sal_uInt16)nYear; + rDate.Month = (sal_uInt16)nMonth; + rDate.Day = (sal_uInt16)nDay; + } + + return bSuccess; +} + +/** convert ISO8601 Time String to util::Time */ +bool ISO8601parseTime(const OUString &aTimeStr, starutil::Time& rTime) +{ + bool bSuccess = true; + + sal_Int32 nHour = 0; + sal_Int32 nMin = 0; + sal_Int32 nSec = 0; + sal_Int32 nNanoSec = 0; + + sal_Int32 n = 0; + OUString tokInt; + OUString tokFrac; + bool bFrac; + // hours + if (bSuccess && (bSuccess = getISO8601TimeToken(aTimeStr, n, tokInt, bFrac, tokFrac))) + { + if ( bFrac && n < aTimeStr.getLength()) + // junk after ISO time + bSuccess = false; + else if ( (bSuccess = convertNumber( nHour, tokInt, 0, 23 )) ) + { + if (bFrac) + { + sal_Int64 fracNumerator; + if ( (bSuccess = convertNumber(fracNumerator, tokFrac)) ) + { + double frac = static_cast(fracNumerator) / static_cast(pow(10, tokFrac.getLength())); + // minutes + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac hours (of hours) not between 0 and 1"); + frac *= 60; + nMin = floor(frac); + frac -= nMin; + // seconds + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac minutes (of hours) not between 0 and 1"); + frac *= 60; + nSec = floor(frac); + frac -= nSec; + // nanoseconds + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac seconds (of hours) not between 0 and 1"); + frac *= 1000000000; + nNanoSec = ::rtl::math::round(frac); + } + goto end; + } + } + } + // minutes + if (bSuccess && (bSuccess = getISO8601TimeToken(aTimeStr, n, tokInt, bFrac, tokFrac))) + { + if ( bFrac && n < aTimeStr.getLength()) + // junk after ISO time + bSuccess = false; + else if ( (bSuccess = convertNumber( nMin, tokInt, 0, 59 )) ) + { + if (bFrac) + { + sal_Int64 fracNumerator; + if ( (bSuccess = convertNumber(fracNumerator, tokFrac)) ) + { + double frac = static_cast(fracNumerator) / static_cast(pow(10, tokFrac.getLength())); + // seconds + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac minutes (of minutes) not between 0 and 1"); + frac *= 60; + nSec = floor(frac); + frac -= nSec; + // nanoseconds + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac seconds (of minutes) not between 0 and 1"); + frac *= 1000000000; + nNanoSec = ::rtl::math::round(frac); + } + goto end; + } + } + } + // seconds + if (bSuccess && (bSuccess = getISO8601TimeToken(aTimeStr, n, tokInt, bFrac, tokFrac))) + { + if ( bFrac && n < aTimeStr.getLength()) + // junk after ISO time + bSuccess = false; + // max 60 for leap seconds + else if ( (bSuccess = convertNumber( nSec, tokInt, 0, 60 )) ) + { + if (bFrac) + { + sal_Int64 fracNumerator; + if ( (bSuccess = convertNumber(fracNumerator, tokFrac)) ) + { + double frac = static_cast(fracNumerator) / static_cast(pow(10, tokFrac.getLength())); + // nanoseconds + OSL_ENSURE(frac < 1 && frac >= 0, "ISO8601parse internal error frac seconds (of seconds) not between 0 and 1"); + frac *= 1000000000; + nNanoSec = ::rtl::math::round(frac); + } + goto end; + } + } + } + + end: + if (bSuccess) + { + // normalise time + const int secondsOverFlow = (nSec == 60) ? 61 : 60; + if (nNanoSec == 1000000000) + { + nNanoSec = 0; + ++nSec; + } + if(nSec == secondsOverFlow) + { + nSec = 0; + ++nMin; + } + if(nMin == 60) + { + nMin = 0; + ++nHour; + } + + rTime.Hours = (sal_uInt16)nHour; + rTime.Minutes = (sal_uInt16)nMin; + rTime.Seconds = (sal_uInt16)nSec; + rTime.NanoSeconds = nNanoSec; + } + + return bSuccess; +} //......................................................................... } // namespace utl //......................................................................... diff --git a/unotools/source/ucbhelper/ucbhelper.cxx b/unotools/source/ucbhelper/ucbhelper.cxx index 9dbd82a9b1cb..82b869f1940b 100644 --- a/unotools/source/ucbhelper/ucbhelper.cxx +++ b/unotools/source/ucbhelper/ucbhelper.cxx @@ -121,7 +121,7 @@ OUString getCasePreservingUrl(INetURLObject url) { DateTime convert(css::util::DateTime const & dt) { return DateTime( Date(dt.Day, dt.Month, dt.Year), - Time(dt.Hours, dt.Minutes, dt.Seconds, dt.HundredthSeconds)); + Time(dt.Hours, dt.Minutes, dt.Seconds, dt.NanoSeconds)); } } diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx index 97ec32d6bb44..aeeef95c77f9 100644 --- a/vcl/source/control/field2.cxx +++ b/vcl/source/control/field2.cxx @@ -2452,9 +2452,11 @@ sal_Bool TimeFormatter::ImplTimeReformat( const OUString& rStr, OUString& rOutSt n += aTempTime.GetSec(); rOutStr = OUString::number( n ); rOutStr += ImplGetLocaleDataWrapper().getTime100SecSep(); - if ( aTempTime.Get100Sec() < 10 ) - rOutStr += "0"; - rOutStr += OUString::number( aTempTime.Get100Sec() ); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << aTempTime.GetNanoSec(); + rOutStr += OUString::createFromAscii(ostr.str().c_str()); } else if ( mbDuration ) rOutStr = ImplGetLocaleDataWrapper().getDuration( aTempTime, bSecond, b100Sec ); @@ -2755,9 +2757,11 @@ void TimeFormatter::ImplSetUserTime( const Time& rNewTime, Selection* pNewSelect n += aNewTime.GetSec(); aStr = OUString::number( n ); aStr += ImplGetLocaleDataWrapper().getTime100SecSep(); - if ( aNewTime.Get100Sec() < 10 ) - aStr += "0"; - aStr += OUString::number( aNewTime.Get100Sec() ); + std::ostringstream ostr; + ostr.fill('0'); + ostr.width(9); + ostr << aNewTime.GetNanoSec(); + aStr += OUString::createFromAscii(ostr.str().c_str()); } else if ( mbDuration ) { diff --git a/wizards/com/sun/star/wizards/common/JavaTools.java b/wizards/com/sun/star/wizards/common/JavaTools.java index 4d003b0c2470..37004bd4efff 100644 --- a/wizards/com/sun/star/wizards/common/JavaTools.java +++ b/wizards/com/sun/star/wizards/common/JavaTools.java @@ -433,7 +433,7 @@ public class JavaTools dt.Hours = (short) cal.get(Calendar.HOUR); dt.Minutes = (short) cal.get(Calendar.MINUTE); dt.Seconds = (short) cal.get(Calendar.SECOND); - dt.HundredthSeconds = (short) cal.get(Calendar.MILLISECOND); + dt.NanoSeconds = cal.get(Calendar.MILLISECOND)*1000000; return dt; } diff --git a/xmloff/source/core/xmluconv.cxx b/xmloff/source/core/xmluconv.cxx index 23b850052419..6c247711cbc0 100644 --- a/xmloff/source/core/xmluconv.cxx +++ b/xmloff/source/core/xmluconv.cxx @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -438,11 +439,11 @@ sal_Bool SvXMLUnitConverter::convertDateTime( double& fDateTime, double Hour = aDateTime.Hours; double Min = aDateTime.Minutes; double Sec = aDateTime.Seconds; - double Sec100 = aDateTime.HundredthSeconds; - fTempDateTime += Hour / 24; - fTempDateTime += Min / (24 * 60); - fTempDateTime += Sec / (24 * 60 * 60); - fTempDateTime += Sec100 / (24 * 60 * 60 * 100); + double NanoSec = aDateTime.NanoSeconds; + fTempDateTime += Hour / ::Time::hourPerDay; + fTempDateTime += Min / ::Time::minutePerDay; + fTempDateTime += Sec / ::Time::secondPerDay; + fTempDateTime += NanoSec / ::Time::nanoSecPerDay; fDateTime = fTempDateTime; } return bSuccess; diff --git a/xmloff/source/draw/animationimport.cxx b/xmloff/source/draw/animationimport.cxx index 67e4f44a1cc6..035fe7eb6366 100644 --- a/xmloff/source/draw/animationimport.cxx +++ b/xmloff/source/draw/animationimport.cxx @@ -1161,7 +1161,7 @@ void AnimationNodeContext::init_node( const ::com::sun::star::uno::Reference< : { fInterval = ((((aDuration.Hours * 60) + aDuration.Minutes) * 60) + aDuration.Seconds) - + (aDuration.MilliSeconds / 1000.0); + + (aDuration.NanoSeconds / 1000000000.0); } } else diff --git a/xmloff/source/draw/propimp0.cxx b/xmloff/source/draw/propimp0.cxx index 51394da2e074..82c1dda41c12 100644 --- a/xmloff/source/draw/propimp0.cxx +++ b/xmloff/source/draw/propimp0.cxx @@ -28,6 +28,7 @@ #include #include +#include using namespace ::com::sun::star; @@ -55,7 +56,7 @@ sal_Bool XMLDurationPropertyHdl::importXML( ::sax::Converter::convertDuration(aDuration, rStrImpValue); const double fSeconds = ((aDuration.Days * 24 + aDuration.Hours) * 60 - + aDuration.Minutes) * 60 + aDuration.Seconds + aDuration.MilliSeconds / 1000.0; + + aDuration.Minutes) * 60 + aDuration.Seconds + aDuration.NanoSeconds / static_cast(::Time::nanoSecPerSec); rValue <<= fSeconds; return sal_True; @@ -72,7 +73,7 @@ sal_Bool XMLDurationPropertyHdl::exportXML( { util::Duration aDuration; aDuration.Seconds = static_cast(nVal); - aDuration.MilliSeconds = static_cast(nVal * 1000.0) % 1000 ; + aDuration.NanoSeconds = static_cast((nVal - aDuration.Seconds) * ::Time::nanoSecPerSec); OUStringBuffer aOut; ::sax::Converter::convertDuration(aOut, aDuration); diff --git a/xmloff/source/forms/elementexport.cxx b/xmloff/source/forms/elementexport.cxx index bc53c1e213bb..b10fa4370ce3 100644 --- a/xmloff/source/forms/elementexport.cxx +++ b/xmloff/source/forms/elementexport.cxx @@ -1150,7 +1150,7 @@ namespace xmloff aDuration.Hours = aTime.GetHour(); aDuration.Minutes = aTime.GetMin(); aDuration.Seconds = aTime.GetSec(); - aDuration.MilliSeconds = nRepeatDelay % 1000; + aDuration.NanoSeconds = (nRepeatDelay % 1000) * 1000000; OUStringBuffer buf; ::sax::Converter::convertDuration(buf, aDuration); diff --git a/xmloff/source/forms/elementimport.cxx b/xmloff/source/forms/elementimport.cxx index 9e2bb7ef6742..9d180b04e65a 100644 --- a/xmloff/source/forms/elementimport.cxx +++ b/xmloff/source/forms/elementimport.cxx @@ -822,7 +822,7 @@ namespace xmloff aProp.Name = PROPERTY_REPEAT_DELAY; sal_Int32 const nMS = ((aDuration.Hours * 60 + aDuration.Minutes) * 60 - + aDuration.Seconds) * 1000 + aDuration.MilliSeconds; + + aDuration.Seconds) * 1000 + aDuration.NanoSeconds/1000000; aProp.Value <<= nMS; implPushBackPropertyValue(aProp); diff --git a/xmloff/source/forms/handler/vcl_time_handler.cxx b/xmloff/source/forms/handler/vcl_time_handler.cxx index 4339ed75c791..c73392f75a14 100644 --- a/xmloff/source/forms/handler/vcl_time_handler.cxx +++ b/xmloff/source/forms/handler/vcl_time_handler.cxx @@ -64,7 +64,7 @@ namespace xmloff aDuration.Hours = aVCLTime.GetHour(); aDuration.Minutes = aVCLTime.GetMin(); aDuration.Seconds = aVCLTime.GetSec(); - aDuration.MilliSeconds = aVCLTime.Get100Sec() * 10; + aDuration.NanoSeconds = aVCLTime.GetNanoSec(); OUStringBuffer aBuffer; ::sax::Converter::convertDuration( aBuffer, aDuration ); @@ -80,7 +80,7 @@ namespace xmloff if (::sax::Converter::convertDuration( aDuration, i_attributeValue )) { ::Time aVCLTime(aDuration.Hours, aDuration.Minutes, - aDuration.Seconds, aDuration.MilliSeconds / 10); + aDuration.Seconds, aDuration.NanoSeconds); nVCLTime = aVCLTime.GetTime(); } else diff --git a/xmloff/source/forms/propertyexport.cxx b/xmloff/source/forms/propertyexport.cxx index a0de21a02029..73f5e1dddc2e 100644 --- a/xmloff/source/forms/propertyexport.cxx +++ b/xmloff/source/forms/propertyexport.cxx @@ -590,16 +590,20 @@ namespace xmloff } else if (_rValue >>= aTime) { - fValue = ((aTime.Hours * 60 + aTime.Minutes) * 60 + aTime.Seconds) * 100 + aTime.HundredthSeconds; - fValue = fValue / 8640000.0; + fValue = aTime.Hours / static_cast(::Time::hourPerDay) + + aTime.Minutes / static_cast(::Time::minutePerDay) + + aTime.Seconds / static_cast(::Time::secondPerDay) + + aTime.NanoSeconds / static_cast(::Time::nanoSecPerDay); } else if (_rValue >>= aDateTime) { DateTime aToolsDateTime( DateTime::EMPTY ); ::utl::typeConvert(aDateTime, aToolsDateTime); // the time part (the digits behind the comma) - fValue = ((aDateTime.Hours * 60 + aDateTime.Minutes) * 60 + aDateTime.Seconds) * 100 + aDateTime.HundredthSeconds; - fValue = fValue / 8640000.0; + fValue = aTime.Hours / static_cast(::Time::hourPerDay) + + aTime.Minutes / static_cast(::Time::minutePerDay) + + aTime.Seconds / static_cast(::Time::secondPerDay) + + aTime.NanoSeconds / static_cast(::Time::nanoSecPerDay); // plus the data part (the digits in front of the comma) fValue += aToolsDateTime.GetDate(); } diff --git a/xmloff/source/forms/propertyimport.cxx b/xmloff/source/forms/propertyimport.cxx index a6c667c27166..53f249a13dd3 100644 --- a/xmloff/source/forms/propertyimport.cxx +++ b/xmloff/source/forms/propertyimport.cxx @@ -30,6 +30,7 @@ #include "callbacks.hxx" #include "xmloff/xmlnmspe.hxx" #include +#include #include #include #include @@ -67,16 +68,15 @@ namespace ::com::sun::star::util::Time lcl_getTime(double _nValue) { ::com::sun::star::util::Time aTime; - sal_uInt32 nIntValue = sal_Int32(_nValue * 8640000); - nIntValue *= 8640000; - aTime.HundredthSeconds = (sal_uInt16)( nIntValue % 100 ); - nIntValue /= 100; - aTime.Seconds = (sal_uInt16)( nIntValue % 60 ); - nIntValue /= 60; - aTime.Minutes = (sal_uInt16)( nIntValue % 60 ); - nIntValue /= 60; + sal_uInt64 nIntValue = static_cast(_nValue * ::Time::nanoSecPerDay); + aTime.NanoSeconds = nIntValue % ::Time::nanoSecPerSec; + nIntValue /= ::Time::nanoSecPerSec; + aTime.Seconds = nIntValue % ::Time::secondPerMinute; + nIntValue /= ::Time::secondPerMinute; + aTime.Minutes = nIntValue % ::Time::minutePerHour; + nIntValue /= ::Time::minutePerHour; OSL_ENSURE(nIntValue < 24, "lcl_getTime: more than a day?"); - aTime.Hours = static_cast< sal_uInt16 >( nIntValue ); + aTime.Hours = nIntValue; return aTime; } @@ -219,7 +219,7 @@ Any PropertyConversion::convertString( SvXMLImport& _rImporter, const ::com::sun ::com::sun::star::util::Date aDate = lcl_getDate(nValue); ::com::sun::star::util::DateTime aDateTime; - aDateTime.HundredthSeconds = aTime.HundredthSeconds; + aDateTime.NanoSeconds = aTime.NanoSeconds; aDateTime.Seconds = aTime.Seconds; aDateTime.Minutes = aTime.Minutes; aDateTime.Hours = aTime.Hours; diff --git a/xmloff/source/style/durationhdl.cxx b/xmloff/source/style/durationhdl.cxx index 73cae30f78be..676f26050510 100644 --- a/xmloff/source/style/durationhdl.cxx +++ b/xmloff/source/style/durationhdl.cxx @@ -39,8 +39,11 @@ sal_Bool XMLDurationMS16PropHdl_Impl::importXML( if (!::sax::Converter::convertDuration( aDuration, rStrImpValue )) return false; + // TODO FIXME why is this in centiseconds? Should it be nanoseconds? + // This overflows... 24h == 8640000cs >> 0x7FFF cs == 32767 + // 32767cs = approx 5 minutes and 27.67s const sal_Int16 nMS = ((aDuration.Hours * 60 + aDuration.Minutes) * 60 - + aDuration.Seconds) * 100 + (aDuration.MilliSeconds / 10); + + aDuration.Seconds) * 100 + (aDuration.NanoSeconds / (10*1000*1000)); rValue <<= nMS; return sal_True; diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index e53736572f27..7e013db446e4 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -2645,7 +2645,7 @@ void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName, // truncate dates if(bIsDate) { - aDateTime.HundredthSeconds = 0; + aDateTime.NanoSeconds = 0; aDateTime.Seconds = 0; aDateTime.Minutes = 0; aDateTime.Hours = 0; diff --git a/xmloff/source/xforms/SchemaRestrictionContext.cxx b/xmloff/source/xforms/SchemaRestrictionContext.cxx index facfafbcdc07..34b64ae12fcb 100644 --- a/xmloff/source/xforms/SchemaRestrictionContext.cxx +++ b/xmloff/source/xforms/SchemaRestrictionContext.cxx @@ -215,7 +215,7 @@ Any xforms_time( const OUString& rValue ) aTime.Hours = aDuration.Hours; aTime.Minutes = aDuration.Minutes; aTime.Seconds = aDuration.Seconds; - aTime.HundredthSeconds = aDuration.MilliSeconds / 10; + aTime.NanoSeconds = aDuration.NanoSeconds; aAny <<= aTime; } return aAny; diff --git a/xmloff/source/xforms/xformsexport.cxx b/xmloff/source/xforms/xformsexport.cxx index a19d11acf6f9..28ba107ab108 100644 --- a/xmloff/source/xforms/xformsexport.cxx +++ b/xmloff/source/xforms/xformsexport.cxx @@ -688,7 +688,7 @@ void xforms_formatTime( OUStringBuffer& aBuffer, const com::sun::star::util::Tim aDuration.Hours = rTime.Hours; aDuration.Minutes = rTime.Minutes; aDuration.Seconds = rTime.Seconds; - aDuration.MilliSeconds = rTime.HundredthSeconds * 10; + aDuration.NanoSeconds = rTime.NanoSeconds; ::sax::Converter::convertDuration( aBuffer, aDuration ); } diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx index 4d366f42518b..5993122837cb 100644 --- a/xmlsecurity/source/component/documentdigitalsignatures.cxx +++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx @@ -309,7 +309,7 @@ DocumentDigitalSignatures::ImplVerifySignatures( // Time support again (#i38744#) Date aDate( rInfo.stDateTime.Day, rInfo.stDateTime.Month, rInfo.stDateTime.Year ); Time aTime( rInfo.stDateTime.Hours, rInfo.stDateTime.Minutes, - rInfo.stDateTime.Seconds, rInfo.stDateTime.HundredthSeconds ); + rInfo.stDateTime.Seconds, rInfo.stDateTime.NanoSeconds ); rSigInfo.SignatureDate = aDate.GetDate(); rSigInfo.SignatureTime = aTime.GetTime(); diff --git a/xmlsecurity/source/dialogs/resourcemanager.cxx b/xmlsecurity/source/dialogs/resourcemanager.cxx index defcae055dd0..2611960df028 100644 --- a/xmlsecurity/source/dialogs/resourcemanager.cxx +++ b/xmlsecurity/source/dialogs/resourcemanager.cxx @@ -54,7 +54,7 @@ namespace XmlSec { return DateTime( Date( _rDT.Day, _rDT.Month, _rDT.Year ), - Time( _rDT.Hours, _rDT.Minutes, _rDT.Seconds, _rDT.HundredthSeconds ) ); + Time( _rDT.Hours, _rDT.Minutes, _rDT.Seconds, _rDT.NanoSeconds ) ); } OUString GetDateTimeString( const ::com::sun::star::util::DateTime& _rDT ) diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx index 6aeb9965ec79..b5e2869b4031 100644 --- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx +++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx @@ -124,7 +124,7 @@ void XMLSignatureHelper::SetX509Certificate( void XMLSignatureHelper::SetDateTime( sal_Int32 nSecurityId, const Date& rDate, const Time& rTime ) { ::com::sun::star::util::DateTime stDateTime; - stDateTime.HundredthSeconds = (::sal_uInt16)rTime.Get100Sec(); + stDateTime.NanoSeconds = rTime.GetNanoSec(); stDateTime.Seconds = (::sal_uInt16)rTime.GetSec(); stDateTime.Minutes = (::sal_uInt16)rTime.GetMin(); stDateTime.Hours = (::sal_uInt16)rTime.GetHour(); diff --git a/xmlsecurity/source/helper/xsecctl.cxx b/xmlsecurity/source/helper/xsecctl.cxx index 733022c43678..addfc3ea3d2b 100644 --- a/xmlsecurity/source/helper/xsecctl.cxx +++ b/xmlsecurity/source/helper/xsecctl.cxx @@ -30,6 +30,7 @@ #include #include +#include namespace cssu = com::sun::star::uno; namespace cssl = com::sun::star::lang; @@ -66,199 +67,6 @@ XSecController::~XSecController() /* * private methods */ -/** convert string to number with optional min and max values */ -sal_Bool XSecController::convertNumber( sal_Int32& rValue, - const OUString& rString, - sal_Int32 /*nMin*/, sal_Int32 /*nMax*/ ) -{ - sal_Bool bNeg = sal_False; - rValue = 0; - - sal_Int32 nPos = 0L; - sal_Int32 nLen = rString.getLength(); - - // skip white space - while( nPos < nLen && sal_Unicode(' ') == rString[nPos] ) - nPos++; - - if( nPos < nLen && sal_Unicode('-') == rString[nPos] ) - { - bNeg = sal_True; - nPos++; - } - - // get number - while( nPos < nLen && - sal_Unicode('0') <= rString[nPos] && - sal_Unicode('9') >= rString[nPos] ) - { - // TODO: check overflow! - rValue *= 10; - rValue += (rString[nPos] - sal_Unicode('0')); - nPos++; - } - - if( bNeg ) - rValue *= -1; - - return nPos == nLen; -} - -/** convert util::DateTime to ISO Date String */ -void XSecController::convertDateTime( OUStringBuffer& rBuffer, - const com::sun::star::util::DateTime& rDateTime ) -{ - rBuffer.append((sal_Int32) rDateTime.Year); - rBuffer.append('-'); - if( rDateTime.Month < 10 ) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.Month); - rBuffer.append('-'); - if( rDateTime.Day < 10 ) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.Day); - - if( rDateTime.Seconds != 0 || - rDateTime.Minutes != 0 || - rDateTime.Hours != 0 ) - { - rBuffer.append('T'); - if( rDateTime.Hours < 10 ) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.Hours); - rBuffer.append(':'); - if( rDateTime.Minutes < 10 ) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.Minutes); - rBuffer.append(':'); - if( rDateTime.Seconds < 10 ) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.Seconds); - if ( rDateTime.HundredthSeconds > 0) - { - rBuffer.append(','); - if (rDateTime.HundredthSeconds < 10) - rBuffer.append('0'); - rBuffer.append((sal_Int32) rDateTime.HundredthSeconds); - } - } -} - -/** convert ISO Date String to util::DateTime */ -sal_Bool XSecController::convertDateTime( com::sun::star::util::DateTime& rDateTime, - const OUString& rString ) -{ - sal_Bool bSuccess = sal_True; - - OUString aDateStr, aTimeStr, sHundredth; - sal_Int32 nPos = rString.indexOf( (sal_Unicode) 'T' ); - sal_Int32 nPos2 = rString.indexOf( (sal_Unicode) ',' ); - if ( nPos >= 0 ) - { - aDateStr = rString.copy( 0, nPos ); - if ( nPos2 >= 0 ) - { - aTimeStr = rString.copy( nPos + 1, nPos2 - nPos - 1 ); - - //Get the fraction of a second with the accuracy of one hundreds second. - //The fraction part of the date could have different accuracies. To calculate - //the count of a hundredth units one could form a fractional number by appending - //the value of the time string to 0. Then multiply it by 100 and use only the whole number. - //For example: 5:27:46,1 -> 0,1 * 100 = 10 - //5:27:46,01 -> 0,01 * 100 = 1 - //5:27:46,001 -> 0,001 * 100 = 0 - //Due to the inaccuracy of floating point numbers the result may not be the same on different - //platforms. We had the case where we had a value of 24 hundredth of second, which converted to - //23 on Linux and 24 on Solaris and Windows. - - //we only support a hundredth second - //make ,1 -> 10 ,01 -> 1 ,001 -> only use first two diggits - sHundredth = rString.copy(nPos2 + 1); - sal_Int32 len = sHundredth.getLength(); - if (len == 1) - sHundredth += OUString("0"); - if (len > 2) - sHundredth = sHundredth.copy(0, 2); - } - else - { - aTimeStr = rString.copy(nPos + 1); - sHundredth = OUString("0"); - } - } - else - aDateStr = rString; // no separator: only date part - - sal_Int32 nYear = 1899; - sal_Int32 nMonth = 12; - sal_Int32 nDay = 30; - sal_Int32 nHour = 0; - sal_Int32 nMin = 0; - sal_Int32 nSec = 0; - - const sal_Unicode* pStr = aDateStr.getStr(); - sal_Int32 nDateTokens = 1; - while ( *pStr ) - { - if ( *pStr == '-' ) - nDateTokens++; - pStr++; - } - if ( nDateTokens > 3 || aDateStr.isEmpty() ) - bSuccess = sal_False; - else - { - sal_Int32 n = 0; - if ( !convertNumber( nYear, aDateStr.getToken( 0, '-', n ), 0, 9999 ) ) - bSuccess = sal_False; - if ( nDateTokens >= 2 ) - if ( !convertNumber( nMonth, aDateStr.getToken( 0, '-', n ), 0, 12 ) ) - bSuccess = sal_False; - if ( nDateTokens >= 3 ) - if ( !convertNumber( nDay, aDateStr.getToken( 0, '-', n ), 0, 31 ) ) - bSuccess = sal_False; - } - - if ( !aTimeStr.isEmpty() ) // time is optional - { - pStr = aTimeStr.getStr(); - sal_Int32 nTimeTokens = 1; - while ( *pStr ) - { - if ( *pStr == ':' ) - nTimeTokens++; - pStr++; - } - if ( nTimeTokens > 3 ) - bSuccess = sal_False; - else - { - sal_Int32 n = 0; - if ( !convertNumber( nHour, aTimeStr.getToken( 0, ':', n ), 0, 23 ) ) - bSuccess = sal_False; - if ( nTimeTokens >= 2 ) - if ( !convertNumber( nMin, aTimeStr.getToken( 0, ':', n ), 0, 59 ) ) - bSuccess = sal_False; - if ( nTimeTokens >= 3 ) - if ( !convertNumber( nSec, aTimeStr.getToken( 0, ':', n ), 0, 59 ) ) - bSuccess = sal_False; - } - } - - if (bSuccess) - { - rDateTime.Year = (sal_uInt16)nYear; - rDateTime.Month = (sal_uInt16)nMonth; - rDateTime.Day = (sal_uInt16)nDay; - rDateTime.Hours = (sal_uInt16)nHour; - rDateTime.Minutes = (sal_uInt16)nMin; - rDateTime.Seconds = (sal_uInt16)nSec; - // rDateTime.HundredthSeconds = sDoubleStr.toDouble() * 100; - rDateTime.HundredthSeconds = static_cast(sHundredth.toInt32()); - } - return bSuccess; -} - int XSecController::findSignatureInfor( sal_Int32 nSecurityId) const /****** XSecController/findSignatureInfor ************************************* * @@ -1123,16 +931,14 @@ void XSecController::exportSignature( OUStringBuffer buffer; //If the xml signature was already contained in the document, //then we use the original date and time string, rather then the - //converted one. When the original string is converted to the DateTime - //structure then information may be lost because it only holds a fractional - //of a second with a accuracy of one hundredth of second. If the string contains - //milli seconds (document was signed by an application other than OOo) - //and the converted time is written back, then the string looks different - //and the signature is broken. + //converted one. This avoids writing a different string due to + //e.g. rounding issues and thus breaking the signature. if (!signatureInfo.ouDateTime.isEmpty()) buffer = signatureInfo.ouDateTime; else - convertDateTime( buffer, signatureInfo.stDateTime ); + { + buffer = utl::toISO8601(signatureInfo.stDateTime); + } xDocumentHandler->characters( buffer.makeStringAndClear() ); xDocumentHandler->endElement( diff --git a/xmlsecurity/source/helper/xsecctl.hxx b/xmlsecurity/source/helper/xsecctl.hxx index 6014807de6bc..40f47aceeda7 100644 --- a/xmlsecurity/source/helper/xsecctl.hxx +++ b/xmlsecurity/source/helper/xsecctl.hxx @@ -345,10 +345,6 @@ private: /* * Common methods */ - sal_Bool convertNumber( sal_Int32& rValue, const OUString& rString, sal_Int32 nMin, sal_Int32 nMax ); - void convertDateTime( OUStringBuffer& rBuffer, const com::sun::star::util::DateTime& rDateTime ); - sal_Bool convertDateTime( com::sun::star::util::DateTime& rDateTime, const OUString& rString ); - void createXSecComponent( ); int findSignatureInfor( sal_Int32 nSecurityId ) const; bool chainOn( bool bRetrievingLastEvent ); diff --git a/xmlsecurity/source/helper/xsecverify.cxx b/xmlsecurity/source/helper/xsecverify.cxx index 3b559ebe0022..67d5b2fd6b42 100644 --- a/xmlsecurity/source/helper/xsecverify.cxx +++ b/xmlsecurity/source/helper/xsecverify.cxx @@ -29,6 +29,7 @@ #include #include #include +#include namespace cssu = com::sun::star::uno; namespace cssl = com::sun::star::lang; @@ -258,7 +259,7 @@ void XSecController::setDate( OUString& ouDate ) return; } InternalSignatureInformation &isi = m_vInternalSignatureInformations.back(); - convertDateTime( isi.signatureInfor.stDateTime, ouDate ); + utl::ISO8601parseDateTime( ouDate, isi.signatureInfor.stDateTime); isi.signatureInfor.ouDateTime = ouDate; } diff --git a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx index 2ec2145a7ca6..34e7e452b7ff 100644 --- a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx +++ b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx @@ -31,6 +31,7 @@ #include #include #include +#include using namespace ::com::sun::star::uno ; using namespace ::com::sun::star::security ; @@ -301,7 +302,7 @@ OUString SAL_CALL X509Certificate_MSCryptImpl :: getSubjectName() throw ( ::com: { if( FileTimeToSystemTime( &localFileTime, &explTime ) ) { //Convert the time to readable local time - dateTime.HundredthSeconds = explTime.wMilliseconds / 100 ; + dateTime.NanoSeconds = explTime.wMilliseconds * ::Time::nanoPerMilli ; dateTime.Seconds = explTime.wSecond ; dateTime.Minutes = explTime.wMinute ; dateTime.Hours = explTime.wHour ; @@ -327,7 +328,7 @@ OUString SAL_CALL X509Certificate_MSCryptImpl :: getSubjectName() throw ( ::com: { if( FileTimeToSystemTime( &localFileTime, &explTime ) ) { //Convert the time to readable local time - dateTime.HundredthSeconds = explTime.wMilliseconds / 100 ; + dateTime.NanoSeconds = explTime.wMilliseconds * ::Time::nanoPerMilli ; dateTime.Seconds = explTime.wSecond ; dateTime.Minutes = explTime.wMinute ; dateTime.Hours = explTime.wHour ; diff --git a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx index 3e81cd6b102f..72d4831cbf6a 100644 --- a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx +++ b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx @@ -33,6 +33,7 @@ #include "certificateextension_xmlsecimpl.hxx" #include "sanextension_nssimpl.hxx" +#include using namespace ::com::sun::star::uno ; using namespace ::com::sun::star::security ; @@ -106,7 +107,7 @@ OUString SAL_CALL X509Certificate_NssImpl :: getSubjectName() throw ( ::com::sun //Convert the time to readable local time PR_ExplodeTime( notBefore, PR_LocalTimeParameters, &explTime ) ; - dateTime.HundredthSeconds = static_cast< sal_Int16 >( explTime.tm_usec / 1000 ); + dateTime.NanoSeconds = static_cast< sal_Int32 >( explTime.tm_usec * ::Time::nanoPerMicro ); dateTime.Seconds = static_cast< sal_Int16 >( explTime.tm_sec ); dateTime.Minutes = static_cast< sal_Int16 >( explTime.tm_min ); dateTime.Hours = static_cast< sal_Int16 >( explTime.tm_hour ); @@ -135,7 +136,7 @@ OUString SAL_CALL X509Certificate_NssImpl :: getSubjectName() throw ( ::com::sun //Convert the time to readable local time PR_ExplodeTime( notAfter, PR_LocalTimeParameters, &explTime ) ; - dateTime.HundredthSeconds = static_cast< sal_Int16 >( explTime.tm_usec / 1000 ); + dateTime.NanoSeconds = static_cast< sal_Int16 >( explTime.tm_usec * ::Time::nanoPerMicro ); dateTime.Seconds = static_cast< sal_Int16 >( explTime.tm_sec ); dateTime.Minutes = static_cast< sal_Int16 >( explTime.tm_min ); dateTime.Hours = static_cast< sal_Int16 >( explTime.tm_hour );