mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-30 00:41:17 +02:00
neutrino: parental PIN unlocks bouquet for 1 hour
for 'pre-locked' bouquets, remember that they are unlocked for an hour this speeds up channel switching because no EPG is needed for unlocking git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@1272 e54a6e83-5905-42d5-8d5c-058d10e6a962
This commit is contained in:
@@ -125,10 +125,10 @@ int CRemoteControl::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data
|
|||||||
zap_completion_timeout = 0;
|
zap_completion_timeout = 0;
|
||||||
g_InfoViewer->chanready = 1;
|
g_InfoViewer->chanready = 1;
|
||||||
}
|
}
|
||||||
#if 0
|
/* for CHANGETOLOCKED, we don't need to wait for EPG to arrive... */
|
||||||
if ((!is_video_started) && (g_settings.parentallock_prompt != PARENTALLOCK_PROMPT_NEVER))
|
if ((!is_video_started) &&
|
||||||
g_RCInput->postMsg( NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false );
|
(g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED))
|
||||||
#endif
|
g_RCInput->postMsg(NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((msg == NeutrinoMessages::EVT_ZAP_COMPLETE) || (msg == NeutrinoMessages::EVT_ZAP_FAILED ) ||
|
if ((msg == NeutrinoMessages::EVT_ZAP_COMPLETE) || (msg == NeutrinoMessages::EVT_ZAP_FAILED ) ||
|
||||||
@@ -167,10 +167,9 @@ int CRemoteControl::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data
|
|||||||
if ( g_InfoViewer->is_visible )
|
if ( g_InfoViewer->is_visible )
|
||||||
g_RCInput->postMsg( NeutrinoMessages::SHOW_INFOBAR , 0 );
|
g_RCInput->postMsg( NeutrinoMessages::SHOW_INFOBAR , 0 );
|
||||||
}
|
}
|
||||||
#if 0
|
if ((!is_video_started) &&
|
||||||
if ((!is_video_started) && (g_settings.parentallock_prompt != PARENTALLOCK_PROMPT_NEVER))
|
(g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED))
|
||||||
g_RCInput->postMsg( NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false );
|
g_RCInput->postMsg(NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ((msg == NeutrinoMessages::EVT_ZAP_SUB_COMPLETE) || (msg == NeutrinoMessages:: EVT_ZAP_SUB_FAILED )) {
|
if ((msg == NeutrinoMessages::EVT_ZAP_SUB_COMPLETE) || (msg == NeutrinoMessages:: EVT_ZAP_SUB_FAILED )) {
|
||||||
@@ -232,13 +231,14 @@ int CRemoteControl::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data
|
|||||||
|
|
||||||
time_t end_program= info_CN->current_zeit.startzeit+ info_CN->current_zeit.dauer;
|
time_t end_program= info_CN->current_zeit.startzeit+ info_CN->current_zeit.dauer;
|
||||||
current_programm_timer = g_RCInput->addTimer( &end_program );
|
current_programm_timer = g_RCInput->addTimer( &end_program );
|
||||||
|
|
||||||
// is_video_started is only false if channel is locked
|
|
||||||
if (((!is_video_started) && (info_CN->current_fsk == 0)) || ((!is_video_started) && (g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED)))
|
|
||||||
g_RCInput->postMsg( NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false );
|
|
||||||
else
|
|
||||||
g_RCInput->postMsg( NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, info_CN->current_fsk, false );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// is_video_started is only false if channel is locked
|
||||||
|
if ((!is_video_started) &&
|
||||||
|
(info_CN->current_fsk == 0 || g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED))
|
||||||
|
g_RCInput->postMsg(NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, 0x100, false);
|
||||||
|
else
|
||||||
|
g_RCInput->postMsg(NeutrinoMessages::EVT_PROGRAMLOCKSTATUS, info_CN->current_fsk, false);
|
||||||
}
|
}
|
||||||
return messages_return::handled;
|
return messages_return::handled;
|
||||||
}
|
}
|
||||||
|
@@ -41,6 +41,7 @@
|
|||||||
#include <driver/fontrenderer.h>
|
#include <driver/fontrenderer.h>
|
||||||
#include <driver/screen_max.h>
|
#include <driver/screen_max.h>
|
||||||
#include <driver/rcinput.h>
|
#include <driver/rcinput.h>
|
||||||
|
#include <driver/abstime.h>
|
||||||
|
|
||||||
#include <gui/color.h>
|
#include <gui/color.h>
|
||||||
#include <gui/eventlist.h>
|
#include <gui/eventlist.h>
|
||||||
@@ -948,18 +949,41 @@ int CChannelList::handleMsg(const neutrino_msg_t msg, neutrino_msg_data_t data)
|
|||||||
if (g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED && data < 0x100)
|
if (g_settings.parentallock_prompt == PARENTALLOCK_PROMPT_CHANGETOLOCKED && data < 0x100)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* if a pre-locked channel is inside the zap time, open it. Hardcoded to one hour for now. */
|
||||||
|
if (data >= 0x100 && chanlist[selected]->last_unlocked_time + 3600 > time_monotonic())
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* OK, let's ask for a PIN */
|
/* OK, let's ask for a PIN */
|
||||||
g_RemoteControl->stopvideo();
|
g_RemoteControl->stopvideo();
|
||||||
//printf("stopped video\n");
|
//printf("stopped video\n");
|
||||||
startvideo = false;
|
|
||||||
zapProtection = new CZapProtection(g_settings.parentallock_pincode, data);
|
zapProtection = new CZapProtection(g_settings.parentallock_pincode, data);
|
||||||
|
|
||||||
if (zapProtection->check())
|
if (zapProtection->check())
|
||||||
{
|
{
|
||||||
//printf("checked true\n");
|
|
||||||
// remember it for the next time
|
// remember it for the next time
|
||||||
chanlist[selected]->last_unlocked_EPGid= g_RemoteControl->current_EPGid;
|
/* data < 0x100: lock age -> remember EPG ID */
|
||||||
startvideo = true;
|
if (data < 0x100)
|
||||||
|
chanlist[selected]->last_unlocked_EPGid = g_RemoteControl->current_EPGid;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* data >= 0x100: pre locked bouquet -> remember unlock time */
|
||||||
|
chanlist[selected]->last_unlocked_time = time_monotonic();
|
||||||
|
int bnum = bouquetList->getActiveBouquetNumber();
|
||||||
|
if (bnum >= 0)
|
||||||
|
{
|
||||||
|
/* unlock the whole bouquet */
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < bouquetList->Bouquets[bnum]->channelList->getSize(); i++)
|
||||||
|
bouquetList->Bouquets[bnum]->channelList->getChannelFromIndex(i)->last_unlocked_time = chanlist[selected]->last_unlocked_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* last_unlocked_time == 0 is the magic to tell zapTo() to not record the time.
|
||||||
|
Without that, zapping to a locked channel twice would open it without the PIN */
|
||||||
|
chanlist[selected]->last_unlocked_time = 0;
|
||||||
|
startvideo = false;
|
||||||
}
|
}
|
||||||
delete zapProtection;
|
delete zapProtection;
|
||||||
zapProtection = NULL;
|
zapProtection = NULL;
|
||||||
@@ -1089,6 +1113,12 @@ void CChannelList::zapTo(int pos, bool /* forceStoreToLastChannels */)
|
|||||||
pos = 0;
|
pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we record when we switched away from a channel, so that the parental-PIN code can
|
||||||
|
check for timeout. last_unlocked_time == 0 means: the PIN was not entered
|
||||||
|
"tuned" is the *old* channel, before zap */
|
||||||
|
if (tuned < chanlist.size() && chanlist[tuned]->last_unlocked_time != 0)
|
||||||
|
chanlist[tuned]->last_unlocked_time = time_monotonic();
|
||||||
|
|
||||||
CZapitChannel* chan = chanlist[pos];
|
CZapitChannel* chan = chanlist[pos];
|
||||||
printf("**************************** CChannelList::zapTo me %p %s tuned %d new %d %s -> %llx\n", this, name.c_str(), tuned, pos, chan->name.c_str(), chan->channel_id);
|
printf("**************************** CChannelList::zapTo me %p %s tuned %d new %d %s -> %llx\n", this, name.c_str(), tuned, pos, chan->name.c_str(), chan->channel_id);
|
||||||
if ( pos!=(int)tuned ) {
|
if ( pos!=(int)tuned ) {
|
||||||
|
@@ -150,6 +150,7 @@ class CZapitChannel
|
|||||||
|
|
||||||
/* from neutrino CChannel class */
|
/* from neutrino CChannel class */
|
||||||
uint64_t last_unlocked_EPGid;
|
uint64_t last_unlocked_EPGid;
|
||||||
|
time_t last_unlocked_time;
|
||||||
|
|
||||||
std::string ttx_language_code;
|
std::string ttx_language_code;
|
||||||
friend class CChannelList;
|
friend class CChannelList;
|
||||||
|
@@ -43,6 +43,8 @@ CZapitChannel::CZapitChannel(const std::string & p_name, t_service_id p_sid, t_t
|
|||||||
pmtPid = 0;
|
pmtPid = 0;
|
||||||
resetPids();
|
resetPids();
|
||||||
ttx_language_code = "";
|
ttx_language_code = "";
|
||||||
|
last_unlocked_EPGid = 0;
|
||||||
|
last_unlocked_time = 0;
|
||||||
//printf("NEW CHANNEL %s %x\n", name.c_str(), (int) this);
|
//printf("NEW CHANNEL %s %x\n", name.c_str(), (int) this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user