diff options
author | bunnei <bunneidev@gmail.com> | 2014-10-06 21:25:19 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2014-10-06 21:25:19 +0200 |
commit | 0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a (patch) | |
tree | 766620c93a936e767cc073382573660041c2e193 /src/core/file_sys/file_sdmc.cpp | |
parent | Merge pull request #125 from purpasmart96/master (diff) | |
parent | Common: Add a helper function to generate a 8.3 filename from a long one. (diff) | |
download | yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar.gz yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar.bz2 yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar.lz yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar.xz yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.tar.zst yuzu-0e2d83fa3ab4aad56dc8813e45d5fdfe05132a5a.zip |
Diffstat (limited to 'src/core/file_sys/file_sdmc.cpp')
-rw-r--r-- | src/core/file_sys/file_sdmc.cpp | 70 |
1 files changed, 57 insertions, 13 deletions
diff --git a/src/core/file_sys/file_sdmc.cpp b/src/core/file_sys/file_sdmc.cpp index 07951c9f1..26204392c 100644 --- a/src/core/file_sys/file_sdmc.cpp +++ b/src/core/file_sys/file_sdmc.cpp @@ -19,31 +19,56 @@ 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; + this->path = archive->GetMountPoint() + path; + this->mode.hex = mode.hex; +} + +File_SDMC::~File_SDMC() { + Close(); +} - if (!mode.create_flag && !FileUtil::Exists(real_path)) { - file = nullptr; - return; +/** + * 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_string += "r"; - if (mode.write_flag) - mode_string += "w"; + 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(real_path, mode_string.c_str()); -} - -File_SDMC::~File_SDMC() { - Close(); + 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 + * @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 +77,29 @@ 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<size_t>(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 + */ bool File_SDMC::Close() const { return file->Close(); } |