From d34673990b5176c7ab71c239694737a9ac8df14e Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 27 Sep 2014 19:09:04 +0000 Subject: FileSys: Add forgotten docstrings. --- src/core/file_sys/file_romfs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/file_sys/file_romfs.h') diff --git a/src/core/file_sys/file_romfs.h b/src/core/file_sys/file_romfs.h index 5db43d4a0..28b4f1158 100644 --- a/src/core/file_sys/file_romfs.h +++ b/src/core/file_sys/file_romfs.h @@ -32,8 +32,8 @@ public: * 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 buffer Buffer to write data from * @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; -- cgit v1.2.3 From 23c2fbfc7a900ae3c9f8791a87c5ad672f5778fe Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 27 Sep 2014 19:16:51 +0000 Subject: FileSys/Kernel: Implement SetSize service call for File objects. --- src/core/file_sys/file.h | 7 +++++++ src/core/file_sys/file_romfs.cpp | 9 +++++++++ src/core/file_sys/file_romfs.h | 7 +++++++ src/core/file_sys/file_sdmc.cpp | 11 +++++++++++ src/core/file_sys/file_sdmc.h | 7 +++++++ src/core/hle/kernel/archive.cpp | 8 ++++++++ 6 files changed, 49 insertions(+) (limited to 'src/core/file_sys/file_romfs.h') diff --git a/src/core/file_sys/file.h b/src/core/file_sys/file.h index 3749e4fcf..443e65319 100644 --- a/src/core/file_sys/file.h +++ b/src/core/file_sys/file.h @@ -43,6 +43,13 @@ public: */ virtual size_t GetSize() const = 0; + /** + * Set the size of the file in bytes + * @param size New size of the file + * @return true if successful + */ + virtual bool SetSize(const u64 size) const = 0; + /** * Close the file * @return true if the file closed correctly diff --git a/src/core/file_sys/file_romfs.cpp b/src/core/file_sys/file_romfs.cpp index 0709e98f0..3ef616e08 100644 --- a/src/core/file_sys/file_romfs.cpp +++ b/src/core/file_sys/file_romfs.cpp @@ -48,6 +48,15 @@ size_t File_RomFS::GetSize() const { return -1; } +/** + * Set the size of the file in bytes + * @param size New size of the file + * @return true if successful + */ +bool File_RomFS::SetSize(const u64 size) const { + return false; +} + /** * Close the file * @return true if the file closed correctly diff --git a/src/core/file_sys/file_romfs.h b/src/core/file_sys/file_romfs.h index 28b4f1158..06973eb93 100644 --- a/src/core/file_sys/file_romfs.h +++ b/src/core/file_sys/file_romfs.h @@ -44,6 +44,13 @@ public: */ 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 diff --git a/src/core/file_sys/file_sdmc.cpp b/src/core/file_sys/file_sdmc.cpp index 76e7f5d3d..3ef2b0c0e 100644 --- a/src/core/file_sys/file_sdmc.cpp +++ b/src/core/file_sys/file_sdmc.cpp @@ -75,6 +75,17 @@ size_t File_SDMC::GetSize() const { return static_cast(file->GetSize()); } +/** + * Set the size of the file in bytes + * @param size New size of the file + * @return true if successful + */ +bool File_SDMC::SetSize(const u64 size) const { + file->Resize(size); + file->Flush(); + return true; +} + /** * Close the file * @return true if the file closed correctly diff --git a/src/core/file_sys/file_sdmc.h b/src/core/file_sys/file_sdmc.h index d23020494..6b3a1f3a5 100644 --- a/src/core/file_sys/file_sdmc.h +++ b/src/core/file_sys/file_sdmc.h @@ -47,6 +47,13 @@ public: */ 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 diff --git a/src/core/hle/kernel/archive.cpp b/src/core/hle/kernel/archive.cpp index fa4972994..0a66ab29b 100644 --- a/src/core/hle/kernel/archive.cpp +++ b/src/core/hle/kernel/archive.cpp @@ -181,6 +181,14 @@ public: break; } + case FileCommand::SetSize: + { + u64 size = cmd_buff[1] | ((u64)cmd_buff[2] << 32); + DEBUG_LOG(KERNEL, "SetSize %s %s size=%d", GetTypeName().c_str(), GetName().c_str(), size); + backend->SetSize(size); + break; + } + case FileCommand::Close: { DEBUG_LOG(KERNEL, "Close %s %s", GetTypeName().c_str(), GetName().c_str()); -- cgit v1.2.3 From 0be5c03176236fe602d49c32717a6f3af0a55465 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 27 Sep 2014 19:21:48 +0000 Subject: FileSys: split the constructor into an Open method, in order to notify the opener something went wrong. Kernel: Return an invalid handle to OpenFile when it failed to open. --- src/core/file_sys/archive_sdmc.cpp | 2 ++ src/core/file_sys/file.h | 6 ++++++ src/core/file_sys/file_romfs.cpp | 8 ++++++++ src/core/file_sys/file_romfs.h | 6 ++++++ src/core/file_sys/file_sdmc.cpp | 38 ++++++++++++++++++++++++-------------- src/core/file_sys/file_sdmc.h | 8 ++++++++ src/core/hle/kernel/archive.cpp | 3 +++ 7 files changed, 57 insertions(+), 14 deletions(-) (limited to 'src/core/file_sys/file_romfs.h') diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp index 8d0827380..213923c02 100644 --- a/src/core/file_sys/archive_sdmc.cpp +++ b/src/core/file_sys/archive_sdmc.cpp @@ -46,6 +46,8 @@ bool Archive_SDMC::Initialize() { std::unique_ptr Archive_SDMC::OpenFile(const std::string& path, const Mode mode) const { DEBUG_LOG(FILESYS, "called path=%s mode=%d", path.c_str(), mode); File_SDMC* file = new File_SDMC(this, path, mode); + if (!file->Open()) + return nullptr; return std::unique_ptr(file); } diff --git a/src/core/file_sys/file.h b/src/core/file_sys/file.h index 443e65319..4013b6c3e 100644 --- a/src/core/file_sys/file.h +++ b/src/core/file_sys/file.h @@ -18,6 +18,12 @@ public: File() { } virtual ~File() { } + /** + * Open the file + * @return true if the file opened correctly + */ + virtual bool Open() = 0; + /** * Read data from the file * @param offset Offset in bytes to start reading data from diff --git a/src/core/file_sys/file_romfs.cpp b/src/core/file_sys/file_romfs.cpp index 3ef616e08..b55708df4 100644 --- a/src/core/file_sys/file_romfs.cpp +++ b/src/core/file_sys/file_romfs.cpp @@ -17,6 +17,14 @@ File_RomFS::File_RomFS() { File_RomFS::~File_RomFS() { } +/** + * Open the file + * @return true if the file opened correctly + */ +bool File_RomFS::Open() { + return false; +} + /** * Read data from the file * @param offset Offset in bytes to start reading data from diff --git a/src/core/file_sys/file_romfs.h b/src/core/file_sys/file_romfs.h index 06973eb93..5196701d3 100644 --- a/src/core/file_sys/file_romfs.h +++ b/src/core/file_sys/file_romfs.h @@ -19,6 +19,12 @@ public: File_RomFS(); ~File_RomFS() override; + /** + * 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 diff --git a/src/core/file_sys/file_sdmc.cpp b/src/core/file_sys/file_sdmc.cpp index 3ef2b0c0e..26204392c 100644 --- a/src/core/file_sys/file_sdmc.cpp +++ b/src/core/file_sys/file_sdmc.cpp @@ -19,26 +19,36 @@ File_SDMC::File_SDMC(const Archive_SDMC* archive, const std::string& path, const // TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass // the root directory we set while opening the archive. // For example, opening /../../etc/passwd can give the emulated program your users list. - std::string real_path = archive->GetMountPoint() + path; - - if (!mode.create_flag && !FileUtil::Exists(real_path)) { - file = nullptr; - return; - } - - std::string mode_string; - if (mode.read_flag) - mode_string += "r"; - if (mode.write_flag) - mode_string += "w"; - - file = new FileUtil::IOFile(real_path, mode_string.c_str()); + this->path = archive->GetMountPoint() + path; + this->mode.hex = mode.hex; } File_SDMC::~File_SDMC() { Close(); } +/** + * Open the file + * @return true if the file opened correctly + */ +bool File_SDMC::Open() { + if (!mode.create_flag && !FileUtil::Exists(path)) { + ERROR_LOG(FILESYS, "Non-existing file %s can’t be open without mode create.", path.c_str()); + return false; + } + + std::string mode_string; + if (mode.read_flag && mode.write_flag) + mode_string = "w+"; + else if (mode.read_flag) + mode_string = "r"; + else if (mode.write_flag) + mode_string = "w"; + + file = new FileUtil::IOFile(path, mode_string.c_str()); + return true; +} + /** * Read data from the file * @param offset Offset in bytes to start reading data from diff --git a/src/core/file_sys/file_sdmc.h b/src/core/file_sys/file_sdmc.h index 6b3a1f3a5..df032f7c0 100644 --- a/src/core/file_sys/file_sdmc.h +++ b/src/core/file_sys/file_sdmc.h @@ -22,6 +22,12 @@ public: File_SDMC(const Archive_SDMC* archive, const std::string& path, const Mode mode); ~File_SDMC() override; + /** + * 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 @@ -61,6 +67,8 @@ public: bool Close() const override; private: + std::string path; + Mode mode; FileUtil::IOFile* file; }; diff --git a/src/core/hle/kernel/archive.cpp b/src/core/hle/kernel/archive.cpp index 0a66ab29b..86aba7489 100644 --- a/src/core/hle/kernel/archive.cpp +++ b/src/core/hle/kernel/archive.cpp @@ -374,6 +374,9 @@ Handle OpenFileFromArchive(Handle archive_handle, const std::string& path, const file->path = path; file->backend = archive->backend->OpenFile(path, mode); + if (!file->backend) + return 0; + return handle; } -- cgit v1.2.3