2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "ServiceManager.h"
11 #include "ContextMenuManager.h"
12 #include "DatabaseManager.h"
13 #include "PlayListPlayer.h"
14 #include "addons/AddonManager.h"
15 #include "addons/BinaryAddonCache.h"
16 #include "addons/ExtsMimeSupportList.h"
17 #include "addons/RepositoryUpdater.h"
18 #include "addons/Service.h"
19 #include "addons/VFSEntry.h"
20 #include "addons/binary-addons/BinaryAddonManager.h"
21 #include "cores/DataCacheCore.h"
22 #include "cores/RetroPlayer/guibridge/GUIGameRenderManager.h"
23 #include "cores/playercorefactory/PlayerCoreFactory.h"
24 #include "favourites/FavouritesService.h"
25 #include "games/GameServices.h"
26 #include "games/controllers/ControllerManager.h"
27 #include "input/InputManager.h"
28 #include "interfaces/generic/ScriptInvocationManager.h"
29 #include "interfaces/python/XBPython.h"
30 #include "network/Network.h"
31 #include "peripherals/Peripherals.h"
32 #if defined(HAS_FILESYSTEM_SMB)
33 #include "network/IWSDiscovery.h"
34 #if defined(TARGET_WINDOWS)
35 #include "platform/win32/network/WSDiscoveryWin32.h"
36 #else // !defined(TARGET_WINDOWS)
37 #include "platform/posix/filesystem/SMBWSDiscovery.h"
38 #endif // defined(TARGET_WINDOWS)
39 #endif // HAS_FILESYSTEM_SMB
40 #include "powermanagement/PowerManager.h"
41 #include "profiles/ProfileManager.h"
42 #include "pvr/PVRManager.h"
43 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
44 #include "storage/DetectDVDType.h"
46 #include "storage/MediaManager.h"
47 #include "utils/FileExtensionProvider.h"
48 #include "utils/log.h"
49 #include "weather/WeatherManager.h"
53 CServiceManager::CServiceManager() = default;
55 CServiceManager::~CServiceManager()
65 bool CServiceManager::InitForTesting()
67 m_network
= CNetworkBase::GetNetwork();
69 m_databaseManager
.reset(new CDatabaseManager
);
71 m_binaryAddonManager
.reset(new ADDON::CBinaryAddonManager());
72 m_addonMgr
.reset(new ADDON::CAddonMgr());
73 if (!m_addonMgr
->Init())
75 CLog::Log(LOGFATAL
, "CServiceManager::{}: Unable to start CAddonMgr", __FUNCTION__
);
79 m_extsMimeSupportList
.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr
));
80 m_fileExtensionProvider
.reset(new CFileExtensionProvider(*m_addonMgr
));
86 void CServiceManager::DeinitTesting()
89 m_fileExtensionProvider
.reset();
90 m_extsMimeSupportList
.reset();
91 m_binaryAddonManager
.reset();
93 m_databaseManager
.reset();
97 bool CServiceManager::InitStageOne()
99 m_Platform
.reset(CPlatform::CreateInstance());
100 if (!m_Platform
->InitStageOne())
104 m_XBPython
.reset(new XBPython());
105 CScriptInvocationManager::GetInstance().RegisterLanguageInvocationHandler(m_XBPython
.get(),
109 m_playlistPlayer
.reset(new PLAYLIST::CPlayListPlayer());
111 m_network
= CNetworkBase::GetNetwork();
117 bool CServiceManager::InitStageTwo(const std::string
& profilesUserDataFolder
)
119 // Initialize the addon database (must be before the addon manager is init'd)
120 m_databaseManager
.reset(new CDatabaseManager
);
122 m_binaryAddonManager
.reset(
124 CBinaryAddonManager()); /* Need to constructed before, GetRunningInstance() of binary CAddonDll need to call them */
125 m_addonMgr
.reset(new ADDON::CAddonMgr());
126 if (!m_addonMgr
->Init())
128 CLog::Log(LOGFATAL
, "CServiceManager::{}: Unable to start CAddonMgr", __FUNCTION__
);
132 m_repositoryUpdater
.reset(new ADDON::CRepositoryUpdater(*m_addonMgr
));
134 m_extsMimeSupportList
.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr
));
136 m_vfsAddonCache
.reset(new ADDON::CVFSAddonCache());
137 m_vfsAddonCache
->Init();
139 m_PVRManager
.reset(new PVR::CPVRManager());
141 m_dataCacheCore
.reset(new CDataCacheCore());
143 m_binaryAddonCache
.reset(new ADDON::CBinaryAddonCache());
144 m_binaryAddonCache
->Init();
146 m_favouritesService
.reset(new CFavouritesService(profilesUserDataFolder
));
148 m_serviceAddons
.reset(new ADDON::CServiceAddonManager(*m_addonMgr
));
150 m_contextMenuManager
.reset(new CContextMenuManager(*m_addonMgr
));
152 m_gameControllerManager
.reset(new GAME::CControllerManager
);
153 m_inputManager
.reset(new CInputManager());
154 m_inputManager
->InitializeInputs();
156 m_peripherals
.reset(new PERIPHERALS::CPeripherals(*m_inputManager
, *m_gameControllerManager
));
158 m_gameRenderManager
.reset(new RETRO::CGUIGameRenderManager
);
160 m_fileExtensionProvider
.reset(new CFileExtensionProvider(*m_addonMgr
));
162 m_powerManager
.reset(new CPowerManager());
163 m_powerManager
->Initialize();
164 m_powerManager
->SetDefaults();
166 m_weatherManager
.reset(new CWeatherManager());
168 m_mediaManager
.reset(new CMediaManager());
169 m_mediaManager
->Initialize();
171 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
172 m_DetectDVDType
= std::make_unique
<MEDIA_DETECT::CDetectDVDMedia
>();
175 #if defined(HAS_FILESYSTEM_SMB)
176 m_WSDiscovery
= WSDiscovery::IWSDiscovery::GetInstance();
179 if (!m_Platform
->InitStageTwo())
186 // stage 3 is called after successful initialization of WindowManager
187 bool CServiceManager::InitStageThree(const std::shared_ptr
<CProfileManager
>& profileManager
)
189 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
190 // Start Thread for DVD Mediatype detection
191 CLog::Log(LOGINFO
, "[Media Detection] starting service for optical media detection");
192 m_DetectDVDType
->Create(false);
195 // Peripherals depends on strings being loaded before stage 3
196 m_peripherals
->Initialise();
199 std::make_unique
<GAME::CGameServices
>(*m_gameControllerManager
, *m_gameRenderManager
,
200 *m_peripherals
, *profileManager
, *m_inputManager
);
202 m_contextMenuManager
->Init();
204 // Init PVR manager after login, not already on login screen
205 if (!profileManager
->UsingLoginScreen())
206 m_PVRManager
->Init();
208 m_playerCoreFactory
.reset(new CPlayerCoreFactory(*profileManager
));
210 if (!m_Platform
->InitStageThree())
217 void CServiceManager::DeinitStageThree()
220 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
221 m_DetectDVDType
->StopThread();
222 m_DetectDVDType
.reset();
224 m_playerCoreFactory
.reset();
225 m_PVRManager
->Deinit();
226 m_contextMenuManager
->Deinit();
227 m_gameServices
.reset();
228 m_peripherals
->Clear();
230 m_Platform
->DeinitStageThree();
233 void CServiceManager::DeinitStageTwo()
237 #if defined(HAS_FILESYSTEM_SMB)
238 m_WSDiscovery
.reset();
241 m_weatherManager
.reset();
242 m_powerManager
.reset();
243 m_fileExtensionProvider
.reset();
244 m_gameRenderManager
.reset();
245 m_peripherals
.reset();
246 m_inputManager
.reset();
247 m_gameControllerManager
.reset();
248 m_contextMenuManager
.reset();
249 m_serviceAddons
.reset();
250 m_favouritesService
.reset();
251 m_binaryAddonCache
.reset();
252 m_dataCacheCore
.reset();
253 m_PVRManager
.reset();
254 m_extsMimeSupportList
.reset();
255 m_vfsAddonCache
.reset();
256 m_repositoryUpdater
.reset();
257 m_binaryAddonManager
.reset();
259 m_databaseManager
.reset();
261 m_mediaManager
->Stop();
262 m_mediaManager
.reset();
264 m_Platform
->DeinitStageTwo();
267 void CServiceManager::DeinitStageOne()
272 m_playlistPlayer
.reset();
274 CScriptInvocationManager::GetInstance().UnregisterLanguageInvocationHandler(m_XBPython
.get());
278 m_Platform
->DeinitStageOne();
282 #if defined(HAS_FILESYSTEM_SMB)
283 WSDiscovery::IWSDiscovery
& CServiceManager::GetWSDiscovery()
285 return *m_WSDiscovery
;
289 ADDON::CAddonMgr
& CServiceManager::GetAddonMgr()
294 ADDONS::CExtsMimeSupportList
& CServiceManager::GetExtsMimeSupportList()
296 return *m_extsMimeSupportList
;
299 ADDON::CBinaryAddonCache
& CServiceManager::GetBinaryAddonCache()
301 return *m_binaryAddonCache
;
304 ADDON::CBinaryAddonManager
& CServiceManager::GetBinaryAddonManager()
306 return *m_binaryAddonManager
;
309 ADDON::CVFSAddonCache
& CServiceManager::GetVFSAddonCache()
311 return *m_vfsAddonCache
;
314 ADDON::CServiceAddonManager
& CServiceManager::GetServiceAddons()
316 return *m_serviceAddons
;
319 ADDON::CRepositoryUpdater
& CServiceManager::GetRepositoryUpdater()
321 return *m_repositoryUpdater
;
325 XBPython
& CServiceManager::GetXBPython()
331 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
332 MEDIA_DETECT::CDetectDVDMedia
& CServiceManager::GetDetectDVDMedia()
334 return *m_DetectDVDType
;
338 PVR::CPVRManager
& CServiceManager::GetPVRManager()
340 return *m_PVRManager
;
343 CContextMenuManager
& CServiceManager::GetContextMenuManager()
345 return *m_contextMenuManager
;
348 CDataCacheCore
& CServiceManager::GetDataCacheCore()
350 return *m_dataCacheCore
;
353 CPlatform
& CServiceManager::GetPlatform()
358 PLAYLIST::CPlayListPlayer
& CServiceManager::GetPlaylistPlayer()
360 return *m_playlistPlayer
;
363 GAME::CControllerManager
& CServiceManager::GetGameControllerManager()
365 return *m_gameControllerManager
;
368 GAME::CGameServices
& CServiceManager::GetGameServices()
370 return *m_gameServices
;
373 KODI::RETRO::CGUIGameRenderManager
& CServiceManager::GetGameRenderManager()
375 return *m_gameRenderManager
;
378 PERIPHERALS::CPeripherals
& CServiceManager::GetPeripherals()
380 return *m_peripherals
;
383 CFavouritesService
& CServiceManager::GetFavouritesService()
385 return *m_favouritesService
;
388 CInputManager
& CServiceManager::GetInputManager()
390 return *m_inputManager
;
393 CFileExtensionProvider
& CServiceManager::GetFileExtensionProvider()
395 return *m_fileExtensionProvider
;
398 CPowerManager
& CServiceManager::GetPowerManager()
400 return *m_powerManager
;
403 // deleters for unique_ptr
404 void CServiceManager::delete_dataCacheCore::operator()(CDataCacheCore
* p
) const
409 void CServiceManager::delete_contextMenuManager::operator()(CContextMenuManager
* p
) const
414 void CServiceManager::delete_favouritesService::operator()(CFavouritesService
* p
) const
419 CNetworkBase
& CServiceManager::GetNetwork()
424 CWeatherManager
& CServiceManager::GetWeatherManager()
426 return *m_weatherManager
;
429 CPlayerCoreFactory
& CServiceManager::GetPlayerCoreFactory()
431 return *m_playerCoreFactory
;
434 CDatabaseManager
& CServiceManager::GetDatabaseManager()
436 return *m_databaseManager
;
439 CMediaManager
& CServiceManager::GetMediaManager()
441 return *m_mediaManager
;