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 46 bool fileExists(const String& path) 47 { 48 return QFile::exists(path); 49 } 50 51 52 bool deleteFile(const String& path) 53 { 54 return QFile::remove(path); 55 } 56 57 bool deleteEmptyDirectory(const String& path) 58 { 59 return QDir::root().rmdir(path); 60 } 61 62 bool getFileSize(const String& path, long long& result) 63 { 64 QFileInfo info(path); 65 result = info.size(); 66 return info.exists(); 67 } 68 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 76 bool makeAllDirectories(const String& path) 77 { 78 return QDir::root().mkpath(path); 79 } 80 81 String pathByAppendingComponent(const String& path, const String& component) 82 { 83 return QDir::toNativeSeparators(QDir(path).filePath(component)); 84 } 85 86 String homeDirectoryPath() 87 { 88 return QDir::homePath(); 89 } 90 91 String pathGetFileName(const String& path) 92 { 93 return QFileInfo(path).fileName(); 94 } 95 96 String directoryName(const String& path) 97 { 98 return QFileInfo(path).absolutePath(); 99 } 100 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 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 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 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 157 void closeFile(PlatformFileHandle& handle) 158 { 159 if (handle) { 160 handle->close(); 161 delete handle; 162 } 163 } 164 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 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 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