mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
651 lines
27 KiB
C
651 lines
27 KiB
C
|
#include "viewelementsdisplaychannel.h"
|
||
|
#include "../config.h"
|
||
|
#include "../extensions/helpers.h"
|
||
|
#include "../extensions/timers.h"
|
||
|
#include "../services/scraper2vdr.h"
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcChannelInfo
|
||
|
******************************************************************/
|
||
|
cVeDcChannelInfo::cVeDcChannelInfo(void) {
|
||
|
}
|
||
|
|
||
|
cVeDcChannelInfo::~cVeDcChannelInfo(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcChannelInfo::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{channelnumber}", (int)eDCChannelInfoST::channelnumber);
|
||
|
tokenContainer->DefineStringToken("{channelname}", (int)eDCChannelInfoST::channelname);
|
||
|
tokenContainer->DefineStringToken("{channelid}", (int)eDCChannelInfoST::channelid);
|
||
|
tokenContainer->DefineIntToken("{channellogoexists}", (int)eDCChannelInfoIT::channellogoexists);
|
||
|
tokenContainer->DefineIntToken("{switching}", (int)eDCChannelInfoIT::switching);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcChannelInfo::Set(const cChannel *c, int number) {
|
||
|
cString channelNumber("");
|
||
|
cString channelName("");
|
||
|
cString channelId("");
|
||
|
if (c) {
|
||
|
channelName = c->Name() ? c->Name() : "";
|
||
|
channelId = c->GetChannelID().ToString();
|
||
|
if (!c->GroupSep()) {
|
||
|
channelNumber = cString::sprintf("%d%s", c->Number(), number ? "-" : "");
|
||
|
}
|
||
|
} else if (number) {
|
||
|
channelNumber = cString::sprintf("%d-", number);
|
||
|
} else {
|
||
|
channelName = ChannelString(NULL, 0);
|
||
|
}
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddStringToken((int)eDCChannelInfoST::channelnumber, *channelNumber);
|
||
|
tokenContainer->AddStringToken((int)eDCChannelInfoST::channelname, *channelName);
|
||
|
tokenContainer->AddStringToken((int)eDCChannelInfoST::channelid, *channelId);
|
||
|
bool logoExists = imgCache->LogoExists(*channelId);
|
||
|
tokenContainer->AddIntToken((int)eDCChannelInfoIT::channellogoexists, logoExists);
|
||
|
tokenContainer->AddIntToken((int)eDCChannelInfoIT::switching, (number > 0)?true:false);
|
||
|
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcChannelGroup
|
||
|
******************************************************************/
|
||
|
cVeDcChannelGroup::cVeDcChannelGroup(void) {
|
||
|
}
|
||
|
|
||
|
cVeDcChannelGroup::~cVeDcChannelGroup(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcChannelGroup::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{group}", (int)eDCChannelGroupST::group);
|
||
|
tokenContainer->DefineStringToken("{nextgroup}", (int)eDCChannelGroupST::nextgroup);
|
||
|
tokenContainer->DefineStringToken("{prevgroup}", (int)eDCChannelGroupST::prevgroup);
|
||
|
tokenContainer->DefineStringToken("{seppath}", (int)eDCChannelGroupST::seppath);
|
||
|
tokenContainer->DefineIntToken("{prevAvailable}", (int)eDCChannelGroupIT::prevAvailable);
|
||
|
tokenContainer->DefineIntToken("{nextAvailable}", (int)eDCChannelGroupIT::nextAvailable);
|
||
|
tokenContainer->DefineIntToken("{sepexists}", (int)eDCChannelGroupIT::sepexists);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcChannelGroup::Set(const cChannel *c) {
|
||
|
const char *sep = c->Name();
|
||
|
bool sepExists = imgCache->SeparatorLogoExists(sep);
|
||
|
|
||
|
const char *prevChannelSep = GetChannelSep(c, true);
|
||
|
const char *nextChannelSep = GetChannelSep(c, false);
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddStringToken((int)eDCChannelGroupST::group, sep);
|
||
|
tokenContainer->AddStringToken((int)eDCChannelGroupST::nextgroup, nextChannelSep ? nextChannelSep : "");
|
||
|
tokenContainer->AddStringToken((int)eDCChannelGroupST::prevgroup, prevChannelSep ? prevChannelSep : "");
|
||
|
tokenContainer->AddStringToken((int)eDCChannelGroupST::seppath, sepExists ? sep : "");
|
||
|
tokenContainer->AddIntToken((int)eDCChannelGroupIT::prevAvailable, (prevChannelSep)?true:false);
|
||
|
tokenContainer->AddIntToken((int)eDCChannelGroupIT::nextAvailable, (nextChannelSep)?true:false);
|
||
|
tokenContainer->AddIntToken((int)eDCChannelGroupIT::sepexists, sepExists);
|
||
|
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
const char *cVeDcChannelGroup::GetChannelSep(const cChannel *c, bool prev) {
|
||
|
const cChannel *sep = prev ? Channels.Prev(c) :
|
||
|
Channels.Next(c);
|
||
|
for (; sep; (prev)?(sep = Channels.Prev(sep)):(sep = Channels.Next(sep))) {
|
||
|
if (sep->GroupSep()) {
|
||
|
return sep->Name();
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
/******************************************************************
|
||
|
* cVeDcEpgInfo
|
||
|
******************************************************************/
|
||
|
cVeDcEpgInfo::cVeDcEpgInfo(void) {
|
||
|
}
|
||
|
|
||
|
cVeDcEpgInfo::~cVeDcEpgInfo(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcEpgInfo::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{currenttitle}", (int)eDCEpgInfoST::currenttitle);
|
||
|
tokenContainer->DefineStringToken("{currentsubtitle}", (int)eDCEpgInfoST::currentsubtitle);
|
||
|
tokenContainer->DefineStringToken("{currentstart}", (int)eDCEpgInfoST::currentstart);
|
||
|
tokenContainer->DefineStringToken("{currentstop}", (int)eDCEpgInfoST::currentstop);
|
||
|
tokenContainer->DefineStringToken("{nexttitle}", (int)eDCEpgInfoST::nexttitle);
|
||
|
tokenContainer->DefineStringToken("{nextsubtitle}", (int)eDCEpgInfoST::nextsubtitle);
|
||
|
tokenContainer->DefineStringToken("{nextstart}", (int)eDCEpgInfoST::nextstart);
|
||
|
tokenContainer->DefineStringToken("{nextstop}", (int)eDCEpgInfoST::nextstop);
|
||
|
tokenContainer->DefineIntToken("{currentduration}", (int)eDCEpgInfoIT::currentduration);
|
||
|
tokenContainer->DefineIntToken("{currentdurationhours}", (int)eDCEpgInfoIT::currentdurationhours);
|
||
|
tokenContainer->DefineIntToken("{currentdurationminutes}", (int)eDCEpgInfoIT::currentdurationminutes);
|
||
|
tokenContainer->DefineIntToken("{currentelapsed}", (int)eDCEpgInfoIT::currentelapsed);
|
||
|
tokenContainer->DefineIntToken("{currentremaining}", (int)eDCEpgInfoIT::currentremaining);
|
||
|
tokenContainer->DefineIntToken("{nextduration}", (int)eDCEpgInfoIT::nextduration);
|
||
|
tokenContainer->DefineIntToken("{nextdurationhours}", (int)eDCEpgInfoIT::nextdurationhours);
|
||
|
tokenContainer->DefineIntToken("{nextdurationminutes}", (int)eDCEpgInfoIT::nextdurationminutes);
|
||
|
tokenContainer->DefineIntToken("{nextrecording}", (int)eDCEpgInfoIT::nextrecording);
|
||
|
tokenContainer->DefineIntToken("{currentrecording}", (int)eDCEpgInfoIT::currentrecording);
|
||
|
tokenContainer->DefineIntToken("{hasVPS}", (int)eDCEpgInfoIT::hasVPS);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcEpgInfo::Set(const cEvent *p, const cEvent *f) {
|
||
|
tokenContainer->Clear();
|
||
|
if (p) {
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::currenttitle, p->Title());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentsubtitle, p->ShortText());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstart, *p->GetTimeString());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::currentstop, *p->GetEndTimeString());
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentduration, p->Duration() / 60);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationhours, p->Duration() / 3600);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentdurationminutes, (p->Duration() / 60) % 60);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentelapsed, (int)round((time(NULL) - p->StartTime())/60));
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentremaining, (int)round((p->EndTime() - time(NULL))/60));
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::currentrecording, EventHasTimer(p));
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)p->Vps());
|
||
|
}
|
||
|
if (f) {
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::nexttitle, f->Title());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextsubtitle, f->ShortText());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstart, *f->GetTimeString());
|
||
|
tokenContainer->AddStringToken((int)eDCEpgInfoST::nextstop, *f->GetEndTimeString());
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextduration, f->Duration() / 60);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationhours, f->Duration() / 3600);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::nextdurationminutes, (f->Duration() / 60) % 60);
|
||
|
tokenContainer->AddIntToken((int)eDCEpgInfoIT::hasVPS, (bool)f->Vps());
|
||
|
}
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
bool cVeDcEpgInfo::EventHasTimer(const cEvent *e) {
|
||
|
if (!e) return false;
|
||
|
cGlobalSortedTimers SortedTimers;// local and remote timers
|
||
|
bool hasTimer = e->HasTimer();
|
||
|
for (int i = 0; i < SortedTimers.Size() && !hasTimer; i++)
|
||
|
if (const cTimer *Timer = SortedTimers[i])
|
||
|
if (Timer->Channel()->GetChannelID() == e->ChannelID())
|
||
|
if (const cEvent *timerEvent = Timer->Event())
|
||
|
if (e->EventID() == timerEvent->EventID())
|
||
|
hasTimer = true;
|
||
|
return hasTimer;
|
||
|
}
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcProgressBar
|
||
|
******************************************************************/
|
||
|
cVeDcProgressBar::cVeDcProgressBar(void) {
|
||
|
currentLast = -1;
|
||
|
startTime = -1;
|
||
|
duration = -1;
|
||
|
}
|
||
|
|
||
|
cVeDcProgressBar::~cVeDcProgressBar(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcProgressBar::Close(void) {
|
||
|
currentLast = -1;
|
||
|
startTime = -1;
|
||
|
duration = -1;
|
||
|
cViewElement::Close();
|
||
|
}
|
||
|
|
||
|
void cVeDcProgressBar::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{start}", (int)eDCProgressBarST::start);
|
||
|
tokenContainer->DefineStringToken("{stop}", (int)eDCProgressBarST::stop);
|
||
|
tokenContainer->DefineIntToken("{duration}", (int)eDCProgressBarIT::duration);
|
||
|
tokenContainer->DefineIntToken("{elapsed}", (int)eDCProgressBarIT::elapsed);
|
||
|
tokenContainer->DefineIntToken("{remaining}", (int)eDCProgressBarIT::remaining);
|
||
|
tokenContainer->DefineIntToken("{permashift}", (int)eDCProgressBarIT::permashift);
|
||
|
tokenContainer->DefineIntToken("{livebuffer}", (int)eDCProgressBarIT::livebuffer);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcProgressBar::Set(const cEvent *p) {
|
||
|
if (!p) {
|
||
|
startTime = -1;
|
||
|
duration = -1;
|
||
|
return;
|
||
|
}
|
||
|
startTime = p->StartTime();
|
||
|
duration = p->Duration();
|
||
|
|
||
|
int current = 0;
|
||
|
time_t t = time(NULL);
|
||
|
if (t > startTime)
|
||
|
current = t - startTime;
|
||
|
|
||
|
currentLast = current;
|
||
|
SetDirty();
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddStringToken((int)eDCProgressBarST::start, *p->GetTimeString());
|
||
|
tokenContainer->AddStringToken((int)eDCProgressBarST::stop, *p->GetEndTimeString());
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::duration, duration);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::elapsed, current);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::remaining, duration - current);
|
||
|
int liveBuffer = GetLiveBuffer();
|
||
|
if (liveBuffer >= 0) {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 1);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::livebuffer, liveBuffer);
|
||
|
} else {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool cVeDcProgressBar::Parse(bool force) {
|
||
|
if (!cViewElement::Parse(force))
|
||
|
return false;
|
||
|
int current = 0;
|
||
|
time_t t = time(NULL);
|
||
|
if (t > startTime)
|
||
|
current = t - startTime;
|
||
|
if (!(current > currentLast + 3) && !force && !Dirty())
|
||
|
return false;
|
||
|
SetDirty();
|
||
|
if (duration <= 0) {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::duration, 0);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::elapsed, 0);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::remaining, 0);
|
||
|
} else {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::duration, duration);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::elapsed, current);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::remaining, duration - current);
|
||
|
int liveBuffer = GetLiveBuffer();
|
||
|
if (liveBuffer >= 0) {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 1);
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::livebuffer, liveBuffer);
|
||
|
} else {
|
||
|
tokenContainer->AddIntToken((int)eDCProgressBarIT::permashift, 0);
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
int cVeDcProgressBar::GetLiveBuffer(void) {
|
||
|
static cPlugin *pPermashift = cPluginManager::GetPlugin("permashift");
|
||
|
if (!pPermashift) {
|
||
|
return -1;
|
||
|
}
|
||
|
int buffer = 0;
|
||
|
if (pPermashift->Service("Permashift-GetUsedBufferSecs-v1", &buffer)) {
|
||
|
return buffer;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
/******************************************************************
|
||
|
* cVeDcStatusInfo
|
||
|
******************************************************************/
|
||
|
cVeDcStatusInfo::cVeDcStatusInfo(void) {
|
||
|
}
|
||
|
|
||
|
cVeDcStatusInfo::~cVeDcStatusInfo(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcStatusInfo::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineIntToken("{isRadio}", (int)eDCStatusInfoIT::isRadio);
|
||
|
tokenContainer->DefineIntToken("{hasVT}", (int)eDCStatusInfoIT::hasVT);
|
||
|
tokenContainer->DefineIntToken("{isStereo}", (int)eDCStatusInfoIT::isStereo);
|
||
|
tokenContainer->DefineIntToken("{isDolby}", (int)eDCStatusInfoIT::isDolby);
|
||
|
tokenContainer->DefineIntToken("{isEncrypted}", (int)eDCStatusInfoIT::isEncrypted);
|
||
|
tokenContainer->DefineIntToken("{isRecording}", (int)eDCStatusInfoIT::isRecording);
|
||
|
tokenContainer->DefineIntToken("{newmails}", (int)eDCStatusInfoIT::newmails);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcStatusInfo::Set(const cChannel *c) {
|
||
|
bool isRadio = !c->Vpid() && c->Apid(0);
|
||
|
bool hasVT = c->Vpid() && c->Tpid();
|
||
|
bool isStereo = c->Apid(0);
|
||
|
bool isDolby = c->Dpid(0);
|
||
|
bool isEncrypted = c->Ca();
|
||
|
bool isRecording = cRecordControls::Active();
|
||
|
cGlobalSortedTimers SortedTimers;// local and remote timers
|
||
|
for (int i = 0; i < SortedTimers.Size() && !isRecording; i++)
|
||
|
if (const cTimer *Timer = SortedTimers[i])
|
||
|
if (Timer->Recording())
|
||
|
isRecording = true;
|
||
|
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::isRadio, isRadio);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::hasVT, hasVT);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::isStereo, isStereo);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::isDolby, isDolby);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::isEncrypted, isEncrypted);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::isRecording, isRecording);
|
||
|
tokenContainer->AddIntToken((int)eDCStatusInfoIT::newmails, CheckMails());
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
bool cVeDcStatusInfo::CheckMails(void) {
|
||
|
static cPlugin *pMailbox = cPluginManager::GetPlugin("mailbox");
|
||
|
if (!pMailbox) {
|
||
|
return false;
|
||
|
}
|
||
|
bool newMail = false;
|
||
|
if (pMailbox->Service("MailBox-HasNewMail-1.0", &newMail)) {
|
||
|
return newMail;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcAudioInfo
|
||
|
******************************************************************/
|
||
|
cVeDcAudioInfo::cVeDcAudioInfo(void) {
|
||
|
lastNumAudioTracks = -1;
|
||
|
lastAudioChannel = -1;
|
||
|
lastTracDesc = NULL;
|
||
|
lastTrackLang = NULL;
|
||
|
}
|
||
|
|
||
|
cVeDcAudioInfo::~cVeDcAudioInfo(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcAudioInfo::Close(void) {
|
||
|
lastNumAudioTracks = -1;
|
||
|
lastAudioChannel = -1;
|
||
|
free(lastTracDesc);
|
||
|
lastTracDesc = NULL;
|
||
|
free(lastTrackLang);
|
||
|
lastTrackLang = NULL;
|
||
|
cViewElement::Close();
|
||
|
}
|
||
|
|
||
|
void cVeDcAudioInfo::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{trackdesc}", (int)eDCAudioInfoST::trackdesc);
|
||
|
tokenContainer->DefineStringToken("{tracklang}", (int)eDCAudioInfoST::tracklang);
|
||
|
tokenContainer->DefineIntToken("{numaudiotracks}", (int)eDCAudioInfoIT::numaudiotracks);
|
||
|
tokenContainer->DefineIntToken("{audiochannel}", (int)eDCAudioInfoIT::audiochannel);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
bool cVeDcAudioInfo::Parse(bool forced) {
|
||
|
if (!cViewElement::Parse(forced))
|
||
|
return false;
|
||
|
int numAudioTracks = 0;
|
||
|
int audioChannel = -1;
|
||
|
const char *trackDescription = "";
|
||
|
const char *trackLanguage = "";
|
||
|
|
||
|
cDevice *device = cDevice::PrimaryDevice();
|
||
|
if (device) {
|
||
|
numAudioTracks = device->NumAudioTracks();
|
||
|
audioChannel = device->GetAudioChannel();
|
||
|
if (numAudioTracks > 0) {
|
||
|
const tTrackId *track = device->GetTrack(device->GetCurrentAudioTrack());
|
||
|
if (track) {
|
||
|
trackDescription = track->description ? track->description : "";
|
||
|
trackLanguage = track->language ? track->language : "";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ( !Dirty() && !forced && lastNumAudioTracks == numAudioTracks
|
||
|
&& lastAudioChannel == audioChannel
|
||
|
&& lastTracDesc && !strcmp(trackDescription, lastTracDesc)
|
||
|
&& lastTrackLang && !strcmp(trackLanguage, lastTrackLang)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
lastNumAudioTracks = numAudioTracks;
|
||
|
lastAudioChannel = audioChannel;
|
||
|
free(lastTracDesc);
|
||
|
lastTracDesc = strdup(trackDescription);
|
||
|
free(lastTrackLang);
|
||
|
lastTrackLang = strdup(trackLanguage);
|
||
|
SetDirty();
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddIntToken((int)eDCAudioInfoIT::numaudiotracks, numAudioTracks);
|
||
|
tokenContainer->AddIntToken((int)eDCAudioInfoIT::audiochannel, audioChannel);
|
||
|
tokenContainer->AddStringToken((int)eDCAudioInfoST::trackdesc, trackDescription);
|
||
|
tokenContainer->AddStringToken((int)eDCAudioInfoST::tracklang, trackLanguage);
|
||
|
return true;
|
||
|
}
|
||
|
/******************************************************************
|
||
|
* cVeDcScreenResolution
|
||
|
******************************************************************/
|
||
|
cVeDcScreenResolution::cVeDcScreenResolution(void) {
|
||
|
lastScreenWidth = -1;
|
||
|
lastScreenHeight = -1;
|
||
|
}
|
||
|
|
||
|
cVeDcScreenResolution::~cVeDcScreenResolution(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcScreenResolution::Close(void) {
|
||
|
lastScreenWidth = -1;
|
||
|
lastScreenHeight = -1;
|
||
|
cViewElement::Close();
|
||
|
}
|
||
|
|
||
|
void cVeDcScreenResolution::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{resolution}", (int)eDCScreenResolutionST::resolution);
|
||
|
tokenContainer->DefineStringToken("{aspect}", (int)eDCScreenResolutionST::aspect);
|
||
|
tokenContainer->DefineIntToken("{screenwidth}", (int)eDCScreenResolutionIT::screenwidth);
|
||
|
tokenContainer->DefineIntToken("{screenheight}", (int)eDCScreenResolutionIT::screenheight);
|
||
|
tokenContainer->DefineIntToken("{isHD}", (int)eDCScreenResolutionIT::isHD);
|
||
|
tokenContainer->DefineIntToken("{isWideScreen}", (int)eDCScreenResolutionIT::isWideScreen);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
bool cVeDcScreenResolution::Parse(bool forced) {
|
||
|
if (!cViewElement::Parse(forced))
|
||
|
return false;
|
||
|
int screenWidth = 0;
|
||
|
int screenHeight = 0;
|
||
|
double aspect = 0;
|
||
|
|
||
|
cDevice::PrimaryDevice()->GetVideoSize(screenWidth, screenHeight, aspect);
|
||
|
|
||
|
if ((lastScreenWidth == screenWidth) && (lastScreenHeight == screenHeight))
|
||
|
return false;
|
||
|
|
||
|
if ((screenWidth == 0) && (screenHeight == 0))
|
||
|
return false;
|
||
|
|
||
|
lastScreenWidth = screenWidth;
|
||
|
lastScreenHeight = screenHeight;
|
||
|
SetDirty();
|
||
|
|
||
|
bool isHD = false;
|
||
|
string resName = GetScreenResolutionString(screenWidth, screenHeight, &isHD);
|
||
|
|
||
|
bool isWideScreen = false;
|
||
|
string aspectName = GetScreenAspectString(aspect, &isWideScreen);
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddIntToken((int)eDCScreenResolutionIT::screenwidth, screenWidth);
|
||
|
tokenContainer->AddIntToken((int)eDCScreenResolutionIT::screenheight, screenHeight);
|
||
|
tokenContainer->AddIntToken((int)eDCScreenResolutionIT::isHD, isHD);
|
||
|
tokenContainer->AddIntToken((int)eDCScreenResolutionIT::isWideScreen, isWideScreen);
|
||
|
tokenContainer->AddStringToken((int)eDCScreenResolutionST::resolution, resName.c_str());
|
||
|
tokenContainer->AddStringToken((int)eDCScreenResolutionST::aspect, aspectName.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
/******************************************************************
|
||
|
* cVeDcSignalQuality
|
||
|
******************************************************************/
|
||
|
cVeDcSignalQuality::cVeDcSignalQuality(void) {
|
||
|
lastSignalDisplay = -1;
|
||
|
lastSignalStrength = -1;
|
||
|
lastSignalQuality = -1;
|
||
|
}
|
||
|
|
||
|
cVeDcSignalQuality::~cVeDcSignalQuality(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcSignalQuality::Close(void) {
|
||
|
lastSignalDisplay = -1;
|
||
|
lastSignalStrength = -1;
|
||
|
lastSignalQuality = -1;
|
||
|
cViewElement::Close();
|
||
|
}
|
||
|
|
||
|
void cVeDcSignalQuality::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineIntToken("{signalstrength}", (int)eDCSignalQualityIT::signalstrength);
|
||
|
tokenContainer->DefineIntToken("{signalquality}", (int)eDCSignalQualityIT::signalquality);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
bool cVeDcSignalQuality::Parse(bool forced) {
|
||
|
if (!cViewElement::Parse(forced))
|
||
|
return false;
|
||
|
time_t now = time(NULL);
|
||
|
if (now == lastSignalDisplay)
|
||
|
return false;
|
||
|
lastSignalDisplay = now;
|
||
|
|
||
|
int signalStrength = cDevice::ActualDevice()->SignalStrength();
|
||
|
int signalQuality = cDevice::ActualDevice()->SignalQuality();
|
||
|
|
||
|
if (signalStrength < 0) signalStrength = 0;
|
||
|
if (signalQuality < 0) signalQuality = 0;
|
||
|
|
||
|
if (signalStrength == 0 && signalQuality==0)
|
||
|
return false;
|
||
|
|
||
|
if ((lastSignalStrength == signalStrength) && (lastSignalQuality == signalQuality))
|
||
|
return false;
|
||
|
SetDirty();
|
||
|
lastSignalStrength = signalStrength;
|
||
|
lastSignalQuality = signalQuality;
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddIntToken((int)eDCSignalQualityIT::signalstrength, signalStrength);
|
||
|
tokenContainer->AddIntToken((int)eDCSignalQualityIT::signalquality, signalQuality);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcScraperContent
|
||
|
******************************************************************/
|
||
|
cVeDcScraperContent::cVeDcScraperContent(void) {
|
||
|
}
|
||
|
|
||
|
cVeDcScraperContent::~cVeDcScraperContent(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcScraperContent::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{posterpath}", (int)eScraperPosterBannerST::posterpath);
|
||
|
tokenContainer->DefineStringToken("{bannerpath}", (int)eScraperPosterBannerST::bannerpath);
|
||
|
tokenContainer->DefineStringToken("{mediapath}", (int)eScraperPosterBannerST::mediapath);
|
||
|
tokenContainer->DefineIntToken("{posterwidth}", (int)eScraperPosterBannerIT::posterwidth);
|
||
|
tokenContainer->DefineIntToken("{posterheight}", (int)eScraperPosterBannerIT::posterheight);
|
||
|
tokenContainer->DefineIntToken("{hasPoster}", (int)eScraperPosterBannerIT::hasposter);
|
||
|
tokenContainer->DefineIntToken("{bannerwidth}", (int)eScraperPosterBannerIT::bannerwidth);
|
||
|
tokenContainer->DefineIntToken("{bannerheight}", (int)eScraperPosterBannerIT::bannerheight);
|
||
|
tokenContainer->DefineIntToken("{hasBanner}", (int)eScraperPosterBannerIT::hasbanner);
|
||
|
tokenContainer->DefineIntToken("{mediawidth}", (int)eScraperPosterBannerIT::mediawidth);
|
||
|
tokenContainer->DefineIntToken("{mediaheight}", (int)eScraperPosterBannerIT::mediaheight);
|
||
|
tokenContainer->DefineIntToken("{isbanner}", (int)eScraperPosterBannerIT::isbanner);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcScraperContent::Set(const cEvent *e) {
|
||
|
tokenContainer->Clear();
|
||
|
SetPosterBanner(tokenContainer, e, NULL);
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
/******************************************************************
|
||
|
* cVeDcScreenResolution
|
||
|
******************************************************************/
|
||
|
cVeDcEcmInfo::cVeDcEcmInfo(void) {
|
||
|
channelSid = -1;
|
||
|
lastEcmInfo.hops = -1;
|
||
|
lastEcmInfo.ecmtime = -1;
|
||
|
lastEcmInfo.caid = -1;
|
||
|
lastEcmInfo.pid = -1;
|
||
|
lastEcmInfo.prid = -1;
|
||
|
}
|
||
|
|
||
|
cVeDcEcmInfo::~cVeDcEcmInfo(void) {
|
||
|
}
|
||
|
|
||
|
void cVeDcEcmInfo::Close(void) {
|
||
|
channelSid = -1;
|
||
|
lastEcmInfo.hops = -1;
|
||
|
lastEcmInfo.ecmtime = -1;
|
||
|
lastEcmInfo.caid = -1;
|
||
|
lastEcmInfo.pid = -1;
|
||
|
lastEcmInfo.prid = -1;
|
||
|
cViewElement::Close();
|
||
|
}
|
||
|
|
||
|
void cVeDcEcmInfo::SetTokenContainer(void) {
|
||
|
tokenContainer = new skindesignerapi::cTokenContainer();
|
||
|
tokenContainer->DefineStringToken("{cardsystem}", (int)eDCEcmInfoST::cardsystem);
|
||
|
tokenContainer->DefineStringToken("{reader}", (int)eDCEcmInfoST::reader);
|
||
|
tokenContainer->DefineStringToken("{from}", (int)eDCEcmInfoST::from);
|
||
|
tokenContainer->DefineStringToken("{protocol}", (int)eDCEcmInfoST::protocol);
|
||
|
tokenContainer->DefineIntToken("{caid}", (int)eDCEcmInfoIT::caid);
|
||
|
tokenContainer->DefineIntToken("{pid}", (int)eDCEcmInfoIT::pid);
|
||
|
tokenContainer->DefineIntToken("{prid}", (int)eDCEcmInfoIT::prid);
|
||
|
tokenContainer->DefineIntToken("{ecmtime}", (int)eDCEcmInfoIT::ecmtime);
|
||
|
tokenContainer->DefineIntToken("{hops}", (int)eDCEcmInfoIT::hops);
|
||
|
InheritTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cVeDcEcmInfo::Set(const cChannel *c) {
|
||
|
channelSid = c->Sid();
|
||
|
}
|
||
|
|
||
|
bool cVeDcEcmInfo::Parse(bool forced) {
|
||
|
if (!cViewElement::Parse(forced))
|
||
|
return false;
|
||
|
static cPlugin *pDVBApi = cPluginManager::GetPlugin("dvbapi");
|
||
|
if (!pDVBApi)
|
||
|
return false;
|
||
|
if (channelSid < 0)
|
||
|
return false;
|
||
|
|
||
|
sDVBAPIEcmInfo ecmInfo;
|
||
|
ecmInfo.sid = channelSid;
|
||
|
|
||
|
if (!pDVBApi->Service("GetEcmInfo", &ecmInfo)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (ecmInfo.hops < 0 || ecmInfo.ecmtime <= 0 || ecmInfo.ecmtime > 100000)
|
||
|
return false;
|
||
|
if (CompareECMInfos(&ecmInfo))
|
||
|
return false;
|
||
|
lastEcmInfo = ecmInfo;
|
||
|
SetDirty();
|
||
|
|
||
|
tokenContainer->Clear();
|
||
|
tokenContainer->AddIntToken((int)eDCEcmInfoIT::caid, ecmInfo.caid);
|
||
|
tokenContainer->AddIntToken((int)eDCEcmInfoIT::pid, ecmInfo.pid);
|
||
|
tokenContainer->AddIntToken((int)eDCEcmInfoIT::prid, ecmInfo.prid);
|
||
|
tokenContainer->AddIntToken((int)eDCEcmInfoIT::ecmtime, ecmInfo.ecmtime);
|
||
|
tokenContainer->AddIntToken((int)eDCEcmInfoIT::hops, ecmInfo.hops);
|
||
|
tokenContainer->AddStringToken((int)eDCEcmInfoST::cardsystem, *ecmInfo.cardsystem);
|
||
|
tokenContainer->AddStringToken((int)eDCEcmInfoST::reader, *ecmInfo.reader);
|
||
|
tokenContainer->AddStringToken((int)eDCEcmInfoST::from, *ecmInfo.from);
|
||
|
tokenContainer->AddStringToken((int)eDCEcmInfoST::protocol, *ecmInfo.protocol);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool cVeDcEcmInfo::CompareECMInfos(sDVBAPIEcmInfo *ecmInfo) {
|
||
|
if (ecmInfo->caid != lastEcmInfo.caid)
|
||
|
return false;
|
||
|
if (ecmInfo->pid != lastEcmInfo.pid)
|
||
|
return false;
|
||
|
if (ecmInfo->prid != lastEcmInfo.prid)
|
||
|
return false;
|
||
|
if (ecmInfo->ecmtime != lastEcmInfo.ecmtime)
|
||
|
return false;
|
||
|
if (ecmInfo->hops != lastEcmInfo.hops)
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|