1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "DecoderAdapter.h" 28 29#include "DataReference.h" 30#include "WebCoreArgumentCoders.h" 31#include <wtf/text/WTFString.h> 32 33namespace WebKit { 34 35DecoderAdapter::DecoderAdapter(const uint8_t* buffer, size_t bufferSize) 36 : m_decoder(CoreIPC::ArgumentDecoder::create(buffer, bufferSize)) 37{ 38 // Keep format compatibility by decoding an unused uint64_t value 39 // that used to be encoded by the argument encoder. 40 uint64_t value; 41 m_decoder->decode(value); 42 ASSERT(!value); 43} 44 45bool DecoderAdapter::decodeBytes(Vector<uint8_t>& bytes) 46{ 47 CoreIPC::DataReference dataReference; 48 if (!m_decoder->decode(dataReference)) 49 return false; 50 51 bytes = dataReference.vector(); 52 return true; 53} 54 55bool DecoderAdapter::decodeBool(bool& value) 56{ 57 return m_decoder->decode(value); 58} 59 60bool DecoderAdapter::decodeUInt16(uint16_t& value) 61{ 62 return m_decoder->decode(value); 63} 64 65bool DecoderAdapter::decodeUInt32(uint32_t& value) 66{ 67 return m_decoder->decode(value); 68} 69 70bool DecoderAdapter::decodeUInt64(uint64_t& value) 71{ 72 return m_decoder->decode(value); 73} 74 75bool DecoderAdapter::decodeInt32(int32_t& value) 76{ 77 return m_decoder->decode(value); 78} 79 80bool DecoderAdapter::decodeInt64(int64_t& value) 81{ 82 return m_decoder->decode(value); 83} 84 85bool DecoderAdapter::decodeFloat(float& value) 86{ 87 return m_decoder->decode(value); 88} 89 90bool DecoderAdapter::decodeDouble(double& value) 91{ 92 return m_decoder->decode(value); 93} 94 95bool DecoderAdapter::decodeString(String& value) 96{ 97 // This mimics the CoreIPC binary encoding of Strings prior to r88886. 98 // Whenever the CoreIPC binary encoding changes, we'll have to "undo" the changes here. 99 // FIXME: We shouldn't use the CoreIPC binary encoding format for history, 100 // and we should come up with a migration strategy so we can actually bump the version number 101 // without breaking encoding/decoding of the history tree. 102 103 uint32_t length; 104 if (!m_decoder->decode(length)) 105 return false; 106 107 if (length == std::numeric_limits<uint32_t>::max()) { 108 // This is the null string. 109 value = String(); 110 return true; 111 } 112 113 uint64_t lengthInBytes; 114 if (!m_decoder->decode(lengthInBytes)) 115 return false; 116 117 if (lengthInBytes % sizeof(UChar) || lengthInBytes / sizeof(UChar) != length) { 118 m_decoder->markInvalid(); 119 return false; 120 } 121 122 if (!m_decoder->bufferIsLargeEnoughToContain<UChar>(length)) { 123 m_decoder->markInvalid(); 124 return false; 125 } 126 127 UChar* buffer; 128 String string = String::createUninitialized(length, buffer); 129 if (!m_decoder->decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(UChar), __alignof(UChar))) 130 return false; 131 132 value = string; 133 return true; 134} 135 136} 137