Updated QML and C++ in various places to build and work with new Qt (6.4+) Minor bugfixes, possibly caused by the Qt version bump, and mostly in JS logic. Tried (again) to get mod sorting working by dragging them within the list. Initial support for Profiles. (To switch between FO4 and FOLON, for example.) Initial "Launch Game" stuff, but it's far from done. Don't use it (yet).
150 lines
5.1 KiB
C++
150 lines
5.1 KiB
C++
#include "archivemanager.h"
|
|
#include "database.h"
|
|
|
|
#include <QDir>
|
|
|
|
ArchiveManager::ArchiveManager(Database *db, const QString &modsdir, int profileId, QObject *parent)
|
|
: QObject{parent},
|
|
m_database{db},
|
|
m_modsdir{modsdir},
|
|
m_profileId{profileId}
|
|
{
|
|
reloadArchives();
|
|
|
|
connect( &m_cacheTimer, &QTimer::timeout, this, &ArchiveManager::cleanCache );
|
|
m_cacheTimer.setInterval(60000);
|
|
m_cacheTimer.start();
|
|
//QObject::connect( m_database, &Database::databaseModified, this, &ArchiveManager::reloadArchives );
|
|
}
|
|
|
|
int ArchiveManager::reloadArchives()
|
|
{
|
|
qDebug() << "ArchiveManager::reloadArchives()";
|
|
QHash< ModLibrary *, Archive * > archives;
|
|
const QList<ModLibrary *> &entries = m_database->archiveList(m_profileId);
|
|
for( ModLibrary *lib : entries )
|
|
{
|
|
Archive *arc = new Archive(lib->m_filename);
|
|
//Archive *arc = new Archive(m_modsdir + QDir::separator() + lib->m_filename);
|
|
archives.insert(lib, arc);
|
|
}
|
|
|
|
// Release old:
|
|
const QList< ModLibrary * > &libs = m_archives.keys();
|
|
for( ModLibrary *lib : libs ) {
|
|
Archive *arc = m_archives[lib];
|
|
arc->killme();
|
|
lib->deleteLater();
|
|
}
|
|
m_archives = archives;
|
|
m_cache.clear();
|
|
return m_archives.count();
|
|
}
|
|
|
|
ArchiveManager::~ArchiveManager()
|
|
{
|
|
m_cacheTimer.stop();
|
|
const QList< Archive * > &arcs = m_archives.values();
|
|
for( Archive *arc : arcs )
|
|
arc->deleteLater();
|
|
}
|
|
|
|
QHash<ModLibrary *, Archive *> ArchiveManager::getArchives()
|
|
{
|
|
return m_archives;
|
|
}
|
|
|
|
bool ArchiveManager::findFile(const QString &qpath, ModLibrary **library, ModEntry **modentry, Archive **archive)
|
|
{
|
|
if( m_cache.contains(qpath) )
|
|
{
|
|
//qDebug() << "ArchiveManager::findFile: Entry [" << qpath << "] cached (Valid:" << m_cache[qpath].m_valid << ")";
|
|
*library = m_cache[qpath].m_library;
|
|
*modentry = m_cache[qpath].m_entry;
|
|
*archive = m_cache[qpath].m_archive;
|
|
return m_cache[qpath].m_valid;
|
|
}
|
|
|
|
qDebug() << "ArchiveManager::findFile: Searching for file" << qpath;
|
|
ArchiveCachedEntry cacheEntry;
|
|
QStringList qparts = qpath.split(QDir::separator());
|
|
if( 0 == qpath.length() )
|
|
qparts.clear();
|
|
|
|
const QList< ModLibrary * > &keys = m_archives.keys();
|
|
for( ModLibrary *lib : keys )
|
|
{
|
|
//qDebug() << "ArchiveManager::findFile: Scanning library" << lib->m_filename;
|
|
for( ModEntry *mod : lib->m_entries )
|
|
{
|
|
/*
|
|
if( 0 != mod->m_installedPath.compare(qpath, Qt::CaseInsensitive) )
|
|
continue;
|
|
|
|
//dolog("getattr (3): \"%s\" exists as \"%s\"\n", mod.m_archivePath.toStdString().c_str(), mod.m_installedPath.toStdString().c_str());
|
|
dolog("getattr(4): Comparing: qpath=\"%s\" vs. path=\"%s\"...\n",
|
|
qparts.join(QDir::separator()).toStdString().c_str(),
|
|
parts.join(QDir::separator()).toStdString().c_str()
|
|
);
|
|
*/
|
|
QStringList parts = mod->m_installedPath.split(QDir::separator());
|
|
if( parts.length() < qparts.length() )
|
|
continue;
|
|
|
|
bool skipme = false;
|
|
for( int x=0; x < qparts.length(); x++ )
|
|
{
|
|
if( 0 != qparts.at(x).compare(parts.at(x), Qt::CaseInsensitive) )
|
|
{
|
|
skipme = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( skipme ) {
|
|
//qDebug() << "ArchiveManager::findFile: Skipping" << mod->m_installedPath;
|
|
continue;
|
|
}
|
|
|
|
if( parts.length() > qparts.length() )
|
|
{
|
|
qDebug() << "ArchiveManager::findFile: Found directory in" << mod->m_archivePath << "aka" << m_archives[lib]->getPath();
|
|
*library = NULL;
|
|
*modentry = NULL;
|
|
*archive = NULL;
|
|
cacheEntry.m_valid = true;
|
|
//cacheEntry.m_isdir = true;
|
|
qDebug() << "Caching...";
|
|
m_cache[qpath] = cacheEntry;
|
|
qDebug() << "Done.";
|
|
return true;
|
|
}
|
|
|
|
//QMap<QString, ArchiveCacheEntry *> *arc = m_archives[lib]->getEntries();
|
|
*library = lib;
|
|
*modentry = mod;
|
|
*archive = m_archives[lib];
|
|
qDebug() << "ArchiveManager::findFile: Found file" << mod->m_installedPath << "in mod" << mod->m_archivePath << "aka" << m_archives[lib]->getPath();
|
|
|
|
cacheEntry.m_valid = true;
|
|
cacheEntry.m_library = lib;
|
|
cacheEntry.m_entry = mod;
|
|
cacheEntry.m_archive = m_archives[lib];
|
|
m_cache[qpath] = cacheEntry;
|
|
//m_archives[lib]->cleanCache(time(NULL)-30);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
qDebug() << "ArchiveManager::findFile: Couldn't find file" << qpath << "(Cached)";
|
|
m_cache[qpath] = cacheEntry;
|
|
return false;
|
|
}
|
|
|
|
void ArchiveManager::cleanCache()
|
|
{
|
|
//qDebug() << "ArchiveManager::cleanCache...";
|
|
const QList< ModLibrary * > &keys = m_archives.keys();
|
|
for( ModLibrary *lib : keys )
|
|
m_archives[lib]->cleanCache(time(NULL)-300); // 5 mins seems like plenty
|
|
}
|