Skip to content

Commit

Permalink
Merge pull request H-uru#47 from cwalther/Plasma
Browse files Browse the repository at this point in the history
---

The attached commit changes the fSecs field of plUnifiedTime from UInt32 to time_t. This fixes various date formatting problems, e.g. missing log timestamps or output of the Net.GetServerTime console command, when building on a system where time_t is 64-bit (e.g. Visual Studio 2010, and possibly also 2008, though I didn’t test that), 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.

Avoiding unnecessary back-and-forth type conversions makes the change ripple out into several other files. Changes have been tested as far as I easily could, and introduce no new compiler warnings.

The minimal-invasive way of fixing only the date formatting, should you prefer that, is in branch [cwalther:timet-minimal](https://github.com/cwalther/Plasma/branches/timet-minimal) (9b54fb05c9471c1b3317a5f8ed6cd4c11977e9e1).
  • Loading branch information
branan committed Jun 19, 2011
2 parents d5dfa28 + 0fe7fde commit 935cb5a
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 51 deletions.
14 changes: 7 additions & 7 deletions Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp
Expand Up @@ -602,7 +602,7 @@ UInt32 cyMisc::GetAgeTime( void )



UInt32 cyMisc::GetDniTime(void)
time_t cyMisc::GetDniTime(void)
{
const plUnifiedTime utime = plNetClientMgr::GetInstance()->GetServerTime();
if ( utime.GetSecs() != 0)
Expand All @@ -611,7 +611,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();
Expand All @@ -626,10 +626,10 @@ float cyMisc::GetAgeTimeOfDayPercent(void)
#define kOneHour (UInt32)3600
#define kOneDay (UInt32)86400

UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
time_t cyMisc::ConvertGMTtoDni(time_t 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
Expand All @@ -638,18 +638,18 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
plUnifiedTime dstStart = plUnifiedTime();
dstStart.SetGMTime(utime.GetYear(),4,1,2,0,0);
// find first Sunday after 4/1 (first sunday of April)
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(),10,25,1,0,0);
// find first sunday after 10/25 (last sunday of Oct.)
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
Expand Down
6 changes: 3 additions & 3 deletions Sources/Plasma/FeatureLib/pfPython/cyMisc.h
Expand Up @@ -274,9 +274,9 @@ class cyMisc
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);

/////////////////////////////////////////////////////////////////////////////
Expand Down
6 changes: 3 additions & 3 deletions Sources/Plasma/FeatureLib/pfPython/cyMiscGlue.cpp
Expand Up @@ -59,12 +59,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")
Expand All @@ -75,7 +75,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"
Expand Down
4 changes: 2 additions & 2 deletions Sources/Plasma/FeatureLib/pfPython/pyDniInfoSource.cpp
Expand Up @@ -55,10 +55,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();
Expand Down
Expand Up @@ -338,7 +338,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
Expand Down
2 changes: 1 addition & 1 deletion Sources/Plasma/PubUtilLib/plStatusLog/plStatusLog.cpp
Expand Up @@ -786,7 +786,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 )
Expand Down
8 changes: 4 additions & 4 deletions Sources/Plasma/PubUtilLib/plUnifiedTime/plTimeSpan.cpp
Expand Up @@ -28,22 +28,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;
}


Expand Down
46 changes: 21 additions & 25 deletions Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp
Expand Up @@ -59,7 +59,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;
}
Expand Down Expand Up @@ -200,14 +200,14 @@ const plUnifiedTime & plUnifiedTime::operator=(const plUnifiedTime * src)

const plUnifiedTime & plUnifiedTime::operator=(time_t src)
{
fSecs = (UInt32)src;
fSecs = src;
fMicros = 0;
return *this;
}

const plUnifiedTime & plUnifiedTime::operator=(unsigned long src)
{
fSecs = src;
fSecs = (time_t)src;
fMicros = 0;
return *this;
}
Expand All @@ -222,7 +222,7 @@ const plUnifiedTime & plUnifiedTime::operator=(const struct timeval & src)
const plUnifiedTime & plUnifiedTime::operator=(const struct tm & src)
{
struct tm atm = src;
fSecs = (UInt32)mktime(&atm); // this won't work after 2030 something, sorry
fSecs = mktime(&atm);
return *this;
}

Expand All @@ -231,16 +231,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()
{
Expand Down Expand Up @@ -268,7 +262,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 = (UInt32)mktime(&atm); // this won't work after 2030 something, sorry
fSecs = mktime(&atm);
if (fSecs == -1)
return false;
if (fMicros >= 1000000)
Expand All @@ -280,7 +274,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;
Expand Down Expand Up @@ -308,20 +302,20 @@ 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();
}

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
Expand Down Expand Up @@ -367,23 +361,20 @@ 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
}

void plUnifiedTime::Write(hsStream* s) const
{
s->WriteSwap(fSecs);
s->WriteSwap((UInt32)fSecs);
s->WriteSwap(fMicros);
// preserve fMode
}
Expand Down Expand Up @@ -442,7 +433,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;
}

Expand All @@ -456,7 +452,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';
Expand Down
8 changes: 3 additions & 5 deletions Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h
Expand Up @@ -59,7 +59,7 @@ class plUnifiedTime //
};

protected:
UInt32 fSecs;
time_t fSecs;
UInt32 fMicros;
Mode fMode;

Expand Down Expand Up @@ -92,7 +92,7 @@ class plUnifiedTime //
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;
Expand All @@ -106,10 +106,9 @@ class plUnifiedTime //
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);
Expand All @@ -118,7 +117,6 @@ class plUnifiedTime //
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
Expand Down

0 comments on commit 935cb5a

Please sign in to comment.