From 3a570a9fee57d77923eb1e71dbadcd08bb39aa25 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 14 Sep 2014 11:52:52 +0000 Subject: [PATCH] Kernel: Implement the Close command for Archive, File and Directory. --- src/core/hle/kernel/archive.cpp | 36 +++++++++++++++++++++++++++++++++ src/core/hle/kernel/archive.h | 7 +++++++ 2 files changed, 43 insertions(+) diff --git a/src/core/hle/kernel/archive.cpp b/src/core/hle/kernel/archive.cpp index 6161f4d00..a7fa661d6 100644 --- a/src/core/hle/kernel/archive.cpp +++ b/src/core/hle/kernel/archive.cpp @@ -96,6 +96,13 @@ public: backend->SetSize(cmd_buff[1] | ((u64)cmd_buff[2] << 32)); break; } + case FileCommand::Close: + { + DEBUG_LOG(KERNEL, "Close %s %s", GetTypeName().c_str(), GetName().c_str()); + Kernel::g_object_pool.Destroy(GetHandle()); + CloseArchive(backend->GetIdCode()); + break; + } // Unknown command... default: { @@ -174,6 +181,13 @@ public: break; } + case FileCommand::Close: + { + DEBUG_LOG(KERNEL, "Close %s %s", GetTypeName().c_str(), GetName().c_str()); + Kernel::g_object_pool.Destroy(GetHandle()); + break; + } + // Unknown command... default: ERROR_LOG(KERNEL, "Unknown command=0x%08X!", cmd); @@ -230,6 +244,13 @@ public: break; } + case DirectoryCommand::Close: + { + DEBUG_LOG(KERNEL, "Close %s %s", GetTypeName().c_str(), GetName().c_str()); + Kernel::g_object_pool.Destroy(GetHandle()); + break; + } + // Unknown command... default: ERROR_LOG(KERNEL, "Unknown command=0x%08X!", cmd); @@ -269,6 +290,21 @@ Handle OpenArchive(FileSys::Archive::IdCode id_code) { return itr->second; } +/** + * Closes an archive + * @param id_code IdCode of the archive to open + * @return Result of operation, 0 on success, otherwise error code + */ +Result CloseArchive(FileSys::Archive::IdCode id_code) { + if (1 != g_archive_map.erase(id_code)) { + ERROR_LOG(KERNEL, "Cannot close archive %d", (int) id_code); + return -1; + } + + INFO_LOG(KERNEL, "Closed archive %d", (int) id_code); + return 0; +} + /** * Mounts an archive * @param archive Pointer to the archive to mount diff --git a/src/core/hle/kernel/archive.h b/src/core/hle/kernel/archive.h index f647aa213..593861f8e 100644 --- a/src/core/hle/kernel/archive.h +++ b/src/core/hle/kernel/archive.h @@ -21,6 +21,13 @@ namespace Kernel { */ Handle OpenArchive(FileSys::Archive::IdCode id_code); +/** + * Closes an archive + * @param id_code IdCode of the archive to open + * @return true if it worked fine + */ +Result CloseArchive(FileSys::Archive::IdCode id_code); + /** * Creates an Archive * @param backend File system backend interface to the archive