Merge pull request #25808 from CastagnaIT/fix_url_parse
[xbmc.git] / xbmc / filesystem / ResourceFile.cpp
blob81a9982b788e6dbf8761156c5c20d1fea0cda086
1 /*
2 * Copyright (C) 2014-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 "ResourceFile.h"
11 #include "ServiceBroker.h"
12 #include "URL.h"
13 #include "Util.h"
14 #include "addons/AddonManager.h"
15 #include "addons/Resource.h"
17 using namespace ADDON;
18 using namespace XFILE;
20 CResourceFile::CResourceFile()
21 : COverrideFile(false)
22 { }
24 CResourceFile::~CResourceFile() = default;
26 bool CResourceFile::TranslatePath(const std::string &path, std::string &translatedPath)
28 return TranslatePath(CURL(path), translatedPath);
31 bool CResourceFile::TranslatePath(const CURL &url, std::string &translatedPath)
33 translatedPath = url.Get();
35 // only handle resource:// paths
36 if (!url.IsProtocol("resource"))
37 return false;
39 // the share name represents an identifier that can be mapped to an addon ID
40 const std::string& addonId = url.GetShareName();
41 std::string filePath;
42 if (url.GetFileName().length() > addonId.length())
43 filePath = url.GetFileName().substr(addonId.size() + 1);
45 if (addonId.empty())
46 return false;
48 AddonPtr addon;
49 if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, OnlyEnabled::CHOICE_YES) ||
50 addon == NULL)
51 return false;
53 std::shared_ptr<CResource> resource = std::dynamic_pointer_cast<ADDON::CResource>(addon);
54 if (resource == NULL)
55 return false;
57 if (!resource->IsAllowed(filePath))
58 return false;
60 translatedPath = CUtil::ValidatePath(resource->GetFullPath(filePath));
61 return true;
64 std::string CResourceFile::TranslatePath(const CURL &url)
66 std::string translatedPath;
67 if (!TranslatePath(url, translatedPath))
68 return "";
70 return translatedPath;