18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef SharedBuffer_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SharedBuffer_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Forward.h> 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/OwnPtr.h> 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RefCounted.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF) 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RetainPtr.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef __OBJC__ 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@class NSData; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass NSData; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass PurgeableBuffer; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass SharedBuffer : public RefCounted<SharedBuffer> { 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> create() { return adoptRef(new SharedBuffer); } 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> create(const char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> create(const unsigned char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> createWithContentsOfFile(const String& filePath); 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> adoptVector(Vector<char>& vector); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // The buffer must be in non-purgeable state before adopted to a SharedBuffer. 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // It will stay that way until released. 64e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke static PassRefPtr<SharedBuffer> adoptPurgeableBuffer(PassOwnPtr<PurgeableBuffer>); 65a101f778588252e4b72f2083fad0dd95346f8702Steve Block 660516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#if PLATFORM(ANDROID) 670516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu virtual 680516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#endif 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ~SharedBuffer(); 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *createNSData(); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static PassRefPtr<SharedBuffer> wrapNSData(NSData *data); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDataRef createCFData(); 775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static PassRefPtr<SharedBuffer> wrapCFData(CFDataRef); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 800516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#if PLATFORM(ANDROID) 810516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu virtual 820516e5ebbe0e0ced8bd40f67f06c38a4d373be9cAndrei Popescu#endif 83d0825bca7fe65beaee391d30da42e937db621564Steve Block // Calling this function will force internal segmented buffers 84d0825bca7fe65beaee391d30da42e937db621564Steve Block // to be merged into a flat buffer. Use getSomeData() whenever possible 85d0825bca7fe65beaee391d30da42e937db621564Steve Block // for better performance. 86d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* data() const; 876140756452d66f35970067d531fbcd4391001994Steve Block#if PLATFORM(ANDROID) 886140756452d66f35970067d531fbcd4391001994Steve Block virtual 896140756452d66f35970067d531fbcd4391001994Steve Block#endif 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned size() const; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 93d0825bca7fe65beaee391d30da42e937db621564Steve Block bool isEmpty() const { return !size(); } 94d0825bca7fe65beaee391d30da42e937db621564Steve Block 95d0825bca7fe65beaee391d30da42e937db621564Steve Block void append(const char*, unsigned); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void clear(); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* platformData() const; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned platformDataSize() const; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1002bde8e466a4451c7319e3a072d118917957d6554Steve Block#if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 1012bde8e466a4451c7319e3a072d118917957d6554Steve Block void append(CFDataRef); 1022bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 1032bde8e466a4451c7319e3a072d118917957d6554Steve Block 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<SharedBuffer> copy() const; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool hasPurgeableBuffer() const { return m_purgeableBuffer.get(); } 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Ensure this buffer has no other clients before calling this. 109e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke PassOwnPtr<PurgeableBuffer> releasePurgeableBuffer(); 110d0825bca7fe65beaee391d30da42e937db621564Steve Block 111d0825bca7fe65beaee391d30da42e937db621564Steve Block // Return the number of consecutive bytes after "position". "data" 112d0825bca7fe65beaee391d30da42e937db621564Steve Block // points to the first byte. 113d0825bca7fe65beaee391d30da42e937db621564Steve Block // Return 0 when no more data left. 114d0825bca7fe65beaee391d30da42e937db621564Steve Block // When extracting all data with getSomeData(), the caller should 115d0825bca7fe65beaee391d30da42e937db621564Steve Block // repeat calling it until it returns 0. 116d0825bca7fe65beaee391d30da42e937db621564Steve Block // Usage: 117d0825bca7fe65beaee391d30da42e937db621564Steve Block // const char* segment; 118d0825bca7fe65beaee391d30da42e937db621564Steve Block // unsigned pos = 0; 119d0825bca7fe65beaee391d30da42e937db621564Steve Block // while (unsigned length = sharedBuffer->getSomeData(segment, pos)) { 120d0825bca7fe65beaee391d30da42e937db621564Steve Block // // Use the data. for example: decoder->decode(segment, length); 121d0825bca7fe65beaee391d30da42e937db621564Steve Block // pos += length; 122d0825bca7fe65beaee391d30da42e937db621564Steve Block // } 123d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned getSomeData(const char*& data, unsigned position = 0) const; 124d0825bca7fe65beaee391d30da42e937db621564Steve Block 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SharedBuffer(); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SharedBuffer(const char*, int); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SharedBuffer(const unsigned char*, int); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Calling this function will force internal segmented buffers 13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // to be merged into a flat buffer. Use getSomeData() whenever possible 13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // for better performance. 13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // As well, be aware that this method does *not* return any purgeable 13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // memory, which can be a source of bugs. 13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const Vector<char>& buffer() const; 13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void clearPlatformData(); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void maybeTransferPlatformData(); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasPlatformData() const; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 141d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned m_size; 142d0825bca7fe65beaee391d30da42e937db621564Steve Block mutable Vector<char> m_buffer; 143d0825bca7fe65beaee391d30da42e937db621564Steve Block mutable Vector<char*> m_segments; 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project OwnPtr<PurgeableBuffer> m_purgeableBuffer; 1452bde8e466a4451c7319e3a072d118917957d6554Steve Block#if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 1462bde8e466a4451c7319e3a072d118917957d6554Steve Block mutable Vector<RetainPtr<CFDataRef> > m_dataArray; 1472bde8e466a4451c7319e3a072d118917957d6554Steve Block void copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const; 1482bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SharedBuffer(CFDataRef); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<CFDataRef> m_cfData; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 157d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // SharedBuffer_h 158