Home | History | Annotate | Download | only in include
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef _FX_DATETIME_H_
      8 #define _FX_DATETIME_H_
      9 class CFX_Unitime;
     10 class CFX_DateTime;
     11 typedef int64_t FX_UNITIME;
     12 enum FX_WEEKDAY {
     13   FX_Sunday = 0,
     14   FX_Monday,
     15   FX_Tuesday,
     16   FX_Wednesday,
     17   FX_Thursday,
     18   FX_Friday,
     19   FX_Saturday,
     20 };
     21 FX_BOOL FX_IsLeapYear(int32_t iYear);
     22 int32_t FX_DaysInYear(int32_t iYear);
     23 uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
     24 class CFX_Unitime {
     25  public:
     26   CFX_Unitime() { m_iUnitime = 0; }
     27   CFX_Unitime(FX_UNITIME iUnitime) { m_iUnitime = iUnitime; }
     28   CFX_Unitime(const CFX_Unitime& unitime) { m_iUnitime = unitime.m_iUnitime; }
     29   operator FX_UNITIME*() { return &m_iUnitime; }
     30   operator FX_UNITIME const*() const { return &m_iUnitime; }
     31   operator FX_UNITIME&() { return m_iUnitime; }
     32   operator const FX_UNITIME&() const { return m_iUnitime; }
     33   CFX_Unitime& operator=(const CFX_Unitime& t) {
     34     m_iUnitime = t.m_iUnitime;
     35     return *this;
     36   }
     37   CFX_Unitime& operator=(FX_UNITIME t) {
     38     m_iUnitime = t;
     39     return *this;
     40   }
     41   CFX_Unitime& operator+=(const CFX_Unitime& t) {
     42     m_iUnitime += t.m_iUnitime;
     43     return *this;
     44   }
     45   CFX_Unitime& operator+=(FX_UNITIME t) {
     46     m_iUnitime += t;
     47     return *this;
     48   }
     49   CFX_Unitime& operator-=(const CFX_Unitime& t) {
     50     m_iUnitime -= t.m_iUnitime;
     51     return *this;
     52   }
     53   CFX_Unitime& operator-=(FX_UNITIME t) {
     54     m_iUnitime -= t;
     55     return *this;
     56   }
     57   void Now();
     58   void SetGMTime();
     59   void Set(int32_t year,
     60            uint8_t month,
     61            uint8_t day,
     62            uint8_t hour = 0,
     63            uint8_t minute = 0,
     64            uint8_t second = 0,
     65            FX_WORD millisecond = 0);
     66   void Set(FX_UNITIME t);
     67   int32_t GetYear() const;
     68   uint8_t GetMonth() const;
     69   uint8_t GetDay() const;
     70   FX_WEEKDAY GetDayOfWeek() const;
     71   FX_WORD GetDayOfYear() const;
     72   int64_t GetDayOfAD() const;
     73   uint8_t GetHour() const;
     74   uint8_t GetMinute() const;
     75   uint8_t GetSecond() const;
     76   FX_WORD GetMillisecond() const;
     77   FX_BOOL AddYears(int32_t iYears);
     78   FX_BOOL AddMonths(int32_t iMonths);
     79   FX_BOOL AddDays(int32_t iDays);
     80   FX_BOOL AddHours(int32_t iHours);
     81   FX_BOOL AddMinutes(int32_t iMinutes);
     82   FX_BOOL AddSeconds(int32_t iSeconds);
     83   FX_BOOL AddMilliseconds(int32_t iMilliseconds);
     84   friend CFX_Unitime operator+(const CFX_Unitime& t1, const CFX_Unitime& t2) {
     85     return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
     86   }
     87   friend CFX_Unitime operator+(const CFX_Unitime& t1, FX_UNITIME t2) {
     88     return CFX_Unitime(t1.m_iUnitime + t2);
     89   }
     90   friend CFX_Unitime operator+(FX_UNITIME t1, const CFX_Unitime& t2) {
     91     return CFX_Unitime(t1 + t2.m_iUnitime);
     92   }
     93   friend CFX_Unitime operator-(const CFX_Unitime& t1, const CFX_Unitime& t2) {
     94     return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
     95   }
     96   friend CFX_Unitime operator-(const CFX_Unitime& t1, FX_UNITIME t2) {
     97     return CFX_Unitime(t1.m_iUnitime + t2);
     98   }
     99   friend CFX_Unitime operator-(FX_UNITIME t1, const CFX_Unitime& t2) {
    100     return CFX_Unitime(t1 + t2.m_iUnitime);
    101   }
    102   friend FX_BOOL operator==(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    103     return t1.m_iUnitime == t2.m_iUnitime;
    104   }
    105   friend FX_BOOL operator==(const CFX_Unitime& t1, FX_UNITIME t2) {
    106     return t1.m_iUnitime == t2;
    107   }
    108   friend FX_BOOL operator==(FX_UNITIME t1, const CFX_Unitime& t2) {
    109     return t1 == t2.m_iUnitime;
    110   }
    111   friend FX_BOOL operator!=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    112     return t1.m_iUnitime != t2.m_iUnitime;
    113   }
    114   friend FX_BOOL operator!=(const CFX_Unitime& t1, FX_UNITIME t2) {
    115     return t1.m_iUnitime != t2;
    116   }
    117   friend FX_BOOL operator!=(FX_UNITIME t1, const CFX_Unitime& t2) {
    118     return t1 != t2.m_iUnitime;
    119   }
    120   friend FX_BOOL operator>(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    121     return t1.m_iUnitime > t2.m_iUnitime;
    122   }
    123   friend FX_BOOL operator>(const CFX_Unitime& t1, FX_UNITIME t2) {
    124     return t1.m_iUnitime > t2;
    125   }
    126   friend FX_BOOL operator>(FX_UNITIME t1, const CFX_Unitime& t2) {
    127     return t1 > t2.m_iUnitime;
    128   }
    129   friend FX_BOOL operator>=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    130     return t1.m_iUnitime >= t2.m_iUnitime;
    131   }
    132   friend FX_BOOL operator>=(const CFX_Unitime& t1, FX_UNITIME t2) {
    133     return t1.m_iUnitime >= t2;
    134   }
    135   friend FX_BOOL operator>=(FX_UNITIME t1, const CFX_Unitime& t2) {
    136     return t1 >= t2.m_iUnitime;
    137   }
    138   friend FX_BOOL operator<(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    139     return t1.m_iUnitime < t2.m_iUnitime;
    140   }
    141   friend FX_BOOL operator<(const CFX_Unitime& t1, FX_UNITIME t2) {
    142     return t1.m_iUnitime < t2;
    143   }
    144   friend FX_BOOL operator<(FX_UNITIME t1, const CFX_Unitime& t2) {
    145     return t1 < t2.m_iUnitime;
    146   }
    147   friend FX_BOOL operator<=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
    148     return t1.m_iUnitime <= t2.m_iUnitime;
    149   }
    150   friend FX_BOOL operator<=(const CFX_Unitime& t1, FX_UNITIME t2) {
    151     return t1.m_iUnitime <= t2;
    152   }
    153   friend FX_BOOL operator<=(FX_UNITIME t1, const CFX_Unitime& t2) {
    154     return t1 <= t2.m_iUnitime;
    155   }
    156 
    157  private:
    158   FX_UNITIME m_iUnitime;
    159 };
    160 #if _FX_OS_ != _FX_ANDROID_
    161 #pragma pack(push, 1)
    162 #endif
    163 typedef struct _FX_DATE {
    164   int32_t year;
    165   uint8_t month;
    166   uint8_t day;
    167 } FX_DATE, *FX_LPDATE;
    168 typedef FX_DATE const* FX_LPCDATE;
    169 typedef struct _FX_TIME {
    170   uint8_t hour;
    171   uint8_t minute;
    172   uint8_t second;
    173   FX_WORD millisecond;
    174 } FX_TIME, *FX_LPTIME;
    175 typedef FX_TIME const* FX_LPCTIME;
    176 typedef struct _FX_TIMEZONE {
    177   int8_t tzHour;
    178   uint8_t tzMinute;
    179 } FX_TIMEZONE, *FX_LPTIMEZONE;
    180 typedef FX_TIMEZONE const* FX_LPCTIMEZONE;
    181 typedef struct _FX_DATETIME {
    182   union {
    183     struct {
    184       int32_t year;
    185       uint8_t month;
    186       uint8_t day;
    187     } sDate;
    188     FX_DATE aDate;
    189   } Date;
    190   union {
    191     struct {
    192       uint8_t hour;
    193       uint8_t minute;
    194       uint8_t second;
    195       FX_WORD millisecond;
    196     } sTime;
    197     FX_TIME aTime;
    198   } Time;
    199 } FX_DATETIME, *FX_LPDATETIME;
    200 typedef FX_DATETIME const* FX_LPCDATETIME;
    201 typedef struct _FX_DATETIMEZONE {
    202   union {
    203     struct {
    204       union {
    205         struct {
    206           int32_t year;
    207           uint8_t month;
    208           uint8_t day;
    209         };
    210         FX_DATE date;
    211       };
    212       union {
    213         struct {
    214           uint8_t hour;
    215           uint8_t minute;
    216           uint8_t second;
    217           FX_WORD millisecond;
    218         };
    219         FX_TIME time;
    220       };
    221     };
    222     FX_DATETIME dt;
    223   };
    224   union {
    225     struct {
    226       int8_t tzHour;
    227       uint8_t tzMinute;
    228     };
    229     FX_TIMEZONE tz;
    230   };
    231 } FX_DATETIMEZONE, *FX_LPDATETIMEZONE;
    232 typedef FX_DATETIMEZONE const* FX_LPCDATETIMEZONE;
    233 #if _FX_OS_ != _FX_ANDROID_
    234 #pragma pack(pop)
    235 #endif
    236 class CFX_DateTime {
    237  public:
    238   CFX_DateTime() {}
    239   CFX_DateTime(const FX_DATETIME& dt) { m_DateTime = dt; }
    240   CFX_DateTime(const CFX_DateTime& dt) { m_DateTime = dt.m_DateTime; }
    241   virtual ~CFX_DateTime() {}
    242   operator FX_DATETIME*() { return &m_DateTime; }
    243   operator FX_DATETIME const*() const { return &m_DateTime; }
    244   operator FX_DATETIME&() { return m_DateTime; }
    245   operator const FX_DATETIME&() const { return m_DateTime; }
    246   CFX_DateTime& operator=(const CFX_DateTime& dt) {
    247     m_DateTime = dt.m_DateTime;
    248     return *this;
    249   }
    250   CFX_DateTime& operator=(const FX_DATETIME& dt) {
    251     m_DateTime = dt;
    252     return *this;
    253   }
    254   CFX_DateTime& operator+=(const CFX_DateTime& dt) {
    255     FromUnitime(ToUnitime() + dt.ToUnitime());
    256     return *this;
    257   }
    258   CFX_DateTime& operator+=(const FX_DATETIME& dt) {
    259     FromUnitime(ToUnitime() + ((const CFX_DateTime&)dt).ToUnitime());
    260     return *this;
    261   }
    262   CFX_DateTime& operator-=(const CFX_DateTime& dt) {
    263     FromUnitime(ToUnitime() - dt.ToUnitime());
    264     return *this;
    265   }
    266   CFX_DateTime& operator-=(const FX_DATETIME& dt) {
    267     FromUnitime(ToUnitime() - ((const CFX_DateTime&)dt).ToUnitime());
    268     return *this;
    269   }
    270   virtual FX_BOOL Set(int32_t year,
    271                       uint8_t month,
    272                       uint8_t day,
    273                       uint8_t hour = 0,
    274                       uint8_t minute = 0,
    275                       uint8_t second = 0,
    276                       FX_WORD millisecond = 0);
    277   virtual FX_BOOL FromUnitime(FX_UNITIME t);
    278   virtual FX_UNITIME ToUnitime() const;
    279   virtual int32_t GetYear() const;
    280   virtual uint8_t GetMonth() const;
    281   virtual uint8_t GetDay() const;
    282   virtual FX_WEEKDAY GetDayOfWeek() const;
    283   virtual FX_WORD GetDayOfYear() const;
    284   virtual int64_t GetDayOfAD() const;
    285   virtual uint8_t GetHour() const;
    286   virtual uint8_t GetMinute() const;
    287   virtual uint8_t GetSecond() const;
    288   virtual FX_WORD GetMillisecond() const;
    289   virtual FX_BOOL AddYears(int32_t iYears);
    290   virtual FX_BOOL AddMonths(int32_t iMonths);
    291   virtual FX_BOOL AddDays(int32_t iDays);
    292   virtual FX_BOOL AddHours(int32_t iHours);
    293   virtual FX_BOOL AddMinutes(int32_t iMinutes);
    294   virtual FX_BOOL AddSeconds(int32_t iSeconds);
    295   virtual FX_BOOL AddMilliseconds(int32_t iMilliseconds);
    296   friend CFX_DateTime operator+(const CFX_DateTime& dt1,
    297                                 const CFX_DateTime& dt2) {
    298     CFX_DateTime dt;
    299     dt.FromUnitime(dt1.ToUnitime() + dt2.ToUnitime());
    300     return dt;
    301   }
    302   friend CFX_DateTime operator+(const CFX_DateTime& dt1,
    303                                 const FX_DATETIME& dt2) {
    304     CFX_DateTime dt;
    305     dt.FromUnitime(dt1.ToUnitime() + ((const CFX_DateTime&)dt2).ToUnitime());
    306     return dt;
    307   }
    308   friend CFX_DateTime operator+(const FX_DATETIME& dt1,
    309                                 const CFX_DateTime& dt2) {
    310     CFX_DateTime dt;
    311     dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() + dt2.ToUnitime());
    312     return dt;
    313   }
    314   friend CFX_DateTime operator-(const CFX_DateTime& dt1,
    315                                 const CFX_DateTime& dt2) {
    316     CFX_DateTime dt;
    317     dt.FromUnitime(dt1.ToUnitime() - dt2.ToUnitime());
    318     return dt;
    319   }
    320   friend CFX_DateTime operator-(const CFX_DateTime& dt1,
    321                                 const FX_DATETIME& dt2) {
    322     CFX_DateTime dt;
    323     dt.FromUnitime(dt1.ToUnitime() - ((const CFX_DateTime&)dt2).ToUnitime());
    324     return dt;
    325   }
    326   friend CFX_DateTime operator-(const FX_DATETIME& dt1,
    327                                 const CFX_DateTime& dt2) {
    328     CFX_DateTime dt;
    329     dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() - dt2.ToUnitime());
    330     return dt;
    331   }
    332   friend FX_BOOL operator==(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    333     return FXSYS_memcmp((FX_LPCDATETIME)dt1, (FX_LPCDATETIME)dt2,
    334                         sizeof(FX_DATETIME)) == 0;
    335   }
    336   friend FX_BOOL operator==(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    337     return FXSYS_memcmp((FX_LPCDATETIME)dt1, &dt2, sizeof(FX_DATETIME)) == 0;
    338   }
    339   friend FX_BOOL operator==(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    340     return FXSYS_memcmp(&dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) == 0;
    341   }
    342   friend FX_BOOL operator!=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    343     return FXSYS_memcmp((FX_LPCDATETIME)dt1, (FX_LPCDATETIME)dt2,
    344                         sizeof(FX_DATETIME)) != 0;
    345   }
    346   friend FX_BOOL operator!=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    347     return FXSYS_memcmp((FX_LPCDATETIME)dt1, &dt2, sizeof(FX_DATETIME)) != 0;
    348   }
    349   friend FX_BOOL operator!=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    350     return FXSYS_memcmp(&dt1, (FX_LPCDATETIME)dt2, sizeof(FX_DATETIME)) != 0;
    351   }
    352   friend FX_BOOL operator>(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    353     return dt1.ToUnitime() > dt2.ToUnitime();
    354   }
    355   friend FX_BOOL operator>(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    356     return dt1.ToUnitime() > ((const CFX_DateTime&)dt2).ToUnitime();
    357   }
    358   friend FX_BOOL operator>(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    359     return ((const CFX_DateTime&)dt1).ToUnitime() > dt2.ToUnitime();
    360   }
    361   friend FX_BOOL operator>=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    362     return dt1.ToUnitime() >= dt2.ToUnitime();
    363   }
    364   friend FX_BOOL operator>=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    365     return dt1.ToUnitime() >= ((const CFX_DateTime&)dt2).ToUnitime();
    366   }
    367   friend FX_BOOL operator>=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    368     return ((const CFX_DateTime&)dt1).ToUnitime() >= dt2.ToUnitime();
    369   }
    370   friend FX_BOOL operator<(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    371     return dt1.ToUnitime() < dt2.ToUnitime();
    372   }
    373   friend FX_BOOL operator<(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    374     return dt1.ToUnitime() < ((const CFX_DateTime&)dt2).ToUnitime();
    375   }
    376   friend FX_BOOL operator<(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    377     return ((const CFX_DateTime&)dt1).ToUnitime() < dt2.ToUnitime();
    378   }
    379   friend FX_BOOL operator<=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
    380     return dt1.ToUnitime() <= dt2.ToUnitime();
    381   }
    382   friend FX_BOOL operator<=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
    383     return dt1.ToUnitime() <= ((const CFX_DateTime&)dt2).ToUnitime();
    384   }
    385   friend FX_BOOL operator<=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
    386     return ((const CFX_DateTime&)dt1).ToUnitime() <= dt2.ToUnitime();
    387   }
    388 
    389  private:
    390   FX_DATETIME m_DateTime;
    391 };
    392 #endif
    393