summaryrefslogtreecommitdiffstats
path: root/xbmc/utils/FileExtensionProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/utils/FileExtensionProvider.cpp')
-rw-r--r--xbmc/utils/FileExtensionProvider.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/xbmc/utils/FileExtensionProvider.cpp b/xbmc/utils/FileExtensionProvider.cpp
new file mode 100644
index 0000000..001629e
--- /dev/null
+++ b/xbmc/utils/FileExtensionProvider.cpp
@@ -0,0 +1,182 @@
1/*
2 * Copyright (C) 2012-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#include "FileExtensionProvider.h"
10
11#include "ServiceBroker.h"
12#include "addons/AddonManager.h"
13#include "settings/AdvancedSettings.h"
14#include "settings/SettingsComponent.h"
15
16#include <string>
17#include <vector>
18
19using namespace ADDON;
20
21const std::vector<TYPE> ADDON_TYPES = {
22 ADDON_VFS,
23 ADDON_IMAGEDECODER,
24 ADDON_AUDIODECODER
25};
26
27CFileExtensionProvider::CFileExtensionProvider(ADDON::CAddonMgr& addonManager)
28 : m_advancedSettings(CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()),
29 m_addonManager(addonManager)
30{
31 SetAddonExtensions();
32
33 m_addonManager.Events().Subscribe(this, &CFileExtensionProvider::OnAddonEvent);
34}
35
36CFileExtensionProvider::~CFileExtensionProvider()
37{
38 m_addonManager.Events().Unsubscribe(this);
39
40 m_advancedSettings.reset();
41 m_addonExtensions.clear();
42}
43
44std::string CFileExtensionProvider::GetDiscStubExtensions() const
45{
46 return m_advancedSettings->m_discStubExtensions;
47}
48
49std::string CFileExtensionProvider::GetMusicExtensions() const
50{
51 std::string extensions(m_advancedSettings->m_musicExtensions);
52 extensions += '|' + GetAddonExtensions(ADDON_VFS);
53 extensions += '|' + GetAddonExtensions(ADDON_AUDIODECODER);
54
55 return extensions;
56}
57
58std::string CFileExtensionProvider::GetPictureExtensions() const
59{
60 std::string extensions(m_advancedSettings->m_pictureExtensions);
61 extensions += '|' + GetAddonExtensions(ADDON_VFS);
62 extensions += '|' + GetAddonExtensions(ADDON_IMAGEDECODER);
63
64 return extensions;
65}
66
67std::string CFileExtensionProvider::GetSubtitleExtensions() const
68{
69 std::string extensions(m_advancedSettings->m_subtitlesExtensions);
70 extensions += '|' + GetAddonExtensions(ADDON_VFS);
71
72 return extensions;
73}
74
75std::string CFileExtensionProvider::GetVideoExtensions() const
76{
77 std::string extensions(m_advancedSettings->m_videoExtensions);
78 if (!extensions.empty())
79 extensions += '|';
80 extensions += GetAddonExtensions(ADDON_VFS);
81
82 return extensions;
83}
84
85std::string CFileExtensionProvider::GetFileFolderExtensions() const
86{
87 std::string extensions(GetAddonFileFolderExtensions(ADDON_VFS));
88 if (!extensions.empty())
89 extensions += '|';
90 extensions += GetAddonFileFolderExtensions(ADDON_AUDIODECODER);
91
92 return extensions;
93}
94
95std::string CFileExtensionProvider::GetAddonExtensions(const TYPE &type) const
96{
97 auto it = m_addonExtensions.find(type);
98 if (it != m_addonExtensions.end())
99 return it->second;
100
101 return "";
102}
103
104std::string CFileExtensionProvider::GetAddonFileFolderExtensions(const TYPE &type) const
105{
106 auto it = m_addonExtensions.find(type);
107 if (it != m_addonExtensions.end())
108 return it->second;
109
110 return "";
111}
112
113void CFileExtensionProvider::SetAddonExtensions()
114{
115 for (auto const type : ADDON_TYPES)
116 {
117 SetAddonExtensions(type);
118 }
119}
120
121void CFileExtensionProvider::SetAddonExtensions(const TYPE& type)
122{
123 std::vector<std::string> extensions;
124 std::vector<std::string> fileFolderExtensions;
125 std::vector<AddonInfoPtr> addonInfos;
126 m_addonManager.GetAddonInfos(addonInfos, true, type);
127 for (const auto& addonInfo : addonInfos)
128 {
129 std::string info = ADDON_VFS == type ? "@extensions" : "@extension";
130 std::string ext = addonInfo->Type(type)->GetValue(info).asString();
131 if (!ext.empty())
132 {
133 extensions.push_back(ext);
134 if (type == ADDON_VFS || type == ADDON_AUDIODECODER)
135 {
136 std::string info2 = ADDON_VFS == type ? "@filedirectories" : "@tracks";
137 if (addonInfo->Type(type)->GetValue(info2).asBoolean())
138 fileFolderExtensions.push_back(ext);
139 }
140 if (type == ADDON_VFS)
141 {
142 if (addonInfo->Type(type)->GetValue("@encodedhostname").asBoolean())
143 {
144 std::string prot = addonInfo->Type(type)->GetValue("@protocols").asString();
145 auto prots = StringUtils::Split(prot, "|");
146 for (const std::string& it : prots)
147 m_encoded.push_back(it);
148 }
149 }
150 }
151 }
152
153 m_addonExtensions.insert(make_pair(type, StringUtils::Join(extensions, "|")));
154 if (!fileFolderExtensions.empty())
155 m_addonFileFolderExtensions.insert(make_pair(type, StringUtils::Join(fileFolderExtensions, "|")));
156}
157
158void CFileExtensionProvider::OnAddonEvent(const AddonEvent& event)
159{
160 if (typeid(event) == typeid(AddonEvents::Enabled) ||
161 typeid(event) == typeid(AddonEvents::Disabled) ||
162 typeid(event) == typeid(AddonEvents::ReInstalled))
163 {
164 for (auto &type : ADDON_TYPES)
165 {
166 if (m_addonManager.HasType(event.id, type))
167 {
168 SetAddonExtensions(type);
169 break;
170 }
171 }
172 }
173 else if (typeid(event) == typeid(AddonEvents::UnInstalled))
174 {
175 SetAddonExtensions();
176 }
177}
178
179bool CFileExtensionProvider::EncodedHostName(const std::string& protocol) const
180{
181 return std::find(m_encoded.begin(),m_encoded.end(),protocol) != m_encoded.end();
182}