| Index: Source/WebCore/platform/text/win/TextCodecWin.cpp
|
| diff --git a/Source/WebCore/platform/text/win/TextCodecWin.cpp b/Source/WebCore/platform/text/win/TextCodecWin.cpp
|
| deleted file mode 100644
|
| index 879af769772ff515f354aa8b1971699b62aba663..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/platform/text/win/TextCodecWin.cpp
|
| +++ /dev/null
|
| @@ -1,309 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2007-2009 Torch Mobile, Inc. All rights reserved.
|
| - * Copyright (C) 2010-2012 Patrick Gansterer <paroga@paroga.com>
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * This library is distributed in the hope that i will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Library General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Library General Public License
|
| - * along with this library; see the file COPYING.LIB. If not, write to
|
| - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - * Boston, MA 02110-1301, USA.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "TextCodecWin.h"
|
| -
|
| -#include "COMPtr.h"
|
| -#include <mlang.h>
|
| -#include <windows.h>
|
| -#include <wtf/HashMap.h>
|
| -#include <wtf/HashSet.h>
|
| -#include <wtf/text/CString.h>
|
| -#include <wtf/text/StringHash.h>
|
| -#include <wtf/text/WTFString.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -struct CharsetInfo {
|
| - CString m_name;
|
| - String m_friendlyName;
|
| - UINT m_codePage;
|
| - Vector<CString> m_aliases;
|
| -};
|
| -
|
| -class LanguageManager {
|
| -private:
|
| - LanguageManager();
|
| -
|
| - friend LanguageManager& languageManager();
|
| -};
|
| -
|
| -// Usage: a lookup table used to get CharsetInfo with code page ID.
|
| -// Key: code page ID. Value: charset information.
|
| -static HashMap<UINT, CString>& codePageCharsets()
|
| -{
|
| - static HashMap<UINT, CString> cc;
|
| - return cc;
|
| -}
|
| -
|
| -static HashMap<String, CharsetInfo>& knownCharsets()
|
| -{
|
| - static HashMap<String, CharsetInfo> kc;
|
| - return kc;
|
| -}
|
| -
|
| -// Usage: a map that stores charsets that are supported by system. Sorted by name.
|
| -// Key: charset. Value: code page ID.
|
| -typedef HashSet<String> CharsetSet;
|
| -static CharsetSet& supportedCharsets()
|
| -{
|
| - static CharsetSet sl;
|
| - return sl;
|
| -}
|
| -
|
| -static LanguageManager& languageManager()
|
| -{
|
| - static LanguageManager lm;
|
| - return lm;
|
| -}
|
| -
|
| -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());
|
| - }
|
| - }
|
| -}
|
| -
|
| -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;
|
| -}
|
| -
|
| -static PassOwnPtr<TextCodec> newTextCodecWin(const TextEncoding& encoding, const void*)
|
| -{
|
| - return adoptPtr(new TextCodecWin(getCodePage(encoding.name())));
|
| -}
|
| -
|
| -TextCodecWin::TextCodecWin(UINT codePage)
|
| - : m_codePage(codePage)
|
| -{
|
| -}
|
| -
|
| -TextCodecWin::~TextCodecWin()
|
| -{
|
| -}
|
| -
|
| -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());
|
| - }
|
| - }
|
| -}
|
| -
|
| -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);
|
| - }
|
| -}
|
| -
|
| -static DWORD getCodePageFlags(UINT codePage)
|
| -{
|
| - if (codePage == 42) // Symbol
|
| - return 0;
|
| -
|
| - // Microsoft says the flag must be 0 for the following code pages
|
| - if (codePage > 50000) {
|
| - if ((codePage >= 50220 && codePage <= 50222)
|
| - || codePage == 50225
|
| - || codePage == 50227
|
| - || codePage == 50229
|
| - || codePage == 52936
|
| - || codePage == 54936
|
| - || (codePage >= 57002 && codePage <= 57001)
|
| - || codePage == 65000 // UTF-7
|
| - )
|
| - return 0;
|
| - }
|
| -
|
| - return MB_PRECOMPOSED | MB_ERR_INVALID_CHARS;
|
| -}
|
| -
|
| -static inline const char* findFirstNonAsciiCharacter(const char* bytes, size_t length)
|
| -{
|
| - for (const char* bytesEnd = bytes + length; bytes < bytesEnd; ++bytes) {
|
| - if (*bytes & 0x80)
|
| - break;
|
| - }
|
| - return bytes;
|
| -}
|
| -
|
| -static void decodeInternal(Vector<UChar, 8192>& result, UINT codePage, const char* bytes, size_t length, size_t* left)
|
| -{
|
| - *left = length;
|
| - if (!bytes || !length)
|
| - return;
|
| -
|
| - DWORD flags = getCodePageFlags(codePage);
|
| -
|
| - int testLength = length;
|
| - int untestedLength = length;
|
| - for (;;) {
|
| - int resultLength = MultiByteToWideChar(codePage, flags, bytes, testLength, 0, 0);
|
| -
|
| - if (resultLength > 0) {
|
| - int oldSize = result.size();
|
| - result.resize(oldSize + resultLength);
|
| -
|
| - MultiByteToWideChar(codePage, flags, bytes, testLength, result.data() + oldSize, resultLength);
|
| -
|
| - if (testLength == untestedLength) {
|
| - *left = length - testLength;
|
| - break;
|
| - }
|
| - untestedLength -= testLength;
|
| - length -= testLength;
|
| - bytes += testLength;
|
| - } else {
|
| - untestedLength = testLength - 1;
|
| - if (!untestedLength) {
|
| - *left = length;
|
| - break;
|
| - }
|
| - }
|
| - testLength = (untestedLength + 1) / 2;
|
| - }
|
| -}
|
| -
|
| -String TextCodecWin::decode(const char* bytes, size_t length, bool flush, bool stopOnError, bool& sawError)
|
| -{
|
| - if (!m_decodeBuffer.isEmpty()) {
|
| - m_decodeBuffer.append(bytes, length);
|
| - bytes = m_decodeBuffer.data();
|
| - length = m_decodeBuffer.size();
|
| - }
|
| -
|
| - size_t left;
|
| - Vector<UChar, 8192> result;
|
| - for (;;) {
|
| - decodeInternal(result, m_codePage, bytes, length, &left);
|
| - if (!left)
|
| - break;
|
| -
|
| - if (!flush && left < 16)
|
| - break;
|
| -
|
| - result.append(L'?');
|
| - sawError = true;
|
| - if (stopOnError)
|
| - return String::adopt(result);
|
| -
|
| - if (left == 1)
|
| - break;
|
| -
|
| - bytes += length - left + 1;
|
| - length = left - 1;
|
| - }
|
| - if (left && !flush) {
|
| - if (m_decodeBuffer.isEmpty())
|
| - m_decodeBuffer.append(bytes + length - left, left);
|
| - else {
|
| - memmove(m_decodeBuffer.data(), bytes + length - left, left);
|
| - m_decodeBuffer.resize(left);
|
| - }
|
| - } else
|
| - m_decodeBuffer.clear();
|
| -
|
| - return String::adopt(result);
|
| -}
|
| -
|
| -CString TextCodecWin::encode(const UChar* characters, size_t length, UnencodableHandling)
|
| -{
|
| - if (!characters || !length)
|
| - return CString();
|
| -
|
| - int resultLength = WideCharToMultiByte(m_codePage, WC_COMPOSITECHECK, characters, length, 0, 0, 0, 0);
|
| -
|
| - // FIXME: We need to implement UnencodableHandling: QuestionMarksForUnencodables, EntitiesForUnencodables, and URLEncodedEntitiesForUnencodables.
|
| -
|
| - if (resultLength <= 0)
|
| - return "?";
|
| -
|
| - char* characterBuffer;
|
| - CString result = CString::newUninitialized(resultLength, characterBuffer);
|
| -
|
| - WideCharToMultiByte(m_codePage, WC_COMPOSITECHECK, characters, length, characterBuffer, resultLength, 0, 0);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -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(), j->value.m_codePage))
|
| - break;
|
| - }
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|