1/* 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#ifndef SharedBuffer_h 28#define SharedBuffer_h 29 30#include "platform/PlatformExport.h" 31#include "platform/PurgeableVector.h" 32#include "third_party/skia/include/core/SkData.h" 33#include "wtf/ArrayBuffer.h" 34#include "wtf/Forward.h" 35#include "wtf/OwnPtr.h" 36#include "wtf/RefCounted.h" 37#include "wtf/text/WTFString.h" 38 39namespace blink { 40 41class PLATFORM_EXPORT SharedBuffer : public RefCounted<SharedBuffer> { 42public: 43 static PassRefPtr<SharedBuffer> create() { return adoptRef(new SharedBuffer); } 44 static PassRefPtr<SharedBuffer> create(size_t size) { return adoptRef(new SharedBuffer(size)); } 45 static PassRefPtr<SharedBuffer> create(const char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } 46 static PassRefPtr<SharedBuffer> create(const unsigned char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } 47 48 static PassRefPtr<SharedBuffer> createPurgeable(const char* c, int i) { return adoptRef(new SharedBuffer(c, i, PurgeableVector::Purgeable)); } 49 50 static PassRefPtr<SharedBuffer> adoptVector(Vector<char>&); 51 52 ~SharedBuffer(); 53 54 // Calling this function will force internal segmented buffers to be merged 55 // into a flat buffer. Use getSomeData() whenever possible for better 56 // performance. 57 const char* data() const; 58 59 unsigned size() const; 60 61 bool isEmpty() const { return !size(); } 62 63 void append(PassRefPtr<SharedBuffer>); 64 void append(const char*, unsigned); 65 void append(const Vector<char>&); 66 67 void clear(); 68 69 PassRefPtr<SharedBuffer> copy() const; 70 71 // Return the number of consecutive bytes after "position". "data" 72 // points to the first byte. 73 // Return 0 when no more data left. 74 // When extracting all data with getSomeData(), the caller should 75 // repeat calling it until it returns 0. 76 // Usage: 77 // const char* segment; 78 // unsigned pos = 0; 79 // while (unsigned length = sharedBuffer->getSomeData(segment, pos)) { 80 // // Use the data. for example: decoder->decode(segment, length); 81 // pos += length; 82 // } 83 unsigned getSomeData(const char*& data, unsigned position = 0) const; 84 85 // Creates an ArrayBuffer and copies this SharedBuffer's contents to that 86 // ArrayBuffer without merging segmented buffers into a flat buffer. If 87 // allocation of an ArrayBuffer fails, returns 0. 88 PassRefPtr<ArrayBuffer> getAsArrayBuffer() const; 89 90 // Creates an SkData and copies this SharedBuffer's contents to that 91 // SkData without merging segmented buffers into a flat buffer. 92 PassRefPtr<SkData> getAsSkData() const; 93 94 // See PurgeableVector::lock(). 95 bool lock(); 96 97 // WARNING: Calling unlock() on a SharedBuffer that wasn't created with the 98 // purgeability option does an extra memcpy(). Please use 99 // SharedBuffer::createPurgeable() if you intend to call unlock(). 100 void unlock(); 101 102 bool isLocked() const; 103 104private: 105 SharedBuffer(); 106 explicit SharedBuffer(size_t); 107 SharedBuffer(const char*, int); 108 SharedBuffer(const char*, int, PurgeableVector::PurgeableOption); 109 SharedBuffer(const unsigned char*, int); 110 111 // See SharedBuffer::data(). 112 void mergeSegmentsIntoBuffer() const; 113 114 unsigned m_size; 115 mutable PurgeableVector m_buffer; 116 mutable Vector<char*> m_segments; 117}; 118 119} // namespace blink 120 121#endif // SharedBuffer_h 122