1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_xml.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/fgas_base.h" 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fx_localemgr.h" 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath, 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WORD wDefaultLCID) { 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* pPathHandle = FX_OpenFolder(pszLocalPath); 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPathHandle) { 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_LocaleMgr* pLocaleMgr = new CFX_LocaleMgr(wDefaultLCID); 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsFileName; 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bFolder = FALSE; 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bFolder) { 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wsFileName.GetLength() < 4) { 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsExt = wsFileName.Right(4); 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsExt.MakeLower(); 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wsExt != L".xml") { 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsFullPath(pszLocalPath); 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsFullPath += L"\\" + wsFileName; 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath); 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRead) { 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CXML_Element* pXmlLocale = CXML_Element::Parse(pRead); 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRead->Release(); 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString bssp = pXmlLocale->GetNamespace(); 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bssp == "http://www.foxitsoftware.com/localization") { 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid"); 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wchar_t* pEnd = NULL; 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16); 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pLocaleMgr->m_lcid2xml.GetValueAt((void*)(uintptr_t)dwLCID)) { 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pXmlLocale; 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLocaleMgr->m_lcid2xml.SetAt((void*)(uintptr_t)dwLCID, pXmlLocale); 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pXmlLocale; 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CloseFolder(pPathHandle); 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pLocaleMgr; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID) : m_wDefLCID(wDefLCID) {} 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_LocaleMgr::~CFX_LocaleMgr() { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_POSITION ps = m_lcid2locale.GetStartPosition(); 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (ps) { 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* plcid; 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_Locale* pLocale = NULL; 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale); 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLocale->Release(); 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_lcid2locale.RemoveAll(); 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ps = m_lcid2xml.GetStartPosition(); 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (ps) { 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* plcid; 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CXML_Element* pxml = NULL; 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml); 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pxml; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_lcid2xml.RemoveAll(); 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_LocaleMgr::GetDefLocaleID() { 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_wDefLCID; 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Locale* CFX_LocaleMgr::GetDefLocale() { 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetLocale(m_wDefLCID); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid) { 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_Locale* pLocale = 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (IFX_Locale*)m_lcid2locale.GetValueAt((void*)(uintptr_t)lcid); 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pLocale) { 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CXML_Element* pxml = 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (CXML_Element*)m_lcid2xml.GetValueAt((void*)(uintptr_t)lcid); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pxml) { 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLocale = IFX_Locale::Create(pxml); 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_lcid2locale.SetAt((void*)(uintptr_t)lcid, pLocale); 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pLocale; 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Locale* CFX_LocaleMgr::GetLocaleByName( 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideStringC& wsLocaleName) { 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 98