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