From 0f1ed5d10a0ffdbc47903a36b622f10f7e63f5f5 Mon Sep 17 00:00:00 2001 From: elasota Date: Sat, 17 Oct 2020 18:08:31 -0400 Subject: [PATCH] Add directory scan to Android --- .../app/jni/main/GpFileSystem_Android.cpp | 56 ++++++++++++++++++- .../app/jni/main/GpFileSystem_Android.h | 1 + 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/AerofoilAndroid/app/jni/main/GpFileSystem_Android.cpp b/AerofoilAndroid/app/jni/main/GpFileSystem_Android.cpp index 364a93f..68a8928 100644 --- a/AerofoilAndroid/app/jni/main/GpFileSystem_Android.cpp +++ b/AerofoilAndroid/app/jni/main/GpFileSystem_Android.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "UTF8.h" @@ -509,7 +510,7 @@ PortabilityLayer::HostDirectoryCursor *GpFileSystem_Android::ScanDirectoryNested if (IsVirtualDirectoryLooseResources(virtualDirectory)) return ScanAssetDirectory(virtualDirectory, paths, numPaths); - return nullptr; + return ScanStorageDirectory(virtualDirectory, paths, numPaths); } bool GpFileSystem_Android::ValidateFilePath(const char *path, size_t length) const @@ -606,6 +607,44 @@ void GpDirectoryCursor_StringList::Destroy() delete this; } +class GpDirectoryCursor_POSIX final : public PortabilityLayer::HostDirectoryCursor +{ +public: + explicit GpDirectoryCursor_POSIX(DIR *dir); + ~GpDirectoryCursor_POSIX(); + + bool GetNext(const char *&outFileName) override; + void Destroy() override; + +private: + DIR *m_dir; +}; + +GpDirectoryCursor_POSIX::GpDirectoryCursor_POSIX(DIR *dir) + : m_dir(dir) +{ +} + +GpDirectoryCursor_POSIX::~GpDirectoryCursor_POSIX() +{ + closedir(m_dir); +} + +bool GpDirectoryCursor_POSIX::GetNext(const char *&outFileName) +{ + struct dirent *dir = readdir(m_dir); + if (!dir) + return false; + + outFileName = dir->d_name; + return true; +} + +void GpDirectoryCursor_POSIX::Destroy() +{ + delete this; +} + PortabilityLayer::HostDirectoryCursor *GpFileSystem_Android::ScanAssetDirectory(PortabilityLayer::VirtualDirectory_t virtualDirectory, char const* const* paths, size_t numPaths) { std::string resolvedPath; @@ -639,4 +678,19 @@ PortabilityLayer::HostDirectoryCursor *GpFileSystem_Android::ScanAssetDirectory( return new GpDirectoryCursor_StringList(subPaths); } +PortabilityLayer::HostDirectoryCursor *GpFileSystem_Android::ScanStorageDirectory(PortabilityLayer::VirtualDirectory_t virtualDirectory, char const* const* paths, size_t numPaths) +{ + std::string resolvedPath; + std::vector subPaths; + bool isAsset = true; + if (!ResolvePath(virtualDirectory, paths, numPaths, resolvedPath, isAsset)) + return nullptr; + + DIR *d = opendir(resolvedPath.c_str()); + if (!d) + return nullptr; + + return new GpDirectoryCursor_POSIX(d); +} + GpFileSystem_Android GpFileSystem_Android::ms_instance; diff --git a/AerofoilAndroid/app/jni/main/GpFileSystem_Android.h b/AerofoilAndroid/app/jni/main/GpFileSystem_Android.h index fb4f18d..fe455be 100644 --- a/AerofoilAndroid/app/jni/main/GpFileSystem_Android.h +++ b/AerofoilAndroid/app/jni/main/GpFileSystem_Android.h @@ -30,6 +30,7 @@ public: private: PortabilityLayer::HostDirectoryCursor *ScanAssetDirectory(PortabilityLayer::VirtualDirectory_t virtualDirectory, char const* const* paths, size_t numPaths); + PortabilityLayer::HostDirectoryCursor *ScanStorageDirectory(PortabilityLayer::VirtualDirectory_t virtualDirectory, char const* const* paths, size_t numPaths); jobject m_activity; jmethodID m_scanAssetDirectoryMID;