Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Unified Diff: Source/WebCore/platform/text/win/TextCodecWin.cpp

Issue 13642009: WebCore: Remove PLATFORM(WIN) files we do not use. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/WebCore/platform/text/win/TextCodecWin.h ('k') | Source/WebCore/platform/win/BString.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/WebCore/platform/text/win/TextCodecWin.h ('k') | Source/WebCore/platform/win/BString.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698