summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/binary-addons/BinaryAddonManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/binary-addons/BinaryAddonManager.cpp')
-rw-r--r--xbmc/addons/binary-addons/BinaryAddonManager.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/xbmc/addons/binary-addons/BinaryAddonManager.cpp b/xbmc/addons/binary-addons/BinaryAddonManager.cpp
new file mode 100644
index 0000000..699fc09
--- /dev/null
+++ b/xbmc/addons/binary-addons/BinaryAddonManager.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2005-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 "BinaryAddonManager.h"
+
+#include "addons/addoninfo/AddonInfo.h"
+#include "addons/binary-addons/AddonDll.h"
+#include "addons/binary-addons/BinaryAddonBase.h"
+#include "utils/log.h"
+
+#include <mutex>
+
+using namespace ADDON;
+
+BinaryAddonBasePtr CBinaryAddonManager::GetAddonBase(const AddonInfoPtr& addonInfo,
+ IAddonInstanceHandler* handler,
+ AddonDllPtr& addon)
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+
+ BinaryAddonBasePtr addonBase;
+
+ const auto& addonInstances = m_runningAddons.find(addonInfo->ID());
+ if (addonInstances != m_runningAddons.end())
+ {
+ addonBase = addonInstances->second;
+ }
+ else
+ {
+ addonBase = std::make_shared<CBinaryAddonBase>(addonInfo);
+
+ m_runningAddons.emplace(addonInfo->ID(), addonBase);
+ }
+
+ if (addonBase)
+ {
+ addon = addonBase->GetAddon(handler);
+ }
+ if (!addon)
+ {
+ CLog::Log(LOGFATAL, "CBinaryAddonManager::{}: Tried to get add-on '{}' who not available!",
+ __func__, addonInfo->ID());
+ }
+
+ return addonBase;
+}
+
+void CBinaryAddonManager::ReleaseAddonBase(const BinaryAddonBasePtr& addonBase,
+ IAddonInstanceHandler* handler)
+{
+ const auto& addon = m_runningAddons.find(addonBase->ID());
+ if (addon == m_runningAddons.end())
+ return;
+
+ addonBase->ReleaseAddon(handler);
+
+ if (addonBase->UsedInstanceCount() > 0)
+ return;
+
+ m_runningAddons.erase(addon);
+}
+
+BinaryAddonBasePtr CBinaryAddonManager::GetRunningAddonBase(const std::string& addonId) const
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+
+ const auto& addonInstances = m_runningAddons.find(addonId);
+ if (addonInstances != m_runningAddons.end())
+ return addonInstances->second;
+
+ return nullptr;
+}
+
+AddonPtr CBinaryAddonManager::GetRunningAddon(const std::string& addonId) const
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+
+ const BinaryAddonBasePtr base = GetRunningAddonBase(addonId);
+ if (base)
+ return base->GetActiveAddon();
+
+ return nullptr;
+}