summaryrefslogtreecommitdiffstats
path: root/xbmc/ServiceManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/ServiceManager.cpp442
1 files changed, 442 insertions, 0 deletions
diff --git a/xbmc/ServiceManager.cpp b/xbmc/ServiceManager.cpp
new file mode 100644
index 0000000..02d9900
--- /dev/null
+++ b/xbmc/ServiceManager.cpp
@@ -0,0 +1,442 @@
+/*
+ * 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 "ServiceManager.h"
+
+#include "ContextMenuManager.h"
+#include "DatabaseManager.h"
+#include "PlayListPlayer.h"
+#include "addons/AddonManager.h"
+#include "addons/BinaryAddonCache.h"
+#include "addons/ExtsMimeSupportList.h"
+#include "addons/RepositoryUpdater.h"
+#include "addons/Service.h"
+#include "addons/VFSEntry.h"
+#include "addons/binary-addons/BinaryAddonManager.h"
+#include "cores/DataCacheCore.h"
+#include "cores/RetroPlayer/guibridge/GUIGameRenderManager.h"
+#include "cores/playercorefactory/PlayerCoreFactory.h"
+#include "favourites/FavouritesService.h"
+#include "games/GameServices.h"
+#include "games/controllers/ControllerManager.h"
+#include "input/InputManager.h"
+#include "interfaces/generic/ScriptInvocationManager.h"
+#include "interfaces/python/XBPython.h"
+#include "network/Network.h"
+#include "peripherals/Peripherals.h"
+#if defined(HAS_FILESYSTEM_SMB)
+#include "network/IWSDiscovery.h"
+#if defined(TARGET_WINDOWS)
+#include "platform/win32/network/WSDiscoveryWin32.h"
+#else // !defined(TARGET_WINDOWS)
+#include "platform/posix/filesystem/SMBWSDiscovery.h"
+#endif // defined(TARGET_WINDOWS)
+#endif // HAS_FILESYSTEM_SMB
+#include "powermanagement/PowerManager.h"
+#include "profiles/ProfileManager.h"
+#include "pvr/PVRManager.h"
+#if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
+#include "storage/DetectDVDType.h"
+#endif
+#include "storage/MediaManager.h"
+#include "utils/FileExtensionProvider.h"
+#include "utils/log.h"
+#include "weather/WeatherManager.h"
+
+using namespace KODI;
+
+CServiceManager::CServiceManager() = default;
+
+CServiceManager::~CServiceManager()
+{
+ if (init_level > 2)
+ DeinitStageThree();
+ if (init_level > 1)
+ DeinitStageTwo();
+ if (init_level > 0)
+ DeinitStageOne();
+}
+
+bool CServiceManager::InitForTesting()
+{
+ m_network = CNetworkBase::GetNetwork();
+
+ m_databaseManager.reset(new CDatabaseManager);
+
+ m_binaryAddonManager.reset(new ADDON::CBinaryAddonManager());
+ m_addonMgr.reset(new ADDON::CAddonMgr());
+ if (!m_addonMgr->Init())
+ {
+ CLog::Log(LOGFATAL, "CServiceManager::{}: Unable to start CAddonMgr", __FUNCTION__);
+ return false;
+ }
+
+ m_extsMimeSupportList.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr));
+ m_fileExtensionProvider.reset(new CFileExtensionProvider(*m_addonMgr));
+
+ init_level = 1;
+ return true;
+}
+
+void CServiceManager::DeinitTesting()
+{
+ init_level = 0;
+ m_fileExtensionProvider.reset();
+ m_extsMimeSupportList.reset();
+ m_binaryAddonManager.reset();
+ m_addonMgr.reset();
+ m_databaseManager.reset();
+ m_network.reset();
+}
+
+bool CServiceManager::InitStageOne()
+{
+ m_Platform.reset(CPlatform::CreateInstance());
+ if (!m_Platform->InitStageOne())
+ return false;
+
+#ifdef HAS_PYTHON
+ m_XBPython.reset(new XBPython());
+ CScriptInvocationManager::GetInstance().RegisterLanguageInvocationHandler(m_XBPython.get(),
+ ".py");
+#endif
+
+ m_playlistPlayer.reset(new PLAYLIST::CPlayListPlayer());
+
+ m_network = CNetworkBase::GetNetwork();
+
+ init_level = 1;
+ return true;
+}
+
+bool CServiceManager::InitStageTwo(const std::string& profilesUserDataFolder)
+{
+ // Initialize the addon database (must be before the addon manager is init'd)
+ m_databaseManager.reset(new CDatabaseManager);
+
+ 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::{}: Unable to start CAddonMgr", __FUNCTION__);
+ return false;
+ }
+
+ m_repositoryUpdater.reset(new ADDON::CRepositoryUpdater(*m_addonMgr));
+
+ m_extsMimeSupportList.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr));
+
+ m_vfsAddonCache.reset(new ADDON::CVFSAddonCache());
+ m_vfsAddonCache->Init();
+
+ m_PVRManager.reset(new PVR::CPVRManager());
+
+ m_dataCacheCore.reset(new CDataCacheCore());
+
+ m_binaryAddonCache.reset(new ADDON::CBinaryAddonCache());
+ m_binaryAddonCache->Init();
+
+ m_favouritesService.reset(new CFavouritesService(profilesUserDataFolder));
+
+ m_serviceAddons.reset(new ADDON::CServiceAddonManager(*m_addonMgr));
+
+ m_contextMenuManager.reset(new CContextMenuManager(*m_addonMgr));
+
+ m_gameControllerManager = std::make_unique<GAME::CControllerManager>(*m_addonMgr);
+ m_inputManager.reset(new CInputManager());
+ m_inputManager->InitializeInputs();
+
+ m_peripherals.reset(new PERIPHERALS::CPeripherals(*m_inputManager, *m_gameControllerManager));
+
+ m_gameRenderManager.reset(new RETRO::CGUIGameRenderManager);
+
+ m_fileExtensionProvider.reset(new CFileExtensionProvider(*m_addonMgr));
+
+ m_powerManager.reset(new CPowerManager());
+ m_powerManager->Initialize();
+ m_powerManager->SetDefaults();
+
+ m_weatherManager.reset(new CWeatherManager());
+
+ m_mediaManager.reset(new CMediaManager());
+ m_mediaManager->Initialize();
+
+#if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
+ m_DetectDVDType = std::make_unique<MEDIA_DETECT::CDetectDVDMedia>();
+#endif
+
+#if defined(HAS_FILESYSTEM_SMB)
+ m_WSDiscovery = WSDiscovery::IWSDiscovery::GetInstance();
+#endif
+
+ if (!m_Platform->InitStageTwo())
+ return false;
+
+ init_level = 2;
+ return true;
+}
+
+// stage 3 is called after successful initialization of WindowManager
+bool CServiceManager::InitStageThree(const std::shared_ptr<CProfileManager>& profileManager)
+{
+#if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
+ // Start Thread for DVD Mediatype detection
+ CLog::Log(LOGINFO, "[Media Detection] starting service for optical media detection");
+ m_DetectDVDType->Create(false);
+#endif
+
+ // Peripherals depends on strings being loaded before stage 3
+ m_peripherals->Initialise();
+
+ m_gameServices =
+ std::make_unique<GAME::CGameServices>(*m_gameControllerManager, *m_gameRenderManager,
+ *m_peripherals, *profileManager, *m_inputManager);
+
+ m_contextMenuManager->Init();
+
+ // Init PVR manager after login, not already on login screen
+ if (!profileManager->UsingLoginScreen())
+ m_PVRManager->Init();
+
+ m_playerCoreFactory.reset(new CPlayerCoreFactory(*profileManager));
+
+ if (!m_Platform->InitStageThree())
+ return false;
+
+ init_level = 3;
+ return true;
+}
+
+void CServiceManager::DeinitStageThree()
+{
+ init_level = 2;
+#if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
+ m_DetectDVDType->StopThread();
+ m_DetectDVDType.reset();
+#endif
+ m_playerCoreFactory.reset();
+ m_PVRManager->Deinit();
+ m_contextMenuManager->Deinit();
+ m_gameServices.reset();
+ m_peripherals->Clear();
+
+ m_Platform->DeinitStageThree();
+}
+
+void CServiceManager::DeinitStageTwo()
+{
+ init_level = 1;
+
+#if defined(HAS_FILESYSTEM_SMB)
+ m_WSDiscovery.reset();
+#endif
+
+ m_weatherManager.reset();
+ m_powerManager.reset();
+ m_fileExtensionProvider.reset();
+ m_gameRenderManager.reset();
+ m_peripherals.reset();
+ m_inputManager.reset();
+ m_gameControllerManager.reset();
+ m_contextMenuManager.reset();
+ m_serviceAddons.reset();
+ m_favouritesService.reset();
+ m_binaryAddonCache.reset();
+ m_dataCacheCore.reset();
+ m_PVRManager.reset();
+ m_extsMimeSupportList.reset();
+ m_vfsAddonCache.reset();
+ m_repositoryUpdater.reset();
+ m_binaryAddonManager.reset();
+ m_addonMgr.reset();
+ m_databaseManager.reset();
+
+ m_mediaManager->Stop();
+ m_mediaManager.reset();
+
+ m_Platform->DeinitStageTwo();
+}
+
+void CServiceManager::DeinitStageOne()
+{
+ init_level = 0;
+
+ m_network.reset();
+ m_playlistPlayer.reset();
+#ifdef HAS_PYTHON
+ CScriptInvocationManager::GetInstance().UnregisterLanguageInvocationHandler(m_XBPython.get());
+ m_XBPython.reset();
+#endif
+
+ m_Platform->DeinitStageOne();
+ m_Platform.reset();
+}
+
+#if defined(HAS_FILESYSTEM_SMB)
+WSDiscovery::IWSDiscovery& CServiceManager::GetWSDiscovery()
+{
+ return *m_WSDiscovery;
+}
+#endif
+
+ADDON::CAddonMgr& CServiceManager::GetAddonMgr()
+{
+ return *m_addonMgr;
+}
+
+ADDONS::CExtsMimeSupportList& CServiceManager::GetExtsMimeSupportList()
+{
+ return *m_extsMimeSupportList;
+}
+
+ADDON::CBinaryAddonCache& CServiceManager::GetBinaryAddonCache()
+{
+ return *m_binaryAddonCache;
+}
+
+ADDON::CBinaryAddonManager& CServiceManager::GetBinaryAddonManager()
+{
+ return *m_binaryAddonManager;
+}
+
+ADDON::CVFSAddonCache& CServiceManager::GetVFSAddonCache()
+{
+ return *m_vfsAddonCache;
+}
+
+ADDON::CServiceAddonManager& CServiceManager::GetServiceAddons()
+{
+ return *m_serviceAddons;
+}
+
+ADDON::CRepositoryUpdater& CServiceManager::GetRepositoryUpdater()
+{
+ return *m_repositoryUpdater;
+}
+
+#ifdef HAS_PYTHON
+XBPython& CServiceManager::GetXBPython()
+{
+ return *m_XBPython;
+}
+#endif
+
+#if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
+MEDIA_DETECT::CDetectDVDMedia& CServiceManager::GetDetectDVDMedia()
+{
+ return *m_DetectDVDType;
+}
+#endif
+
+PVR::CPVRManager& CServiceManager::GetPVRManager()
+{
+ return *m_PVRManager;
+}
+
+CContextMenuManager& CServiceManager::GetContextMenuManager()
+{
+ return *m_contextMenuManager;
+}
+
+CDataCacheCore& CServiceManager::GetDataCacheCore()
+{
+ return *m_dataCacheCore;
+}
+
+CPlatform& CServiceManager::GetPlatform()
+{
+ return *m_Platform;
+}
+
+PLAYLIST::CPlayListPlayer& CServiceManager::GetPlaylistPlayer()
+{
+ return *m_playlistPlayer;
+}
+
+GAME::CControllerManager& CServiceManager::GetGameControllerManager()
+{
+ return *m_gameControllerManager;
+}
+
+GAME::CGameServices& CServiceManager::GetGameServices()
+{
+ return *m_gameServices;
+}
+
+KODI::RETRO::CGUIGameRenderManager& CServiceManager::GetGameRenderManager()
+{
+ return *m_gameRenderManager;
+}
+
+PERIPHERALS::CPeripherals& CServiceManager::GetPeripherals()
+{
+ return *m_peripherals;
+}
+
+CFavouritesService& CServiceManager::GetFavouritesService()
+{
+ return *m_favouritesService;
+}
+
+CInputManager& CServiceManager::GetInputManager()
+{
+ return *m_inputManager;
+}
+
+CFileExtensionProvider& CServiceManager::GetFileExtensionProvider()
+{
+ return *m_fileExtensionProvider;
+}
+
+CPowerManager& CServiceManager::GetPowerManager()
+{
+ return *m_powerManager;
+}
+
+// deleters for unique_ptr
+void CServiceManager::delete_dataCacheCore::operator()(CDataCacheCore* p) const
+{
+ delete p;
+}
+
+void CServiceManager::delete_contextMenuManager::operator()(CContextMenuManager* p) const
+{
+ delete p;
+}
+
+void CServiceManager::delete_favouritesService::operator()(CFavouritesService* p) const
+{
+ delete p;
+}
+
+CNetworkBase& CServiceManager::GetNetwork()
+{
+ return *m_network;
+}
+
+CWeatherManager& CServiceManager::GetWeatherManager()
+{
+ return *m_weatherManager;
+}
+
+CPlayerCoreFactory& CServiceManager::GetPlayerCoreFactory()
+{
+ return *m_playerCoreFactory;
+}
+
+CDatabaseManager& CServiceManager::GetDatabaseManager()
+{
+ return *m_databaseManager;
+}
+
+CMediaManager& CServiceManager::GetMediaManager()
+{
+ return *m_mediaManager;
+}