378 lines
15 KiB
Diff
378 lines
15 KiB
Diff
diff -Naur vdr-plugin-live-3.0.10/pages/searchresults.ecpp vdr-plugin-live-master/pages/searchresults.ecpp
|
|
--- vdr-plugin-live-3.0.10/pages/searchresults.ecpp 2021-07-18 14:51:47.000000000 +0200
|
|
+++ vdr-plugin-live-master/pages/searchresults.ecpp 2021-09-10 14:11:46.000000000 +0200
|
|
@@ -62,53 +62,60 @@
|
|
<%cpp>
|
|
std::string current_day = "";
|
|
|
|
-#if VDRVERSNUM >= 20301
|
|
- LOCK_CHANNELS_READ;
|
|
-#endif
|
|
for (SearchResults::iterator result = results.begin(); result != results.end(); ++result) {
|
|
#if VDRVERSNUM >= 20301
|
|
- cChannel* channel = (cChannel *)Channels->GetByChannelID(result->Channel());
|
|
+ cStateKey StateKey;
|
|
+ if (const cChannels *Channels = cChannels::GetChannelsRead(StateKey)) {
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: pages/searchresults.ecpp LOCK_CHANNELS_READ");
|
|
+ #endif
|
|
+ cChannel* channel = (cChannel *)Channels->GetByChannelID(result->Channel());
|
|
#else
|
|
cChannel* channel = Channels.GetByChannelID(result->Channel());
|
|
#endif
|
|
- if (!channel) continue;
|
|
- std::string channelname = channel->Name();
|
|
- int channelnr = channel->Number();
|
|
- std::string start(result->StartTime() ? FormatDateTime(tr("%I:%M %p"), result->StartTime()) : "");
|
|
- std::string end(result->StopTime() ? FormatDateTime(tr("%I:%M %p"), result->StopTime()) : "");
|
|
- std::string day(result->StartTime() ? FormatDateTime(tr("%A, %b %d %Y"), result->StartTime()) : "");
|
|
- std::string description = result->Description();
|
|
- std::string epgid = EpgEvents::EncodeDomId(result->Channel(), result->EventId());
|
|
+ if (!channel) {
|
|
+ StateKey.Remove();
|
|
+ continue;
|
|
+ }
|
|
+ std::string channelname = channel->Name();
|
|
+ int channelnr = channel->Number();
|
|
+ std::string start(result->StartTime() ? FormatDateTime(tr("%I:%M %p"), result->StartTime()) : "");
|
|
+ std::string end(result->StopTime() ? FormatDateTime(tr("%I:%M %p"), result->StopTime()) : "");
|
|
+ std::string day(result->StartTime() ? FormatDateTime(tr("%A, %b %d %Y"), result->StartTime()) : "");
|
|
+ std::string description = result->Description();
|
|
+ std::string epgid = EpgEvents::EncodeDomId(result->Channel(), result->EventId());
|
|
|
|
- bool truncated = false;
|
|
+ bool truncated = false;
|
|
|
|
- bool bottom = false;
|
|
- SearchResults::iterator nextResult = result; ++nextResult;
|
|
- if (nextResult == results.end())
|
|
- bottom = true;
|
|
- else {
|
|
- std::string nextDay(nextResult->StartTime() ? FormatDateTime(tr("%A, %b %d %Y"), nextResult->StartTime()) : "");
|
|
- bottom = (day != nextDay);
|
|
- }
|
|
+ bool bottom = false;
|
|
+ SearchResults::iterator nextResult = result; ++nextResult;
|
|
+ if (nextResult == results.end())
|
|
+ bottom = true;
|
|
+ else {
|
|
+ std::string nextDay(nextResult->StartTime() ? FormatDateTime(tr("%A, %b %d %Y"), nextResult->StartTime()) : "");
|
|
+ bottom = (day != nextDay);
|
|
+ }
|
|
|
|
- if (current_day != day) {
|
|
- if (current_day != "") {
|
|
+ if (current_day != day) {
|
|
+ if (current_day != "") {
|
|
</%cpp>
|
|
- <tr class="spacer">
|
|
- <td colspan="4"/>
|
|
- </tr>
|
|
+ <tr class="spacer">
|
|
+ <td colspan="4"/>
|
|
+ </tr>
|
|
+% }
|
|
+ <tr class="head">
|
|
+ <td colspan="4"><div class="boxheader"><div><div><$ day $></div></div></div></td>
|
|
+ </tr>
|
|
+% current_day = day;
|
|
% }
|
|
- <tr class="head">
|
|
- <td colspan="4"><div class="boxheader"><div><div><$ day $></div></div></div></td>
|
|
- </tr>
|
|
-% current_day = day;
|
|
+% StateKey.Remove(); // release channels read lock before calling event_timer which make a timers read lock
|
|
+ <tr>
|
|
+ <td class="action leftcol <? bottom ? "bottomrow"?>"><& pageelems.event_timer epgid=(epgid) &></td>
|
|
+ <td class="topaligned <? bottom ? "bottomrow"?>"><div class="withmargin"><a href="schedule.html?channel=<$ channelnr $>"><$ channelname $></a></div></td>
|
|
+ <td class="topaligned <? bottom ? "bottomrow"?>"><div class="withmargin nowrap"><$ start $> - <$ end $></div></td>
|
|
+ <td class="topaligned rightcol <? bottom ? "bottomrow"?>"><div class="more withmargin"><a <& tooltip.hint text=(StringEscapeAndBreak(StringWordTruncate(description, 300, truncated)) + "<br />" + tr("Click to view details.")) &><& tooltip.display domId=(epgid) &>><span class="title"><$ result->Title() $></span><br /><span class="short"><%cpp>if (result->ShortText().empty()) { </%cpp> <%cpp> } </%cpp><$ result->ShortText() $></span></a></div></td>
|
|
+ </tr>
|
|
% }
|
|
- <tr>
|
|
- <td class="action leftcol <? bottom ? "bottomrow"?>"><& pageelems.event_timer epgid=(epgid) &></td>
|
|
- <td class="topaligned <? bottom ? "bottomrow"?>"><div class="withmargin"><a href="schedule.html?channel=<$ channelnr $>"><$ channelname $></a></div></td>
|
|
- <td class="topaligned <? bottom ? "bottomrow"?>"><div class="withmargin nowrap"><$ start $> - <$ end $></div></td>
|
|
- <td class="topaligned rightcol <? bottom ? "bottomrow"?>"><div class="more withmargin"><a <& tooltip.hint text=(StringEscapeAndBreak(StringWordTruncate(description, 300, truncated)) + "<br />" + tr("Click to view details.")) &><& tooltip.display domId=(epgid) &>><span class="title"><$ result->Title() $></span><br /><span class="short"><%cpp>if (result->ShortText().empty()) { </%cpp> <%cpp> } </%cpp><$ result->ShortText() $></span></a></div></td>
|
|
- </tr>
|
|
% }
|
|
</table>
|
|
</div>
|
|
diff -Naur vdr-plugin-live-3.0.10/pages/timers.ecpp vdr-plugin-live-master/pages/timers.ecpp
|
|
--- vdr-plugin-live-3.0.10/pages/timers.ecpp 2021-07-18 14:51:47.000000000 +0200
|
|
+++ vdr-plugin-live-master/pages/timers.ecpp 2021-09-10 14:11:46.000000000 +0200
|
|
@@ -37,7 +37,7 @@
|
|
timer = 0;
|
|
if ( !timerid.empty() ) {
|
|
std::string tId = SortedTimers::DecodeDomId(timerid);
|
|
- // dsyslog("live: DEBUG: TIMER: tId = %s", tId.c_str());
|
|
+// dsyslog("live: DEBUG: TIMER: tId = %s", tId.c_str());
|
|
timer = timers.GetByTimerId(tId);
|
|
if ( timer == 0 )
|
|
throw HtmlError( tr("Couldn't find timer. Maybe you mistyped your request?") );
|
|
@@ -70,25 +70,26 @@
|
|
<& pageelems.logo &>
|
|
<& menu active=("timers") component=("timers.timer_actions")>
|
|
<div class="inhalt">
|
|
-% if (timers.size() == 0) {
|
|
+<%cpp>
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: pages/timers.ecpp LOCK_TIMERS_READ");
|
|
+ #endif
|
|
+ LOCK_TIMERS_READ;
|
|
+ cSortedTimers sortedTimers(Timers);
|
|
+ if (sortedTimers.Size() == 0) {
|
|
+</%cpp>
|
|
<$ tr("No timer defined") $>
|
|
% } else {
|
|
<table class="listing" cellspacing="0" cellpadding="0">
|
|
<%cpp>
|
|
// output of the timer list:
|
|
- for (SortedTimers::iterator timer = timers.begin(); timer != timers.end(); ++timer) {
|
|
- EpgInfoPtr epgEvent;
|
|
+ for (int i = 0; i < sortedTimers.Size(); i++) {
|
|
+ const cTimer *timer = sortedTimers[i];
|
|
+ EpgInfoPtr epgEvent;
|
|
std::string longDescription;
|
|
std::string searchTimName;
|
|
std::string searchTimId;
|
|
-#if VDRVERSNUM >= 20301
|
|
- if (!timer->Event()) {
|
|
- LOCK_SCHEDULES_READ;
|
|
- timer->SetEventFromSchedule(Schedules);
|
|
- }
|
|
-#else
|
|
- if (!timer->Event()) timer->SetEventFromSchedule();
|
|
-#endif
|
|
+
|
|
if (timer->Event())
|
|
{
|
|
epgEvent = EpgEvents::CreateEpgInfo(timer->Channel(), timer->Event());
|
|
@@ -98,13 +99,13 @@
|
|
searchTimName = SortedTimers::SearchTimerInfo(*timer, "searchtimer");
|
|
searchTimId = SortedTimers::SearchTimerInfo(*timer, "s-id");
|
|
}
|
|
- std::string currentDay = SortedTimers::GetTimerDays(*timer);
|
|
- SortedTimers::iterator nextTimer = timer; ++nextTimer;
|
|
+ std::string currentDay = SortedTimers::GetTimerDays(timer);
|
|
+ const cTimer *nextTimer = NULL;
|
|
+ if (i < (sortedTimers.Size() - 1)) nextTimer = sortedTimers[i + 1];
|
|
bool bottom = false;
|
|
- if (nextTimer == timers.end())
|
|
- bottom = true;
|
|
+ if (i == sortedTimers.Size() - 1) bottom = true;
|
|
else {
|
|
- std::string nextDay = SortedTimers::GetTimerDays(*nextTimer);
|
|
+ std::string nextDay = SortedTimers::GetTimerDays(nextTimer);
|
|
bottom = (currentDay != nextDay);
|
|
}
|
|
if (previousDay != currentDay) {
|
|
diff -Naur vdr-plugin-live-3.0.10/timers.cpp vdr-plugin-live-master/timers.cpp
|
|
--- vdr-plugin-live-3.0.10/timers.cpp 2021-07-18 14:51:47.000000000 +0200
|
|
+++ vdr-plugin-live-master/timers.cpp 2021-09-10 14:11:46.000000000 +0200
|
|
@@ -11,11 +11,6 @@
|
|
#include <vdr/menu.h>
|
|
#include <vdr/svdrp.h>
|
|
|
|
-static bool operator<( cTimer const& left, cTimer const& right )
|
|
-{
|
|
- return left.Compare( right ) < 0;
|
|
-}
|
|
-
|
|
namespace vdrlive {
|
|
|
|
static char const* const TIMER_DELETE = "DELETE";
|
|
@@ -26,7 +21,6 @@
|
|
: m_state( 0 )
|
|
#endif
|
|
{
|
|
- ReloadTimers();
|
|
}
|
|
|
|
std::string SortedTimers::GetTimerId( cTimer const& timer )
|
|
@@ -46,6 +40,11 @@
|
|
}
|
|
|
|
#if VDRVERSNUM >= 20301
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp SortedTimers::GetByTimerId() LOCK_TIMERS_READ");
|
|
+ dsyslog("live: timers.cpp SortedTimers::GetByTimerId() LOCK_CHANNELS_READ");
|
|
+ #endif
|
|
+ LOCK_TIMERS_READ
|
|
LOCK_CHANNELS_READ;
|
|
cChannel* channel = (cChannel *)Channels->GetByChannelID( tChannelID::FromString( parts[0].c_str() ) );
|
|
#else
|
|
@@ -64,7 +63,7 @@
|
|
|
|
cMutexLock MutexLock(&m_mutex);
|
|
|
|
- for ( SortedTimers::iterator timer = begin(); timer != end(); ++timer ) {
|
|
+ for (cTimer* timer = (cTimer *)Timers->First(); timer; timer = (cTimer *)Timers->Next(timer)) {
|
|
if ( timer->Channel() == channel &&
|
|
( ( weekdays != 0 && timer->WeekDays() == weekdays ) || ( weekdays == 0 && timer->Day() == day ) ) &&
|
|
timer->Start() == start && timer->Stop() == stop )
|
|
@@ -94,33 +93,12 @@
|
|
}
|
|
|
|
|
|
- void SortedTimers::ReloadTimers()
|
|
- {
|
|
-// dsyslog("live: SortedTimers::ReloadTimers() reloading timers");
|
|
-
|
|
- cMutexLock MutexLock(&m_mutex);
|
|
-
|
|
- clear();
|
|
-#if VDRVERSNUM >= 20301
|
|
- {
|
|
- LOCK_TIMERS_READ;
|
|
- for ( cTimer* timer = (cTimer *)Timers->First(); timer; timer = (cTimer *)Timers->Next( timer ) ) {
|
|
- push_back( *timer );
|
|
- }
|
|
- }
|
|
-#else
|
|
- for ( cTimer* timer = Timers.First(); timer; timer = Timers.Next( timer ) ) {
|
|
- push_back( *timer );
|
|
- }
|
|
-#endif
|
|
- sort();
|
|
- }
|
|
-
|
|
- std::string SortedTimers::GetTimerDays(cTimer const& timer)
|
|
+ std::string SortedTimers::GetTimerDays(cTimer const *timer)
|
|
{
|
|
- std::string currentDay = timer.WeekDays() > 0 ?
|
|
- *cTimer::PrintDay(0, timer.WeekDays(), true) :
|
|
- FormatDateTime(tr("%A, %x"), timer.Day());
|
|
+ if (!timer) return "";
|
|
+ std::string currentDay = timer->WeekDays() > 0 ?
|
|
+ *cTimer::PrintDay(0, timer->WeekDays(), true) :
|
|
+ FormatDateTime(tr("%A, %x"), timer->Day());
|
|
return currentDay;
|
|
}
|
|
|
|
@@ -269,7 +247,6 @@
|
|
if ( m_updateTimers.size() > 0 ) {
|
|
DoUpdateTimers();
|
|
}
|
|
- DoReloadTimers();
|
|
// dsyslog("live: SV: signalling waiters");
|
|
m_updateWait.Broadcast();
|
|
}
|
|
@@ -332,6 +309,9 @@
|
|
}
|
|
#if VDRVERSNUM >= 20301
|
|
dsyslog("live: DoInsertTimer() add local timer");
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::DoInsertTimer() LOCK_TIMERS_WRITE");
|
|
+ #endif
|
|
LOCK_TIMERS_WRITE;
|
|
Timers->SetExplicitModify();
|
|
const cTimer *checkTimer = Timers->GetTimer( newTimer.get() );
|
|
@@ -418,6 +398,9 @@
|
|
else { // old and new are local
|
|
dsyslog("live: DoUpdateTimer() old and new timer are local");
|
|
#if VDRVERSNUM >= 20301
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::DoUpdateTimer() LOCK_TIMERS_WRITE");
|
|
+ #endif
|
|
LOCK_TIMERS_WRITE;
|
|
Timers->SetExplicitModify();
|
|
cTimer* oldTimer = Timers->GetById( timerData.id, timerData.oldRemote );
|
|
@@ -494,6 +477,9 @@
|
|
#endif
|
|
|
|
#if VDRVERSNUM >= 20301
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::DoDeleteTimer() LOCK_TIMERS_WRITE");
|
|
+ #endif
|
|
LOCK_TIMERS_WRITE;
|
|
Timers->SetExplicitModify();
|
|
cTimer* oldTimer = Timers->GetById( timerData.id, timerData.remote );
|
|
@@ -527,6 +513,9 @@
|
|
void TimerManager::DoToggleTimer( timerStruct& timerData )
|
|
{
|
|
if ( timerData.remote ) { // toggle remote timer via svdrpsend
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::DoToggleTimer() LOCK_TIMERS_READ");
|
|
+ #endif
|
|
LOCK_TIMERS_READ;
|
|
const cTimer* toggleTimer = Timers->GetById( timerData.id, timerData.remote );
|
|
std::string command = "MODT ";
|
|
@@ -571,6 +560,9 @@
|
|
#endif
|
|
|
|
#if VDRVERSNUM >= 20301
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::DoToggleTimer() LOCK_TIMERS_WRITE");
|
|
+ #endif
|
|
LOCK_TIMERS_WRITE;
|
|
Timers->SetExplicitModify();
|
|
cTimer* toggleTimer = Timers->GetById( timerData.id, timerData.remote );
|
|
@@ -616,20 +608,18 @@
|
|
const cTimer* TimerManager::GetTimer(tEventID eventid, tChannelID channelid)
|
|
{
|
|
cMutexLock timersLock( &LiveTimerManager() );
|
|
- SortedTimers& timers = LiveTimerManager().GetTimers();
|
|
|
|
- for ( SortedTimers::iterator timer = timers.begin(); timer != timers.end(); ++timer )
|
|
+ #ifdef DEBUG_LOCK
|
|
+ dsyslog("live: timers.cpp TimerManager::GetTimer() LOCK_TIMERS_READ");
|
|
+ #endif
|
|
+ LOCK_TIMERS_READ;
|
|
+ for (cTimer* timer = (cTimer *)Timers->First(); timer; timer = (cTimer *)Timers->Next(timer)) {
|
|
if (timer->Channel() && timer->Channel()->GetChannelID() == channelid)
|
|
{
|
|
-#if VDRVERSNUM >= 20301
|
|
- LOCK_SCHEDULES_READ;
|
|
- if (!timer->Event()) timer->SetEventFromSchedule(Schedules);
|
|
-#else
|
|
- if (!timer->Event()) timer->SetEventFromSchedule();
|
|
-#endif
|
|
if (timer->Event() && timer->Event()->EventID() == eventid)
|
|
return &*timer;
|
|
}
|
|
+ }
|
|
return NULL;
|
|
}
|
|
|
|
diff -Naur vdr-plugin-live-3.0.10/timers.h vdr-plugin-live-master/timers.h
|
|
--- vdr-plugin-live-3.0.10/timers.h 2021-07-18 14:51:47.000000000 +0200
|
|
+++ vdr-plugin-live-master/timers.h 2021-09-10 14:11:46.000000000 +0200
|
|
@@ -31,7 +31,7 @@
|
|
bool Modified() { return Timers.Modified(m_state); }
|
|
#endif
|
|
|
|
- static std::string GetTimerDays(cTimer const& timer);
|
|
+ static std::string GetTimerDays(cTimer const *timer);
|
|
static std::string GetTimerInfo(cTimer const& timer);
|
|
static std::string SearchTimerInfo(cTimer const& timer, std::string const& value);
|
|
|
|
@@ -47,7 +47,6 @@
|
|
int m_state;
|
|
#endif
|
|
|
|
- void ReloadTimers();
|
|
};
|
|
|
|
class TimerManager: public cMutex
|
|
@@ -64,7 +63,6 @@
|
|
void ToggleTimerActive( int timerId, const char* remote);
|
|
// may only be called from Plugin::MainThreadHook
|
|
void DoPendingWork();
|
|
- void DoReloadTimers() { m_timers.ReloadTimers(); m_reloadTimers = false; }
|
|
const cTimer* GetTimer(tEventID eventid, tChannelID channelid);
|
|
void SetReloadTimers() { m_reloadTimers = true; }
|
|
|
|
diff -Naur vdr-plugin-live-3.0.10/tools.h vdr-plugin-live-master/tools.h
|
|
--- vdr-plugin-live-3.0.10/tools.h 2021-07-18 14:51:47.000000000 +0200
|
|
+++ vdr-plugin-live-master/tools.h 2021-09-10 14:11:46.000000000 +0200
|
|
@@ -1,6 +1,9 @@
|
|
#ifndef VDR_LIVE_TOOLS_H
|
|
#define VDR_LIVE_TOOLS_H
|
|
|
|
+// uncomment to debug lock sequence
|
|
+// #define DEBUG_LOCK
|
|
+
|
|
// STL headers need to be before VDR tools.h (included by <vdr/channels.h>)
|
|
#include <istream>
|
|
#include <sstream>
|