From 752236caad5d1d3ed097c22929081919f27b190e Mon Sep 17 00:00:00 2001
From: Narr the Reg <juangerman-13@hotmail.com>
Date: Thu, 1 Dec 2022 19:42:39 -0600
Subject: [PATCH] input_common: Allow mifare files

---
 src/input_common/drivers/virtual_amiibo.cpp | 38 ++++++++++++++-------
 src/input_common/drivers/virtual_amiibo.h   |  7 ++--
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/input_common/drivers/virtual_amiibo.cpp b/src/input_common/drivers/virtual_amiibo.cpp
index 564a188e53..63ffaca67b 100644
--- a/src/input_common/drivers/virtual_amiibo.cpp
+++ b/src/input_common/drivers/virtual_amiibo.cpp
@@ -47,20 +47,20 @@ Common::Input::NfcState VirtualAmiibo::SupportsNfc(
 
 Common::Input::NfcState VirtualAmiibo::WriteNfcData(
     [[maybe_unused]] const PadIdentifier& identifier_, const std::vector<u8>& data) {
-    const Common::FS::IOFile amiibo_file{file_path, Common::FS::FileAccessMode::ReadWrite,
-                                         Common::FS::FileType::BinaryFile};
+    const Common::FS::IOFile nfc_file{file_path, Common::FS::FileAccessMode::ReadWrite,
+                                      Common::FS::FileType::BinaryFile};
 
-    if (!amiibo_file.IsOpen()) {
+    if (!nfc_file.IsOpen()) {
         LOG_ERROR(Core, "Amiibo is already on use");
         return Common::Input::NfcState::WriteFailed;
     }
 
-    if (!amiibo_file.Write(data)) {
+    if (!nfc_file.Write(data)) {
         LOG_ERROR(Service_NFP, "Error writting to file");
         return Common::Input::NfcState::WriteFailed;
     }
 
-    amiibo_data = data;
+    nfc_data = data;
 
     return Common::Input::NfcState::Success;
 }
@@ -70,32 +70,44 @@ VirtualAmiibo::State VirtualAmiibo::GetCurrentState() const {
 }
 
 VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(const std::string& filename) {
-    const Common::FS::IOFile amiibo_file{filename, Common::FS::FileAccessMode::Read,
-                                         Common::FS::FileType::BinaryFile};
+    const Common::FS::IOFile nfc_file{filename, Common::FS::FileAccessMode::Read,
+                                      Common::FS::FileType::BinaryFile};
 
     if (state != State::WaitingForAmiibo) {
         return Info::WrongDeviceState;
     }
 
-    if (!amiibo_file.IsOpen()) {
+    if (!nfc_file.IsOpen()) {
         return Info::UnableToLoad;
     }
 
-    amiibo_data.resize(amiibo_size);
-
-    if (amiibo_file.Read(amiibo_data) < amiibo_size_without_password) {
+    switch (nfc_file.GetSize()) {
+    case AmiiboSize:
+    case AmiiboSizeWithoutPassword:
+        nfc_data.resize(AmiiboSize);
+        if (nfc_file.Read(nfc_data) < AmiiboSizeWithoutPassword) {
+            return Info::NotAnAmiibo;
+        }
+        break;
+    case MifareSize:
+        nfc_data.resize(MifareSize);
+        if (nfc_file.Read(nfc_data) < MifareSize) {
+            return Info::NotAnAmiibo;
+        }
+        break;
+    default:
         return Info::NotAnAmiibo;
     }
 
     file_path = filename;
     state = State::AmiiboIsOpen;
-    SetNfc(identifier, {Common::Input::NfcState::NewAmiibo, amiibo_data});
+    SetNfc(identifier, {Common::Input::NfcState::NewAmiibo, nfc_data});
     return Info::Success;
 }
 
 VirtualAmiibo::Info VirtualAmiibo::ReloadAmiibo() {
     if (state == State::AmiiboIsOpen) {
-        SetNfc(identifier, {Common::Input::NfcState::NewAmiibo, amiibo_data});
+        SetNfc(identifier, {Common::Input::NfcState::NewAmiibo, nfc_data});
         return Info::Success;
     }
 
diff --git a/src/input_common/drivers/virtual_amiibo.h b/src/input_common/drivers/virtual_amiibo.h
index 9baeb39974..0f9dad3338 100644
--- a/src/input_common/drivers/virtual_amiibo.h
+++ b/src/input_common/drivers/virtual_amiibo.h
@@ -53,12 +53,13 @@ public:
     std::string GetLastFilePath() const;
 
 private:
-    static constexpr std::size_t amiibo_size = 0x21C;
-    static constexpr std::size_t amiibo_size_without_password = amiibo_size - 0x8;
+    static constexpr std::size_t AmiiboSize = 0x21C;
+    static constexpr std::size_t AmiiboSizeWithoutPassword = AmiiboSize - 0x8;
+    static constexpr std::size_t MifareSize = 0x400;
 
     std::string file_path{};
     State state{State::Initialized};
-    std::vector<u8> amiibo_data;
+    std::vector<u8> nfc_data;
     Common::Input::PollingMode polling_mode{Common::Input::PollingMode::Pasive};
 };
 } // namespace InputCommon