summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-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