From a117e47b5e4902f34380c99c649a923420967743 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Wed, 1 Jul 2020 15:17:08 -0600 Subject: [PATCH] Change the fSecs field of plUnifiedTime from UInt32 to time_t. (cherry picked from commit 9adb8efd5dcb240d2406a1b1876cc005056b0772) This fixes various date formatting problems when building on a system where time_t is 64-bit (e.g. Visual Studio 2010), and, as a bonus, extends the range past 2038 on such systems. The wire protocol is left at 32-bit for now, we might change that to 64 when other reasons to break compatibility have accumulated. --- .../Plasma/FeatureLib/pfPython/cyMisc.cpp | 12 ++--- .../Plasma/FeatureLib/pfPython/cyMisc.h | 6 +-- .../Plasma/FeatureLib/pfPython/cyMiscGlue.cpp | 6 +-- .../FeatureLib/pfPython/pyDniInfoSource.cpp | 4 +- .../plAgeDescription/plAgeDescription.cpp | 2 +- .../PubUtilLib/plStatusLog/plStatusLog.cpp | 2 +- .../PubUtilLib/plUnifiedTime/plTimeSpan.cpp | 8 ++-- .../plUnifiedTime/plUnifiedTime.cpp | 44 +++++++++---------- .../PubUtilLib/plUnifiedTime/plUnifiedTime.h | 8 ++-- 9 files changed, 43 insertions(+), 49 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp index beca03b2..2079b07b 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp @@ -618,7 +618,7 @@ UInt32 cyMisc::GetAgeTime( void ) -UInt32 cyMisc::GetDniTime(void) +time_t cyMisc::GetDniTime(void) { const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime(); if ( utime.GetSecs() != 0) @@ -627,7 +627,7 @@ UInt32 cyMisc::GetDniTime(void) return 0; } -UInt32 cyMisc::GetServerTime(void) +time_t cyMisc::GetServerTime(void) { const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime(); return utime.GetSecs(); @@ -645,7 +645,7 @@ float cyMisc::GetAgeTimeOfDayPercent(void) UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) { // convert to mountain time - UInt32 dtime = gtime - kMST; + time_t dtime = gtime - kMST; plUnifiedTime utime = plUnifiedTime(); utime.SetSecs(dtime); // check for daylight savings time in New Mexico and adjust @@ -654,10 +654,10 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) plUnifiedTime dstStart = plUnifiedTime(); dstStart.SetGMTime(utime.GetYear(),3,8,2,0,0); // find first Sunday after (including) 3/8 (second Sunday of March) - UInt32 days_to_go = 7 - dstStart.GetDayOfWeek(); + int days_to_go = 7 - dstStart.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; - UInt32 dstStartSecs = dstStart.GetSecs() + days_to_go * kOneDay; + time_t dstStartSecs = dstStart.GetSecs() + days_to_go * kOneDay; plUnifiedTime dstEnd = plUnifiedTime(); dstEnd.SetGMTime(utime.GetYear(),11,1,1,0,0); @@ -665,7 +665,7 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) days_to_go = 7 - dstEnd.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; - UInt32 dstEndSecs = dstEnd.GetSecs() + days_to_go * kOneDay; + time_t dstEndSecs = dstEnd.GetSecs() + days_to_go * kOneDay; if ( dtime >= dstStartSecs && dtime < dstEndSecs ) // add hour for daylight savings time diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h index 05c21367..56909892 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h @@ -290,9 +290,9 @@ public: static PyObject* GetPrevAgeInfo(); // current time in current age static UInt32 GetAgeTime( void ); - static UInt32 GetDniTime(void); - static UInt32 ConvertGMTtoDni(UInt32 time); - static UInt32 GetServerTime( void ); // returns the current server time in GMT + static time_t GetDniTime(void); + static time_t ConvertGMTtoDni(time_t time); + static time_t GetServerTime( void ); // returns the current server time in GMT static float GetAgeTimeOfDayPercent(void); ///////////////////////////////////////////////////////////////////////////// diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp index 68ab7077..fcc5c041 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp @@ -75,12 +75,12 @@ PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetPrevAgeInfo, "Returns ptAgeInfoStruc PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetDniTime, "Returns current D'Ni time") { - return PyLong_FromUnsignedLong(cyMisc::GetDniTime()); + return PyLong_FromUnsignedLong((unsigned long)cyMisc::GetDniTime()); } PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetServerTime, "Returns the current time on the server (which is GMT)") { - return PyLong_FromUnsignedLong(cyMisc::GetServerTime()); + return PyLong_FromUnsignedLong((unsigned long)cyMisc::GetServerTime()); } PYTHON_GLOBAL_METHOD_DEFINITION(PtGMTtoDniTime, args, "Params: gtime\nConverts GMT time (passed in) to D'Ni time") @@ -91,7 +91,7 @@ PYTHON_GLOBAL_METHOD_DEFINITION(PtGMTtoDniTime, args, "Params: gtime\nConverts G PyErr_SetString(PyExc_TypeError, "PtGMTtoDniTime expects a long"); PYTHON_RETURN_ERROR; } - return PyLong_FromUnsignedLong(cyMisc::ConvertGMTtoDni(gtime)); + return PyLong_FromUnsignedLong((unsigned long)cyMisc::ConvertGMTtoDni(gtime)); } PYTHON_GLOBAL_METHOD_DEFINITION(PtGetClientName, args, "Params: avatarKey=None\nThis will return the name of the client that is owned by the avatar\n" diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp index 5fbfb4a2..3e89b805 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp @@ -71,10 +71,10 @@ UInt32 pyDniInfoSource::GetAgeTime( void ) const if (!node) return 0; - unsigned result; + UInt32 result; VaultAgeInfoNode ageInfo(node); if (const plUnifiedTime * utime = ageInfo.GetAgeTime()) - result = utime->GetSecs(); + result = (UInt32)utime->GetSecs(); else result = 0; node->DecRef(); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp index e0c71f8b..f88d335f 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp @@ -354,7 +354,7 @@ void plAgeDescription::Write(hsStream* stream) const char buf[256]; // Write the date/time - sprintf(buf, "StartDateTime=%010u\n", fStart.GetSecs()); + sprintf(buf, "StartDateTime=%010lu\n", (unsigned long)fStart.GetSecs()); stream->WriteString(buf); // Write the day length diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp index f7f5c1ce..2e73b134 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp @@ -808,7 +808,7 @@ bool plStatusLog::IPrintLineToFile( const char *line, UInt32 count ) } if ( fFlags & kTimeInSeconds ) { - StrPrintf(work, arrsize(work), "(%u) ", plUnifiedTime(kNow).GetSecs()); + StrPrintf(work, arrsize(work), "(%lu) ", (unsigned long)plUnifiedTime(kNow).GetSecs()); StrPack(buf, work, arrsize(buf)); } if ( fFlags & kTimeAsDouble ) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp index 49aba759..3b293938 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp @@ -44,22 +44,22 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com long plTimeSpan::GetTotalDays() const { - return fSecs / (24*3600L); + return (long)(fSecs / (24*3600L)); } long plTimeSpan::GetTotalHours() const { - return fSecs / 3600; + return (long)(fSecs / 3600); } long plTimeSpan::GetTotalMinutes() const { - return fSecs / 60; + return (long)(fSecs / 60); } long plTimeSpan::GetTotalSeconds() const { - return fSecs; + return (long)fSecs; } diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp index c6c360b6..9c711442 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp @@ -75,7 +75,7 @@ hsBool plUnifiedTime::SetFromWinFileTime(const FILETIME ft) if (ffsecs >= MAGICWINDOWSOFFSET) // make sure we won't end up negatice { - fSecs = (UInt32)(ffsecs-MAGICWINDOWSOFFSET); + fSecs = (time_t)(ffsecs-MAGICWINDOWSOFFSET); fMicros = (UInt32)(ff % 10000000)/10; return true; } @@ -223,7 +223,7 @@ const plUnifiedTime & plUnifiedTime::operator=(time_t src) const plUnifiedTime & plUnifiedTime::operator=(unsigned long src) { - fSecs = src; + fSecs = (time_t)src; fMicros = 0; return *this; } @@ -238,7 +238,7 @@ const plUnifiedTime & plUnifiedTime::operator=(const struct timeval & src) const plUnifiedTime & plUnifiedTime::operator=(const struct tm & src) { struct tm atm = src; - fSecs = mktime(&atm); // this won't work after 2030 something, sorry + fSecs = mktime(&atm); return *this; } @@ -247,16 +247,10 @@ void plUnifiedTime::SetSecsDouble(double secs) hsAssert(secs>=0, "plUnifiedTime::SetSecsDouble negative time"); double x,y; x = modf(secs,&y); - fSecs = (UInt32)y; + fSecs = (time_t)y; fMicros = (UInt32)(x*1000000); } -void plUnifiedTime::FromMillis(UInt32 millis) -{ - fSecs = millis/1000; - fMicros = 0; -} - void plUnifiedTime::ToCurrentTime() { @@ -284,7 +278,7 @@ hsBool plUnifiedTime::SetTime(short year, short month, short day, short hour, sh atm.tm_mon = month - 1; atm.tm_year = year - 1900; atm.tm_isdst = dst; - fSecs = mktime(&atm); // this won't work after 2030 something, sorry + fSecs = mktime(&atm); if (fSecs == -1) return false; if (fMicros >= 1000000) @@ -296,7 +290,7 @@ hsBool plUnifiedTime::SetTime(short year, short month, short day, short hour, sh hsBool plUnifiedTime::GetTime(short &year, short &month, short &day, short &hour, short &minute, short &second) const { - struct tm* time = IGetTime((const time_t *)&fSecs); + struct tm* time = IGetTime(&fSecs); if (!time) return false; year = time->tm_year+1900; @@ -324,8 +318,8 @@ const char* plUnifiedTime::Print() const const char* plUnifiedTime::PrintWMillis() const { static std::string s; - xtl::format(s,"%s,s:%d,ms:%d", - Print(), GetSecs(), GetMillis() ); + xtl::format(s,"%s,s:%lu,ms:%d", + Print(), (unsigned long)GetSecs(), GetMillis() ); return s.c_str(); } @@ -333,11 +327,11 @@ struct tm * plUnifiedTime::GetTm(struct tm * ptm) const { if (ptm != nil) { - *ptm = *IGetTime((const time_t *)&fSecs); + *ptm = *IGetTime(&fSecs); return ptm; } else - return IGetTime((const time_t *)&fSecs); + return IGetTime(&fSecs); } int plUnifiedTime::GetYear() const @@ -383,15 +377,12 @@ double plUnifiedTime::GetSecsDouble() const } #pragma optimize( "", on ) // restore optimizations to their defaults -UInt32 plUnifiedTime::AsMillis() -{ - return GetSecs()*1000; -} - void plUnifiedTime::Read(hsStream* s) { s->LogSubStreamStart("UnifiedTime"); - s->LogReadSwap(&fSecs,"Seconds"); + UInt32 secs; + s->LogReadSwap(&secs,"Seconds"); + fSecs = (time_t)secs; s->LogReadSwap(&fMicros,"MicroSeconds"); s->LogSubStreamEnd(); // preserve fMode @@ -399,7 +390,7 @@ void plUnifiedTime::Read(hsStream* s) void plUnifiedTime::Write(hsStream* s) const { - s->WriteSwap(fSecs); + s->WriteSwap((UInt32)fSecs); s->WriteSwap(fMicros); // preserve fMode } @@ -458,7 +449,12 @@ bool plUnifiedTime::operator>=(const plUnifiedTime & rhs) const plUnifiedTime::operator timeval() const { +#if HS_BUILD_FOR_WIN32 + // tv_secs should be a time_t, but on Windows it is a long + struct timeval t = {(long)fSecs, (long)fMicros}; +#else struct timeval t = {fSecs, fMicros}; +#endif return t; } @@ -472,7 +468,7 @@ plUnifiedTime::operator struct tm() const std::string plUnifiedTime::Format(const char * fmt) const { char buf[128]; - struct tm * t = IGetTime((const time_t *)&fSecs); + struct tm * t = IGetTime(&fSecs); if (t == nil || !strftime(buf, sizeof(buf), fmt, t)) buf[0] = '\0'; diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h index 86172eea..bd9f4a97 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h @@ -75,7 +75,7 @@ public: }; protected: - UInt32 fSecs; + time_t fSecs; UInt32 fMicros; Mode fMode; @@ -108,7 +108,7 @@ public: const plUnifiedTime & operator=(const struct tm & src); // getters - UInt32 GetSecs() const { return fSecs; } + time_t GetSecs() const { return fSecs; } UInt32 GetMicros() const { return fMicros; } double GetSecsDouble() const; // get the secs and micros as a double floating point value hsBool GetTime(short &year, short &month, short &day, short &hour, short &minute, short &second) const; @@ -122,10 +122,9 @@ public: int GetMillis() const; int GetDayOfWeek() const; int GetMode() const {return fMode;} // local or gmt. - UInt32 AsMillis(); // setters - void SetSecs(const UInt32 secs) { fSecs = secs; } + void SetSecs(const time_t secs) { fSecs = secs; } void SetSecsDouble(double secs); void SetMicros(const UInt32 micros) { fMicros = micros; } hsBool SetTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec=0, int dst=-1); @@ -134,7 +133,6 @@ public: void ToCurrentTime(); void ToEpoch() { fSecs = 0; fMicros = 0;} void SetMode(Mode mode) { fMode=mode;} - void FromMillis(UInt32 millis); #if HS_BUILD_FOR_WIN32 hsBool SetFromWinFileTime(const FILETIME ft); #endif