blob: 93e5ea08744757ef14bbd74c128ed67c20ea6c52 [file] [log] [blame]
// 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 "xfa/fgas/localization/fgas_localemgr.h"
#include "core/fxcrt/include/fx_xml.h"
IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath,
uint16_t wDefaultLCID) {
void* pPathHandle = FX_OpenFolder(pszLocalPath);
if (!pPathHandle) {
return NULL;
}
CFX_LocaleMgr* pLocaleMgr = 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.c_str());
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;
uint32_t dwLCID = wcstol(wsLCID.c_str(), &pEnd, 16);
if (pLocaleMgr->m_lcid2xml.GetValueAt((void*)(uintptr_t)dwLCID)) {
delete pXmlLocale;
} else {
pLocaleMgr->m_lcid2xml.SetAt((void*)(uintptr_t)dwLCID, pXmlLocale);
}
} else {
delete pXmlLocale;
}
}
}
FX_CloseFolder(pPathHandle);
return pLocaleMgr;
}
CFX_LocaleMgr::CFX_LocaleMgr(uint16_t wDefLCID) : m_wDefLCID(wDefLCID) {}
CFX_LocaleMgr::~CFX_LocaleMgr() {
FX_POSITION ps = m_lcid2locale.GetStartPosition();
while (ps) {
void* plcid;
IFX_Locale* pLocale = NULL;
m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale);
pLocale->Release();
}
m_lcid2locale.RemoveAll();
ps = m_lcid2xml.GetStartPosition();
while (ps) {
void* plcid;
CXML_Element* pxml = NULL;
m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml);
delete pxml;
}
m_lcid2xml.RemoveAll();
}
uint16_t CFX_LocaleMgr::GetDefLocaleID() {
return m_wDefLCID;
}
IFX_Locale* CFX_LocaleMgr::GetDefLocale() {
return GetLocale(m_wDefLCID);
}
IFX_Locale* CFX_LocaleMgr::GetLocale(uint16_t lcid) {
IFX_Locale* pLocale =
(IFX_Locale*)m_lcid2locale.GetValueAt((void*)(uintptr_t)lcid);
if (!pLocale) {
CXML_Element* pxml =
(CXML_Element*)m_lcid2xml.GetValueAt((void*)(uintptr_t)lcid);
if (pxml) {
pLocale = IFX_Locale::Create(pxml);
m_lcid2locale.SetAt((void*)(uintptr_t)lcid, pLocale);
}
}
return pLocale;
}
IFX_Locale* CFX_LocaleMgr::GetLocaleByName(
const CFX_WideStringC& wsLocaleName) {
return NULL;
}