diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/favourites/FavouritesURL.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/favourites/FavouritesURL.cpp')
-rw-r--r-- | xbmc/favourites/FavouritesURL.cpp | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/xbmc/favourites/FavouritesURL.cpp b/xbmc/favourites/FavouritesURL.cpp new file mode 100644 index 0000000..a277256 --- /dev/null +++ b/xbmc/favourites/FavouritesURL.cpp @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2022 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 "FavouritesURL.h" + +#include "FileItem.h" +#include "ServiceBroker.h" +#include "URL.h" +#include "addons/AddonManager.h" +#include "addons/IAddon.h" +#include "guilib/LocalizeStrings.h" +#include "input/WindowTranslator.h" +#include "utils/ExecString.h" +#include "utils/StringUtils.h" +#include "utils/SystemInfo.h" +#include "utils/URIUtils.h" +#include "utils/log.h" + +#include <vector> + +namespace +{ +std::string GetActionString(CFavouritesURL::Action action) +{ + switch (action) + { + case CFavouritesURL::Action::ACTIVATE_WINDOW: + return "activatewindow"; + case CFavouritesURL::Action::PLAY_MEDIA: + return "playmedia"; + case CFavouritesURL::Action::SHOW_PICTURE: + return "showpicture"; + case CFavouritesURL::Action::RUN_SCRIPT: + return "runscript"; + case CFavouritesURL::Action::RUN_ADDON: + return "runaddon"; + case CFavouritesURL::Action::START_ANDROID_ACTIVITY: + return "startandroidactivity"; + default: + return {}; + } +} + +CFavouritesURL::Action GetActionId(const std::string& actionString) +{ + if (actionString == "activatewindow") + return CFavouritesURL::Action::ACTIVATE_WINDOW; + else if (actionString == "playmedia") + return CFavouritesURL::Action::PLAY_MEDIA; + else if (actionString == "showpicture") + return CFavouritesURL::Action::SHOW_PICTURE; + else if (actionString == "runscript") + return CFavouritesURL::Action::RUN_SCRIPT; + else if (actionString == "runaddon") + return CFavouritesURL::Action::RUN_ADDON; + else if (actionString == "startandroidactivity") + return CFavouritesURL::Action::START_ANDROID_ACTIVITY; + else + return CFavouritesURL::Action::UNKNOWN; +} +} // namespace + +CFavouritesURL::CFavouritesURL(const std::string& favouritesURL) +{ + const CURL url(favouritesURL); + if (url.GetProtocol() != "favourites") + { + CLog::LogF(LOGERROR, "Invalid protocol"); + return; + } + + m_exec = CExecString(CURL::Decode(url.GetHostName())); + if (m_exec.IsValid()) + m_valid = Parse(GetActionId(m_exec.GetFunction()), m_exec.GetParams()); +} + +CFavouritesURL::CFavouritesURL(const CExecString& execString) : m_exec(execString) +{ + if (m_exec.IsValid()) + m_valid = Parse(GetActionId(m_exec.GetFunction()), m_exec.GetParams()); +} + +CFavouritesURL::CFavouritesURL(Action action, const std::vector<std::string>& params) + : m_exec(GetActionString(action), params) +{ + if (m_exec.IsValid()) + m_valid = Parse(action, params); +} + +CFavouritesURL::CFavouritesURL(const CFileItem& item, int contextWindow) + : m_exec(item, std::to_string(contextWindow)) +{ + if (m_exec.IsValid()) + m_valid = Parse(GetActionId(m_exec.GetFunction()), m_exec.GetParams()); +} + +bool CFavouritesURL::Parse(CFavouritesURL::Action action, const std::vector<std::string>& params) +{ + m_action = action; + + bool pathIsAddonID = false; + + switch (action) + { + case Action::ACTIVATE_WINDOW: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + + // mandatory: window name/id + m_windowId = CWindowTranslator::TranslateWindow(params[0]); + + if (params.size() > 1) + { + // optional: target url/path + m_target = StringUtils::DeParamify(params[1]); + } + m_actionLabel = + StringUtils::Format(g_localizeStrings.Get(15220), // Show content in '<windowname>' + g_localizeStrings.Get(m_windowId)); + break; + case Action::PLAY_MEDIA: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15218); // Play media + break; + case Action::SHOW_PICTURE: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15219); // Show picture + break; + case Action::RUN_SCRIPT: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15221); // Execute script + pathIsAddonID = true; + break; + case Action::RUN_ADDON: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15223); // Execute add-on + pathIsAddonID = true; + break; + case Action::START_ANDROID_ACTIVITY: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15222); // Execute Android app + break; + default: + if (params.empty()) + { + CLog::LogF(LOGERROR, "Missing parameter"); + return false; + } + m_action = CFavouritesURL::Action::UNKNOWN; + m_target = StringUtils::DeParamify(params[0]); + m_actionLabel = g_localizeStrings.Get(15224); // Other / Unknown + break; + } + + m_path = StringUtils::Format("favourites://{}", CURL::Encode(GetExecString())); + m_isDir = URIUtils::HasSlashAtEnd(m_target, true); + + if (pathIsAddonID || URIUtils::IsPlugin(m_target)) + { + // get the add-on name + const std::string plugin = pathIsAddonID ? m_target : CURL(m_target).GetHostName(); + + ADDON::AddonPtr addon; + CServiceBroker::GetAddonMgr().GetAddon(plugin, addon, ADDON::OnlyEnabled::CHOICE_NO); + if (addon) + m_providerLabel = addon->Name(); + } + if (m_providerLabel.empty()) + m_providerLabel = CSysInfo::GetAppName(); + + return true; +} |