• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 Staikos Computing Services Inc.
3  * Copyright (C) 2007 Holger Hans Peter Freyther
4  * Copyright (C) 2008 Apple, Inc. All rights reserved.
5  * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
6  * Copyright (C) 2010 Sencha, Inc. All rights reserved.
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 "PlatformString.h"
37 #include <QDateTime>
38 #include <QDir>
39 #include <QFile>
40 #include <QFileInfo>
41 #include <QTemporaryFile>
42 #include <wtf/text/CString.h>
43 
44 namespace WebCore {
45 
fileExists(const String & path)46 bool fileExists(const String& path)
47 {
48     return QFile::exists(path);
49 }
50 
51 
deleteFile(const String & path)52 bool deleteFile(const String& path)
53 {
54     return QFile::remove(path);
55 }
56 
deleteEmptyDirectory(const String & path)57 bool deleteEmptyDirectory(const String& path)
58 {
59     return QDir::root().rmdir(path);
60 }
61 
getFileSize(const String & path,long long & result)62 bool getFileSize(const String& path, long long& result)
63 {
64     QFileInfo info(path);
65     result = info.size();
66     return info.exists();
67 }
68 
getFileModificationTime(const String & path,time_t & result)69 bool getFileModificationTime(const String& path, time_t& result)
70 {
71     QFileInfo info(path);
72     result = info.lastModified().toTime_t();
73     return info.exists();
74 }
75 
makeAllDirectories(const String & path)76 bool makeAllDirectories(const String& path)
77 {
78     return QDir::root().mkpath(path);
79 }
80 
pathByAppendingComponent(const String & path,const String & component)81 String pathByAppendingComponent(const String& path, const String& component)
82 {
83     return QDir::toNativeSeparators(QDir(path).filePath(component));
84 }
85 
homeDirectoryPath()86 String homeDirectoryPath()
87 {
88     return QDir::homePath();
89 }
90 
pathGetFileName(const String & path)91 String pathGetFileName(const String& path)
92 {
93     return QFileInfo(path).fileName();
94 }
95 
directoryName(const String & path)96 String directoryName(const String& path)
97 {
98     return QFileInfo(path).absolutePath();
99 }
100 
listDirectory(const String & path,const String & filter)101 Vector<String> listDirectory(const String& path, const String& filter)
102 {
103     Vector<String> entries;
104 
105     QStringList nameFilters;
106     if (!filter.isEmpty())
107         nameFilters.append(filter);
108     QFileInfoList fileInfoList = QDir(path).entryInfoList(nameFilters, QDir::AllEntries | QDir::NoDotAndDotDot);
109     foreach (const QFileInfo fileInfo, fileInfoList) {
110         String entry = String(fileInfo.canonicalFilePath());
111         entries.append(entry);
112     }
113 
114     return entries;
115 }
116 
openTemporaryFile(const String & prefix,PlatformFileHandle & handle)117 String openTemporaryFile(const String& prefix, PlatformFileHandle& handle)
118 {
119 #ifndef QT_NO_TEMPORARYFILE
120     QTemporaryFile* tempFile = new QTemporaryFile(QDir::tempPath() + QLatin1Char('/') + QString(prefix));
121     tempFile->setAutoRemove(false);
122     QFile* temp = tempFile;
123     if (temp->open(QIODevice::ReadWrite)) {
124         handle = temp;
125         return temp->fileName();
126     }
127 #endif
128     handle = invalidPlatformFileHandle;
129     return String();
130 }
131 
openFile(const String & path,FileOpenMode mode)132 PlatformFileHandle openFile(const String& path, FileOpenMode mode)
133 {
134     QIODevice::OpenMode platformMode;
135 
136     if (mode == OpenForRead)
137         platformMode = QIODevice::ReadOnly;
138     else if (mode == OpenForWrite)
139         platformMode = (QIODevice::WriteOnly | QIODevice::Truncate);
140     else
141         return invalidPlatformFileHandle;
142 
143     QFile* file = new QFile(path);
144     if (file->open(platformMode))
145         return file;
146 
147     return invalidPlatformFileHandle;
148 }
149 
readFromFile(PlatformFileHandle handle,char * data,int length)150 int readFromFile(PlatformFileHandle handle, char* data, int length)
151 {
152     if (handle && handle->exists() && handle->isReadable())
153         return handle->read(data, length);
154     return 0;
155 }
156 
closeFile(PlatformFileHandle & handle)157 void closeFile(PlatformFileHandle& handle)
158 {
159     if (handle) {
160         handle->close();
161         delete handle;
162     }
163 }
164 
seekFile(PlatformFileHandle handle,long long offset,FileSeekOrigin origin)165 long long seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
166 {
167     if (handle) {
168         long long current = 0;
169 
170         switch (origin) {
171         case SeekFromBeginning:
172             break;
173         case SeekFromCurrent:
174             current = handle->pos();
175             break;
176         case SeekFromEnd:
177             current = handle->size();
178             break;
179         }
180 
181         // Add the offset to the current position and seek to the new position
182         // Return our new position if the seek is successful
183         current += offset;
184         if (handle->seek(current))
185             return current;
186         else
187             return -1;
188     }
189 
190     return -1;
191 }
192 
writeToFile(PlatformFileHandle handle,const char * data,int length)193 int writeToFile(PlatformFileHandle handle, const char* data, int length)
194 {
195     if (handle && handle->exists() && handle->isWritable())
196         return handle->write(data, length);
197 
198     return 0;
199 }
200 
unloadModule(PlatformModule module)201 bool unloadModule(PlatformModule module)
202 {
203 #if defined(Q_WS_MAC)
204     CFRelease(module);
205     return true;
206 
207 #elif defined(Q_OS_WIN)
208     return ::FreeLibrary(module);
209 
210 #else
211 #ifndef QT_NO_LIBRARY
212     if (module->unload()) {
213         delete module;
214         return true;
215     }
216 #endif
217     return false;
218 #endif
219 }
220 
221 }
222 
223 // vim: ts=4 sw=4 et
224