Unreviewed, rolling out r215608.
[WebKit-https.git] / Source / WebCore / platform / SharedBuffer.h
1 /*
2  * Copyright (C) 2006-2017 Apple 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 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 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 #pragma once
28
29 #include "FileSystem.h"
30 #include <runtime/ArrayBuffer.h>
31 #include <wtf/Forward.h>
32 #include <wtf/RefCounted.h>
33 #include <wtf/ThreadSafeRefCounted.h>
34 #include <wtf/Vector.h>
35 #include <wtf/text/WTFString.h>
36
37 #if USE(CF)
38 #include <wtf/RetainPtr.h>
39 #endif
40
41 #if USE(SOUP)
42 #include "GUniquePtrSoup.h"
43 #endif
44
45 #if USE(FOUNDATION)
46 OBJC_CLASS NSArray;
47 OBJC_CLASS NSData;
48 #endif
49
50 namespace WebCore {
51     
52 class SharedBuffer : public RefCounted<SharedBuffer> {
53 public:
54     static Ref<SharedBuffer> create() { return adoptRef(*new SharedBuffer); }
55     static Ref<SharedBuffer> create(const char* c, unsigned i) { return adoptRef(*new SharedBuffer(c, i)); }
56     static Ref<SharedBuffer> create(const unsigned char* data, unsigned size) { return adoptRef(*new SharedBuffer(data, size)); }
57
58     WEBCORE_EXPORT static RefPtr<SharedBuffer> createWithContentsOfFile(const String& filePath);
59
60     WEBCORE_EXPORT static Ref<SharedBuffer> create(Vector<char>&&);
61     
62     WEBCORE_EXPORT ~SharedBuffer();
63     
64 #if USE(FOUNDATION)
65     WEBCORE_EXPORT RetainPtr<NSData> createNSData();
66     WEBCORE_EXPORT RetainPtr<NSArray> createNSDataArray() const;
67     WEBCORE_EXPORT static Ref<SharedBuffer> wrapNSData(NSData *);
68 #endif
69 #if USE(CF)
70     WEBCORE_EXPORT RetainPtr<CFDataRef> createCFData();
71     WEBCORE_EXPORT static Ref<SharedBuffer> wrapCFData(CFDataRef);
72     WEBCORE_EXPORT void append(CFDataRef);
73 #endif
74
75 #if USE(SOUP)
76     GUniquePtr<SoupBuffer> createSoupBuffer(unsigned offset = 0, unsigned size = 0);
77     static Ref<SharedBuffer> wrapSoupBuffer(SoupBuffer*);
78 #endif
79
80     // Calling this function will force internal segmented buffers
81     // to be merged into a flat buffer. Use getSomeData() whenever possible
82     // for better performance.
83     WEBCORE_EXPORT const char* data() const;
84     // Creates an ArrayBuffer and copies this SharedBuffer's contents to that
85     // ArrayBuffer without merging segmented buffers into a flat buffer.
86     WEBCORE_EXPORT RefPtr<ArrayBuffer> createArrayBuffer() const;
87
88     WEBCORE_EXPORT unsigned size() const;
89
90     bool isEmpty() const { return !size(); }
91
92     WEBCORE_EXPORT void append(SharedBuffer&);
93     WEBCORE_EXPORT void append(const char*, unsigned);
94     WEBCORE_EXPORT void append(Vector<char>&&);
95
96     WEBCORE_EXPORT void clear();
97
98     WEBCORE_EXPORT Ref<SharedBuffer> copy() const;
99     
100     // Return the number of consecutive bytes after "position". "data"
101     // points to the first byte.
102     // Return 0 when no more data left.
103     // When extracting all data with getSomeData(), the caller should
104     // repeat calling it until it returns 0.
105     // Usage:
106     //      const char* segment;
107     //      unsigned pos = 0;
108     //      while (unsigned length = sharedBuffer->getSomeData(segment, pos)) {
109     //          // Use the data. for example: decoder->decode(segment, length);
110     //          pos += length;
111     //      }
112     WEBCORE_EXPORT unsigned getSomeData(const char*& data, unsigned position = 0) const;
113
114     bool tryReplaceContentsWithPlatformBuffer(SharedBuffer&);
115     WEBCORE_EXPORT bool hasPlatformData() const;
116
117     struct DataBuffer : public ThreadSafeRefCounted<DataBuffer> {
118         Vector<char> data;
119     };
120
121     void hintMemoryNotNeededSoon();
122
123 private:
124     WEBCORE_EXPORT SharedBuffer();
125     WEBCORE_EXPORT SharedBuffer(const char*, unsigned);
126     WEBCORE_EXPORT SharedBuffer(const unsigned char*, unsigned);
127     explicit SharedBuffer(MappedFileData&&);
128
129     static RefPtr<SharedBuffer> createFromReadingFile(const String& filePath);
130
131     // Calling this function will force internal segmented buffers
132     // to be merged into a flat buffer. Use getSomeData() whenever possible
133     // for better performance.
134     const Vector<char>& buffer() const;
135
136     void clearPlatformData();
137     void maybeTransferPlatformData();
138     bool maybeAppendPlatformData(SharedBuffer&);
139
140     void maybeTransferMappedFileData();
141
142     void copyBufferAndClear(char* destination, unsigned bytesToCopy) const;
143
144     void appendToDataBuffer(const char *, unsigned) const;
145     void duplicateDataBufferIfNecessary() const;
146     void clearDataBuffer();
147
148     unsigned m_size { 0 };
149     mutable Ref<DataBuffer> m_buffer;
150
151 #if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
152     mutable Vector<RetainPtr<CFDataRef>> m_dataArray;
153     unsigned copySomeDataFromDataArray(const char*& someData, unsigned position) const;
154     const char *singleDataArrayBuffer() const;
155     bool maybeAppendDataArray(SharedBuffer&);
156 #else
157     mutable Vector<char*> m_segments;
158 #endif
159
160     unsigned platformDataSize() const;
161     const char* platformData() const;
162
163 #if USE(CF)
164     explicit SharedBuffer(CFDataRef);
165     RetainPtr<CFDataRef> m_cfData;
166     CFDataRef existingCFData();
167 #endif
168
169 #if USE(SOUP)
170     explicit SharedBuffer(SoupBuffer*);
171     GUniquePtr<SoupBuffer> m_soupBuffer;
172 #endif
173
174     MappedFileData m_fileData;
175 };
176
177 RefPtr<SharedBuffer> utf8Buffer(const String&);
178
179 } // namespace WebCore