Refactor DSi_NAND (#1844)

* Refactor diskio's contents

- Change ff_disk_read_cb/write_cb into a std::function instead of a raw pointer
- Add const specifiers as needed

* Refactor DSi_NAND to manage the file system's mounted lifetime with RAII

* Split NANDMount into NANDMount and NANDImage

- NANDImage is used for information about the NAND that doesn't require decryption or filesystem access
- NANDMount is used to actually access the file system
- Both classes manage their respective resources (the NAND file handle and the NAND's mount) with RAII
- Also split the file loading into another function that I will remove in a later PR

* Make NANDMount immovable

* Remove NAND-loading code that I had sectioned off into a function

- Incomplete copypasta
- I must have gotten distracted

* Tidy up NANDImage's initialization

- Don't unmount the disk image if the constructor fails (that's NANDMount's job now)
- Only assign CurFile if the constructor succeeds

* Add some const-correctness

* Move DSi NAND initialization to the frontend

- The NANDImage is now installed via a unique_ptr in DSi

* Remove Platform::DSi_NANDPath

- Not Config::DSiNANDPath; that can still be configured as usual
- The core no longer needs to care
This commit is contained in:
Jesse Talavera-Greenberg
2023-10-11 11:20:05 -04:00
committed by GitHub
parent b2fcff97c1
commit d4e51f8060
20 changed files with 441 additions and 290 deletions

View File

@ -19,6 +19,7 @@
#ifndef TITLEMANAGERDIALOG_H
#define TITLEMANAGERDIALOG_H
#include <memory>
#include <QDialog>
#include <QMessageBox>
#include <QListWidget>
@ -30,6 +31,7 @@
#include <QNetworkAccessManager>
#include "DSi_TMD.h"
#include "DSi_NAND.h"
namespace Ui
{
@ -44,10 +46,10 @@ class TitleManagerDialog : public QDialog
Q_OBJECT
public:
explicit TitleManagerDialog(QWidget* parent);
explicit TitleManagerDialog(QWidget* parent, DSi_NAND::NANDImage& image);
~TitleManagerDialog();
static bool NANDInited;
static std::unique_ptr<DSi_NAND::NANDImage> nand;
static bool openNAND();
static void closeNAND();
@ -68,7 +70,10 @@ public:
return nullptr;
}
currentDlg = new TitleManagerDialog(parent);
assert(nand != nullptr);
assert(*nand);
currentDlg = new TitleManagerDialog(parent, *nand);
currentDlg->open();
return currentDlg;
}
@ -89,6 +94,7 @@ private slots:
void onExportTitleData();
private:
DSi_NAND::NANDMount nandmount;
Ui::TitleManagerDialog* ui;
QString importAppPath;
@ -106,7 +112,7 @@ class TitleImportDialog : public QDialog
Q_OBJECT
public:
explicit TitleImportDialog(QWidget* parent, QString& apppath, const DSi_TMD::TitleMetadata* tmd, bool& readonly);
explicit TitleImportDialog(QWidget* parent, QString& apppath, const DSi_TMD::TitleMetadata* tmd, bool& readonly, DSi_NAND::NANDMount& nand);
~TitleImportDialog();
private slots:
@ -119,6 +125,7 @@ private slots:
private:
Ui::TitleImportDialog* ui;
DSi_NAND::NANDMount& nandmount;
QButtonGroup* grpTmdSource;