summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2015-01-01 18:39:27 +0100
committerSubv <subv2112@gmail.com>2015-01-03 03:13:54 +0100
commitaade417b143a756da10b69747793c707ef8316fd (patch)
treed5fd49926dbfb4e7c289a8fa060df9c1e4401fde /src/core/file_sys
parentSaveDataCheck: Preliminary work in this archive. (diff)
downloadyuzu-aade417b143a756da10b69747793c707ef8316fd.tar
yuzu-aade417b143a756da10b69747793c707ef8316fd.tar.gz
yuzu-aade417b143a756da10b69747793c707ef8316fd.tar.bz2
yuzu-aade417b143a756da10b69747793c707ef8316fd.tar.lz
yuzu-aade417b143a756da10b69747793c707ef8316fd.tar.xz
yuzu-aade417b143a756da10b69747793c707ef8316fd.tar.zst
yuzu-aade417b143a756da10b69747793c707ef8316fd.zip
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/archive_backend.h3
-rw-r--r--src/core/file_sys/archive_romfs.cpp70
-rw-r--r--src/core/file_sys/archive_romfs.h75
-rw-r--r--src/core/file_sys/archive_savedatacheck.cpp41
-rw-r--r--src/core/file_sys/archive_savedatacheck.h31
-rw-r--r--src/core/file_sys/directory_romfs.cpp32
-rw-r--r--src/core/file_sys/directory_romfs.h43
-rw-r--r--src/core/file_sys/file_romfs.cpp43
-rw-r--r--src/core/file_sys/file_romfs.h73
-rw-r--r--src/core/file_sys/ivfc_archive.cpp88
-rw-r--r--src/core/file_sys/ivfc_archive.h63
11 files changed, 229 insertions, 333 deletions
diff --git a/src/core/file_sys/archive_backend.h b/src/core/file_sys/archive_backend.h
index 1612c35c2..390178f67 100644
--- a/src/core/file_sys/archive_backend.h
+++ b/src/core/file_sys/archive_backend.h
@@ -88,6 +88,7 @@ public:
const std::string DebugStr() const {
switch (GetType()) {
case Invalid:
+ default:
return "[Invalid]";
case Empty:
return "[Empty]";
@@ -117,6 +118,7 @@ public:
return {};
case Invalid:
case Binary:
+ default:
// TODO(yuriks): Add assert
LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
return {};
@@ -159,6 +161,7 @@ public:
case Empty:
return {};
case Invalid:
+ default:
// TODO(yuriks): Add assert
LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!");
return {};
diff --git a/src/core/file_sys/archive_romfs.cpp b/src/core/file_sys/archive_romfs.cpp
index df07eb657..a30f73d0e 100644
--- a/src/core/file_sys/archive_romfs.cpp
+++ b/src/core/file_sys/archive_romfs.cpp
@@ -9,8 +9,6 @@
#include "common/make_unique.h"
#include "core/file_sys/archive_romfs.h"
-#include "core/file_sys/directory_romfs.h"
-#include "core/file_sys/file_romfs.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// FileSys namespace
@@ -24,72 +22,4 @@ Archive_RomFS::Archive_RomFS(const Loader::AppLoader& app_loader) {
}
}
-Archive_RomFS::Archive_RomFS(std::string mountp) : mount_point(mountp) {
-
-}
-
-std::unique_ptr<FileBackend> Archive_RomFS::OpenFile(const Path& path, const Mode mode) const {
- return Common::make_unique<File_RomFS>(this);
-}
-
-bool Archive_RomFS::DeleteFile(const Path& path) const {
- LOG_WARNING(Service_FS, "Attempted to delete a file from ROMFS.");
- return false;
-}
-
-bool Archive_RomFS::RenameFile(const Path& src_path, const Path& dest_path) const {
- LOG_WARNING(Service_FS, "Attempted to rename a file within ROMFS.");
- return false;
-}
-
-bool Archive_RomFS::DeleteDirectory(const Path& path) const {
- LOG_WARNING(Service_FS, "Attempted to delete a directory from ROMFS.");
- return false;
-}
-
-ResultCode Archive_RomFS::CreateFile(const Path& path, u32 size) const {
- LOG_WARNING(Service_FS, "Attempted to create a file in ROMFS.");
- // TODO: Verify error code
- return ResultCode(ErrorDescription::NotAuthorized, ErrorModule::FS, ErrorSummary::NotSupported, ErrorLevel::Permanent);
-}
-
-bool Archive_RomFS::CreateDirectory(const Path& path) const {
- LOG_WARNING(Service_FS, "Attempted to create a directory in ROMFS.");
- return false;
-}
-
-bool Archive_RomFS::RenameDirectory(const Path& src_path, const Path& dest_path) const {
- LOG_WARNING(Service_FS, "Attempted to rename a file within ROMFS.");
- return false;
-}
-
-std::unique_ptr<DirectoryBackend> Archive_RomFS::OpenDirectory(const Path& path) const {
- return Common::make_unique<Directory_RomFS>();
-}
-
-ResultCode Archive_RomFS::Format(const Path& path) const {
- LOG_WARNING(Service_FS, "Attempted to format ROMFS.");
- return UnimplementedFunction(ErrorModule::FS);
-}
-
-ResultCode Archive_RomFS::Open(const Path& path) {
- if (mount_point.empty())
- return RESULT_SUCCESS;
- auto vec = path.AsBinary();
- const u32* data = reinterpret_cast<u32*>(vec.data());
- std::string file_path = Common::StringFromFormat("%s%08X%08X.bin", mount_point.c_str(), data[1], data[0]);
- FileUtil::IOFile file(file_path, "rb");
-
- std::fill(raw_data.begin(), raw_data.end(), 0);
-
- if (!file.IsOpen()) {
- return ResultCode(-1); // TODO(Subv): Find the right error code
- }
- auto size = file.GetSize();
- raw_data.resize(size);
- file.ReadBytes(raw_data.data(), size);
- file.Close();
- return RESULT_SUCCESS;
-}
-
} // namespace FileSys
diff --git a/src/core/file_sys/archive_romfs.h b/src/core/file_sys/archive_romfs.h
index b657dd38b..5cb75e04d 100644
--- a/src/core/file_sys/archive_romfs.h
+++ b/src/core/file_sys/archive_romfs.h
@@ -8,7 +8,7 @@
#include "common/common_types.h"
-#include "core/file_sys/archive_backend.h"
+#include "core/file_sys/ivfc_archive.h"
#include "core/loader/loader.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -17,81 +17,12 @@
namespace FileSys {
/// File system interface to the RomFS archive
-class Archive_RomFS final : public ArchiveBackend {
+class Archive_RomFS final : public IVFCArchive {
public:
Archive_RomFS(const Loader::AppLoader& app_loader);
- Archive_RomFS(std::string mount_point);
std::string GetName() const override { return "RomFS"; }
-
- /**
- * Open a file specified by its path, using the specified mode
- * @param path Path relative to the archive
- * @param mode Mode to open the file with
- * @return Opened file, or nullptr
- */
- std::unique_ptr<FileBackend> OpenFile(const Path& path, const Mode mode) const override;
-
- /**
- * Delete a file specified by its path
- * @param path Path relative to the archive
- * @return Whether the file could be deleted
- */
- bool DeleteFile(const Path& path) const override;
-
- /**
- * Rename a File specified by its path
- * @param src_path Source path relative to the archive
- * @param dest_path Destination path relative to the archive
- * @return Whether rename succeeded
- */
- bool RenameFile(const Path& src_path, const Path& dest_path) const override;
-
- /**
- * Delete a directory specified by its path
- * @param path Path relative to the archive
- * @return Whether the directory could be deleted
- */
- bool DeleteDirectory(const Path& path) const override;
-
- /**
- * Create a file specified by its path
- * @param path Path relative to the Archive
- * @param size The size of the new file, filled with zeroes
- * @return File creation result code
- */
- ResultCode CreateFile(const Path& path, u32 size) const override;
-
- /**
- * Create a directory specified by its path
- * @param path Path relative to the archive
- * @return Whether the directory could be created
- */
- bool CreateDirectory(const Path& path) const override;
-
- /**
- * Rename a Directory specified by its path
- * @param src_path Source path relative to the archive
- * @param dest_path Destination path relative to the archive
- * @return Whether rename succeeded
- */
- bool RenameDirectory(const Path& src_path, const Path& dest_path) const override;
-
- /**
- * Open a directory specified by its path
- * @param path Path relative to the archive
- * @return Opened directory, or nullptr
- */
- std::unique_ptr<DirectoryBackend> OpenDirectory(const Path& path) const override;
-
- ResultCode Open(const Path& path) override;
-
- ResultCode Format(const Path& path) const override;
-
-private:
- friend class File_RomFS;
- std::string mount_point;
- std::vector<u8> raw_data;
+ ResultCode Open(const Path& path) override { return RESULT_SUCCESS; }
};
} // namespace FileSys
diff --git a/src/core/file_sys/archive_savedatacheck.cpp b/src/core/file_sys/archive_savedatacheck.cpp
new file mode 100644
index 000000000..233158a0c
--- /dev/null
+++ b/src/core/file_sys/archive_savedatacheck.cpp
@@ -0,0 +1,41 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/file_util.h"
+
+#include "core/file_sys/archive_savedatacheck.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+Archive_SaveDataCheck::Archive_SaveDataCheck(const std::string& mount_loc) : mount_point(mount_loc) {
+}
+
+ResultCode Archive_SaveDataCheck::Open(const Path& path) {
+ // TODO(Subv): We should not be overwriting raw_data everytime this function is called,
+ // but until we use factory classes to create the archives at runtime instead of creating them beforehand
+ // and allow multiple archives of the same type to be open at the same time without clobbering each other,
+ // we won't be able to maintain the state of each archive, hence we overwrite it every time it's needed.
+ // There are a number of problems with this, for example opening a file in this archive, then opening
+ // this archive again with a different path, will corrupt the previously open file.
+ auto vec = path.AsBinary();
+ const u32* data = reinterpret_cast<u32*>(vec.data());
+ std::string file_path = Common::StringFromFormat("%s%08x%08x.bin", mount_point.c_str(), data[1], data[0]);
+ FileUtil::IOFile file(file_path, "rb");
+
+ std::fill(raw_data.begin(), raw_data.end(), 0);
+
+ if (!file.IsOpen()) {
+ return ResultCode(-1); // TODO(Subv): Find the right error code
+ }
+ auto size = file.GetSize();
+ raw_data.resize(size);
+ file.ReadBytes(raw_data.data(), size);
+ file.Close();
+ return RESULT_SUCCESS;
+}
+
+} // namespace FileSys
diff --git a/src/core/file_sys/archive_savedatacheck.h b/src/core/file_sys/archive_savedatacheck.h
new file mode 100644
index 000000000..f6e73e803
--- /dev/null
+++ b/src/core/file_sys/archive_savedatacheck.h
@@ -0,0 +1,31 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <vector>
+
+#include "common/common_types.h"
+
+#include "core/file_sys/ivfc_archive.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+/// File system interface to the SaveDataCheck archive
+class Archive_SaveDataCheck final : public IVFCArchive {
+public:
+ Archive_SaveDataCheck(const std::string& mount_point);
+
+ std::string GetName() const override { return "SaveDataCheck"; }
+ ResultCode Open(const Path& path) override;
+
+private:
+ std::string mount_point;
+};
+
+} // namespace FileSys
diff --git a/src/core/file_sys/directory_romfs.cpp b/src/core/file_sys/directory_romfs.cpp
deleted file mode 100644
index e130aca17..000000000
--- a/src/core/file_sys/directory_romfs.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "common/common_types.h"
-
-#include "core/file_sys/directory_romfs.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// FileSys namespace
-
-namespace FileSys {
-
-Directory_RomFS::Directory_RomFS() {
-}
-
-Directory_RomFS::~Directory_RomFS() {
-}
-
-bool Directory_RomFS::Open() {
- return false;
-}
-
-u32 Directory_RomFS::Read(const u32 count, Entry* entries) {
- return 0;
-}
-
-bool Directory_RomFS::Close() const {
- return false;
-}
-
-} // namespace FileSys
diff --git a/src/core/file_sys/directory_romfs.h b/src/core/file_sys/directory_romfs.h
deleted file mode 100644
index 2297f1645..000000000
--- a/src/core/file_sys/directory_romfs.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include "common/common_types.h"
-
-#include "core/file_sys/directory_backend.h"
-#include "core/loader/loader.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// FileSys namespace
-
-namespace FileSys {
-
-class Directory_RomFS final : public DirectoryBackend {
-public:
- Directory_RomFS();
- ~Directory_RomFS() override;
-
- /**
- * Open the directory
- * @return true if the directory opened correctly
- */
- bool Open() override;
-
- /**
- * List files contained in the directory
- * @param count Number of entries to return at once in entries
- * @param entries Buffer to read data into
- * @return Number of entries listed
- */
- u32 Read(const u32 count, Entry* entries) override;
-
- /**
- * Close the directory
- * @return true if the directory closed correctly
- */
- bool Close() const override;
-};
-
-} // namespace FileSys
diff --git a/src/core/file_sys/file_romfs.cpp b/src/core/file_sys/file_romfs.cpp
deleted file mode 100644
index 7467d6d31..000000000
--- a/src/core/file_sys/file_romfs.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "common/common_types.h"
-
-#include "core/file_sys/file_romfs.h"
-#include "core/file_sys/archive_romfs.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// FileSys namespace
-
-namespace FileSys {
-
-bool File_RomFS::Open() {
- return true;
-}
-
-size_t File_RomFS::Read(const u64 offset, const u32 length, u8* buffer) const {
- LOG_TRACE(Service_FS, "called offset=%llu, length=%d", offset, length);
- memcpy(buffer, &archive->raw_data[(u32)offset], length);
- return length;
-}
-
-size_t File_RomFS::Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const {
- LOG_WARNING(Service_FS, "Attempted to write to ROMFS.");
- return 0;
-}
-
-size_t File_RomFS::GetSize() const {
- return sizeof(u8) * archive->raw_data.size();
-}
-
-bool File_RomFS::SetSize(const u64 size) const {
- LOG_WARNING(Service_FS, "Attempted to set the size of ROMFS");
- return false;
-}
-
-bool File_RomFS::Close() const {
- return false;
-}
-
-} // namespace FileSys
diff --git a/src/core/file_sys/file_romfs.h b/src/core/file_sys/file_romfs.h
deleted file mode 100644
index 04d8a16a2..000000000
--- a/src/core/file_sys/file_romfs.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include "common/common_types.h"
-
-#include "core/file_sys/file_backend.h"
-#include "core/loader/loader.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// FileSys namespace
-
-namespace FileSys {
-
-class Archive_RomFS;
-
-class File_RomFS final : public FileBackend {
-public:
- File_RomFS(const Archive_RomFS* archive) : archive(archive) {}
-
- /**
- * Open the file
- * @return true if the file opened correctly
- */
- bool Open() override;
-
- /**
- * Read data from the file
- * @param offset Offset in bytes to start reading data from
- * @param length Length in bytes of data to read from file
- * @param buffer Buffer to read data into
- * @return Number of bytes read
- */
- size_t Read(const u64 offset, const u32 length, u8* buffer) const override;
-
- /**
- * Write data to the file
- * @param offset Offset in bytes to start writing data to
- * @param length Length in bytes of data to write to file
- * @param flush The flush parameters (0 == do not flush)
- * @param buffer Buffer to read data from
- * @return Number of bytes written
- */
- size_t Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const override;
-
- /**
- * Get the size of the file in bytes
- * @return Size of the file in bytes
- */
- size_t GetSize() const override;
-
- /**
- * Set the size of the file in bytes
- * @param size New size of the file
- * @return true if successful
- */
- bool SetSize(const u64 size) const override;
-
- /**
- * Close the file
- * @return true if the file closed correctly
- */
- bool Close() const override;
-
- void Flush() const override { }
-
-private:
- const Archive_RomFS* archive;
-};
-
-} // namespace FileSys
diff --git a/src/core/file_sys/ivfc_archive.cpp b/src/core/file_sys/ivfc_archive.cpp
new file mode 100644
index 000000000..300b95413
--- /dev/null
+++ b/src/core/file_sys/ivfc_archive.cpp
@@ -0,0 +1,88 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <memory>
+
+#include "common/common_types.h"
+#include "common/file_util.h"
+#include "common/make_unique.h"
+
+#include "core/file_sys/ivfc_archive.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+IVFCArchive::IVFCArchive() {
+}
+
+std::unique_ptr<FileBackend> IVFCArchive::OpenFile(const Path& path, const Mode mode) const {
+ return Common::make_unique<IVFCFile>(this);
+}
+
+bool IVFCArchive::DeleteFile(const Path& path) const {
+ LOG_WARNING(Service_FS, "Attempted to delete a file from an IVFC archive (%s).", GetName().c_str());
+ return false;
+}
+
+bool IVFCArchive::RenameFile(const Path& src_path, const Path& dest_path) const {
+ LOG_WARNING(Service_FS, "Attempted to rename a file within an IVFC archive (%s).", GetName().c_str());
+ return false;
+}
+
+bool IVFCArchive::DeleteDirectory(const Path& path) const {
+ LOG_WARNING(Service_FS, "Attempted to delete a directory from an IVFC archive (%s).", GetName().c_str());
+ return false;
+}
+
+ResultCode IVFCArchive::CreateFile(const Path& path, u32 size) const {
+ LOG_WARNING(Service_FS, "Attempted to create a file in an IVFC archive (%s).", GetName().c_str());
+ // TODO: Verify error code
+ return ResultCode(ErrorDescription::NotAuthorized, ErrorModule::FS, ErrorSummary::NotSupported, ErrorLevel::Permanent);
+}
+
+bool IVFCArchive::CreateDirectory(const Path& path) const {
+ LOG_WARNING(Service_FS, "Attempted to create a directory in an IVFC archive (%s).", GetName().c_str());
+ return false;
+}
+
+bool IVFCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const {
+ LOG_WARNING(Service_FS, "Attempted to rename a file within an IVFC archive (%s).", GetName().c_str());
+ return false;
+}
+
+std::unique_ptr<DirectoryBackend> IVFCArchive::OpenDirectory(const Path& path) const {
+ return Common::make_unique<IVFCDirectory>();
+}
+
+ResultCode IVFCArchive::Format(const Path& path) const {
+ LOG_WARNING(Service_FS, "Attempted to format an IVFC archive (%s).", GetName().c_str());
+ // TODO: Verify error code
+ return ResultCode(ErrorDescription::NotAuthorized, ErrorModule::FS, ErrorSummary::NotSupported, ErrorLevel::Permanent);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+size_t IVFCFile::Read(const u64 offset, const u32 length, u8* buffer) const {
+ LOG_TRACE(Service_FS, "called offset=%llu, length=%d", offset, length);
+ memcpy(buffer, &archive->raw_data[(u32)offset], length);
+ return length;
+}
+
+size_t IVFCFile::Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const {
+ LOG_WARNING(Service_FS, "Attempted to write to IVFC file in archive %s.", archive->GetName().c_str());
+ return 0;
+}
+
+size_t IVFCFile::GetSize() const {
+ return sizeof(u8) * archive->raw_data.size();
+}
+
+bool IVFCFile::SetSize(const u64 size) const {
+ LOG_WARNING(Service_FS, "Attempted to set the size of an IVFC file in archive %s", archive->GetName().c_str());
+ return false;
+}
+
+} // namespace FileSys
diff --git a/src/core/file_sys/ivfc_archive.h b/src/core/file_sys/ivfc_archive.h
new file mode 100644
index 000000000..fd9a3042d
--- /dev/null
+++ b/src/core/file_sys/ivfc_archive.h
@@ -0,0 +1,63 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <vector>
+
+#include "common/common_types.h"
+
+#include "core/file_sys/archive_backend.h"
+#include "core/loader/loader.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FileSys namespace
+
+namespace FileSys {
+
+class IVFCArchive : public ArchiveBackend {
+public:
+ IVFCArchive();
+
+ std::unique_ptr<FileBackend> OpenFile(const Path& path, const Mode mode) const override;
+ bool DeleteFile(const Path& path) const override;
+ bool RenameFile(const Path& src_path, const Path& dest_path) const override;
+ bool DeleteDirectory(const Path& path) const override;
+ ResultCode CreateFile(const Path& path, u32 size) const override;
+ bool CreateDirectory(const Path& path) const override;
+ bool RenameDirectory(const Path& src_path, const Path& dest_path) const override;
+ std::unique_ptr<DirectoryBackend> OpenDirectory(const Path& path) const override;
+ ResultCode Format(const Path& path) const override;
+
+protected:
+ friend class IVFCFile;
+ std::vector<u8> raw_data;
+};
+
+class IVFCFile : public FileBackend {
+public:
+ IVFCFile(const IVFCArchive* archive) : archive(archive) {}
+
+ bool Open() override { return true; }
+ size_t Read(const u64 offset, const u32 length, u8* buffer) const override;
+ size_t Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const override;
+ size_t GetSize() const override;
+ bool SetSize(const u64 size) const override;
+ bool Close() const override { return false; }
+ void Flush() const override { }
+
+private:
+ const IVFCArchive* archive;
+};
+
+class IVFCDirectory : public DirectoryBackend {
+public:
+ IVFCDirectory() { }
+
+ bool Open() override { return false; }
+ u32 Read(const u32 count, Entry* entries) override { return 0; }
+ bool Close() const override { return false; }
+};
+
+} // namespace FileSys