void TextCodecWin::enumerateSupportedEncodings(EncodingReceiver& receiver) { languageManager(); for (CharsetSet::iterator i = supportedCharsets().begin(); i != supportedCharsets().end(); ++i) { HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(*i); if (j != knownCharsets().end() && !receiver.receive(j->value.m_name.data(), j->value.m_friendlyName.charactersWithNullTermination().data(), j->value.m_codePage)) break; } }
void TextCodecWin::registerExtendedCodecs(TextCodecRegistrar registrar) { languageManager(); for (CharsetSet::iterator i = supportedCharsets().begin(); i != supportedCharsets().end(); ++i) { HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(*i); if (j != knownCharsets().end()) registrar(j->value.m_name.data(), newTextCodecWin, 0); } }
void TextCodecWin::registerExtendedEncodingNames(EncodingNameRegistrar registrar) { languageManager(); for (CharsetSet::iterator i = supportedCharsets().begin(); i != supportedCharsets().end(); ++i) { HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(*i); if (j != knownCharsets().end()) { registrar(j->value.m_name.data(), j->value.m_name.data()); for (Vector<CString>::const_iterator alias = j->value.m_aliases.begin(); alias != j->value.m_aliases.end(); ++alias) registrar(alias->data(), j->value.m_name.data()); } } }
static UINT getCodePage(const char* name) { // Explicitly use a "const" reference to fix the silly VS build error // saying "==" is not found for const_iterator and iterator const HashMap<String, CharsetInfo>& charsets = knownCharsets(); HashMap<String, CharsetInfo>::const_iterator i = charsets.find(name); return i == charsets.end() ? CP_ACP : i->value.m_codePage; }
LanguageManager::LanguageManager() { COMPtr<IMultiLanguage> multiLanguage; if (FAILED(::CoCreateInstance(CLSID_CMultiLanguage, 0, CLSCTX_INPROC_SERVER, IID_IMultiLanguage, reinterpret_cast<LPVOID*>(&multiLanguage)))) return; COMPtr<IEnumCodePage> enumInterface; if (FAILED(multiLanguage->EnumCodePages(MIMECONTF_BROWSER, &enumInterface))) return; MIMECPINFO cpInfo; ULONG ccpInfo; while (SUCCEEDED(enumInterface->Next(1, &cpInfo, &ccpInfo)) && ccpInfo) { if (!IsValidCodePage(cpInfo.uiCodePage)) continue; HashMap<UINT, CString>::iterator i = codePageCharsets().find(cpInfo.uiCodePage); CString name(String(cpInfo.wszWebCharset).latin1()); if (i == codePageCharsets().end()) { CharsetInfo info; info.m_codePage = cpInfo.uiCodePage; knownCharsets().set(name.data(), info); i = codePageCharsets().set(cpInfo.uiCodePage, name).iterator; } if (i != codePageCharsets().end()) { HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(String(i->value.data(), i->value.length())); ASSERT(j != knownCharsets().end()); CharsetInfo& info = j->value; info.m_name = i->value.data(); info.m_friendlyName = cpInfo.wszDescription; info.m_aliases.append(name); info.m_aliases.append(String(cpInfo.wszHeaderCharset).latin1()); info.m_aliases.append(String(cpInfo.wszBodyCharset).latin1()); String cpName = "cp" + String::number(cpInfo.uiCodePage); info.m_aliases.append(cpName.latin1()); supportedCharsets().add(i->value.data()); } } }
LanguageManager::LanguageManager() { IEnumCodePage* enumInterface; IMultiLanguage* mli = FontCache::getMultiLanguageInterface(); if (mli && S_OK == mli->EnumCodePages(MIMECONTF_BROWSER, &enumInterface)) { MIMECPINFO cpInfo; ULONG ccpInfo; while (S_OK == enumInterface->Next(1, &cpInfo, &ccpInfo) && ccpInfo) { if (!IsValidCodePage(cpInfo.uiCodePage)) continue; HashMap<UINT, CString>::iterator i = codePageCharsets().find(cpInfo.uiCodePage); CString name(String(cpInfo.wszWebCharset).latin1()); if (i == codePageCharsets().end()) { CharsetInfo info; info.m_codePage = cpInfo.uiCodePage; knownCharsets().set(name.data(), info); i = codePageCharsets().set(cpInfo.uiCodePage, name).iterator; } if (i != codePageCharsets().end()) { HashMap<String, CharsetInfo>::iterator j = knownCharsets().find(String(i->second.data(), i->second.length())); ASSERT(j != knownCharsets().end()); CharsetInfo& info = j->second; info.m_name = i->second.data(); info.m_friendlyName = cpInfo.wszDescription; info.m_aliases.append(name); info.m_aliases.append(String(cpInfo.wszHeaderCharset).latin1()); info.m_aliases.append(String(cpInfo.wszBodyCharset).latin1()); String cpName = "cp" + String::number(cpInfo.uiCodePage); info.m_aliases.append(cpName.latin1()); supportedCharsets().add(i->second.data()); } } enumInterface->Release(); } }