summaryrefslogtreecommitdiffstats
path: root/xbmc/filesystem/ResourceFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/filesystem/ResourceFile.cpp')
-rw-r--r--xbmc/filesystem/ResourceFile.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/xbmc/filesystem/ResourceFile.cpp b/xbmc/filesystem/ResourceFile.cpp
new file mode 100644
index 0000000..81a9982
--- /dev/null
+++ b/xbmc/filesystem/ResourceFile.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2014-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "ResourceFile.h"
+
+#include "ServiceBroker.h"
+#include "URL.h"
+#include "Util.h"
+#include "addons/AddonManager.h"
+#include "addons/Resource.h"
+
+using namespace ADDON;
+using namespace XFILE;
+
+CResourceFile::CResourceFile()
+ : COverrideFile(false)
+{ }
+
+CResourceFile::~CResourceFile() = default;
+
+bool CResourceFile::TranslatePath(const std::string &path, std::string &translatedPath)
+{
+ return TranslatePath(CURL(path), translatedPath);
+}
+
+bool CResourceFile::TranslatePath(const CURL &url, std::string &translatedPath)
+{
+ translatedPath = url.Get();
+
+ // only handle resource:// paths
+ if (!url.IsProtocol("resource"))
+ return false;
+
+ // the share name represents an identifier that can be mapped to an addon ID
+ const std::string& addonId = url.GetShareName();
+ std::string filePath;
+ if (url.GetFileName().length() > addonId.length())
+ filePath = url.GetFileName().substr(addonId.size() + 1);
+
+ if (addonId.empty())
+ return false;
+
+ AddonPtr addon;
+ if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, OnlyEnabled::CHOICE_YES) ||
+ addon == NULL)
+ return false;
+
+ std::shared_ptr<CResource> resource = std::dynamic_pointer_cast<ADDON::CResource>(addon);
+ if (resource == NULL)
+ return false;
+
+ if (!resource->IsAllowed(filePath))
+ return false;
+
+ translatedPath = CUtil::ValidatePath(resource->GetFullPath(filePath));
+ return true;
+}
+
+std::string CResourceFile::TranslatePath(const CURL &url)
+{
+ std::string translatedPath;
+ if (!TranslatePath(url, translatedPath))
+ return "";
+
+ return translatedPath;
+}