#include "config.h"
#include "FileSystem.h"
#include "PlatformString.h"
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTemporaryFile>
#include <wtf/text/CString.h>
namespace WebCore {
bool fileExists(const String& path)
{
return QFile::exists(path);
}
bool deleteFile(const String& path)
{
return QFile::remove(path);
}
bool deleteEmptyDirectory(const String& path)
{
return QDir::root().rmdir(path);
}
bool getFileSize(const String& path, long long& result)
{
QFileInfo info(path);
result = info.size();
return info.exists();
}
bool getFileModificationTime(const String& path, time_t& result)
{
QFileInfo info(path);
result = info.lastModified().toTime_t();
return info.exists();
}
bool makeAllDirectories(const String& path)
{
return QDir::root().mkpath(path);
}
String pathByAppendingComponent(const String& path, const String& component)
{
return QDir::toNativeSeparators(QDir(path).filePath(component));
}
String homeDirectoryPath()
{
return QDir::homePath();
}
String pathGetFileName(const String& path)
{
return QFileInfo(path).fileName();
}
String directoryName(const String& path)
{
return QFileInfo(path).absolutePath();
}
Vector<String> listDirectory(const String& path, const String& filter)
{
Vector<String> entries;
QStringList nameFilters;
if (!filter.isEmpty())
nameFilters.append(filter);
QFileInfoList fileInfoList = QDir(path).entryInfoList(nameFilters, QDir::AllEntries | QDir::NoDotAndDotDot);
foreach (const QFileInfo fileInfo, fileInfoList) {
String entry = String(fileInfo.canonicalFilePath());
entries.append(entry);
}
return entries;
}
String openTemporaryFile(const String& prefix, PlatformFileHandle& handle)
{
#ifndef QT_NO_TEMPORARYFILE
QTemporaryFile* tempFile = new QTemporaryFile(QDir::tempPath() + QLatin1Char('/') + QString(prefix));
tempFile->setAutoRemove(false);
QFile* temp = tempFile;
if (temp->open(QIODevice::ReadWrite)) {
handle = temp;
return temp->fileName();
}
#endif
handle = invalidPlatformFileHandle;
return String();
}
PlatformFileHandle openFile(const String& path, FileOpenMode mode)
{
QIODevice::OpenMode platformMode;
if (mode == OpenForRead)
platformMode = QIODevice::ReadOnly;
else if (mode == OpenForWrite)
platformMode = (QIODevice::WriteOnly | QIODevice::Truncate);
else
return invalidPlatformFileHandle;
QFile* file = new QFile(path);
if (file->open(platformMode))
return file;
return invalidPlatformFileHandle;
}
int readFromFile(PlatformFileHandle handle, char* data, int length)
{
if (handle && handle->exists() && handle->isReadable())
return handle->read(data, length);
return 0;
}
void closeFile(PlatformFileHandle& handle)
{
if (handle) {
handle->close();
delete handle;
}
}
long long seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
{
if (handle) {
long long current = 0;
switch (origin) {
case SeekFromBeginning:
break;
case SeekFromCurrent:
current = handle->pos();
break;
case SeekFromEnd:
current = handle->size();
break;
}
current += offset;
if (handle->seek(current))
return current;
else
return -1;
}
return -1;
}
int writeToFile(PlatformFileHandle handle, const char* data, int length)
{
if (handle && handle->exists() && handle->isWritable())
return handle->write(data, length);
return 0;
}
bool unloadModule(PlatformModule module)
{
#if defined(Q_WS_MAC)
CFRelease(module);
return true;
#elif defined(Q_OS_WIN)
return ::FreeLibrary(module);
#else
#ifndef QT_NO_LIBRARY
if (module->unload()) {
delete module;
return true;
}
#endif
return false;
#endif
}
}