summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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 55508b1e1..b5bfa6741 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -30,6 +30,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
30#define QT_NO_OPENGL 30#define QT_NO_OPENGL
31#include <QDesktopWidget> 31#include <QDesktopWidget>
32#include <QDialogButtonBox> 32#include <QDialogButtonBox>
33#include <QFile>
33#include <QFileDialog> 34#include <QFileDialog>
34#include <QMessageBox> 35#include <QMessageBox>
35#include <QtConcurrent/QtConcurrent> 36#include <QtConcurrent/QtConcurrent>
@@ -1336,20 +1337,40 @@ void GMainWindow::OnLoadAmiibo() {
1336 const QString extensions{"*.bin"}; 1337 const QString extensions{"*.bin"};
1337 const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions); 1338 const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
1338 const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter); 1339 const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter);
1339 if (!filename.isEmpty()) { 1340
1340 Core::System& system{Core::System::GetInstance()}; 1341 if (filename.isEmpty()) {
1341 Service::SM::ServiceManager& sm = system.ServiceManager(); 1342 return;
1342 auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user"); 1343 }
1343 if (nfc != nullptr) { 1344
1344 auto nfc_file = FileUtil::IOFile(filename.toStdString(), "rb"); 1345 Core::System& system{Core::System::GetInstance()};
1345 if (!nfc_file.IsOpen()) { 1346 Service::SM::ServiceManager& sm = system.ServiceManager();
1346 return; 1347 auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
1347 } 1348 if (nfc == nullptr) {
1348 std::vector<u8> amiibo_buffer(nfc_file.GetSize()); 1349 return;
1349 nfc_file.ReadBytes(amiibo_buffer.data(), amiibo_buffer.size()); 1350 }
1350 nfc_file.Close(); 1351
1351 nfc->LoadAmiibo(amiibo_buffer); 1352 QFile nfc_file{filename};
1352 } 1353 if (!nfc_file.open(QIODevice::ReadOnly)) {
1354 QMessageBox::warning(this, tr("Error opening Amiibo data file"),
1355 tr("Unable to open Amiibo file \"%1\" for reading.").arg(filename));
1356 return;
1357 }
1358
1359 const u64 nfc_file_size = nfc_file.size();
1360 std::vector<u8> buffer(nfc_file_size);
1361 const u64 read_size = nfc_file.read(reinterpret_cast<char*>(buffer.data()), nfc_file_size);
1362 if (nfc_file_size != read_size) {
1363 QMessageBox::warning(this, tr("Error reading Amiibo data file"),
1364 tr("Unable to fully read Amiibo data. Expected to read %1 bytes, but "
1365 "was only able to read %2 bytes.")
1366 .arg(nfc_file_size)
1367 .arg(read_size));
1368 return;
1369 }
1370
1371 if (!nfc->LoadAmiibo(buffer)) {
1372 QMessageBox::warning(this, tr("Error loading Amiibo data"),
1373 tr("Unable to load Amiibo data."));
1353 } 1374 }
1354} 1375}
1355 1376