bool CPVRTimers::UpdateEntry(const CPVRTimerInfoTag &timer) { CPVRTimerInfoTag *tag = NULL; CSingleLock lock(m_critSection); if ((tag = GetByClient(timer.m_iClientId, timer.m_iClientIndex)) == NULL) { tag = new CPVRTimerInfoTag(); push_back(tag); } return tag->UpdateEntry(timer); }
bool CPVRTimers::UpdateEntry(const CPVRTimerInfoTag &timer) { CPVRTimerInfoTag *tag = NULL; CSingleLock lock(m_critSection); if ((tag = GetByClient(timer.m_iClientId, timer.m_iClientIndex)) == NULL) { tag = new CPVRTimerInfoTag(); vector<CPVRTimerInfoTag *>* addEntry = NULL; map<CDateTime, vector<CPVRTimerInfoTag *>* >::iterator itr = m_tags.find(timer.StartAsUTC()); if (itr == m_tags.end()) { addEntry = new vector<CPVRTimerInfoTag *>; m_tags.insert(make_pair(timer.StartAsUTC(), addEntry)); } else { addEntry = itr->second; } addEntry->push_back(tag); } return tag->UpdateEntry(timer); }
bool CPVRTimers::UpdateEntries(CPVRTimers *timers) { bool bChanged(false); bool bAddedOrDeleted(false); CSingleLock lock(m_critSection); /* go through the timer list and check for updated or new timers */ for (unsigned int iTimerPtr = 0; iTimerPtr < timers->size(); iTimerPtr++) { const CPVRTimerInfoTag *timer = timers->at(iTimerPtr); /* check if this timer is present in this container */ CPVRTimerInfoTag *existingTimer = (CPVRTimerInfoTag *) GetByClient(timer->m_iClientId, timer->m_iClientIndex); if (existingTimer) { /* if it's present, update the current tag */ if (existingTimer->UpdateEntry(*timer)) { bChanged = true; CLog::Log(LOGINFO,"PVRTimers - %s - updated timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } else { /* new timer */ CPVRTimerInfoTag *newTimer = new CPVRTimerInfoTag; newTimer->UpdateEntry(*timer); push_back(newTimer); bChanged = true; bAddedOrDeleted = true; CLog::Log(LOGINFO,"PVRTimers - %s - added timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } /* check for deleted timers */ unsigned int iSize = size(); for (unsigned int iTimerPtr = 0; iTimerPtr < iSize; iTimerPtr++) { CPVRTimerInfoTag *timer = (CPVRTimerInfoTag *) at(iTimerPtr); if (!timer) continue; if (timers->GetByClient(timer->m_iClientId, timer->m_iClientIndex) == NULL) { /* timer was not found */ CLog::Log(LOGINFO,"PVRTimers - %s - deleted timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); CPVREpgInfoTag *epgTag = (CPVREpgInfoTag *) at(iTimerPtr)->m_epgInfo; if (epgTag) epgTag->SetTimer(NULL); delete at(iTimerPtr); erase(begin() + iTimerPtr); iTimerPtr--; iSize--; bChanged = true; bAddedOrDeleted = true; } } m_bIsUpdating = false; if (bChanged) { Sort(); SetChanged(); lock.Leave(); NotifyObservers("timers", false); g_PVRManager.UpdateWindow(PVR_WINDOW_TIMERS, bAddedOrDeleted); g_PVRManager.UpdateWindow(PVR_WINDOW_EPG, false); g_PVRManager.UpdateWindow(PVR_WINDOW_RECORDINGS, bAddedOrDeleted); g_PVRManager.UpdateWindow(PVR_WINDOW_CHANNELS_TV, false); g_PVRManager.UpdateWindow(PVR_WINDOW_CHANNELS_RADIO, false); } return bChanged; }
bool CPVRTimers::UpdateEntries(CPVRTimers *timers) { bool bChanged(false); bool bAddedOrDeleted(false); vector<CStdString> timerNotifications; CSingleLock lock(m_critSection); /* go through the timer list and check for updated or new timers */ for (map<CDateTime, vector<CPVRTimerInfoTag *>* >::iterator it = timers->m_tags.begin(); it != timers->m_tags.end(); it++) { vector<CPVRTimerInfoTag*> *entry = it->second; for (unsigned int iTagPtr = 0; iTagPtr < entry->size(); iTagPtr++) { const CPVRTimerInfoTag *timer = entry->at(iTagPtr); /* check if this timer is present in this container */ CPVRTimerInfoTag *existingTimer = (CPVRTimerInfoTag *) GetByClient(timer->m_iClientId, timer->m_iClientIndex); if (existingTimer) { /* if it's present, update the current tag */ bool bStateChanged(existingTimer->m_state != timer->m_state); if (existingTimer->UpdateEntry(*timer)) { bChanged = true; if (bStateChanged && g_PVRManager.IsStarted()) { CStdString strMessage; existingTimer->GetNotificationText(strMessage); timerNotifications.push_back(strMessage); } CLog::Log(LOGDEBUG,"PVRTimers - %s - updated timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } else { /* new timer */ CPVRTimerInfoTag *newTimer = new CPVRTimerInfoTag; newTimer->UpdateEntry(*timer); vector<CPVRTimerInfoTag *>* addEntry = NULL; map<CDateTime, vector<CPVRTimerInfoTag *>* >::iterator itr = m_tags.find(newTimer->StartAsUTC()); if (itr == m_tags.end()) { addEntry = new vector<CPVRTimerInfoTag *>; m_tags.insert(make_pair(newTimer->StartAsUTC(), addEntry)); } else { addEntry = itr->second; } addEntry->push_back(newTimer); bChanged = true; bAddedOrDeleted = true; if (g_PVRManager.IsStarted()) { CStdString strMessage; newTimer->GetNotificationText(strMessage); timerNotifications.push_back(strMessage); } CLog::Log(LOGDEBUG,"PVRTimers - %s - added timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } } /* to collect timer with changed starting time */ vector<CPVRTimerInfoTag *> timersToMove; /* check for deleted timers */ for (map<CDateTime, vector<CPVRTimerInfoTag *>* >::iterator it = m_tags.begin(); it != m_tags.end();) { vector<CPVRTimerInfoTag*> *entry = it->second; for (int iTagPtr = entry->size() - 1; iTagPtr >= 0; iTagPtr--) { CPVRTimerInfoTag *timer = entry->at(iTagPtr); if (!timer) continue; if (timers->GetByClient(timer->m_iClientId, timer->m_iClientIndex) == NULL) { /* timer was not found */ CLog::Log(LOGDEBUG,"PVRTimers - %s - deleted timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); if (g_PVRManager.IsStarted()) { CStdString strMessage; strMessage.Format("%s: '%s'", (timer->EndAsUTC() <= CDateTime::GetCurrentDateTime().GetAsUTCDateTime()) ? g_localizeStrings.Get(19227) : g_localizeStrings.Get(19228), timer->m_strTitle.c_str()); timerNotifications.push_back(strMessage); } delete entry->at(iTagPtr); entry->erase(entry->begin() + iTagPtr); bChanged = true; bAddedOrDeleted = true; } else if (timer->StartAsUTC() != it->first) { /* timer start has changed */ CLog::Log(LOGDEBUG,"PVRTimers - %s - changed start time timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); /* remember timer */ timersToMove.push_back(entry->at(iTagPtr)); /* remove timer for now, reinsert later */ entry->erase(entry->begin() + iTagPtr); bChanged = true; bAddedOrDeleted = true; } } if (entry->size() == 0) m_tags.erase(it++); else ++it; } /* reinsert timers with changed timer start */ for (unsigned int iTagPtr = 0; iTagPtr < timersToMove.size(); iTagPtr++) { CPVRTimerInfoTag *timer = timersToMove.at(iTagPtr); vector<CPVRTimerInfoTag *>* addEntry = NULL; map<CDateTime, vector<CPVRTimerInfoTag *>* >::iterator itr = m_tags.find(timer->StartAsUTC()); if (itr == m_tags.end()) { addEntry = new vector<CPVRTimerInfoTag *>; m_tags.insert(make_pair(timer->StartAsUTC(), addEntry)); } else { addEntry = itr->second; } addEntry->push_back(timer); } m_bIsUpdating = false; if (bChanged) { SetChanged(); lock.Leave(); NotifyObservers(bAddedOrDeleted ? "timers-reset" : "timers", false); if (g_guiSettings.GetBool("pvrrecord.timernotifications")) { /* queue notifications */ for (unsigned int iNotificationPtr = 0; iNotificationPtr < timerNotifications.size(); iNotificationPtr++) { CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(19166), timerNotifications.at(iNotificationPtr)); } } } return bChanged; }
bool CPVRTimers::UpdateEntries(CPVRTimers *timers) { bool bChanged(false); bool bAddedOrDeleted(false); CSingleLock lock(m_critSection); /* go through the timer list and check for updated or new timers */ for (unsigned int iTimerPtr = 0; iTimerPtr < timers->size(); iTimerPtr++) { const CPVRTimerInfoTag *timer = timers->at(iTimerPtr); /* check if this timer is present in this container */ CPVRTimerInfoTag *existingTimer = (CPVRTimerInfoTag *) GetByClient(timer->m_iClientId, timer->m_iClientIndex); if (existingTimer) { /* if it's present, update the current tag */ bool bStateChanged(existingTimer->m_state != timer->m_state); if (existingTimer->UpdateEntry(*timer)) { bChanged = true; if (bStateChanged && g_PVRManager.IsStarted()) existingTimer->QueueNotification(); CLog::Log(LOGINFO,"PVRTimers - %s - updated timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } else { /* new timer */ CPVRTimerInfoTag *newTimer = new CPVRTimerInfoTag; newTimer->UpdateEntry(*timer); push_back(newTimer); bChanged = true; bAddedOrDeleted = true; if (g_PVRManager.IsStarted()) newTimer->QueueNotification(); CLog::Log(LOGINFO,"PVRTimers - %s - added timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); } } /* check for deleted timers */ unsigned int iSize = size(); for (unsigned int iTimerPtr = 0; iTimerPtr < iSize; iTimerPtr++) { CPVRTimerInfoTag *timer = (CPVRTimerInfoTag *) at(iTimerPtr); if (!timer) continue; if (timers->GetByClient(timer->m_iClientId, timer->m_iClientIndex) == NULL) { /* timer was not found */ CLog::Log(LOGINFO,"PVRTimers - %s - deleted timer %d on client %d", __FUNCTION__, timer->m_iClientIndex, timer->m_iClientId); if (g_PVRManager.IsStarted() && g_guiSettings.GetBool("pvrrecord.timernotifications")) { CStdString strMessage; strMessage.Format("%s: '%s'", g_localizeStrings.Get(19228), timer->m_strTitle.c_str()); g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(19166), strMessage); } CPVREpgInfoTag *epgTag = (CPVREpgInfoTag *) at(iTimerPtr)->m_epgInfo; if (epgTag) epgTag->SetTimer(NULL); delete at(iTimerPtr); erase(begin() + iTimerPtr); iTimerPtr--; iSize--; bChanged = true; bAddedOrDeleted = true; } } m_bIsUpdating = false; if (bChanged) { Sort(); SetChanged(); lock.Leave(); NotifyObservers(bAddedOrDeleted ? "timers-reset" : "timers", false); } return bChanged; }