QTfrontend/util/FileEngine.cpp
author Mitchell Kember <mk12360@gmail.com>
Fri, 30 Nov 2012 20:00:53 -0500
changeset 8149 237802cf4610
parent 8115 ac1007c6dea8
child 8178 8bd087478b48
permissions -rw-r--r--
Google Code-in: Center help text field Modifies the grid layout slightly so that the help text which appears when hovering over certain elements is centered with respect to the window, even when there are more buttons on one side. https://google-melange.appspot.com/gci/task/view/google/gci2012/7968226
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     1
/* borrowed from https://github.com/skhaz/qt-physfs-wrapper
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     2
 * TODO: add copyright header, determine license
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     3
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     4
8052
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 7955
diff changeset
     5
#include "hwpacksmounter.h"
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     6
#include "FileEngine.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     7
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
     8
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
     9
const QString FileEngineHandler::scheme = "physfs:/";
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
    10
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    11
FileEngine::FileEngine(const QString& filename)
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    12
    : m_handle(NULL)
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    13
    , m_flags(0)
8112
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
    14
    , m_bufferSet(false)
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    15
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    16
    setFileName(filename);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    17
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    18
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    19
FileEngine::~FileEngine()
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    20
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    21
    close();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    22
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    23
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    24
bool FileEngine::open(QIODevice::OpenMode openMode)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    25
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    26
    close();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    27
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    28
    if (openMode & QIODevice::WriteOnly) {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    29
        m_handle = PHYSFS_openWrite(m_fileName.toUtf8().constData());
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    30
        m_flags = QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::FileType;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    31
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    32
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    33
    else if (openMode & QIODevice::ReadOnly) {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    34
        m_handle = PHYSFS_openRead(m_fileName.toUtf8().constData());
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    35
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    36
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    37
    else if (openMode & QIODevice::Append) {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    38
        m_handle = PHYSFS_openAppend(m_fileName.toUtf8().constData());
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    39
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    40
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    41
    else {
8098
4efee370e2de - Fix saving .ini files
unc0rr
parents: 8085
diff changeset
    42
        qWarning("[PHYSFS] Bad file open mode: %d", (int)openMode);
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    43
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    44
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    45
    if (!m_handle) {
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    46
        qWarning("[PHYSFS] Failed to open %s, reason: %s", m_fileName.toUtf8().constData(), PHYSFS_getLastError());
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    47
        return false;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    48
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    49
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    50
    return true;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    51
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    52
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    53
bool FileEngine::close()
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    54
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    55
    if (isOpened()) {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    56
        int result = PHYSFS_close(m_handle);
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    57
        m_handle = NULL;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    58
        return result != 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    59
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    60
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    61
    return true;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    62
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    63
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    64
bool FileEngine::flush()
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    65
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    66
    return PHYSFS_flush(m_handle) != 0;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    67
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    68
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    69
qint64 FileEngine::size() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    70
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    71
    return m_size;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    72
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    73
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    74
qint64 FileEngine::pos() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    75
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    76
    return PHYSFS_tell(m_handle);
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    77
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    78
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    79
bool FileEngine::seek(qint64 pos)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    80
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    81
    return PHYSFS_seek(m_handle, pos) != 0;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    82
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    83
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    84
bool FileEngine::isSequential() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    85
{
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
    86
    return false;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    87
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    88
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    89
bool FileEngine::remove()
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    90
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
    91
    return PHYSFS_delete(m_fileName.toUtf8().constData()) != 0;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    92
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    93
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    94
bool FileEngine::mkdir(const QString &dirName, bool createParentDirectories) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    95
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    96
    Q_UNUSED(createParentDirectories);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    97
    return PHYSFS_mkdir(dirName.toUtf8().constData()) != 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    98
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    99
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   100
bool FileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   101
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   102
    Q_UNUSED(recurseParentDirectories);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   103
    return PHYSFS_delete(dirName.toUtf8().constData()) != 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   104
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   105
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   106
bool FileEngine::caseSensitive() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   107
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   108
    return true;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   109
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   110
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   111
bool FileEngine::isRelativePath() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   112
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   113
    return true;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   114
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   115
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   116
QAbstractFileEngineIterator * FileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   117
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   118
    return new FileEngineIterator(filters, filterNames, entryList(filters, filterNames));
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   119
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   120
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   121
QStringList FileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   122
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   123
    Q_UNUSED(filters);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   124
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   125
    QString file;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   126
    QStringList result;
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   127
    char **files = PHYSFS_enumerateFiles(m_fileName.toUtf8().constData());
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   128
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   129
    for (char **i = files; *i != NULL; i++) {
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   130
        file = QString::fromUtf8(*i);
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   131
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   132
        if (filterNames.isEmpty() || QDir::match(filterNames, file)) {
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   133
            result << file;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   134
        }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   135
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   136
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   137
    PHYSFS_freeList(files);
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   138
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   139
    return result;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   140
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   141
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   142
QAbstractFileEngine::FileFlags FileEngine::fileFlags(FileFlags type) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   143
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   144
    return type & m_flags;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   145
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   146
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   147
QString FileEngine::fileName(FileName file) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   148
{
8085
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   149
    switch(file)
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   150
    {
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   151
        case QAbstractFileEngine::AbsolutePathName:
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   152
        {
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   153
            QString s(PHYSFS_getWriteDir());
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   154
            return s;
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   155
        }
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   156
        case QAbstractFileEngine::BaseName:
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   157
        {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   158
            int l = m_fileName.lastIndexOf('/');
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   159
            QString s = m_fileName.mid(l + 1);
8085
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   160
            return s;
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   161
        }
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   162
        case QAbstractFileEngine::DefaultName:
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   163
        case QAbstractFileEngine::AbsoluteName:
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   164
        default:
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   165
        {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   166
            QString s = "physfs:/" + m_fileName;
8085
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   167
            return s;
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   168
        }
6c059add1560 Take care of parameter passed to FileEngine::fileName. Fixes problem with weird paths on windows.
unc0rr
parents: 8052
diff changeset
   169
    }
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   170
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   171
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   172
QDateTime FileEngine::fileTime(FileTime time) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   173
{
7955
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   174
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   175
    switch (time)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   176
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   177
        case QAbstractFileEngine::ModificationTime:
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   178
        default:
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   179
            return m_date;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   180
            break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   181
    };
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   182
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   183
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   184
void FileEngine::setFileName(const QString &file)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   185
{
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   186
    if(file.startsWith(FileEngineHandler::scheme))
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   187
        m_fileName = file.mid(FileEngineHandler::scheme.size());
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   188
    else
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   189
        m_fileName = file;
7931
5a27ed7f17b7 Wee, now frontend is able to load translation file
unc0rr
parents: 7770
diff changeset
   190
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   191
    PHYSFS_Stat stat;
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   192
    if (PHYSFS_stat(m_fileName.toUtf8().constData(), &stat) != 0) {
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   193
        m_size = stat.filesize;
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   194
        m_date = QDateTime::fromTime_t(stat.modtime);
7955
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   195
//        _flags |= QAbstractFileEngine::WriteUserPerm;
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   196
        m_flags |= QAbstractFileEngine::ReadUserPerm;
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   197
        m_flags |= QAbstractFileEngine::ExistsFlag;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   198
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   199
        switch (stat.filetype)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   200
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   201
            case PHYSFS_FILETYPE_REGULAR:
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   202
                m_flags |= QAbstractFileEngine::FileType;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   203
                break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   204
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   205
            case PHYSFS_FILETYPE_DIRECTORY:
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   206
                m_flags |= QAbstractFileEngine::DirectoryType;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   207
                break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   208
            case PHYSFS_FILETYPE_SYMLINK:
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   209
                m_flags |= QAbstractFileEngine::LinkType;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   210
                break;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   211
            default: ;
7955
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   212
        }
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   213
    }
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   214
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   215
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   216
bool FileEngine::atEnd() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   217
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   218
    return PHYSFS_eof(m_handle) != 0;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   219
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   220
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   221
qint64 FileEngine::read(char *data, qint64 maxlen)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   222
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   223
    return PHYSFS_readBytes(m_handle, data, maxlen);
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   224
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   225
8112
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   226
qint64 FileEngine::readLine(char *data, qint64 maxlen)
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   227
{
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   228
    if(!m_bufferSet)
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   229
    {
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   230
        PHYSFS_setBuffer(m_handle, 4096);
8112
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   231
        m_bufferSet = true;
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   232
    }
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   233
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   234
    qint64 bytesRead = 0;
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   235
    while(PHYSFS_readBytes(m_handle, data, 1)
8112
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   236
          && maxlen
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   237
          && (*data == '\n'))
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   238
    {
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   239
        ++data;
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   240
        --maxlen;
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   241
        ++bytesRead;
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   242
    }
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   243
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   244
    return bytesRead;
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   245
}
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   246
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   247
qint64 FileEngine::write(const char *data, qint64 len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   248
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   249
    return PHYSFS_writeBytes(m_handle, data, len);
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   250
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   251
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   252
bool FileEngine::isOpened() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   253
{
8115
ac1007c6dea8 Refactor identifiers names
unc0rr
parents: 8112
diff changeset
   254
    return m_handle != NULL;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   255
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   256
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   257
QFile::FileError FileEngine::error() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   258
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   259
    return QFile::UnspecifiedError;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   260
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   261
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   262
QString FileEngine::errorString() const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   263
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   264
    return PHYSFS_getLastError();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   265
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   266
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   267
bool FileEngine::supportsExtension(Extension extension) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   268
{
8112
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   269
    return
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   270
            (extension == QAbstractFileEngine::AtEndExtension)
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   271
            || (extension == QAbstractFileEngine::FastReadLineExtension)
d85dc8a8f41c Implement QAbstractFileEngine::FastReadLineExtension
unc0rr
parents: 8098
diff changeset
   272
            ;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   273
}
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   274
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   275
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   276
FileEngineHandler::FileEngineHandler(char *argv0)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   277
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   278
    PHYSFS_init(argv0);
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   279
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   280
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   281
FileEngineHandler::~FileEngineHandler()
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   282
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   283
    PHYSFS_deinit();
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   284
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   285
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   286
QAbstractFileEngine* FileEngineHandler::create(const QString &filename) const
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   287
{
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   288
    if (filename.startsWith(scheme))
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   289
        return new FileEngine(filename.mid(scheme.size()));
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   290
    else
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   291
        return NULL;
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   292
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   293
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   294
void FileEngineHandler::mount(const QString &path)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   295
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   296
    PHYSFS_mount(path.toUtf8().constData(), NULL, 1);
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   297
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   298
7955
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   299
void FileEngineHandler::mount(const QString & path, const QString & mountPoint)
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   300
{
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   301
    PHYSFS_mount(path.toUtf8().constData(), mountPoint.toUtf8().constData(), 1);
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   302
}
85b3970b402a - Load teams via physfs
unc0rr
parents: 7931
diff changeset
   303
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   304
void FileEngineHandler::setWriteDir(const QString &path)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   305
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   306
    PHYSFS_setWriteDir(path.toUtf8().constData());
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   307
}
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   308
8052
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 7955
diff changeset
   309
void FileEngineHandler::mountPacks()
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 7955
diff changeset
   310
{
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 7955
diff changeset
   311
    hedgewarsMountPackages();
845b5ae03841 Mount .hwt files found in Data folder
unc0rr
parents: 7955
diff changeset
   312
}
7770
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   313
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   314
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   315
FileEngineIterator::FileEngineIterator(QDir::Filters filters, const QStringList &nameFilters, const QStringList &entries)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   316
    : QAbstractFileEngineIterator(filters, nameFilters)
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   317
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   318
    m_entries = entries;
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   319
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   320
    /* heck.. docs are unclear on this
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   321
     * QDirIterator puts iterator before first entry
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   322
     * but QAbstractFileEngineIterator example puts iterator on first entry
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   323
     * though QDirIterator approach seems to be the right one
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   324
     */
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   325
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   326
    m_index = -1;
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   327
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   328
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   329
bool FileEngineIterator::hasNext() const
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   330
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   331
    return m_index < m_entries.size() - 1;
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   332
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   333
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   334
QString FileEngineIterator::next()
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   335
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   336
   if (!hasNext())
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   337
       return QString();
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   338
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   339
   ++m_index;
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   340
   return currentFilePath();
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   341
}
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   342
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   343
QString FileEngineIterator::currentFileName() const
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   344
{
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   345
    return m_entries.at(m_index);
ff3442338882 Many bugfixes and features to FileEngine
unc0rr
parents: 7768
diff changeset
   346
}