946d5f3b3a5d47ff9486284bd0bc32887333fb1b
[WebKit.git] / Source / WebCore / platform / FileSystem.cpp
1 /*
2  * Copyright (C) 2007, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2015 Canon Inc. 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  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "FileSystem.h"
29
30 #include <wtf/HexNumber.h>
31 #include <wtf/text/CString.h>
32 #include <wtf/text/StringBuilder.h>
33
34 #if !PLATFORM(WIN)
35 #include <fcntl.h>
36 #include <sys/mman.h>
37 #include <sys/stat.h>
38 #include <unistd.h>
39 #endif
40
41 namespace WebCore {
42
43 // The following lower-ASCII characters need escaping to be used in a filename
44 // across all systems, including Windows:
45 //     - Unprintable ASCII (00-1F)
46 //     - Space             (20)
47 //     - Double quote      (22)
48 //     - Percent           (25) (escaped because it is our escape character)
49 //     - Asterisk          (2A)
50 //     - Slash             (2F)
51 //     - Colon             (3A)
52 //     - Less-than         (3C)
53 //     - Greater-than      (3E)
54 //     - Question Mark     (3F)
55 //     - Backslash         (5C)
56 //     - Pipe              (7C)
57 //     - Delete            (7F)
58
59 static const bool needsEscaping[128] = {
60     /* 00-07 */ true,  true,  true,  true,  true,  true,  true,  true, 
61     /* 08-0F */ true,  true,  true,  true,  true,  true,  true,  true, 
62
63     /* 10-17 */ true,  true,  true,  true,  true,  true,  true,  true, 
64     /* 18-1F */ true,  true,  true,  true,  true,  true,  true,  true, 
65
66     /* 20-27 */ true,  false, true,  false, false, true,  false, false, 
67     /* 28-2F */ false, false, true,  false, false, false, false, true, 
68     
69     /* 30-37 */ false, false, false, false, false, false, false, false, 
70     /* 38-3F */ false, false, true,  false, true,  false, true,  true, 
71     
72     /* 40-47 */ false, false, false, false, false, false, false, false, 
73     /* 48-4F */ false, false, false, false, false, false, false, false,
74     
75     /* 50-57 */ false, false, false, false, false, false, false, false, 
76     /* 58-5F */ false, false, false, false, true,  false, false, false,
77     
78     /* 60-67 */ false, false, false, false, false, false, false, false, 
79     /* 68-6F */ false, false, false, false, false, false, false, false,
80     
81     /* 70-77 */ false, false, false, false, false, false, false, false, 
82     /* 78-7F */ false, false, false, false, true,  false, false, true, 
83 };
84
85 static inline bool shouldEscapeUChar(UChar c)
86 {
87     return c > 127 ? false : needsEscaping[c];
88 }
89
90 String encodeForFileName(const String& inputString)
91 {
92     StringBuilder result;
93     StringImpl* stringImpl = inputString.impl();
94     unsigned length = inputString.length();
95     for (unsigned i = 0; i < length; ++i) {
96         UChar character = (*stringImpl)[i];
97         if (shouldEscapeUChar(character)) {
98             result.append('%');
99             appendByteAsHex(character, result);
100         } else
101             result.append(character);
102     }
103
104     return result.toString();
105 }
106
107 #if !PLATFORM(MAC)
108
109 void setMetadataURL(String&, const String&, const String&)
110 {
111 }
112
113 bool canExcludeFromBackup()
114 {
115     return false;
116 }
117
118 bool excludeFromBackup(const String&)
119 {
120     return false;
121 }
122
123 #endif
124
125 MappedFileData::~MappedFileData()
126 {
127 #if !PLATFORM(WIN)
128     if (!m_fileData)
129         return;
130     munmap(m_fileData, m_fileSize);
131 #endif
132 }
133
134 MappedFileData::MappedFileData(const String& filePath, bool& success)
135 {
136 #if PLATFORM(WIN)
137     // FIXME: Implement mapping
138     success = false;
139 #else
140     CString fsRep = fileSystemRepresentation(filePath);
141     int fd = !fsRep.isNull() ? open(fsRep.data(), O_RDONLY) : -1;
142     if (fd < 0) {
143         success = false;
144         return;
145     }
146
147     struct stat fileStat;
148     if (fstat(fd, &fileStat)) {
149         close(fd);
150         success = false;
151         return;
152     }
153
154     if (fileStat.st_size < 0 || fileStat.st_size > std::numeric_limits<unsigned>::max()) {
155         close(fd);
156         success = false;
157         return;
158     }
159
160     unsigned size = static_cast<unsigned>(fileStat.st_size);
161
162     if (!size) {
163         close(fd);
164         success = true;
165         return;
166     }
167
168     void* data = mmap(0, size, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
169     close(fd);
170
171     if (data == MAP_FAILED) {
172         success = false;
173         return;
174     }
175
176     success = true;
177     m_fileData = data;
178     m_fileSize = size;
179 #endif
180 }
181
182 } // namespace WebCore