TeaSafe::SharedTeaSafeFolder TeaSafe::doGetParentTeaSafeFolder(std::string const &path) const { boost::filesystem::path pathToCheck(path); if (pathToCheck.parent_path().string() == "/") { return m_rootFolder; } pathToCheck = pathToCheck.relative_path().parent_path(); // prefer to pull out of cache if it exists FolderCache::const_iterator cacheIt = m_folderCache.find(pathToCheck.string()); if (cacheIt != m_folderCache.end()) { return cacheIt->second; } // iterate over path parts extracting sub folders along the way boost::filesystem::path::iterator it = pathToCheck.begin(); TeaSafeFolder folderOfInterest = *m_rootFolder; boost::filesystem::path pathBuilder; for (; it != pathToCheck.end(); ++it) { SharedEntryInfo entryInfo = folderOfInterest.getEntryInfo(it->string()); if (!entryInfo) { return SharedTeaSafeFolder(); } pathBuilder /= entryInfo->filename(); if (pathBuilder == pathToCheck) { if (entryInfo->type() == EntryType::FolderType) { SharedTeaSafeFolder folder(boost::make_shared<TeaSafeFolder>(folderOfInterest.getTeaSafeFolder(entryInfo->filename()))); m_folderCache.insert(std::make_pair(pathToCheck.string(), folder)); return folder; } else { return SharedTeaSafeFolder(); } } // recurse deeper folderOfInterest = folderOfInterest.getTeaSafeFolder(entryInfo->filename()); } return SharedTeaSafeFolder(); }
TeaSafe::SharedCompoundFolder TeaSafe::doGetParentCompoundFolder(std::string const &path) const { boost::filesystem::path pathToCheck(path); if (pathToCheck.parent_path().string() == "/") { return m_rootFolder; } pathToCheck = pathToCheck.relative_path().parent_path(); // prefer to pull out of cache if it exists auto cacheIt(m_folderCache.find(pathToCheck.string())); if (cacheIt != m_folderCache.end()) { return cacheIt->second; } // iterate over path parts extracting sub folders along the way auto folderOfInterest(m_rootFolder); boost::filesystem::path pathBuilder; for (auto const & it : pathToCheck) { SharedEntryInfo entryInfo(folderOfInterest->getEntryInfo(it.string())); if (!entryInfo) { return SharedCompoundFolder(); } pathBuilder /= entryInfo->filename(); if (pathBuilder == pathToCheck) { if (entryInfo->type() == EntryType::FolderType) { auto folder(folderOfInterest->getFolder(entryInfo->filename())); m_folderCache.insert(std::make_pair(pathToCheck.string(), folder)); return folder; } else { return SharedCompoundFolder(); } } // recurse deeper folderOfInterest = folderOfInterest->getFolder(entryInfo->filename()); } return SharedCompoundFolder(); }