# HG changeset patch # User unc0rr # Date 1350765108 -14400 # Node ID ff34423388821ba7214c7c3ee169c979f77f04e9 # Parent 13e2037ebc798bac242a2803881868012bba973d Many bugfixes and features to FileEngine diff -r 13e2037ebc79 -r ff3442338882 QTfrontend/util/FileEngine.cpp --- a/QTfrontend/util/FileEngine.cpp Sat Oct 20 00:20:39 2012 +0400 +++ b/QTfrontend/util/FileEngine.cpp Sun Oct 21 00:31:48 2012 +0400 @@ -4,6 +4,9 @@ #include "FileEngine.h" + +const QString FileEngineHandler::scheme = "physfs:/"; + FileEngine::FileEngine(const QString& filename) : _handler(NULL) , _flags(0) @@ -78,7 +81,7 @@ bool FileEngine::isSequential() const { - return true; + return false; } bool FileEngine::remove() @@ -108,22 +111,29 @@ return true; } +QAbstractFileEngineIterator * FileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) +{ + return new FileEngineIterator(filters, filterNames, entryList(filters, filterNames)); +} + QStringList FileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const { Q_UNUSED(filters); QString file; QStringList result; - char **files = PHYSFS_enumerateFiles(""); + char **files = PHYSFS_enumerateFiles(_filename.toUtf8().constData()); for (char **i = files; *i != NULL; i++) { - file = QString::fromAscii(*i); - if (QDir::match(filterNames, file)) { + file = QString::fromUtf8(*i); + + if (filterNames.isEmpty() || QDir::match(filterNames, file)) { result << file; } } PHYSFS_freeList(files); + return result; } @@ -153,7 +163,10 @@ void FileEngine::setFileName(const QString &file) { - _filename = file; + if(file.startsWith(FileEngineHandler::scheme)) + _filename = file.mid(FileEngineHandler::scheme.size()); + else + _filename = file; PHYSFS_Stat stat; if (PHYSFS_stat(_filename.toUtf8().constData(), &stat) != 0) { _size = stat.filesize; @@ -187,14 +200,6 @@ 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); @@ -220,7 +225,67 @@ return extension == QAbstractFileEngine::AtEndExtension; } + + +FileEngineHandler::FileEngineHandler(char *argv0) +{ + PHYSFS_init(argv0); +} + +FileEngineHandler::~FileEngineHandler() +{ + PHYSFS_deinit(); +} + QAbstractFileEngine* FileEngineHandler::create(const QString &filename) const { - return new FileEngine(filename); + if (filename.startsWith(scheme)) + return new FileEngine(filename.mid(scheme.size())); + else + return NULL; +} + +void FileEngineHandler::mount(const QString &path) +{ + PHYSFS_mount(path.toUtf8().constData(), NULL, 1); +} + +void FileEngineHandler::setWriteDir(const QString &path) +{ + PHYSFS_setWriteDir(path.toUtf8().constData()); } + + + +FileEngineIterator::FileEngineIterator(QDir::Filters filters, const QStringList &nameFilters, const QStringList &entries) + : QAbstractFileEngineIterator(filters, nameFilters) +{ + m_entries = entries; + + /* heck.. docs are unclear on this + * QDirIterator puts iterator before first entry + * but QAbstractFileEngineIterator example puts iterator on first entry + * though QDirIterator approach seems to be the right one + */ + + m_index = -1; +} + +bool FileEngineIterator::hasNext() const +{ + return m_index < m_entries.size() - 1; +} + +QString FileEngineIterator::next() +{ + if (!hasNext()) + return QString(); + + ++m_index; + return currentFilePath(); +} + +QString FileEngineIterator::currentFileName() const +{ + return m_entries.at(m_index); +} diff -r 13e2037ebc79 -r ff3442338882 QTfrontend/util/FileEngine.h --- a/QTfrontend/util/FileEngine.h Sat Oct 20 00:20:39 2012 +0400 +++ b/QTfrontend/util/FileEngine.h Sun Oct 21 00:31:48 2012 +0400 @@ -3,6 +3,7 @@ #include #include +#include #include #include "physfs.h" @@ -28,6 +29,7 @@ virtual bool rmdir(const QString &dirName, bool recurseParentDirectories) const; virtual bool caseSensitive() const; virtual bool isRelativePath() const; + QAbstractFileEngineIterator *beginEntryList(QDir::Filters filters, const QStringList & filterNames); virtual QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const; virtual FileFlags fileFlags(FileFlags type=FileInfoAll) const; virtual QString fileName(FileName file=DefaultName) const; @@ -36,7 +38,6 @@ bool atEnd() const; virtual qint64 read(char *data, qint64 maxlen); - virtual qint64 readLine(char *data, qint64 maxlen); virtual qint64 write(const char *data, qint64 len); bool isOpened() const; @@ -57,7 +58,29 @@ class FileEngineHandler : public QAbstractFileEngineHandler { public: + FileEngineHandler(char * argv0); + ~FileEngineHandler(); + QAbstractFileEngine *create(const QString &filename) const; + + void mount(const QString & path); + void setWriteDir(const QString & path); + +// private: + static const QString scheme; +}; + +class FileEngineIterator : public QAbstractFileEngineIterator +{ +public: + FileEngineIterator(QDir::Filters filters, const QStringList & nameFilters, const QStringList & entries); + + bool hasNext() const; + QString next(); + QString currentFileName() const; +private: + QStringList m_entries; + int m_index; }; #endif