yuzu/main: Notify user of loading errors with Amiibo data
We shouldn't silently continue if loading failed, since the general assumption is that no messages showing up implicitly indicates success.
This commit is contained in:
parent
a94e5d9e68
commit
bed2d6c425
|
@ -328,13 +328,15 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
|
||||||
rb.PushIpcInterface<IUser>(*this);
|
rb.PushIpcInterface<IUser>(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
|
bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
|
||||||
std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
|
std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
|
||||||
if (buffer.size() < sizeof(AmiiboFile)) {
|
if (buffer.size() < sizeof(AmiiboFile)) {
|
||||||
return; // Failed to load file
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::memcpy(&amiibo, buffer.data(), sizeof(amiibo));
|
std::memcpy(&amiibo, buffer.data(), sizeof(amiibo));
|
||||||
nfc_tag_load->Signal();
|
nfc_tag_load->Signal();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const {
|
const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const {
|
||||||
return nfc_tag_load;
|
return nfc_tag_load;
|
||||||
|
|
|
@ -32,7 +32,7 @@ public:
|
||||||
static_assert(sizeof(AmiiboFile) == 0x94, "AmiiboFile is an invalid size");
|
static_assert(sizeof(AmiiboFile) == 0x94, "AmiiboFile is an invalid size");
|
||||||
|
|
||||||
void CreateUserInterface(Kernel::HLERequestContext& ctx);
|
void CreateUserInterface(Kernel::HLERequestContext& ctx);
|
||||||
void LoadAmiibo(const std::vector<u8>& buffer);
|
bool LoadAmiibo(const std::vector<u8>& buffer);
|
||||||
const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const;
|
const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const;
|
||||||
const AmiiboFile& GetAmiiboBuffer() const;
|
const AmiiboFile& GetAmiiboBuffer() const;
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
|
||||||
#define QT_NO_OPENGL
|
#define QT_NO_OPENGL
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
|
#include <QFile>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QtConcurrent/QtConcurrent>
|
#include <QtConcurrent/QtConcurrent>
|
||||||
|
@ -1304,20 +1305,40 @@ void GMainWindow::OnLoadAmiibo() {
|
||||||
const QString extensions{"*.bin"};
|
const QString extensions{"*.bin"};
|
||||||
const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
|
const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
|
||||||
const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter);
|
const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter);
|
||||||
if (!filename.isEmpty()) {
|
|
||||||
Core::System& system{Core::System::GetInstance()};
|
if (filename.isEmpty()) {
|
||||||
Service::SM::ServiceManager& sm = system.ServiceManager();
|
return;
|
||||||
auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
|
}
|
||||||
if (nfc != nullptr) {
|
|
||||||
auto nfc_file = FileUtil::IOFile(filename.toStdString(), "rb");
|
Core::System& system{Core::System::GetInstance()};
|
||||||
if (!nfc_file.IsOpen()) {
|
Service::SM::ServiceManager& sm = system.ServiceManager();
|
||||||
return;
|
auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
|
||||||
}
|
if (nfc == nullptr) {
|
||||||
std::vector<u8> amiibo_buffer(nfc_file.GetSize());
|
return;
|
||||||
nfc_file.ReadBytes(amiibo_buffer.data(), amiibo_buffer.size());
|
}
|
||||||
nfc_file.Close();
|
|
||||||
nfc->LoadAmiibo(amiibo_buffer);
|
QFile nfc_file{filename};
|
||||||
}
|
if (!nfc_file.open(QIODevice::ReadOnly)) {
|
||||||
|
QMessageBox::warning(this, tr("Error opening Amiibo data file"),
|
||||||
|
tr("Unable to open Amiibo file \"%1\" for reading.").arg(filename));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const u64 nfc_file_size = nfc_file.size();
|
||||||
|
std::vector<u8> buffer(nfc_file_size);
|
||||||
|
const u64 read_size = nfc_file.read(reinterpret_cast<char*>(buffer.data()), nfc_file_size);
|
||||||
|
if (nfc_file_size != read_size) {
|
||||||
|
QMessageBox::warning(this, tr("Error reading Amiibo data file"),
|
||||||
|
tr("Unable to fully read Amiibo data. Expected to read %1 bytes, but "
|
||||||
|
"was only able to read %2 bytes.")
|
||||||
|
.arg(nfc_file_size)
|
||||||
|
.arg(read_size));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nfc->LoadAmiibo(buffer)) {
|
||||||
|
QMessageBox::warning(this, tr("Error loading Amiibo data"),
|
||||||
|
tr("Unable to load Amiibo data."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue