13 #include "utils/CharsetConverter.h" 14 #include "utils/StringUtils.h" 15 #include "utils/URIUtils.h" 32 template<
class TEntry>
33 using DirectorizeEntryToFileItemFunction =
CFileItemPtr(*)(
const TEntry& entry,
const std::string& label,
const std::string& path,
bool isFolder);
35 template<
class TEntry>
36 using DirectorizeEntry = std::pair<std::string, TEntry>;
37 template<
class TEntry>
38 using DirectorizeEntries = std::vector<DirectorizeEntry<TEntry>>;
48 template<
class TEntry>
49 static void Directorize(
const CURL& url,
const DirectorizeEntries<TEntry>& entries, DirectorizeEntryToFileItemFunction<TEntry> converter,
CFileItemList& items)
51 if (url.Get().empty() || entries.empty())
54 const std::string& options = url.GetOptions();
55 const std::string& filePath = url.GetFileName();
58 baseUrl.SetOptions(
"");
59 baseUrl.SetFileName(
"");
61 std::string basePath = baseUrl.Get();
62 URIUtils::AddSlashAtEnd(basePath);
64 std::vector<std::string> filePathTokens;
65 if (!filePath.empty())
68 bool fastLookup = items.GetFastLookup();
69 items.SetFastLookup(
true);
70 for (
const auto& entry : entries)
72 std::string entryPath = entry.first;
73 std::string entryFileName = entryPath;
74 StringUtils::Replace(entryFileName,
'\\',
'/');
77 if (entryFileName == filePath)
81 std::size_t found = entryPath.find(
"__MACOSX");
82 if (found != std::string::npos)
85 std::vector<std::string> pathTokens;
89 if (pathTokens.size() < filePathTokens.size() + 1)
93 bool ignoreItem =
false;
94 entryFileName.clear();
95 for (
auto filePathToken = filePathTokens.begin(); filePathToken != filePathTokens.end(); ++filePathToken)
97 if (*filePathToken != pathTokens[std::distance(filePathTokens.begin(), filePathToken)])
102 entryFileName = URIUtils::AddFileToFolder(entryFileName, *filePathToken);
107 entryFileName = URIUtils::AddFileToFolder(entryFileName, pathTokens[filePathTokens.size()]);
108 char c = entryPath[entryFileName.size()];
109 if (c ==
'/' || c ==
'\\')
110 URIUtils::AddSlashAtEnd(entryFileName);
112 std::string itemPath = URIUtils::AddFileToFolder(basePath, entryFileName) + options;
113 bool isFolder =
false;
114 if (URIUtils::HasSlashAtEnd(entryFileName))
117 if (items.Contains(itemPath))
121 URIUtils::AddSlashAtEnd(itemPath);
125 std::string label = pathTokens[filePathTokens.size()];
126 g_charsetConverter.unknownToUTF8(label);
129 CFileItemPtr item = converter(entry.second, label, itemPath, isFolder);
130 item->SetPath(itemPath);
131 item->m_bIsFolder = isFolder;
137 items.SetFastLookup(fastLookup);
std::shared_ptr< CFileItem > CFileItemPtr
A shared pointer to CFileItem.
Definition: FileItem.h:680
Represents a list of files.
Definition: FileItem.h:713
static std::vector< std::string > Tokenize(const std::string &input, const std::string &delimiters)
Split a string by the specified delimiters. Splits a string using one or more delimiting characters...
Definition: StringUtils.cpp:1814