1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FXFA_PARSER_CXFA_LOCALEMGR_H_ 8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FXFA_PARSER_CXFA_LOCALEMGR_H_ 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker #include <vector> 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h" 13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h" 14*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h" 15*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h" 16*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/garbage-collected.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/crt/locale_mgr_iface.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/gced_locale_iface.h" 20*3ac0a46fSAndroid Build Coastguard Worker 21*3ac0a46fSAndroid Build Coastguard Worker class CXFA_Node; 22*3ac0a46fSAndroid Build Coastguard Worker class CXFA_NodeLocale; 23*3ac0a46fSAndroid Build Coastguard Worker class CXFA_XMLLocale; 24*3ac0a46fSAndroid Build Coastguard Worker 25*3ac0a46fSAndroid Build Coastguard Worker class CXFA_LocaleMgr final : public cppgc::GarbageCollected<CXFA_LocaleMgr>, 26*3ac0a46fSAndroid Build Coastguard Worker public LocaleMgrIface { 27*3ac0a46fSAndroid Build Coastguard Worker public: 28*3ac0a46fSAndroid Build Coastguard Worker enum class LangID : uint16_t { 29*3ac0a46fSAndroid Build Coastguard Worker k_zh_HK = 0x0c04, 30*3ac0a46fSAndroid Build Coastguard Worker k_zh_CN = 0x0804, 31*3ac0a46fSAndroid Build Coastguard Worker k_zh_TW = 0x0404, 32*3ac0a46fSAndroid Build Coastguard Worker k_nl_NL = 0x0413, 33*3ac0a46fSAndroid Build Coastguard Worker k_en_GB = 0x0809, 34*3ac0a46fSAndroid Build Coastguard Worker k_en_US = 0x0409, 35*3ac0a46fSAndroid Build Coastguard Worker k_fr_FR = 0x040c, 36*3ac0a46fSAndroid Build Coastguard Worker k_de_DE = 0x0407, 37*3ac0a46fSAndroid Build Coastguard Worker k_it_IT = 0x0410, 38*3ac0a46fSAndroid Build Coastguard Worker k_ja_JP = 0x0411, 39*3ac0a46fSAndroid Build Coastguard Worker k_ko_KR = 0x0412, 40*3ac0a46fSAndroid Build Coastguard Worker k_pt_BR = 0x0416, 41*3ac0a46fSAndroid Build Coastguard Worker k_ru_RU = 0x0419, 42*3ac0a46fSAndroid Build Coastguard Worker k_es_LA = 0x080a, 43*3ac0a46fSAndroid Build Coastguard Worker k_es_ES = 0x0c0a, 44*3ac0a46fSAndroid Build Coastguard Worker }; 45*3ac0a46fSAndroid Build Coastguard Worker 46*3ac0a46fSAndroid Build Coastguard Worker CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; 47*3ac0a46fSAndroid Build Coastguard Worker ~CXFA_LocaleMgr() override; 48*3ac0a46fSAndroid Build Coastguard Worker 49*3ac0a46fSAndroid Build Coastguard Worker void Trace(cppgc::Visitor* visitor) const; 50*3ac0a46fSAndroid Build Coastguard Worker 51*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* GetDefLocale() override; 52*3ac0a46fSAndroid Build Coastguard Worker GCedLocaleIface* GetLocaleByName(const WideString& wsLocaleName) override; 53*3ac0a46fSAndroid Build Coastguard Worker 54*3ac0a46fSAndroid Build Coastguard Worker void SetDefLocale(GCedLocaleIface* pLocale); 55*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> GetConfigLocaleName(CXFA_Node* pConfig) const; 56*3ac0a46fSAndroid Build Coastguard Worker 57*3ac0a46fSAndroid Build Coastguard Worker private: 58*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleMgr(cppgc::Heap* pHeap, 59*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pLocaleSet, 60*3ac0a46fSAndroid Build Coastguard Worker WideString wsDeflcid); 61*3ac0a46fSAndroid Build Coastguard Worker 62*3ac0a46fSAndroid Build Coastguard Worker // May allocate a new object on the cppgc heap. 63*3ac0a46fSAndroid Build Coastguard Worker CXFA_XMLLocale* GetLocale(LangID lcid); 64*3ac0a46fSAndroid Build Coastguard Worker 65*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<cppgc::Heap> m_pHeap; 66*3ac0a46fSAndroid Build Coastguard Worker std::vector<cppgc::Member<CXFA_NodeLocale>> m_LocaleArray; 67*3ac0a46fSAndroid Build Coastguard Worker std::vector<cppgc::Member<CXFA_XMLLocale>> m_XMLLocaleArray; 68*3ac0a46fSAndroid Build Coastguard Worker cppgc::Member<GCedLocaleIface> m_pDefLocale; 69*3ac0a46fSAndroid Build Coastguard Worker 70*3ac0a46fSAndroid Build Coastguard Worker // Note: three possiblities 71*3ac0a46fSAndroid Build Coastguard Worker // 1. we might never have tried to determine |m_wsConfigLocale|. 72*3ac0a46fSAndroid Build Coastguard Worker // 2. we might have tried but gotten nothing and want to continue 73*3ac0a46fSAndroid Build Coastguard Worker // to return nothing without ever trying again. 74*3ac0a46fSAndroid Build Coastguard Worker // 3. we might have tried and gotten something. 75*3ac0a46fSAndroid Build Coastguard Worker // So |m_bConfigLocaleCached| indicates whether we've already tried, 76*3ac0a46fSAndroid Build Coastguard Worker // and |m_wsConfigLocale| is the possibly nothing we got if we tried. 77*3ac0a46fSAndroid Build Coastguard Worker mutable absl::optional<WideString> m_wsConfigLocale; 78*3ac0a46fSAndroid Build Coastguard Worker mutable bool m_bConfigLocaleCached = false; 79*3ac0a46fSAndroid Build Coastguard Worker 80*3ac0a46fSAndroid Build Coastguard Worker LangID m_eDeflcid; 81*3ac0a46fSAndroid Build Coastguard Worker }; 82*3ac0a46fSAndroid Build Coastguard Worker 83*3ac0a46fSAndroid Build Coastguard Worker #endif // XFA_FXFA_PARSER_CXFA_LOCALEMGR_H_ 84