Skip to content

Commit

Permalink
[addons] make binary addon management independent
Browse files Browse the repository at this point in the history
This changes add a new binary addon manager who handle the
addons on request.

This way allow the use of several instances on the same addon.

Currently only used on Visualization and Screensaver, but other binary
addon types becomes on next steps changed to use them here.

Further becomes on next changes everything related to binary addons
moved to the new folder "./xbmc/addons/binary-addons".

The old system is not changed!
  • Loading branch information
AlwinEsch committed Jun 17, 2017
1 parent 63ccea5 commit 2ce6afe
Show file tree
Hide file tree
Showing 67 changed files with 1,272 additions and 89 deletions.
1 change: 1 addition & 0 deletions cmake/treedata/common/subdirs.txt
@@ -1,5 +1,6 @@
xbmc xbmc
xbmc/addons addons
xbmc/addons/binary-addons addons_binary-addons
xbmc/addons/interfaces addonsBinaryInterfaces
xbmc/addons/interfaces/Addon addonCallbacks_Addon
xbmc/addons/interfaces/GUI addons_interfaces_gui
Expand Down
5 changes: 5 additions & 0 deletions xbmc/ServiceBroker.cpp
Expand Up @@ -28,6 +28,11 @@ ADDON::CAddonMgr &CServiceBroker::GetAddonMgr()
return g_application.m_ServiceManager->GetAddonMgr();
}

ADDON::CBinaryAddonManager &CServiceBroker::GetBinaryAddonManager()
{
return g_application.m_ServiceManager->GetBinaryAddonManager();
}

ADDON::CBinaryAddonCache &CServiceBroker::GetBinaryAddonCache()
{
return g_application.m_ServiceManager->GetBinaryAddonCache();
Expand Down
2 changes: 2 additions & 0 deletions xbmc/ServiceBroker.h
Expand Up @@ -22,6 +22,7 @@

namespace ADDON {
class CAddonMgr;
class CBinaryAddonManager;
class CBinaryAddonCache;
}

Expand Down Expand Up @@ -68,6 +69,7 @@ class CServiceBroker
{
public:
static ADDON::CAddonMgr &GetAddonMgr();
static ADDON::CBinaryAddonManager &GetBinaryAddonManager();
static ADDON::CBinaryAddonCache &GetBinaryAddonCache();
static ANNOUNCEMENT::CAnnouncementManager &GetAnnouncementManager();
static XBPython &GetXBPython();
Expand Down
18 changes: 16 additions & 2 deletions xbmc/ServiceManager.cpp
Expand Up @@ -20,6 +20,7 @@

#include "ServiceManager.h"
#include "addons/BinaryAddonCache.h"
#include "addons/binary-addons/BinaryAddonManager.h"
#include "ContextMenuManager.h"
#include "cores/AudioEngine/Engines/ActiveAE/ActiveAE.h"
#include "cores/DataCacheCore.h"
Expand Down Expand Up @@ -71,10 +72,17 @@ bool CServiceManager::Init2()
{
m_Platform->Init();

m_binaryAddonManager.reset(new ADDON::CBinaryAddonManager()); /* Need to constructed before, GetRunningInstance() of binary CAddonDll need to call them */
m_addonMgr.reset(new ADDON::CAddonMgr());
if (!m_addonMgr->Init())
{
CLog::Log(LOGFATAL, "CServiceManager::Init: Unable to start CAddonMgr");
CLog::Log(LOGFATAL, "CServiceManager::%s: Unable to start CAddonMgr", __FUNCTION__);
return false;
}

if (!m_binaryAddonManager->Init())
{
CLog::Log(LOGFATAL, "CServiceManager::%s: Unable to initialize CBinaryAddonManager", __FUNCTION__);
return false;
}

Expand Down Expand Up @@ -113,7 +121,7 @@ bool CServiceManager::StartAudioEngine()
{
if (!m_ActiveAE)
{
CLog::Log(LOGFATAL, "CServiceManager::StartAudioEngine: Unable to start ActiveAE");
CLog::Log(LOGFATAL, "CServiceManager::%s: Unable to start ActiveAE", __FUNCTION__);
return false;
}

Expand Down Expand Up @@ -141,6 +149,7 @@ void CServiceManager::Deinit()
if (m_PVRManager)
m_PVRManager->Deinit();
m_PVRManager.reset();
m_binaryAddonManager.reset();
m_addonMgr.reset();
#ifdef HAS_PYTHON
CScriptInvocationManager::GetInstance().UnregisterLanguageInvocationHandler(m_XBPython.get());
Expand All @@ -160,6 +169,11 @@ ADDON::CBinaryAddonCache &CServiceManager::GetBinaryAddonCache()
return *m_binaryAddonCache.get();
}

ADDON::CBinaryAddonManager &CServiceManager::GetBinaryAddonManager()
{
return *m_binaryAddonManager.get();
}

ANNOUNCEMENT::CAnnouncementManager& CServiceManager::GetAnnouncementManager()
{
return *m_announcementManager;
Expand Down
3 changes: 3 additions & 0 deletions xbmc/ServiceManager.h
Expand Up @@ -25,6 +25,7 @@

namespace ADDON {
class CAddonMgr;
class CBinaryAddonManager;
class CBinaryAddonCache;
}

Expand Down Expand Up @@ -83,6 +84,7 @@ class CServiceManager
bool Init3();
void Deinit();
ADDON::CAddonMgr& GetAddonMgr();
ADDON::CBinaryAddonManager& GetBinaryAddonManager();
ADDON::CBinaryAddonCache& GetBinaryAddonCache();
ANNOUNCEMENT::CAnnouncementManager& GetAnnouncementManager();
#ifdef HAS_PYTHON
Expand Down Expand Up @@ -126,6 +128,7 @@ class CServiceManager
};

std::unique_ptr<ADDON::CAddonMgr> m_addonMgr;
std::unique_ptr<ADDON::CBinaryAddonManager> m_binaryAddonManager;
std::unique_ptr<ADDON::CBinaryAddonCache> m_binaryAddonCache;
std::unique_ptr<ANNOUNCEMENT::CAnnouncementManager> m_announcementManager;
#ifdef HAS_PYTHON
Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/AddonBuilder.h
Expand Up @@ -61,7 +61,7 @@ class CAddonBuilder
const std::string& GetId() const { return m_addonInfo.m_id; }
const AddonVersion& GetVersion() const { return m_addonInfo.m_version; }

const CAddonInfo& GetAddonInfo() { return m_addonInfo; }
const CAddonInfo& GetAddonInfo() const { return m_addonInfo; }

private:
static std::shared_ptr<IAddon> FromProps(CAddonInfo addonInfo);
Expand Down
34 changes: 34 additions & 0 deletions xbmc/addons/AddonManager.cpp
Expand Up @@ -567,6 +567,40 @@ bool CAddonMgr::FindInstallableById(const std::string& addonId, AddonPtr& result
return true;
}

bool CAddonMgr::GetInstalledBinaryAddons(BINARY_ADDON_LIST& binaryAddonList)
{
CSingleLock lock(m_critSection);
if (!m_cp_context)
return false;

std::vector<CAddonBuilder> builders;
m_database.GetInstalled(builders);

for (auto builder : builders)
{
cp_status_t status;
cp_plugin_info_t* cp_addon = m_cpluff->get_plugin_info(m_cp_context, builder.GetId().c_str(), &status);
if (status == CP_OK && cp_addon)
{
cp_extension_t* props = GetFirstExtPoint(cp_addon, ADDON_UNKNOWN);
if (props != nullptr)
{
std::string value = GetPlatformLibraryName(props->plugin->extensions->configuration);
if (!value.empty() &&
props->plugin->plugin_path &&
strcmp(props->plugin->plugin_path, "") != 0 &&
Factory(cp_addon, ADDON_UNKNOWN, builder, true))
{
binaryAddonList.push_back(BINARY_ADDON_LIST_ENTRY(!IsAddonDisabled(cp_addon->identifier), std::move(builder.GetAddonInfo())));
}
}
m_cpluff->release_info(m_cp_context, cp_addon);
}
}

return !binaryAddonList.empty();
}

bool CAddonMgr::GetAddonsInternal(const TYPE &type, VECADDONS &addons, bool enabledOnly)
{
CSingleLock lock(m_critSection);
Expand Down
23 changes: 22 additions & 1 deletion xbmc/addons/AddonManager.h
Expand Up @@ -29,7 +29,6 @@
#include <map>
#include <deque>


class DllLibCPluff;
extern "C"
{
Expand All @@ -42,6 +41,16 @@ namespace ADDON
typedef std::map<TYPE, VECADDONS>::iterator IMAPADDONS;
typedef std::vector<cp_cfg_element_t*> ELEMENTS;

/*!
* @brief The value binaryAddonList use a tuple in following construct:
* | Number | Type | Description
* |:------:|------------:|:------------------------------------------------
* | first | boolean | If true addon is enabled, otherwise disabled
* | second | CAddonInfo | Information data of addon
*/
typedef std::pair<bool, CAddonInfo> BINARY_ADDON_LIST_ENTRY;
typedef std::vector<BINARY_ADDON_LIST_ENTRY> BINARY_ADDON_LIST;

const std::string ADDON_PYTHON_EXT = "*.py";

/**
Expand Down Expand Up @@ -117,6 +126,18 @@ namespace ADDON

bool GetInstallableAddons(VECADDONS& addons, const TYPE &type);

/*!
* @brief To get all installed binary addon on Kodi
*
* This function becomes used from ADDON::CBinaryAddonManager to get his
* related addons (whether enabled or disabled).
*
* @param[out] binaryAddonList The list where from here the binary addons
* becomes stored.
* @return If list is not empty becomes true returned
*/
bool GetInstalledBinaryAddons(BINARY_ADDON_LIST& binaryAddonList);

/*! Get the installable addon with the highest version. */
bool FindInstallableById(const std::string& addonId, AddonPtr& addon);

Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/AudioDecoder.h
Expand Up @@ -18,7 +18,7 @@
*/
#pragma once

#include "AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/kodi_audiodec_types.h"
#include "cores/paplayer/ICodec.h"
#include "music/tags/ImusicInfoTagLoader.h"
Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/AudioEncoder.h
Expand Up @@ -18,7 +18,7 @@
*/
#pragma once

#include "AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/xbmc_audioenc_types.h"
#include "cdrip/IEncoder.h"

Expand Down
5 changes: 0 additions & 5 deletions xbmc/addons/CMakeLists.txt
Expand Up @@ -2,10 +2,8 @@ set(SOURCES Addon.cpp
AddonBuilder.cpp
BinaryAddonCache.cpp
AddonDatabase.cpp
AddonDll.cpp
AddonInfo.cpp
AddonInstaller.cpp
AddonInstanceHandler.cpp
AddonManager.cpp
AddonStatusHandler.cpp
AddonSystemSettings.cpp
Expand Down Expand Up @@ -41,10 +39,8 @@ set(HEADERS Addon.h
AddonEvents.h
BinaryAddonCache.h
AddonDatabase.h
AddonDll.h
AddonInfo.h
AddonInstaller.h
AddonInstanceHandler.h
AddonManager.h
AddonStatusHandler.h
AddonSystemSettings.h
Expand All @@ -53,7 +49,6 @@ set(HEADERS Addon.h
AudioEncoder.h
ContextMenuAddon.h
ContextMenus.h
DllAddon.h
DllLibCPluff.h
FilesystemInstaller.h
GameResource.h
Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/ImageDecoder.h
Expand Up @@ -18,7 +18,7 @@
*/
#pragma once

#include "AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/kodi_imagedec_types.h"
#include "guilib/iimage.h"

Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/InputStream.h
Expand Up @@ -18,7 +18,7 @@
*/
#pragma once

#include "AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/kodi_inputstream_types.h"
#include "FileItem.h"
#include "cores/VideoPlayer/DVDDemuxers/DVDDemuxUtils.h"
Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/PVRClient.h
Expand Up @@ -25,7 +25,7 @@
#include <vector>

#include "addons/Addon.h"
#include "addons/AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h"

#include "pvr/channels/PVRChannel.h"
Expand Down
4 changes: 2 additions & 2 deletions xbmc/addons/ScreenSaver.cpp
Expand Up @@ -27,8 +27,8 @@
namespace ADDON
{

CScreenSaver::CScreenSaver(AddonDllPtr addonInfo)
: IAddonInstanceHandler(ADDON_INSTANCE_SCREENSAVER, addonInfo)
CScreenSaver::CScreenSaver(BinaryAddonBasePtr addonBase)
: IAddonInstanceHandler(ADDON_INSTANCE_SCREENSAVER, addonBase)
{
m_name = Name();
m_presets = CSpecialProtocol::TranslatePath(Path());
Expand Down
4 changes: 2 additions & 2 deletions xbmc/addons/ScreenSaver.h
Expand Up @@ -20,15 +20,15 @@
#pragma once

#include "addons/kodi-addon-dev-kit/include/kodi/addon-instance/Screensaver.h"
#include "addons/AddonInstanceHandler.h"
#include "addons/binary-addons/AddonInstanceHandler.h"

namespace ADDON
{

class CScreenSaver : public IAddonInstanceHandler
{
public:
CScreenSaver(AddonDllPtr addonInfo);
CScreenSaver(BinaryAddonBasePtr addonBase);
virtual ~CScreenSaver();

bool Start();
Expand Down
2 changes: 1 addition & 1 deletion xbmc/addons/VFSEntry.h
Expand Up @@ -18,7 +18,7 @@
*/
#pragma once

#include "AddonDll.h"
#include "addons/binary-addons/AddonDll.h"
#include "addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h"
#include "filesystem/IFile.h"
#include "filesystem/IDirectory.h"
Expand Down
4 changes: 2 additions & 2 deletions xbmc/addons/Visualization.cpp
Expand Up @@ -30,8 +30,8 @@
namespace ADDON
{

CVisualization::CVisualization(ADDON::AddonDllPtr addonInfo, float x, float y, float w, float h)
: IAddonInstanceHandler(ADDON_INSTANCE_VISUALIZATION, addonInfo)
CVisualization::CVisualization(ADDON::BinaryAddonBasePtr addonBase, float x, float y, float w, float h)
: IAddonInstanceHandler(ADDON_INSTANCE_VISUALIZATION, addonBase)
{
// Setup new Visualization instance
m_name = Name();
Expand Down
4 changes: 2 additions & 2 deletions xbmc/addons/Visualization.h
Expand Up @@ -20,15 +20,15 @@
*/

#include "addons/kodi-addon-dev-kit/include/kodi/addon-instance/Visualization.h"
#include "addons/AddonInstanceHandler.h"
#include "addons/binary-addons/AddonInstanceHandler.h"

namespace ADDON
{

class CVisualization : public IAddonInstanceHandler
{
public:
CVisualization(ADDON::AddonDllPtr addonInfo, float x, float y, float w, float h);
CVisualization(ADDON::BinaryAddonBasePtr addonBase, float x, float y, float w, float h);
virtual ~CVisualization();

bool Start(int channels, int samplesPerSec, int bitsPerSample, const std::string& songName);
Expand Down

0 comments on commit 2ce6afe

Please sign in to comment.