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 XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
8#define XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
9
10#include <memory>
11
12#include "core/fxcrt/fx_xml.h"
13#include "xfa/fgas/localization/fgas_datetime.h"
14
15class CFX_Unitime;
16
17enum FX_LOCALENUMSYMBOL {
18  FX_LOCALENUMSYMBOL_Decimal,
19  FX_LOCALENUMSYMBOL_Grouping,
20  FX_LOCALENUMSYMBOL_Percent,
21  FX_LOCALENUMSYMBOL_Minus,
22  FX_LOCALENUMSYMBOL_Zero,
23  FX_LOCALENUMSYMBOL_CurrencySymbol,
24  FX_LOCALENUMSYMBOL_CurrencyName,
25};
26enum FX_LOCALEDATETIMESUBCATEGORY {
27  FX_LOCALEDATETIMESUBCATEGORY_Default,
28  FX_LOCALEDATETIMESUBCATEGORY_Short,
29  FX_LOCALEDATETIMESUBCATEGORY_Medium,
30  FX_LOCALEDATETIMESUBCATEGORY_Full,
31  FX_LOCALEDATETIMESUBCATEGORY_Long,
32};
33enum FX_LOCALENUMSUBCATEGORY {
34  FX_LOCALENUMPATTERN_Percent,
35  FX_LOCALENUMPATTERN_Currency,
36  FX_LOCALENUMPATTERN_Decimal,
37  FX_LOCALENUMPATTERN_Integer,
38};
39enum FX_LOCALECATEGORY {
40  FX_LOCALECATEGORY_Unknown,
41  FX_LOCALECATEGORY_Date,
42  FX_LOCALECATEGORY_Time,
43  FX_LOCALECATEGORY_DateTime,
44  FX_LOCALECATEGORY_Num,
45  FX_LOCALECATEGORY_Text,
46  FX_LOCALECATEGORY_Zero,
47  FX_LOCALECATEGORY_Null,
48};
49enum FX_DATETIMETYPE {
50  FX_DATETIMETYPE_Unknown,
51  FX_DATETIMETYPE_Date,
52  FX_DATETIMETYPE_Time,
53  FX_DATETIMETYPE_DateTime,
54  FX_DATETIMETYPE_TimeDate,
55};
56
57class IFX_Locale {
58 public:
59  virtual ~IFX_Locale() {}
60
61  virtual CFX_WideString GetName() const = 0;
62  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
63                                 CFX_WideString& wsNumSymbol) const = 0;
64  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0;
65  virtual void GetMonthName(int32_t nMonth,
66                            CFX_WideString& wsMonthName,
67                            bool bAbbr = true) const = 0;
68  virtual void GetDayName(int32_t nWeek,
69                          CFX_WideString& wsDayName,
70                          bool bAbbr = true) const = 0;
71  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
72                               bool bAM = true) const = 0;
73  virtual void GetTimeZone(FX_TIMEZONE* tz) const = 0;
74  virtual void GetEraName(CFX_WideString& wsEraName, bool bAD = true) const = 0;
75  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
76                              CFX_WideString& wsPattern) const = 0;
77  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
78                              CFX_WideString& wsPattern) const = 0;
79  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
80                             CFX_WideString& wsPattern) const = 0;
81};
82
83class IFX_LocaleMgr {
84 public:
85  virtual ~IFX_LocaleMgr() {}
86
87  virtual uint16_t GetDefLocaleID() const = 0;
88  virtual IFX_Locale* GetDefLocale() = 0;
89  virtual IFX_Locale* GetLocaleByName(const CFX_WideString& wsLocaleName) = 0;
90
91 protected:
92  virtual std::unique_ptr<IFX_Locale> GetLocale(uint16_t lcid) = 0;
93};
94
95bool FX_DateFromCanonical(const CFX_WideString& wsDate, CFX_Unitime& datetime);
96bool FX_TimeFromCanonical(const CFX_WideStringC& wsTime,
97                          CFX_Unitime& datetime,
98                          IFX_Locale* pLocale);
99class CFX_Decimal {
100 public:
101  CFX_Decimal();
102  explicit CFX_Decimal(uint32_t val);
103  explicit CFX_Decimal(uint64_t val);
104  explicit CFX_Decimal(int32_t val);
105  explicit CFX_Decimal(int64_t val);
106  explicit CFX_Decimal(FX_FLOAT val, uint8_t scale = 3);
107  explicit CFX_Decimal(const CFX_WideStringC& str);
108  explicit CFX_Decimal(const CFX_ByteStringC& str);
109  operator CFX_WideString() const;
110  operator double() const;
111  bool operator==(const CFX_Decimal& val) const;
112  bool operator<=(const CFX_Decimal& val) const;
113  bool operator>=(const CFX_Decimal& val) const;
114  bool operator!=(const CFX_Decimal& val) const;
115  bool operator<(const CFX_Decimal& val) const;
116  bool operator>(const CFX_Decimal& val) const;
117  CFX_Decimal operator+(const CFX_Decimal& val) const;
118  CFX_Decimal operator-(const CFX_Decimal& val) const;
119  CFX_Decimal operator*(const CFX_Decimal& val) const;
120  CFX_Decimal operator/(const CFX_Decimal& val) const;
121  CFX_Decimal operator%(const CFX_Decimal& val) const;
122  void SetScale(uint8_t newScale);
123  uint8_t GetScale();
124  void SetAbs();
125  void SetNegate();
126  void SetFloor();
127  void SetCeiling();
128  void SetTruncate();
129
130 protected:
131  CFX_Decimal(uint32_t hi, uint32_t mid, uint32_t lo, bool neg, uint8_t scale);
132  inline bool IsNotZero() const { return m_uHi || m_uMid || m_uLo; }
133  inline int8_t Compare(const CFX_Decimal& val) const;
134  inline void Swap(CFX_Decimal& val);
135  inline void FloorOrCeil(bool bFloor);
136  CFX_Decimal AddOrMinus(const CFX_Decimal& val, bool isAdding) const;
137  CFX_Decimal Multiply(const CFX_Decimal& val) const;
138  CFX_Decimal Divide(const CFX_Decimal& val) const;
139  CFX_Decimal Modulus(const CFX_Decimal& val) const;
140  uint32_t m_uFlags;
141  uint32_t m_uHi;
142  uint32_t m_uLo;
143  uint32_t m_uMid;
144};
145
146#endif  // XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
147