diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/nfp/nfp.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/nfp/nfp.h | 2 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 49 |
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 | ||
| 331 | void Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | 331 | bool 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 | } |
| 339 | const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const { | 341 | const 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 | ||