Просмотр исходного кода

FileSys: remove Open from FileBackend

Same as directory, file shouldn't expose Open either.
wwylele 9 лет назад
Родитель
Сommit
9a0405858a

+ 40 - 52
src/core/file_sys/disk_archive.cpp

@@ -18,11 +18,46 @@ namespace FileSys {
 ResultVal<std::unique_ptr<FileBackend>> DiskArchive::OpenFile(const Path& path,
                                                               const Mode& mode) const {
     LOG_DEBUG(Service_FS, "called path=%s mode=%01X", path.DebugStr().c_str(), mode.hex);
-    auto file = std::make_unique<DiskFile>(*this, path, mode);
-    ResultCode result = file->Open();
-    if (result.IsError())
-        return result;
-    return MakeResult<std::unique_ptr<FileBackend>>(std::move(file));
+
+    auto full_path = mount_point + path.AsString();
+    if (FileUtil::IsDirectory(full_path))
+        return ResultCode(ErrorDescription::FS_NotAFile, ErrorModule::FS, ErrorSummary::Canceled,
+                          ErrorLevel::Status);
+
+    // Specifying only the Create flag is invalid
+    if (mode.create_flag && !mode.read_flag && !mode.write_flag) {
+        return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS,
+                          ErrorSummary::Canceled, ErrorLevel::Status);
+    }
+
+    if (!FileUtil::Exists(full_path)) {
+        if (!mode.create_flag) {
+            LOG_ERROR(Service_FS, "Non-existing file %s can't be open without mode create.",
+                      full_path.c_str());
+            return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS,
+                              ErrorSummary::NotFound, ErrorLevel::Status);
+        } else {
+            // Create the file
+            FileUtil::CreateEmptyFile(full_path);
+        }
+    }
+
+    std::string mode_string = "";
+    if (mode.write_flag)
+        mode_string += "r+"; // Files opened with Write access can be read from
+    else if (mode.read_flag)
+        mode_string += "r";
+
+    // Open the file in binary mode, to avoid problems with CR/LF on Windows systems
+    mode_string += "b";
+
+    FileUtil::IOFile file(full_path, mode_string.c_str());
+    if (!file.IsOpen())
+        return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
+                          ErrorLevel::Status);
+
+    auto disk_file = std::make_unique<DiskFile>(std::move(file), mode);
+    return MakeResult<std::unique_ptr<FileBackend>>(std::move(disk_file));
 }
 
 ResultCode DiskArchive::DeleteFile(const Path& path) const {
@@ -127,53 +162,6 @@ u64 DiskArchive::GetFreeBytes() const {
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
-DiskFile::DiskFile(const DiskArchive& archive, const Path& path, const Mode mode) {
-    // 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.
-    this->path = archive.mount_point + path.AsString();
-    this->mode.hex = mode.hex;
-}
-
-ResultCode DiskFile::Open() {
-    if (FileUtil::IsDirectory(path))
-        return ResultCode(ErrorDescription::FS_NotAFile, ErrorModule::FS, ErrorSummary::Canceled,
-                          ErrorLevel::Status);
-
-    // Specifying only the Create flag is invalid
-    if (mode.create_flag && !mode.read_flag && !mode.write_flag) {
-        return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS,
-                          ErrorSummary::Canceled, ErrorLevel::Status);
-    }
-
-    if (!FileUtil::Exists(path)) {
-        if (!mode.create_flag) {
-            LOG_ERROR(Service_FS, "Non-existing file %s can't be open without mode create.",
-                      path.c_str());
-            return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS,
-                              ErrorSummary::NotFound, ErrorLevel::Status);
-        } else {
-            // Create the file
-            FileUtil::CreateEmptyFile(path);
-        }
-    }
-
-    std::string mode_string = "";
-    if (mode.write_flag)
-        mode_string += "r+"; // Files opened with Write access can be read from
-    else if (mode.read_flag)
-        mode_string += "r";
-
-    // Open the file in binary mode, to avoid problems with CR/LF on Windows systems
-    mode_string += "b";
-
-    file = std::make_unique<FileUtil::IOFile>(path, mode_string.c_str());
-    if (file->IsOpen())
-        return RESULT_SUCCESS;
-    return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
-                      ErrorLevel::Status);
-}
-
 ResultVal<size_t> DiskFile::Read(const u64 offset, const size_t length, u8* buffer) const {
     if (!mode.read_flag && !mode.write_flag)
         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS,

+ 4 - 3
src/core/file_sys/disk_archive.h

@@ -54,9 +54,11 @@ protected:
 
 class DiskFile : public FileBackend {
 public:
-    DiskFile(const DiskArchive& archive, const Path& path, const Mode mode);
+    DiskFile(FileUtil::IOFile&& file_, const Mode& mode_)
+        : file(new FileUtil::IOFile(std::move(file_))) {
+        mode.hex = mode_.hex;
+    }
 
-    ResultCode Open() override;
     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override;
     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override;
     u64 GetSize() const override;
@@ -68,7 +70,6 @@ public:
     }
 
 protected:
-    std::string path;
     Mode mode;
     std::unique_ptr<FileUtil::IOFile> file;
 };

+ 0 - 6
src/core/file_sys/file_backend.h

@@ -18,12 +18,6 @@ public:
     FileBackend() {}
     virtual ~FileBackend() {}
 
-    /**
-     * Open the file
-     * @return Result of the file operation
-     */
-    virtual ResultCode Open() = 0;
-
     /**
      * Read data from the file
      * @param offset Offset in bytes to start reading data from

+ 0 - 3
src/core/file_sys/ivfc_archive.h

@@ -55,9 +55,6 @@ public:
     IVFCFile(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size)
         : romfs_file(file), data_offset(offset), data_size(size) {}
 
-    ResultCode Open() override {
-        return RESULT_SUCCESS;
-    }
     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override;
     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) const override;
     u64 GetSize() const override;