bool CPVRChannels::Update(CPVRChannels *channels) { /* the database has already been opened */ CPVRDatabase *database = g_PVRManager.GetTVDatabase(); int iSize = size(); for (int ptr = 0; ptr < iSize; ptr++) { CPVRChannel *channel = at(ptr); /* ignore virtual channels */ if (channel->IsVirtual()) continue; /* check if this channel is still present */ CPVRChannel *existingChannel = channels->GetByUniqueID(channel->UniqueID()); if (existingChannel) { /* if it's present, update the current tag */ if (channel->UpdateFromClient(*existingChannel)) { channel->Persist(true); CLog::Log(LOGINFO,"%s - updated %s channel '%s'", __FUNCTION__, m_bRadio ? "radio" : "TV", channel->ChannelName().c_str()); } /* remove this tag from the temporary channel list */ channels->RemoveByUniqueID(channel->UniqueID()); } else { /* channel is no longer present */ CLog::Log(LOGINFO,"%s - removing %s channel '%s'", __FUNCTION__, m_bRadio ? "radio" : "TV", channel->ChannelName().c_str()); database->RemoveChannel(*channel); erase(begin() + ptr); ptr--; iSize--; } } /* the temporary channel list only contains new channels now */ for (unsigned int ptr = 0; ptr < channels->size(); ptr++) { CPVRChannel *channel = channels->at(ptr); channel->Persist(true); push_back(channel); CLog::Log(LOGINFO,"%s - added %s channel '%s'", __FUNCTION__, m_bRadio ? "radio" : "TV", channel->ChannelName().c_str()); } /* post the queries generated by the update */ database->CommitInsertQueries(); /* recount hidden channels */ m_iHiddenChannels = 0; for (unsigned int i = 0; i < size(); i++) { if (at(i)->IsHidden()) m_iHiddenChannels++; } m_bIsSorted = false; return true; }