bool CPVRTimerInfoTag::UpdateEntry(const CPVRTimerInfoTag &tag) { if (m_EpgInfo) { m_EpgInfo->SetTimer(NULL); m_EpgInfo = NULL; } m_iClientID = tag.m_iClientID; m_iClientIndex = tag.m_iClientIndex; m_bIsActive = tag.m_bIsActive; m_strTitle = tag.m_strTitle; m_strDir = tag.m_strDir; m_iClientNumber = tag.m_iClientNumber; m_iClientChannelUid = tag.m_iClientChannelUid; m_StartTime = tag.m_StartTime; m_StopTime = tag.m_StopTime; m_FirstDay = tag.m_FirstDay; m_iPriority = tag.m_iPriority; m_iLifetime = tag.m_iLifetime; m_bIsRecording = tag.m_bIsRecording; m_bIsRepeating = tag.m_bIsRepeating; m_iWeekdays = tag.m_iWeekdays; m_iChannelNumber = tag.m_iChannelNumber; m_bIsRadio = tag.m_bIsRadio; /* try to find an epg event */ UpdateEpgEvent(); return true; }
void CAddonCallbacksPVR::PVREpgEventStateChange(void* addonData, EPG_TAG* tag, unsigned int iUniqueChannelId, EPG_EVENT_STATE newState) { CPVRClient *client = GetPVRClient(addonData); if (!client || !tag) { CLog::Log(LOGERROR, "PVR - %s - invalid handler data", __FUNCTION__); return; } CLog::Log(LOGDEBUG, "PVR - %s - state for epg event '%d' on channel '%d' on client '%s' changed to '%d'.", __FUNCTION__, tag->iUniqueBroadcastId, iUniqueChannelId, client->Name().c_str(), newState); static CCriticalSection queueMutex; static std::vector<EpgEventStateChange> queuedChanges; // during Kodi startup, addons may push updates very early, even before EPGs are ready to use. if (g_PVRManager.EpgsCreated()) { { // deliver queued changes, if any. discard event if delivery fails. CSingleLock lock(queueMutex); if (!queuedChanges.empty()) CLog::Log(LOGNOTICE, "PVR - %s - processing %ld queued epg event changes.", __FUNCTION__, queuedChanges.size()); while (!queuedChanges.empty()) { auto it = queuedChanges.begin(); UpdateEpgEvent(*it, true); queuedChanges.erase(it); } } // deliver current change. UpdateEpgEvent(EpgEventStateChange(client->GetID(), iUniqueChannelId, tag, newState), false); } else { // queue for later delivery. CSingleLock lock(queueMutex); queuedChanges.push_back(EpgEventStateChange(client->GetID(), iUniqueChannelId, tag, newState)); } }
bool CPVRTimerInfoTag::UpdateOnClient() { UpdateEpgEvent(); PVR_ERROR error; if (!CPVRManager::GetClients()->UpdateTimer(*this, &error)) { DisplayError(error); return false; } else { if (m_StartTime < CDateTime::GetCurrentDateTime() && m_StopTime > CDateTime::GetCurrentDateTime()) CPVRManager::Get()->TriggerRecordingsUpdate(); return true; } }