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 #ifndef SharedBuffer_h 27 #define SharedBuffer_h 28 29 #include "PlatformString.h" 30 #include <wtf/Forward.h> 31 #include <wtf/OwnPtr.h> 32 #include <wtf/RefCounted.h> 33 #include <wtf/Vector.h> 34 35 #if USE(CF) 36 #include <wtf/RetainPtr.h> 37 #endif 38 39 #if PLATFORM(MAC) || (PLATFORM(QT) && USE(QTKIT)) 40 #ifdef __OBJC__ 41 @class NSData; 42 #else 43 class NSData; 44 #endif 45 46 #endif 47 48 namespace WebCore { 49 50 class PurgeableBuffer; 51 52 class SharedBuffer : public RefCounted<SharedBuffer> { 53 public: create()54 static PassRefPtr<SharedBuffer> create() { return adoptRef(new SharedBuffer); } create(const char * c,int i)55 static PassRefPtr<SharedBuffer> create(const char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } create(const unsigned char * c,int i)56 static PassRefPtr<SharedBuffer> create(const unsigned char* c, int i) { return adoptRef(new SharedBuffer(c, i)); } 57 58 static PassRefPtr<SharedBuffer> createWithContentsOfFile(const String& filePath); 59 60 static PassRefPtr<SharedBuffer> adoptVector(Vector<char>& vector); 61 62 // The buffer must be in non-purgeable state before adopted to a SharedBuffer. 63 // It will stay that way until released. 64 static PassRefPtr<SharedBuffer> adoptPurgeableBuffer(PassOwnPtr<PurgeableBuffer>); 65 66 ~SharedBuffer(); 67 68 #if PLATFORM(MAC) || (PLATFORM(QT) && USE(QTKIT)) 69 NSData *createNSData(); 70 static PassRefPtr<SharedBuffer> wrapNSData(NSData *data); 71 #endif 72 #if USE(CF) 73 CFDataRef createCFData(); 74 static PassRefPtr<SharedBuffer> wrapCFData(CFDataRef); 75 #endif 76 77 // Calling this function will force internal segmented buffers 78 // to be merged into a flat buffer. Use getSomeData() whenever possible 79 // for better performance. 80 const char* data() const; 81 82 unsigned size() const; 83 84 isEmpty()85 bool isEmpty() const { return !size(); } 86 87 void append(const char*, unsigned); 88 void clear(); 89 const char* platformData() const; 90 unsigned platformDataSize() const; 91 92 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 93 void append(CFDataRef); 94 #endif 95 96 PassRefPtr<SharedBuffer> copy() const; 97 hasPurgeableBuffer()98 bool hasPurgeableBuffer() const { return m_purgeableBuffer.get(); } 99 100 // Ensure this buffer has no other clients before calling this. 101 PassOwnPtr<PurgeableBuffer> releasePurgeableBuffer(); 102 103 // Return the number of consecutive bytes after "position". "data" 104 // points to the first byte. 105 // Return 0 when no more data left. 106 // When extracting all data with getSomeData(), the caller should 107 // repeat calling it until it returns 0. 108 // Usage: 109 // const char* segment; 110 // unsigned pos = 0; 111 // while (unsigned length = sharedBuffer->getSomeData(segment, pos)) { 112 // // Use the data. for example: decoder->decode(segment, length); 113 // pos += length; 114 // } 115 unsigned getSomeData(const char*& data, unsigned position = 0) const; 116 117 private: 118 SharedBuffer(); 119 SharedBuffer(const char*, int); 120 SharedBuffer(const unsigned char*, int); 121 122 // Calling this function will force internal segmented buffers 123 // to be merged into a flat buffer. Use getSomeData() whenever possible 124 // for better performance. 125 // As well, be aware that this method does *not* return any purgeable 126 // memory, which can be a source of bugs. 127 const Vector<char>& buffer() const; 128 129 void clearPlatformData(); 130 void maybeTransferPlatformData(); 131 bool hasPlatformData() const; 132 133 unsigned m_size; 134 mutable Vector<char> m_buffer; 135 mutable Vector<char*> m_segments; 136 OwnPtr<PurgeableBuffer> m_purgeableBuffer; 137 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 138 mutable Vector<RetainPtr<CFDataRef> > m_dataArray; 139 void copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const; 140 #endif 141 #if USE(CF) 142 SharedBuffer(CFDataRef); 143 RetainPtr<CFDataRef> m_cfData; 144 #endif 145 }; 146 147 } 148 149 #endif // SharedBuffer_h 150