From 5844f83998040d4a79dc442151a21dc17de60feb Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Tue, 16 May 2017 18:10:29 +0300
Subject: Add subdir support in VirtFs::getFiles.

---
 src/fs/virtfs/fsdir.cpp           |  4 ++--
 src/fs/virtfs/fsdir.h             |  2 +-
 src/fs/virtfs/fsfuncs.h           |  2 +-
 src/fs/virtfs/fszip.cpp           |  7 +++++--
 src/fs/virtfs/fszip.h             |  2 +-
 src/fs/virtfs/virtfs1_unittest.cc | 33 ++++++++++++++++++++++++++++++-
 src/fs/virtfs/virtfs_unittest.cc  | 41 ++++++++++++++++++++++++++++++++++++++-
 7 files changed, 82 insertions(+), 9 deletions(-)

(limited to 'src/fs')

diff --git a/src/fs/virtfs/fsdir.cpp b/src/fs/virtfs/fsdir.cpp
index bafe3d2e3..10e980722 100644
--- a/src/fs/virtfs/fsdir.cpp
+++ b/src/fs/virtfs/fsdir.cpp
@@ -521,10 +521,10 @@ namespace FsDir
     }
 
     void getFiles(FsEntry *restrict const entry,
-                  const std::string &dirName,
+                  std::string dirName,
                   StringVect &names)
     {
-        const std::string path = entry->root + dirName;
+        const std::string path = entry->root + entry->subDir + dirName;
         const struct dirent *next_file = nullptr;
         DIR *const dir = opendir(path.c_str());
         if (dir)
diff --git a/src/fs/virtfs/fsdir.h b/src/fs/virtfs/fsdir.h
index ada58943e..3c4f4a46d 100644
--- a/src/fs/virtfs/fsdir.h
+++ b/src/fs/virtfs/fsdir.h
@@ -59,7 +59,7 @@ namespace FsDir
                    std::string dirName,
                    StringVect &names);
     void getFiles(FsEntry *restrict const entry,
-                  const std::string &dirName,
+                  std::string dirName,
                   StringVect &names);
     void getFilesWithDir(FsEntry *restrict const entry,
                          const std::string &dirName,
diff --git a/src/fs/virtfs/fsfuncs.h b/src/fs/virtfs/fsfuncs.h
index 989ee558e..c0dc2a7c1 100644
--- a/src/fs/virtfs/fsfuncs.h
+++ b/src/fs/virtfs/fsfuncs.h
@@ -92,7 +92,7 @@ struct FsFuncs final
                        std::string dirName,
                        StringVect &names);
     void (*getFiles) (FsEntry *restrict const entry,
-                      const std::string &dirName,
+                      std::string dirName,
                       StringVect &names);
     void (*getFilesWithDir) (FsEntry *restrict const entry,
                              const std::string &dirName,
diff --git a/src/fs/virtfs/fszip.cpp b/src/fs/virtfs/fszip.cpp
index 91d323cc1..b2e123f49 100644
--- a/src/fs/virtfs/fszip.cpp
+++ b/src/fs/virtfs/fszip.cpp
@@ -156,7 +156,7 @@ namespace FsZip
                    StringVect &names)
     {
         ZipEntry *const zipEntry = static_cast<ZipEntry*>(entry);
-        std::string subDir = zipEntry->subDir;
+        const std::string subDir = zipEntry->subDir;
         if (subDir != dirSeparator)
             dirName = pathJoin(subDir, dirName);
         if (dirName == dirSeparator)
@@ -215,10 +215,13 @@ namespace FsZip
     }
 
     void getFiles(FsEntry *restrict const entry,
-                  const std::string &dirName,
+                  std::string dirName,
                   StringVect &names)
     {
         ZipEntry *const zipEntry = static_cast<ZipEntry*>(entry);
+        const std::string subDir = zipEntry->subDir;
+        if (subDir != dirSeparator)
+            dirName = pathJoin(subDir, dirName);
         if (dirName == dirSeparator)
         {
             FOR_EACH (std::vector<ZipLocalHeader*>::const_iterator,
diff --git a/src/fs/virtfs/fszip.h b/src/fs/virtfs/fszip.h
index 68466a25c..76bb1e148 100644
--- a/src/fs/virtfs/fszip.h
+++ b/src/fs/virtfs/fszip.h
@@ -46,7 +46,7 @@ namespace FsZip
                    std::string dirName,
                    StringVect &names);
     void getFiles(FsEntry *restrict const entry,
-                  const std::string &dirName,
+                  std::string dirName,
                   StringVect &names);
     void getFilesWithDir(FsEntry *restrict const entry,
                          const std::string &dirName,
diff --git a/src/fs/virtfs/virtfs1_unittest.cc b/src/fs/virtfs/virtfs1_unittest.cc
index 4c046b621..43834d87e 100644
--- a/src/fs/virtfs/virtfs1_unittest.cc
+++ b/src/fs/virtfs/virtfs1_unittest.cc
@@ -3103,7 +3103,7 @@ TEST_CASE("VirtFs1 rwops_read3")
     delete2(logger);
 }
 
-TEST_CASE("VirtFs1 getFiles zip")
+TEST_CASE("VirtFs1 getFiles zip1")
 {
     VirtFs::init(".");
     logger = new Logger();
@@ -3134,6 +3134,37 @@ TEST_CASE("VirtFs1 getFiles zip")
     delete2(logger);
 }
 
+TEST_CASE("VirtFs1 getFiles zip2")
+{
+    VirtFs::init(".");
+    logger = new Logger();
+    std::string name("data/test/test.zip");
+    std::string prefix;
+    if (Files::existsLocal(name) == false)
+        prefix = "../" + prefix;
+
+    VirtFs::mountZip2(prefix + "data/test/test2.zip",
+        "dir",
+        Append_false);
+
+    StringVect list;
+    VirtFs::getFiles(dirSeparator, list);
+    REQUIRE(list.size() == 2);
+    REQUIRE(inList(list, "dye.png"));
+    REQUIRE(inList(list, "hide.png"));
+
+    list.clear();
+    VirtFs::getFiles("1", list);
+    REQUIRE(list.size() == 2);
+    REQUIRE(inList(list, "file1.txt"));
+    REQUIRE(inList(list, "test.txt"));
+
+    VirtFs::unmountZip2(prefix + "data/test/test2.zip",
+        "dir");
+    VirtFs::deinit();
+    delete2(logger);
+}
+
 TEST_CASE("VirtFs1 getDirs1")
 {
     VirtFs::init(".");
diff --git a/src/fs/virtfs/virtfs_unittest.cc b/src/fs/virtfs/virtfs_unittest.cc
index d6ab42ff4..24b9232fc 100644
--- a/src/fs/virtfs/virtfs_unittest.cc
+++ b/src/fs/virtfs/virtfs_unittest.cc
@@ -778,7 +778,7 @@ TEST_CASE("VirtFs getrealDir3")
     delete2(logger);
 }
 
-TEST_CASE("VirtFs permitLinks")
+TEST_CASE("VirtFs permitLinks1")
 {
     logger = new Logger();
     VirtFs::mountDirSilent("data", Append_false);
@@ -811,6 +811,45 @@ TEST_CASE("VirtFs permitLinks")
     delete2(logger);
 }
 
+TEST_CASE("VirtFs permitLinks2")
+{
+    logger = new Logger();
+    VirtFs::mountDirSilent2("data",
+        "test",
+        Append_false);
+    VirtFs::mountDirSilent2("../data",
+        "test",
+        Append_false);
+
+    const int cnt1 = VirtFs::exists("test2.txt") ? 26 : 25;
+    const int cnt2 = 26;
+
+    StringVect list;
+    VirtFs::permitLinks(false);
+    VirtFs::getFiles(dirSeparator, list);
+    removeTemp(list);
+    const size_t sz = list.size();
+    REQUIRE(sz == cnt1);
+
+    list.clear();
+    VirtFs::permitLinks(true);
+    VirtFs::getFiles(dirSeparator, list);
+    removeTemp(list);
+    REQUIRE(list.size() == cnt2);
+
+    list.clear();
+    VirtFs::permitLinks(false);
+    VirtFs::getFiles(dirSeparator, list);
+    removeTemp(list);
+    REQUIRE(list.size() == cnt1);
+
+    VirtFs::unmountDirSilent2("data",
+        "test");
+    VirtFs::unmountDirSilent2("../data",
+        "test");
+    delete2(logger);
+}
+
 TEST_CASE("VirtFs read1")
 {
     logger = new Logger();
-- 
cgit v1.2.3-70-g09d2