diff options
Diffstat (limited to 'src/frontend/qt_sdl/TitleManagerDialog.cpp')
-rw-r--r-- | src/frontend/qt_sdl/TitleManagerDialog.cpp | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/src/frontend/qt_sdl/TitleManagerDialog.cpp b/src/frontend/qt_sdl/TitleManagerDialog.cpp index d5147fc..84bd1ef 100644 --- a/src/frontend/qt_sdl/TitleManagerDialog.cpp +++ b/src/frontend/qt_sdl/TitleManagerDialog.cpp @@ -32,13 +32,13 @@ using namespace Platform; -bool TitleManagerDialog::NANDInited = false; +std::unique_ptr<DSi_NAND::NANDImage> TitleManagerDialog::nand = nullptr; TitleManagerDialog* TitleManagerDialog::currentDlg = nullptr; extern std::string EmuDirectory; -TitleManagerDialog::TitleManagerDialog(QWidget* parent) : QDialog(parent), ui(new Ui::TitleManagerDialog) +TitleManagerDialog::TitleManagerDialog(QWidget* parent, DSi_NAND::NANDImage& image) : QDialog(parent), ui(new Ui::TitleManagerDialog), nandmount(image) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); @@ -47,7 +47,7 @@ TitleManagerDialog::TitleManagerDialog(QWidget* parent) : QDialog(parent), ui(ne const u32 category = 0x00030004; std::vector<u32> titlelist; - DSi_NAND::ListTitles(category, titlelist); + nandmount.ListTitles(category, titlelist); for (std::vector<u32>::iterator it = titlelist.begin(); it != titlelist.end(); it++) { @@ -109,7 +109,7 @@ void TitleManagerDialog::createTitleItem(u32 category, u32 titleid) NDSHeader header; NDSBanner banner; - DSi_NAND::GetTitleInfo(category, titleid, version, &header, &banner); + nandmount.GetTitleInfo(category, titleid, version, &header, &banner); u32 icondata[32*32]; ROMManager::ROMIcon(banner.Icon, banner.Palette, icondata); @@ -137,7 +137,7 @@ void TitleManagerDialog::createTitleItem(u32 category, u32 titleid) bool TitleManagerDialog::openNAND() { - NANDInited = false; + nand = nullptr; FileHandle* bios7i = Platform::OpenLocalFile(Config::DSiBIOS7Path, FileMode::Read); if (!bios7i) @@ -148,22 +148,25 @@ bool TitleManagerDialog::openNAND() FileRead(es_keyY, 16, 1, bios7i); CloseFile(bios7i); - if (!DSi_NAND::Init(es_keyY)) - { + FileHandle* nandfile = Platform::OpenLocalFile(Config::DSiNANDPath, FileMode::ReadWriteExisting); + if (!nandfile) + return false; + + nand = std::make_unique<DSi_NAND::NANDImage>(nandfile, es_keyY); + if (!*nand) + { // If loading and mounting the NAND image failed... + nand = nullptr; return false; + // NOTE: The NANDImage takes ownership of the FileHandle, + // so it will be closed even if the NANDImage constructor fails. } - NANDInited = true; return true; } void TitleManagerDialog::closeNAND() { - if (NANDInited) - { - DSi_NAND::DeInit(); - NANDInited = false; - } + nand = nullptr; } void TitleManagerDialog::done(int r) @@ -175,7 +178,7 @@ void TitleManagerDialog::done(int r) void TitleManagerDialog::on_btnImportTitle_clicked() { - TitleImportDialog* importdlg = new TitleImportDialog(this, importAppPath, &importTmdData, importReadOnly); + TitleImportDialog* importdlg = new TitleImportDialog(this, importAppPath, &importTmdData, importReadOnly, nandmount); importdlg->open(); connect(importdlg, &TitleImportDialog::finished, this, &TitleManagerDialog::onImportTitleFinished); @@ -190,14 +193,16 @@ void TitleManagerDialog::onImportTitleFinished(int res) titleid[0] = importTmdData.GetCategory(); titleid[1] = importTmdData.GetID(); + assert(nand != nullptr); + assert(*nand); // remove anything that might hinder the install - DSi_NAND::DeleteTitle(titleid[0], titleid[1]); + nandmount.DeleteTitle(titleid[0], titleid[1]); - bool importres = DSi_NAND::ImportTitle(importAppPath.toStdString().c_str(), importTmdData, importReadOnly); + bool importres = nandmount.ImportTitle(importAppPath.toStdString().c_str(), importTmdData, importReadOnly); if (!importres) { // remove a potential half-completed install - DSi_NAND::DeleteTitle(titleid[0], titleid[1]); + nandmount.DeleteTitle(titleid[0], titleid[1]); QMessageBox::critical(this, "Import title - melonDS", @@ -224,7 +229,7 @@ void TitleManagerDialog::on_btnDeleteTitle_clicked() return; u64 titleid = cur->data(Qt::UserRole).toULongLong(); - DSi_NAND::DeleteTitle((u32)(titleid >> 32), (u32)titleid); + nandmount.DeleteTitle((u32)(titleid >> 32), (u32)titleid); delete cur; } @@ -317,7 +322,7 @@ void TitleManagerDialog::onImportTitleData() } u64 titleid = cur->data(Qt::UserRole).toULongLong(); - bool res = DSi_NAND::ImportTitleData((u32)(titleid >> 32), (u32)titleid, type, file.toStdString().c_str()); + bool res = nandmount.ImportTitleData((u32)(titleid >> 32), (u32)titleid, type, file.toStdString().c_str()); if (!res) { QMessageBox::critical(this, @@ -370,7 +375,7 @@ void TitleManagerDialog::onExportTitleData() if (file.isEmpty()) return; u64 titleid = cur->data(Qt::UserRole).toULongLong(); - bool res = DSi_NAND::ExportTitleData((u32)(titleid >> 32), (u32)titleid, type, file.toStdString().c_str()); + bool res = nandmount.ExportTitleData((u32)(titleid >> 32), (u32)titleid, type, file.toStdString().c_str()); if (!res) { QMessageBox::critical(this, @@ -380,8 +385,8 @@ void TitleManagerDialog::onExportTitleData() } -TitleImportDialog::TitleImportDialog(QWidget* parent, QString& apppath, const DSi_TMD::TitleMetadata* tmd, bool& readonly) -: QDialog(parent), ui(new Ui::TitleImportDialog), appPath(apppath), tmdData(tmd), readOnly(readonly) +TitleImportDialog::TitleImportDialog(QWidget* parent, QString& apppath, const DSi_TMD::TitleMetadata* tmd, bool& readonly, DSi_NAND::NANDMount& nandmount) +: QDialog(parent), ui(new Ui::TitleImportDialog), appPath(apppath), tmdData(tmd), readOnly(readonly), nandmount(nandmount) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); @@ -455,7 +460,7 @@ void TitleImportDialog::accept() } } - if (DSi_NAND::TitleExists(titleid[1], titleid[0])) + if (nandmount.TitleExists(titleid[1], titleid[0])) { if (QMessageBox::question(this, "Import title - melonDS", |