ecf6d98af69fe0719dc65b88367ca4df78b87a53
[WebKit-https.git] / Source / WebKit / NetworkProcess / cache / NetworkCacheData.h
1 /*
2  * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef NetworkCacheData_h
27 #define NetworkCacheData_h
28
29 #include <wtf/FunctionDispatcher.h>
30 #include <wtf/SHA1.h>
31 #include <wtf/ThreadSafeRefCounted.h>
32 #include <wtf/text/WTFString.h>
33
34 #if PLATFORM(COCOA)
35 #include <wtf/DispatchPtr.h>
36 #endif
37
38 #if USE(SOUP)
39 #include <WebCore/GRefPtrSoup.h>
40 #endif
41
42 namespace WebKit {
43
44 class SharedMemory;
45
46 namespace NetworkCache {
47
48 class Data {
49 public:
50     Data() { }
51     Data(const uint8_t*, size_t);
52
53     ~Data() { }
54
55     static Data empty();
56     static Data adoptMap(void* map, size_t, int fd);
57
58 #if PLATFORM(COCOA)
59     enum class Backing { Buffer, Map };
60     Data(DispatchPtr<dispatch_data_t>, Backing = Backing::Buffer);
61 #endif
62 #if USE(SOUP)
63     Data(GRefPtr<SoupBuffer>&&, int fd = -1);
64 #endif
65     bool isNull() const;
66     bool isEmpty() const { return !m_size; }
67
68     const uint8_t* data() const;
69     size_t size() const { return m_size; }
70     bool isMap() const { return m_isMap; }
71     RefPtr<SharedMemory> tryCreateSharedMemory() const;
72
73     Data subrange(size_t offset, size_t) const;
74
75     bool apply(const Function<bool (const uint8_t*, size_t)>&) const;
76
77     Data mapToFile(const char* path) const;
78
79 #if PLATFORM(COCOA)
80     dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
81 #endif
82
83 #if USE(SOUP)
84     SoupBuffer* soupBuffer() const { return m_buffer.get(); }
85 #endif
86 private:
87 #if PLATFORM(COCOA)
88     mutable DispatchPtr<dispatch_data_t> m_dispatchData;
89 #endif
90 #if USE(SOUP)
91     mutable GRefPtr<SoupBuffer> m_buffer;
92     int m_fileDescriptor { -1 };
93 #endif
94     mutable const uint8_t* m_data { nullptr };
95     size_t m_size { 0 };
96     bool m_isMap { false };
97 };
98
99 Data concatenate(const Data&, const Data&);
100 bool bytesEqual(const Data&, const Data&);
101 Data adoptAndMapFile(int fd, size_t offset, size_t);
102 Data mapFile(const char* path);
103
104 using Salt = std::array<uint8_t, 8>;
105
106 std::optional<Salt> readOrMakeSalt(const String& path);
107 SHA1::Digest computeSHA1(const Data&, const Salt&);
108
109 }
110 }
111
112 #endif