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 "wtf/ArrayBuffer.h" 31 #include "wtf/Forward.h" 32 #include "wtf/OwnPtr.h" 33 #include "wtf/RefCounted.h" 34 #include "wtf/Vector.h" 35 #include "wtf/text/WTFString.h" 36 37 namespace WebCore { 38 39 class PurgeableBuffer; 40 41 class SharedBuffer : public RefCounted<SharedBuffer> { 42 public: 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> adoptVector(Vector<char>& vector); 49 50 // The buffer must be in non-purgeable state before adopted to a SharedBuffer. 51 // It will stay that way until released. 52 static PassRefPtr<SharedBuffer> adoptPurgeableBuffer(PassOwnPtr<PurgeableBuffer>); 53 54 ~SharedBuffer(); 55 56 // Calling this function will force internal segmented buffers 57 // to be merged into a flat buffer. Use getSomeData() whenever possible 58 // for better performance. 59 const char* data() const; 60 61 void moveTo(Vector<char>&); 62 63 unsigned size() const; 64 65 bool isEmpty() const { return !size(); } 66 67 void append(SharedBuffer*); 68 void append(const char*, unsigned); 69 void append(const Vector<char>&); 70 71 void clear(); 72 73 PassRefPtr<SharedBuffer> copy() const; 74 75 bool hasPurgeableBuffer() const { return m_purgeableBuffer.get(); } 76 77 // Ensure this buffer has no other clients before calling this. 78 PassOwnPtr<PurgeableBuffer> releasePurgeableBuffer(); 79 80 // Return the number of consecutive bytes after "position". "data" 81 // points to the first byte. 82 // Return 0 when no more data left. 83 // When extracting all data with getSomeData(), the caller should 84 // repeat calling it until it returns 0. 85 // Usage: 86 // const char* segment; 87 // unsigned pos = 0; 88 // while (unsigned length = sharedBuffer->getSomeData(segment, pos)) { 89 // // Use the data. for example: decoder->decode(segment, length); 90 // pos += length; 91 // } 92 unsigned getSomeData(const char*& data, unsigned position = 0) const; 93 94 void createPurgeableBuffer() const; 95 96 // Creates an ArrayBuffer and copies this SharedBuffer's contents to that 97 // ArrayBuffer without merging segmented buffers into a flat buffer. 98 PassRefPtr<ArrayBuffer> getAsArrayBuffer() const; 99 100 private: 101 SharedBuffer(); 102 explicit SharedBuffer(size_t); 103 SharedBuffer(const char*, int); 104 SharedBuffer(const unsigned char*, int); 105 106 // Calling this function will force internal segmented buffers 107 // to be merged into a flat buffer. Use getSomeData() whenever possible 108 // for better performance. 109 // As well, be aware that this method does *not* return any purgeable 110 // memory, which can be a source of bugs. 111 const Vector<char>& buffer() const; 112 113 unsigned m_size; 114 mutable Vector<char> m_buffer; 115 mutable Vector<char*> m_segments; 116 mutable OwnPtr<PurgeableBuffer> m_purgeableBuffer; 117 }; 118 119 } // namespace WebCore 120 121 #endif // SharedBuffer_h 122