diff options
| author | 2018-10-25 22:10:08 -0400 | |
|---|---|---|
| committer | 2018-10-25 22:10:08 -0400 | |
| commit | debabf1fa68b61cc08addfe0b6c5380cb9eb11da (patch) | |
| tree | 1ae4bf5901a5bda00720f131916f3c2de6f87cfb | |
| parent | Merge pull request #1587 from lioncash/private (diff) | |
| parent | yuzu/main: Notify user of loading errors with Amiibo data (diff) | |
| download | yuzu-debabf1fa68b61cc08addfe0b6c5380cb9eb11da.tar.gz yuzu-debabf1fa68b61cc08addfe0b6c5380cb9eb11da.tar.xz yuzu-debabf1fa68b61cc08addfe0b6c5380cb9eb11da.zip | |
Merge pull request #1569 from lioncash/amiibo
yuzu/main: Notify user of loading errors with Amiibo data
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 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 | ||