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_sdmc.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/core/file_sys/file_sdmc.cpp') diff --git a/src/core/file_sys/file_sdmc.cpp b/src/core/file_sys/file_sdmc.cpp index 07951c9f1..76e7f5d3d 100644 --- a/src/core/file_sys/file_sdmc.cpp +++ b/src/core/file_sys/file_sdmc.cpp @@ -39,11 +39,26 @@ File_SDMC::~File_SDMC() { Close(); } +/** + * 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 File_SDMC::Read(const u64 offset, const u32 length, u8* buffer) const { file->Seek(offset, SEEK_SET); return file->ReadBytes(buffer, length); } +/** + * 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 File_SDMC::Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const { file->Seek(offset, SEEK_SET); size_t written = file->WriteBytes(buffer, length); @@ -52,10 +67,18 @@ size_t File_SDMC::Write(const u64 offset, const u32 length, const u32 flush, con return written; } +/** + * Get the size of the file in bytes + * @return Size of the file in bytes + */ size_t File_SDMC::GetSize() const { return static_cast(file->GetSize()); } +/** + * Close the file + * @return true if the file closed correctly + */ bool File_SDMC::Close() const { return file->Close(); } -- 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_sdmc.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/core/file_sys/file_sdmc.cpp') 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 -- 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/file_sdmc.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'src/core/file_sys/file_sdmc.cpp') 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 -- cgit v1.2.3