QTfrontend/util/FileEngine.cpp
branchphysfslayer
changeset 7768 13e2037ebc79
child 7770 ff3442338882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/util/FileEngine.cpp	Sat Oct 20 00:20:39 2012 +0400
@@ -0,0 +1,226 @@
+/* borrowed from https://github.com/skhaz/qt-physfs-wrapper
+ * TODO: add copyright header, determine license
+ */
+
+#include "FileEngine.h"
+
+FileEngine::FileEngine(const QString& filename)
+: _handler(NULL)
+, _flags(0)
+{
+    setFileName(filename);
+}
+
+FileEngine::~FileEngine()
+{
+    close();
+}
+
+bool FileEngine::open(QIODevice::OpenMode openMode)
+{
+    close();
+
+    if (openMode & QIODevice::WriteOnly) {
+        _handler = PHYSFS_openWrite(_filename.toUtf8().constData());
+        _flags = QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::FileType;
+    }
+
+    else if (openMode & QIODevice::ReadOnly) {
+        _handler = PHYSFS_openRead(_filename.toUtf8().constData());
+    }
+
+    else if (openMode & QIODevice::Append) {
+        _handler = PHYSFS_openAppend(_filename.toUtf8().constData());
+    }
+
+    else {
+        qWarning("Bad file open mode: %d", (int)openMode);
+    }
+
+    if (!_handler) {
+        qWarning("Failed to open %s, reason: %s", _filename.toUtf8().constData(), PHYSFS_getLastError());
+        return false;
+    }
+
+    return true;
+}
+
+bool FileEngine::close()
+{
+    if (isOpened()) {
+        int result = PHYSFS_close(_handler);
+        _handler = NULL;
+        return result != 0;
+    }
+
+    return true;
+}
+
+bool FileEngine::flush()
+{
+    return PHYSFS_flush(_handler) != 0;
+}
+
+qint64 FileEngine::size() const
+{
+    return _size;
+}
+
+qint64 FileEngine::pos() const
+{
+    return PHYSFS_tell(_handler);
+}
+
+bool FileEngine::seek(qint64 pos)
+{
+    return PHYSFS_seek(_handler, pos) != 0;
+}
+
+bool FileEngine::isSequential() const
+{
+    return true;
+}
+
+bool FileEngine::remove()
+{
+    return PHYSFS_delete(_filename.toUtf8().constData()) != 0;
+}
+
+bool FileEngine::mkdir(const QString &dirName, bool createParentDirectories) const
+{
+    Q_UNUSED(createParentDirectories);
+    return PHYSFS_mkdir(dirName.toUtf8().constData()) != 0;
+}
+
+bool FileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const
+{
+    Q_UNUSED(recurseParentDirectories);
+    return PHYSFS_delete(dirName.toUtf8().constData()) != 0;
+}
+
+bool FileEngine::caseSensitive() const
+{
+    return true;
+}
+
+bool FileEngine::isRelativePath() const
+{
+    return true;
+}
+
+QStringList FileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const
+{
+    Q_UNUSED(filters);
+
+    QString file;
+    QStringList result;
+    char **files = PHYSFS_enumerateFiles("");
+
+    for (char **i = files; *i != NULL; i++) {
+        file = QString::fromAscii(*i);
+        if (QDir::match(filterNames, file)) {
+            result << file;
+        }
+    }
+
+    PHYSFS_freeList(files);
+    return result;
+}
+
+QAbstractFileEngine::FileFlags FileEngine::fileFlags(FileFlags type) const
+{
+    return type & _flags;
+}
+
+QString FileEngine::fileName(FileName file) const
+{
+    if (file == QAbstractFileEngine::AbsolutePathName)
+        return PHYSFS_getWriteDir();
+
+    return _filename;
+}
+
+QDateTime FileEngine::fileTime(FileTime time) const
+{
+    switch (time)
+    {
+        case QAbstractFileEngine::ModificationTime:
+        default:
+            return _datetime;
+            break;
+    };
+}
+
+void FileEngine::setFileName(const QString &file)
+{
+    _filename = file;
+    PHYSFS_Stat stat;
+    if (PHYSFS_stat(_filename.toUtf8().constData(), &stat) != 0) {
+        _size = stat.filesize;
+        _datetime = QDateTime::fromTime_t(stat.modtime);
+        _flags |= QAbstractFileEngine::ExistsFlag;
+
+        switch (stat.filetype)
+        {
+            case PHYSFS_FILETYPE_REGULAR:
+                _flags |= QAbstractFileEngine::FileType;
+                break;
+
+            case PHYSFS_FILETYPE_DIRECTORY:
+                _flags |= QAbstractFileEngine::DirectoryType;
+                break;
+            case PHYSFS_FILETYPE_SYMLINK:
+                _flags |= QAbstractFileEngine::LinkType;
+                break;
+            default: ;
+        };
+    }
+}
+
+bool FileEngine::atEnd() const
+{
+    return PHYSFS_eof(_handler) != 0;
+}
+
+qint64 FileEngine::read(char *data, qint64 maxlen)
+{
+    return PHYSFS_readBytes(_handler, data, maxlen);
+}
+
+qint64 FileEngine::readLine(char *data, qint64 maxlen)
+{
+    Q_UNUSED(data);
+    Q_UNUSED(maxlen);
+    // TODO
+    return 0;
+}
+
+qint64 FileEngine::write(const char *data, qint64 len)
+{
+    return PHYSFS_writeBytes(_handler, data, len);
+}
+
+bool FileEngine::isOpened() const
+{
+    return _handler != NULL;
+}
+
+QFile::FileError FileEngine::error() const
+{
+    return QFile::UnspecifiedError;
+}
+
+QString FileEngine::errorString() const
+{
+    return PHYSFS_getLastError();
+}
+
+bool FileEngine::supportsExtension(Extension extension) const
+{
+    return extension == QAbstractFileEngine::AtEndExtension;
+}
+
+QAbstractFileEngine* FileEngineHandler::create(const QString &filename) const
+{
+    return new FileEngine(filename);
+}