Browse Source

Change the fSecs field of plUnifiedTime from UInt32 to time_t. (cherry picked from commit 9adb8efd5d)

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.
cwalther/timetypes-1
Christian Walther 5 years ago committed by rarified
parent
commit
a117e47b5e
  1. 12
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp
  2. 6
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h
  3. 6
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp
  4. 4
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp
  5. 2
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp
  6. 2
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp
  7. 8
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp
  8. 44
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp
  9. 8
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h

12
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(); const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime();
if ( utime.GetSecs() != 0) if ( utime.GetSecs() != 0)
@ -627,7 +627,7 @@ UInt32 cyMisc::GetDniTime(void)
return 0; return 0;
} }
UInt32 cyMisc::GetServerTime(void) time_t cyMisc::GetServerTime(void)
{ {
const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime(); const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime();
return utime.GetSecs(); return utime.GetSecs();
@ -645,7 +645,7 @@ float cyMisc::GetAgeTimeOfDayPercent(void)
UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
{ {
// convert to mountain time // convert to mountain time
UInt32 dtime = gtime - kMST; time_t dtime = gtime - kMST;
plUnifiedTime utime = plUnifiedTime(); plUnifiedTime utime = plUnifiedTime();
utime.SetSecs(dtime); utime.SetSecs(dtime);
// check for daylight savings time in New Mexico and adjust // check for daylight savings time in New Mexico and adjust
@ -654,10 +654,10 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
plUnifiedTime dstStart = plUnifiedTime(); plUnifiedTime dstStart = plUnifiedTime();
dstStart.SetGMTime(utime.GetYear(),3,8,2,0,0); dstStart.SetGMTime(utime.GetYear(),3,8,2,0,0);
// find first Sunday after (including) 3/8 (second Sunday of March) // 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) if (days_to_go == 7)
days_to_go = 0; days_to_go = 0;
UInt32 dstStartSecs = dstStart.GetSecs() + days_to_go * kOneDay; time_t dstStartSecs = dstStart.GetSecs() + days_to_go * kOneDay;
plUnifiedTime dstEnd = plUnifiedTime(); plUnifiedTime dstEnd = plUnifiedTime();
dstEnd.SetGMTime(utime.GetYear(),11,1,1,0,0); dstEnd.SetGMTime(utime.GetYear(),11,1,1,0,0);
@ -665,7 +665,7 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
days_to_go = 7 - dstEnd.GetDayOfWeek(); days_to_go = 7 - dstEnd.GetDayOfWeek();
if (days_to_go == 7) if (days_to_go == 7)
days_to_go = 0; 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 ) if ( dtime >= dstStartSecs && dtime < dstEndSecs )
// add hour for daylight savings time // add hour for daylight savings time

6
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.h

@ -290,9 +290,9 @@ public:
static PyObject* GetPrevAgeInfo(); static PyObject* GetPrevAgeInfo();
// current time in current age // current time in current age
static UInt32 GetAgeTime( void ); static UInt32 GetAgeTime( void );
static UInt32 GetDniTime(void); static time_t GetDniTime(void);
static UInt32 ConvertGMTtoDni(UInt32 time); static time_t ConvertGMTtoDni(time_t time);
static UInt32 GetServerTime( void ); // returns the current server time in GMT static time_t GetServerTime( void ); // returns the current server time in GMT
static float GetAgeTimeOfDayPercent(void); static float GetAgeTimeOfDayPercent(void);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

6
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") 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)") 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") 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"); PyErr_SetString(PyExc_TypeError, "PtGMTtoDniTime expects a long");
PYTHON_RETURN_ERROR; 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" PYTHON_GLOBAL_METHOD_DEFINITION(PtGetClientName, args, "Params: avatarKey=None\nThis will return the name of the client that is owned by the avatar\n"

4
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp

@ -71,10 +71,10 @@ UInt32 pyDniInfoSource::GetAgeTime( void ) const
if (!node) if (!node)
return 0; return 0;
unsigned result; UInt32 result;
VaultAgeInfoNode ageInfo(node); VaultAgeInfoNode ageInfo(node);
if (const plUnifiedTime * utime = ageInfo.GetAgeTime()) if (const plUnifiedTime * utime = ageInfo.GetAgeTime())
result = utime->GetSecs(); result = (UInt32)utime->GetSecs();
else else
result = 0; result = 0;
node->DecRef(); node->DecRef();

2
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAgeDescription/plAgeDescription.cpp

@ -354,7 +354,7 @@ void plAgeDescription::Write(hsStream* stream) const
char buf[256]; char buf[256];
// Write the date/time // Write the date/time
sprintf(buf, "StartDateTime=%010u\n", fStart.GetSecs()); sprintf(buf, "StartDateTime=%010lu\n", (unsigned long)fStart.GetSecs());
stream->WriteString(buf); stream->WriteString(buf);
// Write the day length // Write the day length

2
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp

@ -808,7 +808,7 @@ bool plStatusLog::IPrintLineToFile( const char *line, UInt32 count )
} }
if ( fFlags & kTimeInSeconds ) 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)); StrPack(buf, work, arrsize(buf));
} }
if ( fFlags & kTimeAsDouble ) if ( fFlags & kTimeAsDouble )

8
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 long plTimeSpan::GetTotalDays() const
{ {
return fSecs / (24*3600L); return (long)(fSecs / (24*3600L));
} }
long plTimeSpan::GetTotalHours() const long plTimeSpan::GetTotalHours() const
{ {
return fSecs / 3600; return (long)(fSecs / 3600);
} }
long plTimeSpan::GetTotalMinutes() const long plTimeSpan::GetTotalMinutes() const
{ {
return fSecs / 60; return (long)(fSecs / 60);
} }
long plTimeSpan::GetTotalSeconds() const long plTimeSpan::GetTotalSeconds() const
{ {
return fSecs; return (long)fSecs;
} }

44
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 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; fMicros = (UInt32)(ff % 10000000)/10;
return true; return true;
} }
@ -223,7 +223,7 @@ const plUnifiedTime & plUnifiedTime::operator=(time_t src)
const plUnifiedTime & plUnifiedTime::operator=(unsigned long src) const plUnifiedTime & plUnifiedTime::operator=(unsigned long src)
{ {
fSecs = src; fSecs = (time_t)src;
fMicros = 0; fMicros = 0;
return *this; return *this;
} }
@ -238,7 +238,7 @@ const plUnifiedTime & plUnifiedTime::operator=(const struct timeval & src)
const plUnifiedTime & plUnifiedTime::operator=(const struct tm & src) const plUnifiedTime & plUnifiedTime::operator=(const struct tm & src)
{ {
struct tm atm = src; struct tm atm = src;
fSecs = mktime(&atm); // this won't work after 2030 something, sorry fSecs = mktime(&atm);
return *this; return *this;
} }
@ -247,16 +247,10 @@ void plUnifiedTime::SetSecsDouble(double secs)
hsAssert(secs>=0, "plUnifiedTime::SetSecsDouble negative time"); hsAssert(secs>=0, "plUnifiedTime::SetSecsDouble negative time");
double x,y; double x,y;
x = modf(secs,&y); x = modf(secs,&y);
fSecs = (UInt32)y; fSecs = (time_t)y;
fMicros = (UInt32)(x*1000000); fMicros = (UInt32)(x*1000000);
} }
void plUnifiedTime::FromMillis(UInt32 millis)
{
fSecs = millis/1000;
fMicros = 0;
}
void plUnifiedTime::ToCurrentTime() 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_mon = month - 1;
atm.tm_year = year - 1900; atm.tm_year = year - 1900;
atm.tm_isdst = dst; atm.tm_isdst = dst;
fSecs = mktime(&atm); // this won't work after 2030 something, sorry fSecs = mktime(&atm);
if (fSecs == -1) if (fSecs == -1)
return false; return false;
if (fMicros >= 1000000) 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 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) if (!time)
return false; return false;
year = time->tm_year+1900; year = time->tm_year+1900;
@ -324,8 +318,8 @@ const char* plUnifiedTime::Print() const
const char* plUnifiedTime::PrintWMillis() const const char* plUnifiedTime::PrintWMillis() const
{ {
static std::string s; static std::string s;
xtl::format(s,"%s,s:%d,ms:%d", xtl::format(s,"%s,s:%lu,ms:%d",
Print(), GetSecs(), GetMillis() ); Print(), (unsigned long)GetSecs(), GetMillis() );
return s.c_str(); return s.c_str();
} }
@ -333,11 +327,11 @@ struct tm * plUnifiedTime::GetTm(struct tm * ptm) const
{ {
if (ptm != nil) if (ptm != nil)
{ {
*ptm = *IGetTime((const time_t *)&fSecs); *ptm = *IGetTime(&fSecs);
return ptm; return ptm;
} }
else else
return IGetTime((const time_t *)&fSecs); return IGetTime(&fSecs);
} }
int plUnifiedTime::GetYear() const int plUnifiedTime::GetYear() const
@ -383,15 +377,12 @@ double plUnifiedTime::GetSecsDouble() const
} }
#pragma optimize( "", on ) // restore optimizations to their defaults #pragma optimize( "", on ) // restore optimizations to their defaults
UInt32 plUnifiedTime::AsMillis()
{
return GetSecs()*1000;
}
void plUnifiedTime::Read(hsStream* s) void plUnifiedTime::Read(hsStream* s)
{ {
s->LogSubStreamStart("UnifiedTime"); s->LogSubStreamStart("UnifiedTime");
s->LogReadSwap(&fSecs,"Seconds"); UInt32 secs;
s->LogReadSwap(&secs,"Seconds");
fSecs = (time_t)secs;
s->LogReadSwap(&fMicros,"MicroSeconds"); s->LogReadSwap(&fMicros,"MicroSeconds");
s->LogSubStreamEnd(); s->LogSubStreamEnd();
// preserve fMode // preserve fMode
@ -399,7 +390,7 @@ void plUnifiedTime::Read(hsStream* s)
void plUnifiedTime::Write(hsStream* s) const void plUnifiedTime::Write(hsStream* s) const
{ {
s->WriteSwap(fSecs); s->WriteSwap((UInt32)fSecs);
s->WriteSwap(fMicros); s->WriteSwap(fMicros);
// preserve fMode // preserve fMode
} }
@ -458,7 +449,12 @@ bool plUnifiedTime::operator>=(const plUnifiedTime & rhs) const
plUnifiedTime::operator timeval() 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}; struct timeval t = {fSecs, fMicros};
#endif
return t; return t;
} }
@ -472,7 +468,7 @@ plUnifiedTime::operator struct tm() const
std::string plUnifiedTime::Format(const char * fmt) const std::string plUnifiedTime::Format(const char * fmt) const
{ {
char buf[128]; char buf[128];
struct tm * t = IGetTime((const time_t *)&fSecs); struct tm * t = IGetTime(&fSecs);
if (t == nil || if (t == nil ||
!strftime(buf, sizeof(buf), fmt, t)) !strftime(buf, sizeof(buf), fmt, t))
buf[0] = '\0'; buf[0] = '\0';

8
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h

@ -75,7 +75,7 @@ public:
}; };
protected: protected:
UInt32 fSecs; time_t fSecs;
UInt32 fMicros; UInt32 fMicros;
Mode fMode; Mode fMode;
@ -108,7 +108,7 @@ public:
const plUnifiedTime & operator=(const struct tm & src); const plUnifiedTime & operator=(const struct tm & src);
// getters // getters
UInt32 GetSecs() const { return fSecs; } time_t GetSecs() const { return fSecs; }
UInt32 GetMicros() const { return fMicros; } UInt32 GetMicros() const { return fMicros; }
double GetSecsDouble() const; // get the secs and micros as a double floating point value 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; hsBool GetTime(short &year, short &month, short &day, short &hour, short &minute, short &second) const;
@ -122,10 +122,9 @@ public:
int GetMillis() const; int GetMillis() const;
int GetDayOfWeek() const; int GetDayOfWeek() const;
int GetMode() const {return fMode;} // local or gmt. int GetMode() const {return fMode;} // local or gmt.
UInt32 AsMillis();
// setters // setters
void SetSecs(const UInt32 secs) { fSecs = secs; } void SetSecs(const time_t secs) { fSecs = secs; }
void SetSecsDouble(double secs); void SetSecsDouble(double secs);
void SetMicros(const UInt32 micros) { fMicros = micros; } 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); 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 ToCurrentTime();
void ToEpoch() { fSecs = 0; fMicros = 0;} void ToEpoch() { fSecs = 0; fMicros = 0;}
void SetMode(Mode mode) { fMode=mode;} void SetMode(Mode mode) { fMode=mode;}
void FromMillis(UInt32 millis);
#if HS_BUILD_FOR_WIN32 #if HS_BUILD_FOR_WIN32
hsBool SetFromWinFileTime(const FILETIME ft); hsBool SetFromWinFileTime(const FILETIME ft);
#endif #endif

Loading…
Cancel
Save