|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifndef TIMEDATE_H
|
|
Packit |
8f70b4 |
#define TIMEDATE_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include <sys/types.h>
|
|
Packit |
8f70b4 |
#include <sys/time.h>
|
|
Packit |
8f70b4 |
#include <time.h>
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class time_tuple
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
time_t sec;
|
|
Packit |
8f70b4 |
int usec;
|
|
Packit |
8f70b4 |
void addU(time_t s,int us); // must be |us|<1000000
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
time_t get_seconds() const { return sec; }
|
|
Packit |
8f70b4 |
int get_milliseconds() const { return usec/1000; }
|
|
Packit |
8f70b4 |
int get_microseconds() const { return usec; }
|
|
Packit |
8f70b4 |
void normalize();
|
|
Packit |
8f70b4 |
void add_sec(long s) { sec+=s; }
|
|
Packit |
8f70b4 |
void add(double);
|
|
Packit |
8f70b4 |
void add(const time_tuple &o) { addU(o.sec,o.usec); }
|
|
Packit |
8f70b4 |
void sub(const time_tuple &o) { addU(-o.sec,-o.usec); }
|
|
Packit |
8f70b4 |
void sub(double o) { add(-o); }
|
|
Packit |
8f70b4 |
void set(time_t s,int ms,int us) { sec=s; usec=ms*1000+us; normalize(); }
|
|
Packit |
8f70b4 |
void set(const time_tuple &o) { sec=o.sec; usec=o.usec; }
|
|
Packit |
8f70b4 |
bool lt(const time_tuple &o) const { return sec
|
|
Packit |
8f70b4 |
double to_double() const;
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class TimeDiff;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class Time : public time_tuple
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
Time();
|
|
Packit |
8f70b4 |
Time(time_t s,int ms=0,int us=0) { set(s,ms,us); }
|
|
Packit |
8f70b4 |
void Set(time_t s,int ms=0,int us=0) { set(s,ms,us); }
|
|
Packit |
8f70b4 |
void SetToCurrentTime();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
time_t UnixTime() const { return get_seconds(); }
|
|
Packit |
8f70b4 |
int MilliSecond() const { return get_milliseconds(); }
|
|
Packit |
8f70b4 |
int MicroSecond() const { return get_microseconds(); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
inline const Time& operator+=(const TimeDiff &o);
|
|
Packit |
8f70b4 |
inline const Time& operator-=(const TimeDiff &o);
|
|
Packit |
8f70b4 |
inline TimeDiff operator-(const Time &o) const;
|
|
Packit |
8f70b4 |
Time operator+(const TimeDiff &o) const { Time t(*this); t+=o; return t; }
|
|
Packit |
8f70b4 |
Time operator-(const TimeDiff &o) const { Time t(*this); t-=o; return t; }
|
|
Packit |
8f70b4 |
bool operator<(const Time &o) const { return this->lt(o); }
|
|
Packit |
8f70b4 |
bool operator>=(const Time &o) const { return !(*this
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
operator time_t() const { return UnixTime(); }
|
|
Packit |
8f70b4 |
bool Passed(int s) const;
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class TimeDate : public Time
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
time_t local_time_unix;
|
|
Packit |
8f70b4 |
struct tm local_time;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void set_local_time();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
TimeDate() { SetToCurrentTime(); local_time_unix=(time_t)-1; }
|
|
Packit |
8f70b4 |
TimeDate(time_t s,int ms=0,int us=0) : Time(s,ms,us) { local_time_unix=(time_t)-1; if(local_time_unix==s) --local_time_unix; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
operator const struct tm *() { set_local_time(); return &local_time; }
|
|
Packit |
8f70b4 |
operator const struct tm &() { set_local_time(); return local_time; }
|
|
Packit |
8f70b4 |
int Year() { set_local_time(); return local_time.tm_year+1900; }
|
|
Packit |
8f70b4 |
int Month() { set_local_time(); return local_time.tm_mon+1; }
|
|
Packit |
8f70b4 |
int DayOfMonth() { set_local_time(); return local_time.tm_mday; }
|
|
Packit |
8f70b4 |
int Hour() { set_local_time(); return local_time.tm_hour; }
|
|
Packit |
8f70b4 |
int Minute() { set_local_time(); return local_time.tm_min; }
|
|
Packit |
8f70b4 |
int Second() { set_local_time(); return local_time.tm_sec; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
// returns static string.
|
|
Packit |
8f70b4 |
const char *IsoDateTime();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
// maybe it is better to make it double.
|
|
Packit |
8f70b4 |
class TimeDiff : public time_tuple
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
void SetDiff(const Time&a,const Time&b) { this->set(a); sub(b); }
|
|
Packit |
8f70b4 |
TimeDiff() {}
|
|
Packit |
8f70b4 |
TimeDiff(const Time&a,const Time&b) { SetDiff(a,b); }
|
|
Packit |
8f70b4 |
TimeDiff(time_t s,int ms,int us=0) { set(s,ms,us); }
|
|
Packit |
8f70b4 |
void Set(time_t s,int ms,int us=0) { set(s,ms,us); }
|
|
Packit |
8f70b4 |
operator double() const { return to_double(); }
|
|
Packit |
8f70b4 |
void Set(double s);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool operator<(const TimeDiff &o) const { return this->lt(o); }
|
|
Packit |
8f70b4 |
bool operator>=(const TimeDiff &o) const { return !(*this
|
|
Packit |
8f70b4 |
bool operator<(int s) const { return get_seconds()
|
|
Packit |
8f70b4 |
bool operator>=(int s) const { return get_seconds()>=s; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const TimeDiff &operator-=(const TimeDiff &o) { sub(o); return *this; }
|
|
Packit |
8f70b4 |
const TimeDiff &operator+=(const TimeDiff &o) { add(o); return *this; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int MicroSeconds() const;
|
|
Packit |
8f70b4 |
int MilliSeconds() const;
|
|
Packit |
8f70b4 |
time_t Seconds() const;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const TimeDiff& valueOf(double v);
|
|
Packit |
8f70b4 |
timeval toTimeval() const { timeval tv={get_seconds(),get_microseconds()}; return tv; }
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
inline TimeDiff Time::operator-(const Time &o) const { return TimeDiff(*this,o); }
|
|
Packit |
8f70b4 |
inline const Time &Time::operator+=(const TimeDiff &o) { add(o); return *this; }
|
|
Packit |
8f70b4 |
inline const Time &Time::operator-=(const TimeDiff &o) { sub(o); return *this; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class TimeInterval : public TimeDiff
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
bool infty;
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
TimeInterval() : TimeDiff(0,0) { infty=true; }
|
|
Packit |
8f70b4 |
TimeInterval(time_t s,int ms,int us=0) : TimeDiff(s,ms,us) { infty=false; }
|
|
Packit |
8f70b4 |
TimeInterval(const TimeDiff &d) : TimeDiff(d) { infty=false; }
|
|
Packit |
8f70b4 |
void SetInfty(bool i=true) { infty=i; }
|
|
Packit |
8f70b4 |
bool IsInfty() const { return infty; }
|
|
Packit |
8f70b4 |
bool Finished(const Time &base) const;
|
|
Packit |
8f70b4 |
int GetTimeout(const Time &base) const { return GetTimeoutU(base)/1000; }
|
|
Packit |
8f70b4 |
int GetTimeoutU(const Time &base) const;
|
|
Packit |
8f70b4 |
bool operator<(const TimeInterval &o) const { return infty
|
|
Packit |
8f70b4 |
bool operator>=(const TimeInterval &o) const { return !(*this
|
|
Packit |
8f70b4 |
bool operator<(int s) const { return !infty && get_seconds()
|
|
Packit |
8f70b4 |
bool operator>=(int s) const { return infty || get_seconds()>=s; }
|
|
Packit |
8f70b4 |
const char *toString(unsigned flags);
|
|
Packit |
8f70b4 |
enum {
|
|
Packit |
8f70b4 |
TO_STR_TRANSLATE=1,
|
|
Packit |
8f70b4 |
TO_STR_TERSE=2
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#define MINUTE (60)
|
|
Packit |
8f70b4 |
#define HOUR (60*MINUTE)
|
|
Packit |
8f70b4 |
#define DAY (24*HOUR)
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif
|