#include "config.h"
#include "FileSystem.h"
#include "FileMetadata.h"
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTemporaryFile>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
#if !defined(Q_OS_WIN)
#include <sys/statvfs.h>
#endif
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 getFileMetadata(const String& path, FileMetadata& result)
{
QFileInfo info(path);
if (!info.exists())
return false;
result.modificationTime = info.lastModified().toTime_t();
result.length = info.size();
result.type = info.isDir() ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
return true;
}
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;
}
uint64_t getVolumeFreeSizeForPath(const char* path)
{
#if defined(Q_OS_WIN)
ULARGE_INTEGER freeBytesToCaller;
BOOL result = GetDiskFreeSpaceExW((LPCWSTR)path, &freeBytesToCaller, 0, 0);
if (!result)
return 0;
return static_cast<uint64_t>(freeBytesToCaller.QuadPart);
#else
struct statvfs volumeInfo;
if (statvfs(path, &volumeInfo))
return 0;
return static_cast<uint64_t>(volumeInfo.f_bavail) * static_cast<uint64_t>(volumeInfo.f_frsize);
#endif
}
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
}
}