mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-14 02:27:40 -04:00
Change the fSecs field of plUnifiedTime from UInt32 to time_t.
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.
This commit is contained in:
@ -602,7 +602,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)
|
||||||
@ -611,7 +611,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();
|
||||||
@ -626,10 +626,10 @@ float cyMisc::GetAgeTimeOfDayPercent(void)
|
|||||||
#define kOneHour (UInt32)3600
|
#define kOneHour (UInt32)3600
|
||||||
#define kOneDay (UInt32)86400
|
#define kOneDay (UInt32)86400
|
||||||
|
|
||||||
UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
|
time_t cyMisc::ConvertGMTtoDni(time_t 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
|
||||||
@ -638,10 +638,10 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime)
|
|||||||
plUnifiedTime dstStart = plUnifiedTime();
|
plUnifiedTime dstStart = plUnifiedTime();
|
||||||
dstStart.SetGMTime(utime.GetYear(),4,1,2,0,0);
|
dstStart.SetGMTime(utime.GetYear(),4,1,2,0,0);
|
||||||
// find first Sunday after 4/1 (first sunday of April)
|
// 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)
|
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(),10,25,1,0,0);
|
dstEnd.SetGMTime(utime.GetYear(),10,25,1,0,0);
|
||||||
@ -649,7 +649,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
|
||||||
|
@ -274,9 +274,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);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -59,12 +59,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")
|
||||||
@ -75,7 +75,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"
|
||||||
|
@ -55,10 +55,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();
|
||||||
|
@ -338,7 +338,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
|
||||||
|
@ -786,7 +786,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 )
|
||||||
|
@ -28,22 +28,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,7 +59,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;
|
||||||
}
|
}
|
||||||
@ -200,14 +200,14 @@ const plUnifiedTime & plUnifiedTime::operator=(const plUnifiedTime * src)
|
|||||||
|
|
||||||
const plUnifiedTime & plUnifiedTime::operator=(time_t src)
|
const plUnifiedTime & plUnifiedTime::operator=(time_t src)
|
||||||
{
|
{
|
||||||
fSecs = (UInt32)src;
|
fSecs = src;
|
||||||
fMicros = 0;
|
fMicros = 0;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -222,7 +222,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 = (UInt32)mktime(&atm); // this won't work after 2030 something, sorry
|
fSecs = mktime(&atm);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,16 +231,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()
|
||||||
{
|
{
|
||||||
@ -268,7 +262,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 = (UInt32)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)
|
||||||
@ -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
|
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;
|
||||||
@ -308,8 +302,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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,11 +311,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
|
||||||
@ -367,15 +361,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
|
||||||
@ -383,7 +374,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
|
||||||
}
|
}
|
||||||
@ -442,7 +433,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,7 +452,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';
|
||||||
|
@ -59,7 +59,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
UInt32 fSecs;
|
time_t fSecs;
|
||||||
UInt32 fMicros;
|
UInt32 fMicros;
|
||||||
Mode fMode;
|
Mode fMode;
|
||||||
|
|
||||||
@ -92,7 +92,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;
|
||||||
@ -106,10 +106,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);
|
||||||
@ -118,7 +117,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
|
||||||
|
Reference in New Issue
Block a user