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); +}