int CPVRClients::RegisterClient(AddonPtr client, bool* newRegistration/*=NULL*/) { int iClientId(-1); if (newRegistration) *newRegistration = false; if (!client->Enabled()) return -1; CLog::Log(LOGDEBUG, "%s - registering add-on '%s'", __FUNCTION__, client->Name().c_str()); CPVRDatabase *database = GetPVRDatabase(); if (!database) return -1; // check whether we already know this client iClientId = database->GetClientId(client->ID()); // try to register the new client in the db if (iClientId < 0) { if ((iClientId = database->Persist(client)) < 0) { CLog::Log(LOGERROR, "PVR - %s - can't add client '%s' to the database", __FUNCTION__, client->Name().c_str()); return -1; } else if (newRegistration) *newRegistration = true; } PVR_CLIENT addon; // load and initialise the client libraries { CSingleLock lock(m_critSection); PVR_CLIENTMAP_CITR existingClient = m_clientMap.find(iClientId); if (existingClient != m_clientMap.end()) { // return existing client addon = existingClient->second; } else { // create a new client instance addon = boost::dynamic_pointer_cast<CPVRClient>(client); m_clientMap.insert(std::make_pair(iClientId, addon)); } } if (iClientId < 0) CLog::Log(LOGERROR, "PVR - %s - can't register add-on '%s'", __FUNCTION__, client->Name().c_str()); return iClientId; }