• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007, 2008 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  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include "config.h"
30 #include "FileSystem.h"
31 
32 #include "CString.h"
33 #include "PlatformString.h"
34 
35 #include <sys/stat.h>
36 #ifdef ANDROID_PLUGINS
37 #include <sys/types.h>
38 #include <dirent.h>
39 #include <fnmatch.h>
40 #endif
41 #include <libgen.h>
42 #include <unistd.h>
43 
44 namespace WebCore {
45 
fileExists(const String & path)46 bool fileExists(const String& path)
47 {
48     if (path.isNull())
49         return false;
50 
51     CString fsRep = fileSystemRepresentation(path);
52 
53     if (!fsRep.data() || fsRep.data()[0] == '\0')
54         return false;
55 
56     struct stat fileInfo;
57 
58     // stat(...) returns 0 on successful stat'ing of the file, and non-zero in any case where the file doesn't exist or cannot be accessed
59     return !stat(fsRep.data(), &fileInfo);
60 }
61 
deleteFile(const String & path)62 bool deleteFile(const String& path)
63 {
64     CString fsRep = fileSystemRepresentation(path);
65 
66     if (!fsRep.data() || fsRep.data()[0] == '\0')
67         return false;
68 
69     // unlink(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
70     return !unlink(fsRep.data());
71 }
72 
deleteEmptyDirectory(const String & path)73 bool deleteEmptyDirectory(const String& path)
74 {
75     CString fsRep = fileSystemRepresentation(path);
76 
77     if (!fsRep.data() || fsRep.data()[0] == '\0')
78         return false;
79 
80     // rmdir(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
81     return !rmdir(fsRep.data());
82 }
83 
getFileSize(const String & path,long long & result)84 bool getFileSize(const String& path, long long& result)
85 {
86     CString fsRep = fileSystemRepresentation(path);
87 
88     if (!fsRep.data() || fsRep.data()[0] == '\0')
89         return false;
90 
91     struct stat fileInfo;
92 
93     if (stat(fsRep.data(), &fileInfo))
94         return false;
95 
96     result = fileInfo.st_size;
97     return true;
98 }
99 
getFileModificationTime(const String & path,time_t & result)100 bool getFileModificationTime(const String& path, time_t& result)
101 {
102     CString fsRep = fileSystemRepresentation(path);
103 
104     if (!fsRep.data() || fsRep.data()[0] == '\0')
105         return false;
106 
107     struct stat fileInfo;
108 
109     if (stat(fsRep.data(), &fileInfo))
110         return false;
111 
112     result = fileInfo.st_mtime;
113     return true;
114 }
115 
pathByAppendingComponent(const String & path,const String & component)116 String pathByAppendingComponent(const String& path, const String& component)
117 {
118     if (path.endsWith("/"))
119         return path + component;
120     else
121         return path + "/" + component;
122 }
123 
makeAllDirectories(const String & path)124 bool makeAllDirectories(const String& path)
125 {
126     CString fullPath = fileSystemRepresentation(path);
127     if (!access(fullPath.data(), F_OK))
128         return true;
129 
130     char* p = fullPath.mutableData() + 1;
131     int length = fullPath.length();
132 
133     if(p[length - 1] == '/')
134         p[length - 1] = '\0';
135     for (; *p; ++p)
136         if (*p == '/') {
137             *p = '\0';
138             if (access(fullPath.data(), F_OK))
139                 if (mkdir(fullPath.data(), S_IRWXU))
140                     return false;
141             *p = '/';
142         }
143     if (access(fullPath.data(), F_OK))
144         if (mkdir(fullPath.data(), S_IRWXU))
145             return false;
146 
147     return true;
148 }
149 
pathGetFileName(const String & path)150 String pathGetFileName(const String& path)
151 {
152     return path.substring(path.reverseFind('/') + 1);
153 }
154 
directoryName(const String & path)155 String directoryName(const String& path)
156 {
157     CString fsRep = fileSystemRepresentation(path);
158 
159     if (!fsRep.data() || fsRep.data()[0] == '\0')
160         return String();
161 
162     return dirname(fsRep.mutableData());
163 }
164 
165 // OK to not implement listDirectory at the moment, because it's only used for plug-ins, and
166 // all platforms that use the shared plug-in implementation have implementations. We'd need
167 // to implement it if we wanted to use PluginDatabase.cpp on the Mac. Better to not implement
168 // at all and get a link error in case this arises, rather than having a stub here, because
169 // with a stub you learn about the problem at runtime instead of link time.
170 
171 } // namespace WebCore
172