summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-10-24 09:37:29 -0400
committerGravatar Lioncash2018-10-24 10:39:31 -0400
commitbed2d6c425c649ff587b80d617597f3eca359da1 (patch)
tree97d8b3f809d25a10bda5871f15ac4d2c233756de /src
parentMerge pull request #1551 from ogniK5377/improved-svcbreak (diff)
downloadyuzu-bed2d6c425c649ff587b80d617597f3eca359da1.tar.gz
yuzu-bed2d6c425c649ff587b80d617597f3eca359da1.tar.xz
yuzu-bed2d6c425c649ff587b80d617597f3eca359da1.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nfp/nfp.cpp6
-rw-r--r--src/core/hle/service/nfp/nfp.h2
-rw-r--r--src/yuzu/main.cpp49
3 files changed, 40 insertions, 17 deletions
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 9a4eb9301..c1af878fe 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -328,13 +328,15 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
328 rb.PushIpcInterface<IUser>(*this); 328 rb.PushIpcInterface<IUser>(*this);
329} 329}
330 330
331void Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { 331bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
332 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); 332 std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
333 if (buffer.size() < sizeof(AmiiboFile)) { 333 if (buffer.size() < sizeof(AmiiboFile)) {
334 return; // Failed to load file 334 return false;
335 } 335 }
336
336 std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); 337 std::memcpy(&amiibo, buffer.data(), sizeof(amiibo));
337 nfc_tag_load->Signal(); 338 nfc_tag_load->Signal();
339 return true;
338} 340}
339const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const { 341const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const {
340 return nfc_tag_load; 342 return nfc_tag_load;
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h
index 46370dedd..5c0ae8a54 100644
--- a/src/core/hle/service/nfp/nfp.h
+++ b/src/core/hle/service/nfp/nfp.h
@@ -32,7 +32,7 @@ public:
32 static_assert(sizeof(AmiiboFile) == 0x94, "AmiiboFile is an invalid size"); 32 static_assert(sizeof(AmiiboFile) == 0x94, "AmiiboFile is an invalid size");
33 33
34 void CreateUserInterface(Kernel::HLERequestContext& ctx); 34 void CreateUserInterface(Kernel::HLERequestContext& ctx);
35 void LoadAmiibo(const std::vector<u8>& buffer); 35 bool LoadAmiibo(const std::vector<u8>& buffer);
36 const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const; 36 const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const;
37 const AmiiboFile& GetAmiiboBuffer() const; 37 const AmiiboFile& GetAmiiboBuffer() const;
38 38
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index be9896614..a3bcb134c 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -29,6 +29,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
29#define QT_NO_OPENGL 29#define QT_NO_OPENGL
30#include <QDesktopWidget> 30#include <QDesktopWidget>
31#include <QDialogButtonBox> 31#include <QDialogButtonBox>
32#include <QFile>
32#include <QFileDialog> 33#include <QFileDialog>
33#include <QMessageBox> 34#include <QMessageBox>
34#include <QtConcurrent/QtConcurrent> 35#include <QtConcurrent/QtConcurrent>
@@ -1304,20 +1305,40 @@ void GMainWindow::OnLoadAmiibo() {
1304 const QString extensions{"*.bin"}; 1305 const QString extensions{"*.bin"};
1305 const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions); 1306 const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
1306 const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter); 1307 const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter);
1307 if (!filename.isEmpty()) { 1308
1308 Core::System& system{Core::System::GetInstance()}; 1309 if (filename.isEmpty()) {
1309 Service::SM::ServiceManager& sm = system.ServiceManager(); 1310 return;
1310 auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user"); 1311 }
1311 if (nfc != nullptr) { 1312
1312 auto nfc_file = FileUtil::IOFile(filename.toStdString(), "rb"); 1313 Core::System& system{Core::System::GetInstance()};
1313 if (!nfc_file.IsOpen()) { 1314 Service::SM::ServiceManager& sm = system.ServiceManager();
1314 return; 1315 auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
1315 } 1316 if (nfc == nullptr) {
1316 std::vector<u8> amiibo_buffer(nfc_file.GetSize()); 1317 return;
1317 nfc_file.ReadBytes(amiibo_buffer.data(), amiibo_buffer.size()); 1318 }
1318 nfc_file.Close(); 1319
1319 nfc->LoadAmiibo(amiibo_buffer); 1320 QFile nfc_file{filename};
1320 } 1321 if (!nfc_file.open(QIODevice::ReadOnly)) {
1322 QMessageBox::warning(this, tr("Error opening Amiibo data file"),
1323 tr("Unable to open Amiibo file \"%1\" for reading.").arg(filename));
1324 return;
1325 }
1326
1327 const u64 nfc_file_size = nfc_file.size();
1328 std::vector<u8> buffer(nfc_file_size);
1329 const u64 read_size = nfc_file.read(reinterpret_cast<char*>(buffer.data()), nfc_file_size);
1330 if (nfc_file_size != read_size) {
1331 QMessageBox::warning(this, tr("Error reading Amiibo data file"),
1332 tr("Unable to fully read Amiibo data. Expected to read %1 bytes, but "
1333 "was only able to read %2 bytes.")
1334 .arg(nfc_file_size)
1335 .arg(read_size));
1336 return;
1337 }
1338
1339 if (!nfc->LoadAmiibo(buffer)) {
1340 QMessageBox::warning(this, tr("Error loading Amiibo data"),
1341 tr("Unable to load Amiibo data."));
1321 } 1342 }
1322} 1343}
1323 1344