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) 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: 54 static PassRefPtr<SharedBuffer> create() { return adoptRef(new SharedBuffer); } 55 static PassRefPtr<SharedBuffer> create(const char* c, int i) { return adoptRef(new SharedBuffer(c, 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 #if PLATFORM(ANDROID) 67 virtual 68 #endif 69 ~SharedBuffer(); 70 71 #if PLATFORM(MAC) 72 NSData *createNSData(); 73 static PassRefPtr<SharedBuffer> wrapNSData(NSData *data); 74 #endif 75 #if USE(CF) 76 CFDataRef createCFData(); 77 static PassRefPtr<SharedBuffer> wrapCFData(CFDataRef); 78 #endif 79 80 #if PLATFORM(ANDROID) 81 virtual 82 #endif 83 // Calling this function will force internal segmented buffers 84 // to be merged into a flat buffer. Use getSomeData() whenever possible 85 // for better performance. 86 const char* data() const; 87 #if PLATFORM(ANDROID) 88 virtual 89 #endif 90 unsigned size() const; 91 92 93 bool isEmpty() const { return !size(); } 94 95 void append(const char*, unsigned); 96 void clear(); 97 const char* platformData() const; 98 unsigned platformDataSize() const; 99 100 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 101 void append(CFDataRef); 102 #endif 103 104 PassRefPtr<SharedBuffer> copy() const; 105 106 bool hasPurgeableBuffer() const { return m_purgeableBuffer.get(); } 107 108 // Ensure this buffer has no other clients before calling this. 109 PassOwnPtr<PurgeableBuffer> releasePurgeableBuffer(); 110 111 // Return the number of consecutive bytes after "position". "data" 112 // points to the first byte. 113 // Return 0 when no more data left. 114 // When extracting all data with getSomeData(), the caller should 115 // repeat calling it until it returns 0. 116 // Usage: 117 // const char* segment; 118 // unsigned pos = 0; 119 // while (unsigned length = sharedBuffer->getSomeData(segment, pos)) { 120 // // Use the data. for example: decoder->decode(segment, length); 121 // pos += length; 122 // } 123 unsigned getSomeData(const char*& data, unsigned position = 0) const; 124 125 private: 126 SharedBuffer(); 127 SharedBuffer(const char*, int); 128 SharedBuffer(const unsigned char*, int); 129 130 // Calling this function will force internal segmented buffers 131 // to be merged into a flat buffer. Use getSomeData() whenever possible 132 // for better performance. 133 // As well, be aware that this method does *not* return any purgeable 134 // memory, which can be a source of bugs. 135 const Vector<char>& buffer() const; 136 137 void clearPlatformData(); 138 void maybeTransferPlatformData(); 139 bool hasPlatformData() const; 140 141 unsigned m_size; 142 mutable Vector<char> m_buffer; 143 mutable Vector<char*> m_segments; 144 OwnPtr<PurgeableBuffer> m_purgeableBuffer; 145 #if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK) 146 mutable Vector<RetainPtr<CFDataRef> > m_dataArray; 147 void copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const; 148 #endif 149 #if USE(CF) 150 SharedBuffer(CFDataRef); 151 RetainPtr<CFDataRef> m_cfData; 152 #endif 153 }; 154 155 } 156 157 #endif // SharedBuffer_h 158