From c14e5713f52cd58f2a8206d844448a8c2d1a54b6 Mon Sep 17 00:00:00 2001
From: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
Date: Fri, 12 Sep 2014 00:47:05 +0200
Subject: [PATCH] Core: Add a method to obtain a Directory from an Archive.

---
 src/core/file_sys/archive.h         |  8 ++++++++
 src/core/file_sys/archive_romfs.cpp | 10 ++++++++++
 src/core/file_sys/archive_romfs.h   |  7 +++++++
 src/core/file_sys/archive_sdmc.cpp  | 12 ++++++++++++
 src/core/file_sys/archive_sdmc.h    |  7 +++++++
 5 files changed, 44 insertions(+)

diff --git a/src/core/file_sys/archive.h b/src/core/file_sys/archive.h
index 67440ef588..560db6deaa 100644
--- a/src/core/file_sys/archive.h
+++ b/src/core/file_sys/archive.h
@@ -10,6 +10,7 @@
 #include "common/bit_field.h"
 
 #include "core/file_sys/file.h"
+#include "core/file_sys/directory.h"
 
 #include "core/hle/kernel/kernel.h"
 
@@ -55,6 +56,13 @@ public:
      */
     virtual std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const = 0;
 
+    /**
+     * Open a directory specified by its path
+     * @param path Path relative to the archive
+     * @return Opened directory, or nullptr
+     */
+    virtual std::unique_ptr<Directory> OpenDirectory(const std::string& path) const = 0;
+
     /**
      * Read data from the archive
      * @param offset Offset in bytes to start reading data from
diff --git a/src/core/file_sys/archive_romfs.cpp b/src/core/file_sys/archive_romfs.cpp
index 99ded4d8b7..9bab3471fa 100644
--- a/src/core/file_sys/archive_romfs.cpp
+++ b/src/core/file_sys/archive_romfs.cpp
@@ -5,6 +5,7 @@
 #include "common/common_types.h"
 
 #include "core/file_sys/archive_romfs.h"
+#include "core/file_sys/directory_romfs.h"
 #include "core/file_sys/file_romfs.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -32,6 +33,15 @@ std::unique_ptr<File> Archive_RomFS::OpenFile(const std::string& path, const Mod
     return std::unique_ptr<File>(new File_RomFS);
 }
 
+/**
+ * Open a directory specified by its path
+ * @param path Path relative to the archive
+ * @return Opened directory, or nullptr
+ */
+std::unique_ptr<Directory> Archive_RomFS::OpenDirectory(const std::string& path) const {
+    return std::unique_ptr<Directory>(new Directory_RomFS);
+}
+
 /**
  * Read data from the archive
  * @param offset Offset in bytes to start reading data from
diff --git a/src/core/file_sys/archive_romfs.h b/src/core/file_sys/archive_romfs.h
index a7669dd712..fcdefa95f4 100644
--- a/src/core/file_sys/archive_romfs.h
+++ b/src/core/file_sys/archive_romfs.h
@@ -36,6 +36,13 @@ public:
      */
     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override;
 
+    /**
+     * Open a directory specified by its path
+     * @param path Path relative to the archive
+     * @return Opened directory, or nullptr
+     */
+    std::unique_ptr<Directory> OpenDirectory(const std::string& path) const override;
+
     /**
      * Read data from the archive
      * @param offset Offset in bytes to start reading data from
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index fb155430da..30d33be5fb 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -8,6 +8,7 @@
 #include "common/file_util.h"
 
 #include "core/file_sys/archive_sdmc.h"
+#include "core/file_sys/directory_sdmc.h"
 #include "core/file_sys/file_sdmc.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -44,6 +45,17 @@ std::unique_ptr<File> Archive_SDMC::OpenFile(const std::string& path, const Mode
     return std::unique_ptr<File>(file);
 }
 
+/**
+ * Open a directory specified by its path
+ * @param path Path relative to the archive
+ * @return Opened directory, or nullptr
+ */
+std::unique_ptr<Directory> Archive_SDMC::OpenDirectory(const std::string& path) const {
+    DEBUG_LOG(FILESYS, "called path=%s", path.c_str());
+    Directory_SDMC* directory = new Directory_SDMC(this, path);
+    return std::unique_ptr<Directory>(directory);
+}
+
 /**
  * Read data from the archive
  * @param offset Offset in bytes to start reading archive from
diff --git a/src/core/file_sys/archive_sdmc.h b/src/core/file_sys/archive_sdmc.h
index 931817e5b2..946f8b9574 100644
--- a/src/core/file_sys/archive_sdmc.h
+++ b/src/core/file_sys/archive_sdmc.h
@@ -36,6 +36,13 @@ public:
      */
     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override;
 
+    /**
+     * Open a directory specified by its path
+     * @param path Path relative to the archive
+     * @return Opened directory, or nullptr
+     */
+    std::unique_ptr<Directory> OpenDirectory(const std::string& path) const override;
+
     /**
      * Read data from the archive
      * @param offset Offset in bytes to start reading archive from
-- 
GitLab