diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index cb69aa6fd..47f6aa67c 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -44,6 +44,7 @@ #include "citra_qt/util/clickable_label.h" #include "common/common_paths.h" #include "common/detached_tasks.h" +#include "common/file_util.h" #include "common/logging/backend.h" #include "common/logging/filter.h" #include "common/logging/log.h" @@ -1278,7 +1279,10 @@ void GMainWindow::OnLoadAmiibo() { Service::SM::ServiceManager& sm = system.ServiceManager(); auto nfc = sm.GetService("nfc:u"); if (nfc != nullptr) { - nfc->LoadAmiibo(filename.toStdString()); + Service::NFC::AmiiboData amiibo_data{}; + auto nfc_file = FileUtil::IOFile(filename.toStdString(), "rb"); + nfc_file.ReadBytes(&amiibo_data, sizeof(Service::NFC::AmiiboData)); + nfc->LoadAmiibo(amiibo_data); ui.action_Remove_Amiibo->setEnabled(true); } } diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index af6a82b41..b7eee1d86 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -97,11 +97,12 @@ void Module::Interface::StartTagScanning(Kernel::HLERequestContext& ctx) { void Module::Interface::GetTagInfo(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x11, 0, 0); - ResultCode result = RESULT_SUCCESS; if (nfc->nfc_tag_state != TagState::TagInRange && nfc->nfc_tag_state != TagState::TagDataLoaded && nfc->nfc_tag_state != TagState::Unknown6) { - result = ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, - ErrorSummary::InvalidState, ErrorLevel::Status); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; } TagInfo tag_info{}; @@ -113,7 +114,7 @@ void Module::Interface::GetTagInfo(Kernel::HLERequestContext& ctx) { tag_info.unk2 = 0x2; IPC::RequestBuilder rb = rp.MakeBuilder(12, 0); - rb.Push(result); + rb.Push(RESULT_SUCCESS); rb.PushRaw(tag_info); LOG_WARNING(Service_NFC, "(STUBBED) called"); } @@ -202,26 +203,28 @@ void Module::Interface::CommunicationGetStatus(Kernel::HLERequestContext& ctx) { void Module::Interface::Unknown0x1A(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x1A, 0, 0); - ResultCode result = RESULT_SUCCESS; if (nfc->nfc_tag_state != TagState::TagInRange) { - result = ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, - ErrorSummary::InvalidState, ErrorLevel::Status); - } else { - nfc->nfc_tag_state = TagState::Unknown6; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; } + nfc->nfc_tag_state = TagState::Unknown6; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(result); + rb.Push(RESULT_SUCCESS); LOG_DEBUG(Service_NFC, "called"); } void Module::Interface::GetIdentificationBlock(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x1B, 0, 0); - ResultCode result = RESULT_SUCCESS; if (nfc->nfc_tag_state != TagState::TagDataLoaded && nfc->nfc_tag_state != TagState::Unknown6) { - result = ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, - ErrorSummary::InvalidState, ErrorLevel::Status); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrCodes::CommandInvalidForState, ErrorModule::NFC, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; } IdentificationBlockReply identification_block_reply{}; @@ -234,7 +237,7 @@ void Module::Interface::GetIdentificationBlock(Kernel::HLERequestContext& ctx) { nfc->amiibo_data_mutex.unlock(); IPC::RequestBuilder rb = rp.MakeBuilder(0x1F, 0); - rb.Push(result); + rb.Push(RESULT_SUCCESS); rb.PushRaw(identification_block_reply); LOG_DEBUG(Service_NFC, "called"); } @@ -248,10 +251,9 @@ std::shared_ptr Module::Interface::GetModule() const { return nfc; } -void Module::Interface::LoadAmiibo(const std::string& filename) { - auto nfc_file = FileUtil::IOFile(filename, "rb"); +void Module::Interface::LoadAmiibo(const AmiiboData& amiibo_data) { nfc->amiibo_data_mutex.lock(); - nfc_file.ReadBytes(&nfc->amiibo_data, sizeof(AmiiboData)); + nfc->amiibo_data = amiibo_data; nfc->amiibo_data_mutex.unlock(); nfc->nfc_tag_state = Service::NFC::TagState::TagInRange; nfc->tag_in_range_event->Signal(); diff --git a/src/core/hle/service/nfc/nfc.h b/src/core/hle/service/nfc/nfc.h index a7b9cfe83..0be495883 100644 --- a/src/core/hle/service/nfc/nfc.h +++ b/src/core/hle/service/nfc/nfc.h @@ -67,7 +67,7 @@ public: std::shared_ptr GetModule() const; - void LoadAmiibo(const std::string& filename); + void LoadAmiibo(const AmiiboData& amiibo_data); void RemoveAmiibo();