Merge pull request #25808 from CastagnaIT/fix_url_parse
[xbmc.git] / xbmc / filesystem / ZipDirectory.cpp
blobcd29d907f8c554a2b8450d13b7cd266f04f93f06
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "ZipDirectory.h"
11 #include "FileItem.h"
12 #include "URL.h"
13 #include "ZipManager.h"
14 #include "filesystem/Directorization.h"
15 #include "utils/CharsetConverter.h"
16 #include "utils/StringUtils.h"
17 #include "utils/URIUtils.h"
19 #include <vector>
21 namespace XFILE
24 static CFileItemPtr ZipEntryToFileItem(const SZipEntry& entry, const std::string& label, const std::string& path, bool isFolder)
26 CFileItemPtr item(new CFileItem(label));
27 if (!isFolder)
29 item->m_dwSize = entry.usize;
30 item->m_idepth = entry.method;
33 return item;
36 CZipDirectory::CZipDirectory() = default;
38 CZipDirectory::~CZipDirectory() = default;
40 bool CZipDirectory::GetDirectory(const CURL& urlOrig, CFileItemList& items)
42 CURL urlZip(urlOrig);
44 /* if this isn't a proper archive path, assume it's the path to a archive file */
45 if (!urlOrig.IsProtocol("zip"))
46 urlZip = URIUtils::CreateArchivePath("zip", urlOrig);
48 std::vector<SZipEntry> zipEntries;
49 if (!g_ZipManager.GetZipList(urlZip, zipEntries))
50 return false;
52 // prepare the ZIP entries for directorization
53 DirectorizeEntries<SZipEntry> entries;
54 entries.reserve(zipEntries.size());
55 for (const auto& zipEntry : zipEntries)
56 entries.emplace_back(zipEntry.name, zipEntry);
58 // directorize the ZIP entries into files and directories
59 Directorize(urlZip, entries, ZipEntryToFileItem, items);
61 return true;
64 bool CZipDirectory::ContainsFiles(const CURL& url)
66 std::vector<SZipEntry> items;
67 g_ZipManager.GetZipList(url, items);
68 if (items.size())
70 if (items.size() > 1)
71 return true;
73 return false;
76 return false;