From 1ebcb21beaadc449e3048a90ea3f6239801ce8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sat, 31 Aug 2019 20:09:44 +0300 Subject: [PATCH] Fixed|FS|libcore: Problem populating subfolders The folder population method assumes that the folder structure is created outside the operation. If folders are returned among the populated files, they will be discarded as pre-existing and will end up destroyed. Reverted back to the correct population procedure in DirectoryFeed. --- .../core/include/de/filesys/directoryfeed.h | 4 +-- .../libs/core/src/filesys/directoryfeed.cpp | 31 ++++--------------- doomsday/libs/core/src/filesys/folder.cpp | 13 +++++--- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/doomsday/libs/core/include/de/filesys/directoryfeed.h b/doomsday/libs/core/include/de/filesys/directoryfeed.h index 509a3307bc..5f84a9ff0e 100644 --- a/doomsday/libs/core/include/de/filesys/directoryfeed.h +++ b/doomsday/libs/core/include/de/filesys/directoryfeed.h @@ -130,8 +130,8 @@ class DE_PUBLIC DirectoryFeed : public Feed static File &manuallyPopulateSingleFile(NativePath const &nativePath, Folder &parentFolder); protected: - Folder *populateSubFolder(const Folder &folder, const String &entryName); - void populateFile(const Folder &folder, const String &entryName, PopulatedFiles &populated); + void populateSubFolder(const Folder &folder, const String &entryName); + void populateFile(const Folder &folder, const String &entryName, PopulatedFiles &populated); private: DE_PRIVATE(d) diff --git a/doomsday/libs/core/src/filesys/directoryfeed.cpp b/doomsday/libs/core/src/filesys/directoryfeed.cpp index 99ffd749e1..c0ece562b9 100644 --- a/doomsday/libs/core/src/filesys/directoryfeed.cpp +++ b/doomsday/libs/core/src/filesys/directoryfeed.cpp @@ -107,10 +107,7 @@ Feed::PopulatedFiles DirectoryFeed::populate(Folder const &folder) if (isDirectory_FileInfo(i.value)) { - if (auto *f = populateSubFolder(folder, name)) - { - populated << f; - } + populateSubFolder(folder, name); } else { @@ -123,7 +120,7 @@ Feed::PopulatedFiles DirectoryFeed::populate(Folder const &folder) return populated; } -Folder *DirectoryFeed::populateSubFolder(const Folder &folder, const String &entryName) +void DirectoryFeed::populateSubFolder(const Folder &folder, const String &entryName) { LOG_AS("DirectoryFeed::populateSubFolder"); @@ -132,25 +129,11 @@ Folder *DirectoryFeed::populateSubFolder(const Folder &folder, const String &ent Folder *subFolder = folder.tryLocate(entryName); if (!subFolder) { - subFolder = new Folder(entryName); - - // Technically folders could be interpreted, but that would require knowing - // their source data at this time, and we only know the file name. - //subFolder = &folder.fileSystem().interpret(subFolder)->as(); - - subFolder->attach(newSubFeed(entryName)); - //folder.add(subFolder); -// subFolder = &folder.fileSystem() -// .makeFolderWithFeed(folder.path() / entryName, -// newSubFeed(entryName), -// Folder::PopulateFullTree, -// FS::DontInheritFeeds); + subFolder = &FS::get().makeFolderWithFeed(folder.path() / entryName, + newSubFeed(entryName), + Folder::PopulateFullTree, + FS::DontInheritFeeds); } -// else -// { -// // Use the previously populated subfolder. -// subFolder = &folder.locate(entryName); -// } if (d->mode & AllowWrite) { subFolder->setMode(File::Write); @@ -159,9 +142,7 @@ Folder *DirectoryFeed::populateSubFolder(const Folder &folder, const String &ent { subFolder->setMode(File::ReadOnly); } - return subFolder; } - return nullptr; } void DirectoryFeed::populateFile(Folder const &folder, String const &entryName, diff --git a/doomsday/libs/core/src/filesys/folder.cpp b/doomsday/libs/core/src/filesys/folder.cpp index d95a3bb506..df9fe217d6 100644 --- a/doomsday/libs/core/src/filesys/folder.cpp +++ b/doomsday/libs/core/src/filesys/folder.cpp @@ -210,6 +210,9 @@ void Folder::clear() void Folder::populate(PopulationBehaviors behavior) { + // Only folders in the file system tree can be populated. + DE_ASSERT(parent() || this == &FS::get().root()); + if (!behavior.testFlag(DisableIndexing)) { fileSystem().changeBusyLevel(+1); @@ -260,7 +263,7 @@ void Folder::populate(PopulationBehaviors behavior) } if (mustPrune) - { + { // It needs to go. file->setParent(nullptr); iter = d->contents.erase(iter); @@ -289,7 +292,7 @@ void Folder::populate(PopulationBehaviors behavior) { if (i) { - std::unique_ptr file(i); + std::unique_ptr file(i); if (!d->contents.contains(i->name().lower())) { d->add(file.release()); @@ -562,19 +565,19 @@ void Folder::waitForPopulation(WaitBehavior waitBehavior) } } -AsyncTask *Folder::afterPopulation(std::function func) +AsyncTask *Folder::afterPopulation(std::function func) { if (!isPopulatingAsync()) { func(); return nullptr; } - return async([] () + return async([]() { waitForPopulation(); return 0; }, - [func] (int) + [func](int) { func(); });