39ae73b356
The data retrieved in these cases are ultimately chiefly owned by either the RegisteredCache instance itself, or the filesystem factories. Both these should live throughout the use of their contained data. If they don't, it should be considered an interface/design issue, and using shared_ptr instances here would mask that, as the data would always be prolonged after the main owner's lifetime ended. This makes the lifetime of the data explicit and makes it harder to accidentally create cyclic references. It also makes the interface slightly more flexible than the previous API, as a shared_ptr can be created from a unique_ptr, but not the other way around, so this allows for that use-case if it ever becomes necessary in some form.
72 lines
2 KiB
C++
72 lines
2 KiB
C++
// Copyright 2018 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
#include <QList>
|
|
#include <QObject>
|
|
#include <QRunnable>
|
|
#include <QString>
|
|
|
|
#include "common/common_types.h"
|
|
#include "yuzu/compatibility_list.h"
|
|
|
|
class QStandardItem;
|
|
|
|
namespace FileSys {
|
|
class NCA;
|
|
class VfsFilesystem;
|
|
} // namespace FileSys
|
|
|
|
/**
|
|
* Asynchronous worker object for populating the game list.
|
|
* Communicates with other threads through Qt's signal/slot system.
|
|
*/
|
|
class GameListWorker : public QObject, public QRunnable {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
GameListWorker(std::shared_ptr<FileSys::VfsFilesystem> vfs, QString dir_path, bool deep_scan,
|
|
const CompatibilityList& compatibility_list);
|
|
~GameListWorker() override;
|
|
|
|
/// Starts the processing of directory tree information.
|
|
void run() override;
|
|
|
|
/// Tells the worker that it should no longer continue processing. Thread-safe.
|
|
void Cancel();
|
|
|
|
signals:
|
|
/**
|
|
* The `EntryReady` signal is emitted once an entry has been prepared and is ready
|
|
* to be added to the game list.
|
|
* @param entry_items a list with `QStandardItem`s that make up the columns of the new entry.
|
|
*/
|
|
void EntryReady(QList<QStandardItem*> entry_items);
|
|
|
|
/**
|
|
* After the worker has traversed the game directory looking for entries, this signal is emitted
|
|
* with a list of folders that should be watched for changes as well.
|
|
*/
|
|
void Finished(QStringList watch_list);
|
|
|
|
private:
|
|
void AddInstalledTitlesToGameList();
|
|
void FillControlMap(const std::string& dir_path);
|
|
void AddFstEntriesToGameList(const std::string& dir_path, unsigned int recursion = 0);
|
|
|
|
std::shared_ptr<FileSys::VfsFilesystem> vfs;
|
|
std::map<u64, std::unique_ptr<FileSys::NCA>> nca_control_map;
|
|
QStringList watch_list;
|
|
QString dir_path;
|
|
bool deep_scan;
|
|
const CompatibilityList& compatibility_list;
|
|
std::atomic_bool stop_processing;
|
|
};
|