131 lines
3 KiB
C++
131 lines
3 KiB
C++
#ifndef FSPROXY_H
|
|
#define FSPROXY_H
|
|
|
|
#include <QObject>
|
|
#include <QFile>
|
|
#include <QMap>
|
|
#include <QMutex>
|
|
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
|
|
class Database;
|
|
class OpenFile : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
QString m_logicalpath;
|
|
QString m_filepath;
|
|
|
|
int m_fd;
|
|
QFile *m_file;
|
|
QMutex m_mutex;
|
|
};
|
|
|
|
class ProxyCacheEntryChunk : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
quint64 m_start;
|
|
QByteArray m_data;
|
|
time_t m_lastAccess;
|
|
quint32 m_accessCount;
|
|
|
|
ProxyCacheEntryChunk(quint64 start, QObject *parent=NULL) :
|
|
QObject(parent),
|
|
m_start{start},
|
|
m_lastAccess{0},
|
|
m_accessCount{0}
|
|
{}
|
|
};
|
|
|
|
class FSProxy;
|
|
class ProxyCacheEntry : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
FSProxy *m_parent;
|
|
|
|
public:
|
|
QString m_logicalpath;
|
|
QString m_filepath;
|
|
|
|
int m_accessCount;
|
|
off_t m_offset;
|
|
struct stat m_stat;
|
|
time_t m_lastAccess;
|
|
QMutex m_mutex;
|
|
|
|
QMap< quint64, ProxyCacheEntryChunk * > m_chunks;
|
|
|
|
ProxyCacheEntry(FSProxy *parent=NULL);
|
|
~ProxyCacheEntry() { clear(); }
|
|
|
|
void clear();
|
|
void clean();
|
|
qint64 sparseRead(int fd, char *buf, size_t size, off_t offset);
|
|
};
|
|
|
|
class FSProxyElement : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
QString m_path;
|
|
|
|
public:
|
|
explicit FSProxyElement(const QString &path, QObject *parent=nullptr);
|
|
|
|
QString resolvePath(const QString &path, int *matchlength);
|
|
};
|
|
|
|
class FSProxy : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
Database *m_db;
|
|
int m_profileId;
|
|
QString m_gamename;
|
|
QString m_gamedir;
|
|
QString m_createPath;
|
|
|
|
public:
|
|
//QString m_path;
|
|
QMap< QString, ProxyCacheEntry * > m_cache;
|
|
//QMap< QString, QString > m_cache;
|
|
QMap< int, OpenFile * > m_openFiles;
|
|
QMutex m_filesMutex;
|
|
QList< FSProxyElement * > m_proxies;
|
|
|
|
explicit FSProxy(QObject *parent = nullptr);
|
|
|
|
void setup(Database *db, int profileId, const QString &gamename, const QString &gamedir, const QString &createPath);
|
|
|
|
//void setRoot(const QString &path);
|
|
QStringList readdir(const QString &path);
|
|
bool getattr(const QString &path, struct stat *st);
|
|
int open(const QString &path, bool createIfNeeded=false);
|
|
bool close(int fd);
|
|
size_t read(int fd, char *buf, size_t size, off_t offset);
|
|
int mknod(const QString &qpath, mode_t mode, dev_t dev);
|
|
int mkdir(const QString &qpath, mode_t mode);
|
|
int unlink(const QString &qpath);
|
|
int rmdir(const QString &qpath);
|
|
int rename(const QString &qpath, const QString &qnewpath, unsigned int flags);
|
|
int truncate(const QString &qpath, off_t offset);
|
|
int write(int fd, const char *buf, size_t bufsz, off_t offset);
|
|
off_t lseek(int fd, off_t off, int whence);
|
|
|
|
ProxyCacheEntry *cacheFile(const QString &qpath);
|
|
|
|
public slots:
|
|
void addRoot(const QString &path);
|
|
void clear();
|
|
void reload();
|
|
void cleanCache();
|
|
|
|
signals:
|
|
};
|
|
|
|
#endif // FSPROXY_H
|