From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WTF/wtf/persistence/Coders.cpp | 156 ++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 Source/WTF/wtf/persistence/Coders.cpp (limited to 'Source/WTF/wtf/persistence/Coders.cpp') diff --git a/Source/WTF/wtf/persistence/Coders.cpp b/Source/WTF/wtf/persistence/Coders.cpp new file mode 100644 index 000000000..7cd42f488 --- /dev/null +++ b/Source/WTF/wtf/persistence/Coders.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2011, 2014-2015 Apple Inc. All rights reserved. + * + * 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 SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "Coders.h" + +#include +#include + +namespace WTF { +namespace Persistence { + +void Coder::encode(Encoder& encoder, const AtomicString& atomicString) +{ + encoder << atomicString.string(); +} + +bool Coder::decode(Decoder& decoder, AtomicString& atomicString) +{ + String string; + if (!decoder.decode(string)) + return false; + + atomicString = string; + return true; +} + +void Coder::encode(Encoder& encoder, const CString& string) +{ + // Special case the null string. + if (string.isNull()) { + encoder << std::numeric_limits::max(); + return; + } + + uint32_t length = string.length(); + encoder << length; + encoder.encodeFixedLengthData(reinterpret_cast(string.data()), length); +} + +bool Coder::decode(Decoder& decoder, CString& result) +{ + uint32_t length; + if (!decoder.decode(length)) + return false; + + if (length == std::numeric_limits::max()) { + // This is the null string. + result = CString(); + return true; + } + + // Before allocating the string, make sure that the decoder buffer is big enough. + if (!decoder.bufferIsLargeEnoughToContain(length)) + return false; + + char* buffer; + CString string = CString::newUninitialized(length, buffer); + if (!decoder.decodeFixedLengthData(reinterpret_cast(buffer), length)) + return false; + + result = string; + return true; +} + + +void Coder::encode(Encoder& encoder, const String& string) +{ + // Special case the null string. + if (string.isNull()) { + encoder << std::numeric_limits::max(); + return; + } + + uint32_t length = string.length(); + bool is8Bit = string.is8Bit(); + + encoder << length << is8Bit; + + if (is8Bit) + encoder.encodeFixedLengthData(reinterpret_cast(string.characters8()), length * sizeof(LChar)); + else + encoder.encodeFixedLengthData(reinterpret_cast(string.characters16()), length * sizeof(UChar)); +} + +template +static inline bool decodeStringText(Decoder& decoder, uint32_t length, String& result) +{ + // Before allocating the string, make sure that the decoder buffer is big enough. + if (!decoder.bufferIsLargeEnoughToContain(length)) + return false; + + CharacterType* buffer; + String string = String::createUninitialized(length, buffer); + if (!decoder.decodeFixedLengthData(reinterpret_cast(buffer), length * sizeof(CharacterType))) + return false; + + result = string; + return true; +} + +bool Coder::decode(Decoder& decoder, String& result) +{ + uint32_t length; + if (!decoder.decode(length)) + return false; + + if (length == std::numeric_limits::max()) { + // This is the null string. + result = String(); + return true; + } + + bool is8Bit; + if (!decoder.decode(is8Bit)) + return false; + + if (is8Bit) + return decodeStringText(decoder, length, result); + return decodeStringText(decoder, length, result); +} + +void Coder::encode(Encoder& encoder, const SHA1::Digest& digest) +{ + encoder.encodeFixedLengthData(digest.data(), sizeof(digest)); +} + +bool Coder::decode(Decoder& decoder, SHA1::Digest& digest) +{ + return decoder.decodeFixedLengthData(digest.data(), sizeof(digest)); +} + +} +} -- cgit v1.2.1