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_
9class CFX_Unitime;
10class CFX_DateTime;
11typedef int64_t FX_UNITIME;
12enum 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};
21FX_BOOL FX_IsLeapYear(int32_t iYear);
22int32_t FX_DaysInYear(int32_t iYear);
23uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
24class 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
163typedef struct _FX_DATE {
164  int32_t year;
165  uint8_t month;
166  uint8_t day;
167} FX_DATE, *FX_LPDATE;
168typedef FX_DATE const* FX_LPCDATE;
169typedef struct _FX_TIME {
170  uint8_t hour;
171  uint8_t minute;
172  uint8_t second;
173  FX_WORD millisecond;
174} FX_TIME, *FX_LPTIME;
175typedef FX_TIME const* FX_LPCTIME;
176typedef struct _FX_TIMEZONE {
177  int8_t tzHour;
178  uint8_t tzMinute;
179} FX_TIMEZONE, *FX_LPTIMEZONE;
180typedef FX_TIMEZONE const* FX_LPCTIMEZONE;
181typedef 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;
200typedef FX_DATETIME const* FX_LPCDATETIME;
201typedef 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;
232typedef FX_DATETIMEZONE const* FX_LPCDATETIMEZONE;
233#if _FX_OS_ != _FX_ANDROID_
234#pragma pack(pop)
235#endif
236class 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