summaryrefslogtreecommitdiff
path: root/xfa/src/fgas/src/localization/fx_localemgr.cpp
blob: b3f0e80d7aea2e9b133b840d02fc14ca0014c8c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../fgas_base.h"
#include "fx_localemgr.h"
IFX_LocaleMgr*	FX_LocaleMgr_Create(FX_LPCWSTR pszLocalPath, FX_WORD wDefaultLCID)
{
    void* pPathHandle = FX_OpenFolder(pszLocalPath);
    if (!pPathHandle) {
        return NULL;
    }
    CFX_LocaleMgr* pLocaleMgr = FX_NEW CFX_LocaleMgr(wDefaultLCID);
    CFX_WideString wsFileName;
    FX_BOOL bFolder = FALSE;
    while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) {
        if (!bFolder) {
            if (wsFileName.GetLength() < 4) {
                continue;
            }
            CFX_WideString wsExt = wsFileName.Right(4);
            wsExt.MakeLower();
            if (wsExt != L".xml") {
                continue;
            }
            CFX_WideString wsFullPath(pszLocalPath);
            wsFullPath += L"\\" + wsFileName;
            IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath);
            if (!pRead) {
                continue;
            }
            CXML_Element* pXmlLocale = CXML_Element::Parse(pRead);
            pRead->Release();
            CFX_ByteString bssp = pXmlLocale->GetNamespace();
            if (bssp == "http://www.foxitsoftware.com/localization") {
                CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid");
                wchar_t* pEnd = NULL;
                FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16);
                if (pLocaleMgr->m_lcid2xml.GetValueAt((FX_LPVOID)(uintptr_t)dwLCID)) {
                    delete pXmlLocale;
                } else {
                    pLocaleMgr->m_lcid2xml.SetAt((FX_LPVOID)(uintptr_t)dwLCID, pXmlLocale);
                }
            } else {
                delete pXmlLocale;
            }
        }
    }
    FX_CloseFolder(pPathHandle);
    return pLocaleMgr;
}
CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID)
    : m_wDefLCID(wDefLCID)
{
}
CFX_LocaleMgr::~CFX_LocaleMgr()
{
    FX_POSITION ps = m_lcid2locale.GetStartPosition();
    while (ps) {
        FX_LPVOID plcid;
        IFX_Locale* pLocale = NULL;
        m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale);
        pLocale->Release();
    }
    m_lcid2locale.RemoveAll();
    ps = m_lcid2xml.GetStartPosition();
    while (ps) {
        FX_LPVOID plcid;
        CXML_Element* pxml = NULL;
        m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml);
        delete pxml;
    }
    m_lcid2xml.RemoveAll();
}
FX_WORD	CFX_LocaleMgr::GetDefLocaleID()
{
    return m_wDefLCID;
}
IFX_Locale* CFX_LocaleMgr::GetDefLocale()
{
    return GetLocale(m_wDefLCID);
}
IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid)
{
    IFX_Locale* pLocale = (IFX_Locale*)m_lcid2locale.GetValueAt((FX_LPVOID)(uintptr_t)lcid);
    if (!pLocale) {
        CXML_Element* pxml = (CXML_Element*)m_lcid2xml.GetValueAt((FX_LPVOID)(uintptr_t)lcid);
        if (pxml) {
            pLocale = IFX_Locale::Create(pxml);
            m_lcid2locale.SetAt((FX_LPVOID)(uintptr_t)lcid, pLocale);
        }
    }
    return pLocale;
}
IFX_Locale* CFX_LocaleMgr::GetLocaleByName(FX_WSTR wsLocaleName)
{
    return NULL;
}