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