1b53a7ef1bb32aa62655deda4c0e3f16df6a1f41
[WebKit-https.git] / WebCore / platform / efl / FileSystemEfl.cpp
1 /*
2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
4  * Copyright (C) 2008 Kenneth Rohde Christiansen.
5  * Copyright (C) 2009-2010 ProFUSION embedded systems
6  * Copyright (C) 2009-2010 Samsung Electronics
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1.  Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  * 2.  Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
18  *     its contributors may be used to endorse or promote products derived
19  *     from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include "config.h"
34 #include "FileSystem.h"
35
36 #include "NotImplemented.h"
37
38 #include <Ecore.h>
39 #include <Ecore_File.h>
40 #include <Eina.h>
41 #include <dirent.h>
42 #include <dlfcn.h>
43 #include <errno.h>
44 #include <fnmatch.h>
45 #include <glib.h> // TODO: remove me after following TODO is solved.
46 #include <limits.h>
47 #include <stdio.h>
48 #include <sys/stat.h>
49 #include <unistd.h>
50 #include <wtf/text/CString.h>
51
52 namespace WebCore {
53
54 CString fileSystemRepresentation(const String& path)
55 {
56     return path.utf8();
57 }
58
59 char* filenameFromString(const String& string)
60 {
61 // WARNING: this is just used by platform/network/soup, thus must be GLIB!!!
62 // TODO: move this to CString and use it instead in both, being more standard
63 #if PLATFORM(WIN_OS)
64     return g_strdup(string.utf8().data());
65 #else
66     return g_uri_unescape_string(string.utf8().data(), 0);
67 #endif
68 }
69
70 CString openTemporaryFile(const char* prefix, PlatformFileHandle& handle)
71 {
72     char buffer[PATH_MAX];
73     const char* tmpDir = getenv("TMPDIR");
74
75     if (!tmpDir)
76         tmpDir = "/tmp";
77
78     if (snprintf(buffer, PATH_MAX, "%s/%sXXXXXX", tmpDir, prefix) >= PATH_MAX)
79         goto end;
80
81     handle = mkstemp(buffer);
82     if (handle < 0)
83         goto end;
84
85     return CString(buffer);
86
87 end:
88     handle = invalidPlatformFileHandle;
89     return CString();
90 }
91
92 void closeFile(PlatformFileHandle& handle)
93 {
94     if (isHandleValid(handle)) {
95         close(handle);
96         handle = invalidPlatformFileHandle;
97     }
98 }
99
100 int writeToFile(PlatformFileHandle handle, const char* data, int length)
101 {
102     size_t totalBytesWritten = 0;
103     size_t todo = length;
104     while (todo > 0) {
105         ssize_t bytesWritten = write(handle, data, todo);
106         if (bytesWritten < 0) {
107             if (errno != EINTR && errno != EAGAIN)
108                 return -1;
109         } else if (bytesWritten > 0) {
110             totalBytesWritten += bytesWritten;
111             data += bytesWritten;
112             todo -= bytesWritten;
113         }
114     }
115
116     return totalBytesWritten;
117 }
118
119 bool unloadModule(PlatformModule module)
120 {
121     // caution, closing handle will make memory vanish and any remaining
122     // timer, idler, threads or any other left-over will crash,
123     // maybe just ignore this is a safer solution?
124     return !dlclose(module);
125 }
126
127 String homeDirectoryPath()
128 {
129     const char *home = getenv("HOME");
130     if (!home) {
131         home = getenv("TMPDIR");
132         if (!home)
133             home = "/tmp";
134     }
135     return String::fromUTF8(home);
136 }
137
138 Vector<String> listDirectory(const String& path, const String& filter)
139 {
140     Vector<String> entries;
141     CString cpath = path.utf8();
142     CString cfilter = filter.utf8();
143     char filePath[PATH_MAX];
144     char* fileName;
145     size_t fileNameSpace;
146     DIR* dir;
147
148     if (cpath.length() + NAME_MAX >= sizeof(filePath))
149         return entries;
150     // loop invariant: directory part + '/'
151     memcpy(filePath, cpath.data(), cpath.length());
152     fileName = filePath + cpath.length();
153     if (cpath.length() > 0 && filePath[cpath.length() - 1] != '/') {
154         fileName[0] = '/';
155         fileName++;
156     }
157     fileNameSpace = sizeof(filePath) - (fileName - filePath) - 1;
158
159     dir = opendir(cpath.data());
160     if (!dir)
161         return entries;
162
163     struct dirent* de;
164     while (de = readdir(dir)) {
165         size_t nameLen;
166         if (de->d_name[0] == '.') {
167             if (de->d_name[1] == '\0')
168                 continue;
169             if (de->d_name[1] == '.' && de->d_name[2] == '\0')
170                 continue;
171         }
172         if (fnmatch(cfilter.data(), de->d_name, 0))
173             continue;
174
175         nameLen = strlen(de->d_name);
176         if (nameLen >= fileNameSpace)
177             continue; // maybe assert? it should never happen anyway...
178
179         memcpy(fileName, de->d_name, nameLen + 1);
180         entries.append(filePath);
181     }
182     closedir(dir);
183     return entries;
184 }
185
186 }