bool CAddonMgr::HasAddons(const TYPE &type, bool enabled /*= true*/) { // TODO: This isn't particularly efficient as we create an addon type for each addon using the Factory, just so // we can check addon dependencies in the addon constructor. VECADDONS addons; return GetAddons(type, addons, enabled); }
void CAddonMgr::StopServices() { CLog::Log(LOGDEBUG, "ADDON: Stopping service addons."); VECADDONS services; if (!GetAddons(ADDON_SERVICE, services)) return; for (IVECADDONS it = services.begin(); it != services.end(); ++it) { boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(*it); if (service) service->Stop(); } }
bool CAddonMgr::StartServices() { CLog::Log(LOGDEBUG, "ADDON: Starting service addons."); VECADDONS services; if (!GetAddons(ADDON_SERVICE, services)) return false; bool ret = true; for (IVECADDONS it = services.begin(); it != services.end(); ++it) { boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(*it); if (service) ret &= service->Start(); } return ret; }
void CAddonMgr::UpdateRepos(bool force) { CSingleLock lock(m_critSection); if (!force && m_watch.IsRunning() && m_watch.GetElapsedSeconds() < 600) return; m_watch.StartZero(); VECADDONS addons; GetAddons(ADDON_REPOSITORY,addons); for (unsigned int i=0;i<addons.size();++i) { RepositoryPtr repo = boost::dynamic_pointer_cast<CRepository>(addons[i]); CDateTime lastUpdate = m_database.GetRepoTimestamp(repo->ID()); if (force || !lastUpdate.IsValid() || lastUpdate + CDateTimeSpan(0,6,0,0) < CDateTime::GetCurrentDateTime()) { CLog::Log(LOGDEBUG,"Checking repository %s for updates",repo->Name().c_str()); CJobManager::GetInstance().AddJob(new CRepositoryUpdateJob(repo), NULL); } } }
void CAddonMgr::StopServices(const bool onlylogin) { CLog::Log(LOGDEBUG, "ADDON: Stopping service addons."); VECADDONS services; if (!GetAddons(ADDON_SERVICE, services)) return; for (IVECADDONS it = services.begin(); it != services.end(); ++it) { boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(*it); if (service) { if ( (onlylogin && service->GetStartOption() == CService::LOGIN) || (!onlylogin) ) service->Stop(); } } }
bool CAddonMgr::StartServices(const bool beforelogin) { CLog::Log(LOGDEBUG, "ADDON: Starting service addons."); VECADDONS services; if (!GetAddons(ADDON_SERVICE, services)) return false; bool ret = true; for (IVECADDONS it = services.begin(); it != services.end(); ++it) { boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(*it); if (service) { if ( (beforelogin && service->GetStartOption() == CService::STARTUP) || (!beforelogin && service->GetStartOption() == CService::LOGIN) ) ret &= service->Start(); } } return ret; }
bool CAddonMgr::Init() { m_cpluff = new DllLibCPluff; m_cpluff->Load(); m_database.Open(); if (!m_cpluff->IsLoaded()) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, could not load libcpluff"); return false; } m_cpluff->set_fatal_error_handler(cp_fatalErrorHandler); cp_status_t status; status = m_cpluff->init(); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_init() returned status: %i", status); return false; } //TODO could separate addons into different contexts // would allow partial unloading of addon framework m_cp_context = m_cpluff->create_context(&status); assert(m_cp_context); status = m_cpluff->register_pcollection(m_cp_context, CSpecialProtocol::TranslatePath("special://home/addons").c_str()); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_register_pcollection() returned status: %i", status); return false; } status = m_cpluff->register_pcollection(m_cp_context, CSpecialProtocol::TranslatePath("special://xbmc/addons").c_str()); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_register_pcollection() returned status: %i", status); return false; } status = m_cpluff->register_pcollection(m_cp_context, CSpecialProtocol::TranslatePath("special://xbmcbin/addons").c_str()); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_register_pcollection() returned status: %i", status); return false; } status = m_cpluff->register_logger(m_cp_context, cp_logger, &CAddonMgr::Get(), clog_to_cp(g_advancedSettings.m_logLevel)); if (status != CP_OK) { CLog::Log(LOGERROR, "ADDONS: Fatal Error, cp_register_logger() returned status: %i", status); return false; } FindAddons(); VECADDONS repos; if (GetAddons(ADDON_REPOSITORY, repos)) { VECADDONS::iterator it = repos.begin(); for (;it != repos.end(); ++it) CLog::Log(LOGNOTICE, "ADDONS: Using repository %s", (*it)->ID().c_str()); } return true; }