1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/*
* Copyright (C) 2009, 2010, 2011 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "WebKitTextCodec.h"
#include "KURL.h"
#include "TextCodecICU.h"
#include <BlackBerryPlatformString.h>
#include <wtf/Vector.h>
#include <wtf/text/Base64.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
using WebCore::TextEncoding;
using WebCore::TextCodecICU;
namespace BlackBerry {
namespace WebKit {
#define COMPILE_ASSERT_MATCHING_ENUM(webkitName, wtfName) \
COMPILE_ASSERT(static_cast<int>(webkitName) == static_cast<int>(WTF::wtfName), mismatchingEnums)
COMPILE_ASSERT_MATCHING_ENUM(Base64FailOnInvalidCharacter, Base64FailOnInvalidCharacter);
COMPILE_ASSERT_MATCHING_ENUM(Base64IgnoreWhitespace, Base64IgnoreWhitespace);
COMPILE_ASSERT_MATCHING_ENUM(Base64IgnoreInvalidCharacters, Base64IgnoreInvalidCharacters);
// FIXME: Base64InsertCRLF should be Base64InsertLFs. WTF::encodeBase64 doesn't insert CR.
COMPILE_ASSERT_MATCHING_ENUM(Base64DoNotInsertCRLF, Base64DoNotInsertLFs);
COMPILE_ASSERT_MATCHING_ENUM(Base64InsertCRLF, Base64InsertLFs);
bool isSameEncoding(const char* encoding1, const char* encoding2)
{
return TextEncoding(encoding1) == TextEncoding(encoding2);
}
bool isASCIICompatibleEncoding(const char* encoding)
{
TextEncoding textEncoding(encoding);
if (!textEncoding.isValid())
return false;
// Check the most common encodings first
if (textEncoding == WebCore::UTF8Encoding() || textEncoding == WebCore::Latin1Encoding() || textEncoding == WebCore::ASCIIEncoding())
return true;
String lowercasedEncoding = String(encoding).lower();
// This is slow and could easily be optimized by directly inspecting encoding[i].
if (lowercasedEncoding.startsWith("iso-8859")
|| lowercasedEncoding.startsWith("windows")
|| lowercasedEncoding.startsWith("euc-jp")
|| lowercasedEncoding.startsWith("euc-kr"))
return true;
return false;
}
TranscodeResult transcode(const char* sourceEncoding, const char* targetEncoding, const char*& sourceStart, int sourceLength, char*& targetStart, unsigned targetLength)
{
TextEncoding textEncodingSource(sourceEncoding);
if (!textEncodingSource.isValid())
return SourceEncodingUnsupported;
TextEncoding textEncodingTarget(targetEncoding);
if (!textEncodingTarget.isValid())
return TargetEncodingUnsupported;
bool sawError = false;
String ucs2 = TextCodecICU(textEncodingSource).decode(sourceStart, sourceLength, true, true, sawError);
if (sawError)
return SourceBroken;
CString encoded = TextCodecICU(textEncodingTarget).encode(ucs2.characters(), ucs2.length(), WebCore::EntitiesForUnencodables);
if (encoded.length() > targetLength)
return TargetBufferInsufficient;
strncpy(targetStart, encoded.data(), encoded.length());
targetStart += encoded.length();
return Success;
}
bool base64Decode(const BlackBerry::Platform::String& base64, std::vector<char>& binary, Base64DecodePolicy policy)
{
Vector<char> result;
if (!WTF::base64Decode(base64.c_str(), base64.length(), result, static_cast<WTF::Base64DecodePolicy>(policy)))
return false;
binary.insert(binary.begin(), result.begin(), result.end());
return true;
}
bool base64Encode(const std::vector<char>& binary, BlackBerry::Platform::String& base64, Base64EncodePolicy policy)
{
Vector<char> result;
result.append(&binary[0], binary.size());
WTF::base64Encode(&binary[0], binary.size(), result, static_cast<WTF::Base64EncodePolicy>(policy));
base64 = BlackBerry::Platform::String::fromAscii(&result[0], result.size());
return true;
}
void unescapeURL(const BlackBerry::Platform::String& escaped, BlackBerry::Platform::String& url)
{
url = WebCore::decodeURLEscapeSequences(escaped);
}
void escapeURL(const BlackBerry::Platform::String& url, BlackBerry::Platform::String& escaped)
{
escaped = WebCore::encodeWithURLEscapeSequences(url);
}
} // namespace WebKit
} // namespace BlackBerry
|