Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / src / localization / fx_localemgr.cpp
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 #include "../fgas_base.h"\r
8 #include "fx_localemgr.h"\r
9 IFX_LocaleMgr*  FX_LocaleMgr_Create(FX_LPCWSTR pszLocalPath, FX_WORD wDefaultLCID)\r
10 {\r
11     void* pPathHandle = FX_OpenFolder(pszLocalPath);\r
12     if (!pPathHandle) {\r
13         return NULL;\r
14     }\r
15     CFX_LocaleMgr* pLocaleMgr = FX_NEW CFX_LocaleMgr(wDefaultLCID);\r
16     CFX_WideString wsFileName;\r
17     FX_BOOL bFolder = FALSE;\r
18     while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) {\r
19         if (!bFolder) {\r
20             if (wsFileName.GetLength() < 4) {\r
21                 continue;\r
22             }\r
23             CFX_WideString wsExt = wsFileName.Right(4);\r
24             wsExt.MakeLower();\r
25             if (wsExt != L".xml") {\r
26                 continue;\r
27             }\r
28             CFX_WideString wsFullPath(pszLocalPath);\r
29             wsFullPath += L"\\" + wsFileName;\r
30             IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath);\r
31             if (!pRead) {\r
32                 continue;\r
33             }\r
34             CXML_Element* pXmlLocale = CXML_Element::Parse(pRead);\r
35             pRead->Release();\r
36             CFX_ByteString bssp = pXmlLocale->GetNamespace();\r
37             if (bssp == "http://www.foxitsoftware.com/localization") {\r
38                 CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid");\r
39                 wchar_t* pEnd = NULL;\r
40                 FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16);\r
41                 if (pLocaleMgr->m_lcid2xml.GetValueAt((FX_LPVOID)(FX_UINTPTR)dwLCID)) {\r
42                     delete pXmlLocale;\r
43                 } else {\r
44                     pLocaleMgr->m_lcid2xml.SetAt((FX_LPVOID)(FX_UINTPTR)dwLCID, pXmlLocale);\r
45                 }\r
46             } else {\r
47                 delete pXmlLocale;\r
48             }\r
49         }\r
50     }\r
51     FX_CloseFolder(pPathHandle);\r
52     return pLocaleMgr;\r
53 }\r
54 CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID)\r
55     : m_wDefLCID(wDefLCID)\r
56 {\r
57 }\r
58 CFX_LocaleMgr::~CFX_LocaleMgr()\r
59 {\r
60     FX_POSITION ps = m_lcid2locale.GetStartPosition();\r
61     while (ps) {\r
62         FX_LPVOID plcid;\r
63         IFX_Locale* pLocale = NULL;\r
64         m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale);\r
65         pLocale->Release();\r
66     }\r
67     m_lcid2locale.RemoveAll();\r
68     ps = m_lcid2xml.GetStartPosition();\r
69     while (ps) {\r
70         FX_LPVOID plcid;\r
71         CXML_Element* pxml = NULL;\r
72         m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml);\r
73         delete pxml;\r
74     }\r
75     m_lcid2xml.RemoveAll();\r
76 }\r
77 FX_WORD CFX_LocaleMgr::GetDefLocaleID()\r
78 {\r
79     return m_wDefLCID;\r
80 }\r
81 IFX_Locale* CFX_LocaleMgr::GetDefLocale()\r
82 {\r
83     return GetLocale(m_wDefLCID);\r
84 }\r
85 IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid)\r
86 {\r
87     IFX_Locale* pLocale = (IFX_Locale*)m_lcid2locale.GetValueAt((FX_LPVOID)(FX_UINTPTR)lcid);\r
88     if (!pLocale) {\r
89         CXML_Element* pxml = (CXML_Element*)m_lcid2xml.GetValueAt((FX_LPVOID)(FX_UINTPTR)lcid);\r
90         if (pxml) {\r
91             pLocale = IFX_Locale::Create(pxml);\r
92             m_lcid2locale.SetAt((FX_LPVOID)(FX_UINTPTR)lcid, pLocale);\r
93         }\r
94     }\r
95     return pLocale;\r
96 }\r
97 IFX_Locale* CFX_LocaleMgr::GetLocaleByName(FX_WSTR wsLocaleName)\r
98 {\r
99     return NULL;\r
100 }\r