Commit 96ebdbf4 authored by Klaus Schmidinger's avatar Klaus Schmidinger

Version 1.1.18

- Fixed missing initialization of 'number' in cChannel (thanks to Martin Hammerschmid
  for reporting this one).
- Fixed a misplaced ')' in the fix about the stale lock files (thanks again to
  Oliver Endriss for pointing this out - it was my fault).
- Group delimiters in the 'channels.conf' file that have no text (like a simple ":"
  or ":@201") no longer show up in the Channels menu (suggested by Guy Roussin).
- Added "Tele 5" to 'channels.conf' (thanks to Georg Hitsch).
- Changed the source directory name for plugins from 'SRC' to 'src' (suggested by
  Clemens Kirchgatterer).
- Removed transponders 10788, 11739 and 12266 from 'channels.conf' (apparently they
  are no longer active).
- Deactivated some templates in tools.h in case some plugin needs to use the STL
  (suggested by Gerald Berwolf).
- Timers now accept channel IDs even if the 'source' is 0 (thanks to Stefan Huelswitt
  for reporting this one).
- Now taking an active SVDRP connection into account when doing shutdown or
  housekeeping (suggested by Emil Naepflein).
- Macros in 'keymacros.conf' can now use "@plugin" to directly access the main menu
  function of a given plugin (see man vdr(5) for details).
- The new plugin 'sky' can be used to integrate a Sky Digibox into the VDR system,
  using a Kfir MPEG2 encoder card (see PLUGINS/src/sky/README for details).
parent fe9499ba
......@@ -48,6 +48,7 @@ Martin Hammerschmid <martin@hammerschmid.com>
for adding a missing #include to ringbuffer.c
for adding a missing 'public' keyword in device.h
for pointing out a bug in displaying the group separators in the channel display
for reporting a problem with a missing initialization of 'number' in cChannel
Bastian Guse <bastian@nocopy.de>
for writing the FORMATS entry for timers.conf
......@@ -159,6 +160,7 @@ Stefan Huelswitt <huels@iname.com>
for helping to fix switching audio tracks in 'Transfer Mode' on the primary DVB device
for fixing handling 'Transfer Mode' on single device systems when recording an
encrypted channel
for reporting a problem with timers when channel IDs have a 'source' that is 0
Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than
......@@ -479,3 +481,20 @@ R
Andreas Kool <akool@akool.de>
for pointing out problems with non-unique definitions in 'channels.conf.cable'
Guy Roussin <guy.roussin@teledetection.fr>
for suggesting not to display channel group delimiters without text
Georg Hitsch <georg@hitsch.at>
for his help in keeping 'channels.conf' up to date
Clemens Kirchgatterer <clemens@thf.ath.cx>
for suggesting to change source directory name for plugins from 'SRC' to 'src'
Emil Naepflein <Emil.Naepflein@philosys.de>
for suggesting to take an active SVDRP connection into account when doing shutdown or
housekeeping
Gerald Berwolf <genka@genka.de>
for suggesting to deactivate some templates in tools.h in case some plugin needs to
use the STL
......@@ -1812,3 +1812,27 @@ Video Disk Recorder Revision History
'now +/- LOCKFILESTALETIME'. This improves things in cases where the system time
makes far jumps, so that a lock file might end up with a time stamp that lies
in the distant future (thanks to Oliver Endriss).
2002-12-01: Version 1.1.18
- Fixed missing initialization of 'number' in cChannel (thanks to Martin Hammerschmid
for reporting this one).
- Fixed a misplaced ')' in the fix about the stale lock files (thanks again to
Oliver Endriss for pointing this out - it was my fault).
- Group delimiters in the 'channels.conf' file that have no text (like a simple ":"
or ":@201") no longer show up in the Channels menu (suggested by Guy Roussin).
- Added "Tele 5" to 'channels.conf' (thanks to Georg Hitsch).
- Changed the source directory name for plugins from 'SRC' to 'src' (suggested by
Clemens Kirchgatterer).
- Removed transponders 10788, 11739 and 12266 from 'channels.conf' (apparently they
are no longer active).
- Deactivated some templates in tools.h in case some plugin needs to use the STL
(suggested by Gerald Berwolf).
- Timers now accept channel IDs even if the 'source' is 0 (thanks to Stefan Huelswitt
for reporting this one).
- Now taking an active SVDRP connection into account when doing shutdown or
housekeeping (suggested by Emil Naepflein).
- Macros in 'keymacros.conf' can now use "@plugin" to directly access the main menu
function of a given plugin (see man vdr(5) for details).
- The new plugin 'sky' can be used to integrate a Sky Digibox into the VDR system,
using a Kfir MPEG2 encoder card (see PLUGINS/src/sky/README for details).
......@@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 1.51 2002/11/01 13:11:53 kls Exp $
# $Id: Makefile 1.52 2002/11/29 15:23:02 kls Exp $
.DELETE_ON_ERROR:
......@@ -109,10 +109,10 @@ include-dir:
# Plugins:
plugins: include-dir
@for i in `ls $(PLUGINDIR)/SRC | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/SRC/$$i" all; done
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" all; done
plugins-clean:
@for i in `ls $(PLUGINDIR)/SRC | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/SRC/$$i" clean; done
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
@-rm -f $(PLUGINDIR)/lib/*
# Install the files:
......
......@@ -129,13 +129,13 @@ VDR source directory. Inside this directory the following subdirectory structure
is used:
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
VDR/PLUGINS/SRC
VDR/PLUGINS/SRC/hello
VDR/PLUGINS/src
VDR/PLUGINS/src/hello
VDR/PLUGINS/lib
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
</pre></td></tr></table><p>
The <tt>SRC</tt> directory contains one subdirectory for each plugin, which carries
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
the name of that plugin (in the above example that would be <tt>hello</tt>).
What's inside the individual source directory of a
plugin is entirely up to the author of that plugin. The only prerequisites are
......@@ -156,7 +156,7 @@ is not used, the path to the plugin directory has be be given to VDR through the
<b><tt>-L</tt></b> option.
<p>
The VDR <tt>Makefile</tt> contains the target <tt>plugins</tt>, which calls
<tt>make all</tt> in every directory found under <tt>VDR/PLUGINS/SRC</tt>,
<tt>make all</tt> in every directory found under <tt>VDR/PLUGINS/src</tt>,
plus the target <tt>plugins-clean</tt>, which calls <tt>make clean</tt> in
each of these directories.
<p>
......@@ -170,7 +170,7 @@ and will unpack into a directory named
<tt>hello-0.0.1</tt>
<p>
To use the <tt>plugins</tt> and <tt>plugins-clean</tt> targets from the VDR <tt>Makefile</tt>
you need to unpack such an archive into the <tt>VDR/PLUGINS/SRC</tt> directory and
you need to unpack such an archive into the <tt>VDR/PLUGINS/src</tt> directory and
create a symbolic link with the basic plugin name, as in
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
......@@ -214,7 +214,7 @@ the "Setup" menu, which will bring up a list of all loaded plugins, through whic
can access each plugin's own setup parameters (if it provides any).
<p>
To implement actual functionality into your plugin you need to edit the source file
that was generated as <tt>PLUGINS/SRC/name.c</tt>. Read the comments in that file
that was generated as <tt>PLUGINS/src/name.c</tt>. Read the comments in that file
to see where you can bring in your own code. The following sections of this document
will walk you through the individual member functions of the plugin class.
<p>
......@@ -866,7 +866,7 @@ provides the target <tt>dist</tt>, which does this for you.
Simply change into your source directory and execute <tt>make dist</tt>:
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
cd VDR/PLUGINS/SRC/hello
cd VDR/PLUGINS/src/hello
make dist
</pre></td></tr></table><p>
......
VDR Plugin 'sky' Revision History
---------------------------------
2002-12-01: Version 0.0.1
- Initial revision.
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 1.1 2002/11/01 13:45:13 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
#
PLUGIN = sky
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options:
CXX = g++
CXXFLAGS = -O2 -Wall -Woverloaded-virtual
### The directory environment:
DVBDIR = ../../../../DVB
VDRDIR = ../../..
LIBDIR = ../../lib
TMPDIR = /tmp
### Allow user defined options to overwrite defaults:
-include $(VDRDIR)/Make.config
### The version number of VDR (taken from VDR's "config.h"):
VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g')
### The name of the distribution archive:
ARCHIVE = $(PLUGIN)-$(VERSION)
PACKAGE = vdr-$(ARCHIVE)
### Includes and Defines (add further entries here):
INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
### The object files (add further files here):
OBJS = $(PLUGIN).o
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
# Dependencies:
MAKEDEP = g++ -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
all: libvdr-$(PLUGIN).so
libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
@cp $@ $(LIBDIR)/$@.$(VDRVERSION)
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <kls@cadsoft.de>
Project's homepage: www.cadsoft.de/vdr
Latest version available at: www.cadsoft.de/vdr
See the file COPYING for license information.
Description:
The 'sky' plugin implements a new device for VDR, which is based on the
MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
allows you to connect the analog a/v output of your Sky Digibox to VDR,
so that you can enjoy the full recording flexibility of VDR with your
Sky subscription. Note that this is NOT something that does anything
illegal, like decrypting the Sky programme without a subscription. You
will need a Sky Digibox and a valid subscription in order to use this
plugin.
The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
The file lircd.conf.sky contains the remote control codes necessary to
control the Digibox.
In order to access the Sky channels VDR needs to know the channel number
under which each channel is stored in the Sky Digibox. These numbers are
used as 'frequency' parameters in the channels.conf definitions of the Sky
channels (see the file 'channels.conf.sky'). Since these numbers are always
less than 1000, they can be easily distinguished from normal satellite
transponder frequencies. The VPID is 160 and the APID is 80 for all Sky
channels. These are just fake PIDs, since the Kfir card always uses these
fixed PIDs. The 'Ca' parameter of the Sky channels is set to 301, which
is defined as "Videoguard, Sky Digital" in VDR's 'ca.conf' file. Again, please
note that VDR doesn't do any decrypting here, this is just to mark these
channels as "conditionally accessible" and have a way of setting the CICAM
value for the Kfir device in VDR's Setup menu.
The Sky EPG is available on the Internet at http://www.ananova.com.
The Perl script getskyepg.pl extracts the EPG data from these pages
and sends it to VDR via an SVDRP connection. The channel numbers Sky
uses to generate the EPG pages are stored as the 'sid' parameter in
the channels.conf definitions of the Sky channels. You can keep your
EPG data up-to-date by entering a call to getskyepg.pl into your
/etc/crontab. Call 'getskyepg.pl -h' for a list of options.
Sky One:106:h:S28.2E:0:160:80:0:301:222
itv2:226:h:S28.2E:0:160:80:0:301:451
sci-fi:130:h:S28.2E:0:160:80:0:301:161
Paramount Comedy:127:h:S28.2E:0:160:80:0:301:185
#!/usr/bin/perl
# getskyepg.pl: Get EPG data from Sky's web pages
#
# Connects to a running VDR instance via SVDRP, gets the channel data
# for the Sky channels and connects to Sky's web pages to extract the
# EPG data for these channels. The result is sent to VDR via SVDRP.
#
# See the README file for copyright information and how to reach the author.
#
# $Id: getskyepg.pl 1.1 2002/11/10 10:05:17 kls Exp $
use Getopt::Std;
use Time::Local;
$Usage = qq{
Usage: $0 [options]
Options: -d hostname destination hostname (default: localhost)
-p port SVDRP port number (default: 2001)
-S source channel source (default: S28.2E)
-D days days to get EPG for (1..7, default: 2)
};
die $Usage if (!getopts("d:D:hp:S:") || $opt_h);
$Dest = $opt_d || "localhost";
$Port = $opt_p || 2001;
$Source = $opt_S || "S28.2E";
$Days = $opt_D || 2;
$SkyWebPage = "www.ananova.com/tv/frontpage.html";
$WGET = "/usr/bin/wget -q -O-";
$LOGGER = "/usr/bin/logger -t SKYEPG";
$DST = 0; ##XXX TODO find out whether DST is active!
$SecsInDay = 86400;
$MaxFrequency = 1000;
$idxName = 0;
$idxFrequency = 1;
$idxSource = 3;
$idxSid = 9;
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
sub Log
{
system("$LOGGER '@_'");
}
sub Error
{
Log(@_);
die "$0: @_\n";
}
sub GetChannels
{
SVDRPsend("LSTC");
my @channels = ();
for (SVDRPreceive(250)) {
my @a = split(':', substr($_, 4));
if ($a[$idxSource] eq $Source && $a[$idxFrequency] < $MaxFrequency) {
push(@channels, [@a]);
}
}
return @channels;
}
sub GetPage
{
my $channel = shift;
my $day = shift;
my $url = "$SkyWebPage?c=$channel&day=day$day";
Log("reading $url");
my @page = split("\n", `$WGET '$url'`);
Log("received " . ($#page + 1) . " lines");
return @page;
}
# In order to get the duration we need to buffer the last event:
$Id = "";
$Time = 0;
$Title = "";
$Episode = "";
$Descr = "";
sub GetEpgData
{
my ($channel, $channelID) = @_;
my $numEvents = 0;
SVDRPsend("C $channelID");
$Time = 0;
for $day (1 .. $Days) {
my $dt = 0;
my $ap = "";
my @page = GetPage($channel, $day);
for $line (@page) {
if ($line =~ /^<\/tr><tr /) {
# extract information:
my ($time, $title, $episode, $descr) = ($line =~ /^.*?<b>(.*?)<\/b>.*?<b>(.*?)<\/b> *(<i>.*?<\/i>)? *(.*?) *<\/small>/);
my ($h, $m, $a) = ($time =~ /([0-9]+)\.([0-9]+)(.)m/);
# handle am/pm:
$dt = $SecsInDay if ($ap eq "p" && $a eq "a");
$ap = $a;
$h += 12 if ($a eq "p" && $h < 12);
$h -= 12 if ($a eq "a" && $h == 12);
# convert to time_t:
my @gmt = gmtime;
$gmt[0] = 0; # seconds
$gmt[1] = $m; # minutes
$gmt[2] = $h; # hours
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + $dt + $DST;
# create EPG data:
if ($Time) {
$duration = $time - $Time;
SVDRPsend("E $Id $Time $duration");
SVDRPsend("T $Title");
SVDRPsend("S $Episode");
SVDRPsend("D $Descr");
SVDRPsend("e");
$numEvents++;
}
# buffer the last event:
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
$Time = $time;
($Title = $title) =~ s/<[^>]+>//g;
($Episode = $episode) =~ s/<[^>]+>//g;
($Descr = $descr) =~ s/<[^>]+>//g;
}
}
}
SVDRPsend("c");
Log("generated $numEvents EPG events");
}
sub ProcessEpg
{
Log("getting Sky channel definitions");
my @channels = GetChannels();
Error("no Sky channels found") unless @channels;
Log("found " . ($#channels + 1) . " channels");
for (@channels) {
my $channel = @$_[$idxSid];
my $channelID = "@$_[$idxSource]-0-@$_[$idxFrequency]-$channel";
Log("processing channel @$_[0]");
SVDRPsend("PUTE");
SVDRPreceive(354);
GetEpgData($channel, $channelID);
SVDRPsend(".");
SVDRPreceive(250);
}
Log("done");
}
#---------------------------------------------------------------------------
# TODO: make this a Perl module??? What about Error()???
use Socket;
$Timeout = 300; # max. seconds to wait for response
$SIG{ALRM} = sub { Error("timeout"); };
alarm($Timeout);
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
$paddr = sockaddr_in($Port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
connect(SOCK, $paddr) || Error("connect: $!");
select(SOCK); $| = 1;
SVDRPreceive(220);
ProcessEpg();
SVDRPsend("QUIT");
sub SVDRPsend
{
my $s = shift;
print SOCK "$s\r\n";
}
sub SVDRPreceive
{
my $expect = shift | 0;
my @a = ();
while (<SOCK>) {
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
push(@a, $_);
if (substr($_, 3, 1) ne "-") {
my $code = substr($_, 0, 3);
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
last;
}
}
return @a;
}
#---------------------------------------------------------------------------
This diff is collapsed.
/*
* sky.c: A plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* $Id: sky.c 1.1 2002/10/26 16:27:13 kls Exp $
*/
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/un.h>
#include <unistd.h>
#include <vdr/plugin.h>
#include <vdr/sources.h>
static const char *VERSION = "0.0.1";
static const char *DESCRIPTION = "Sky Digibox interface";
// --- cDigiboxDevice --------------------------------------------------------
class cDigiboxDevice : public cDevice {
private:
int source;
int digiboxChannelNumber;
int fd_dvr;
cTSBuffer *tsBuffer;
int fd_lirc;
void LircSend(const char *s);
void LircSend(int n);
protected:
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
virtual bool OpenDvr(void);
virtual void CloseDvr(void);
virtual bool GetTSPacket(uchar *&Data);
public:
cDigiboxDevice(void);
virtual ~cDigiboxDevice();
virtual bool ProvidesSource(int Source) const;
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
};
cDigiboxDevice::cDigiboxDevice(void)
{
source = cSource::FromString("S28.2E");//XXX parameter???
digiboxChannelNumber = 0;
fd_dvr = -1;
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
if (fd_lirc >= 0) {
if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
LOG_ERROR;
close(fd_lirc);
}
}
else
LOG_ERROR;
}
cDigiboxDevice::~cDigiboxDevice()
{
if (fd_lirc >= 0)
close(fd_lirc);
}
void cDigiboxDevice::LircSend(const char *s)
{
const char *c = "SEND_ONCE SKY %s\n";
char buf[100];
sprintf(buf, c, s);
dsyslog(buf);//XXX
if (write(fd_lirc, buf, strlen(buf)) < 0)
LOG_ERROR;//XXX _STR
delay_ms(200);
}
void cDigiboxDevice::LircSend(int n)
{
char buf[10];
snprintf(buf, sizeof(buf), "%d", n);
char *p = buf;
while (*p) {
char q[10];
sprintf(q, "%c", *p);
LircSend(q);
p++;
}
}
bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
{
dsyslog("SetPid %d %d", Handle->pid, On);
return true;
}
bool cDigiboxDevice::OpenDvr(void)
{
CloseDvr();
fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
if (fd_dvr >= 0)
tsBuffer = new cTSBuffer(fd_dvr, KILOBYTE(256), CardIndex() + 1);
return fd_dvr >= 0;
}
void cDigiboxDevice::CloseDvr(void)
{
if (fd_dvr >= 0) {
close(fd_dvr);
fd_dvr = -1;
delete tsBuffer;
tsBuffer = NULL;
}
}
bool cDigiboxDevice::GetTSPacket(uchar *&Data)
{
if (tsBuffer) {
int r = tsBuffer->Read();
if (r >= 0) {
Data = tsBuffer->Get();
return true;
}
else if (FATALERRNO) {
LOG_ERROR;
return false;
}
return true;
}
return false;
}
bool cDigiboxDevice::ProvidesSource(int Source) const
{
return source == Source;
}
bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
{
bool result = false;
bool hasPriority = Priority < 0 || Priority > this->Priority();
bool needsDetachReceivers = true;
if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel->Ca())) {
if (Receiving()) {
if (digiboxChannelNumber == Channel->Frequency()) {
needsDetachReceivers = false;
result = true;
}
else
result = hasPriority;
}
else
result = hasPriority;
}
if (NeedsDetachReceivers)
*NeedsDetachReceivers = needsDetachReceivers;
return result;
}
bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{
if (fd_lirc >= 0 && !Receiving()) { // if we are receiving the channel is already set!
digiboxChannelNumber = Channel->Frequency();
//XXX only when recording??? -> faster channel switching!
LircSend("SKY"); // makes sure the Digibox is "on"
//XXX lircprint(fd_lirc, "BACKUP");
//XXX lircprint(fd_lirc, "BACKUP");
//XXX lircprint(fd_lirc, "BACKUP");
LircSend(digiboxChannelNumber);
}
return true;
}
// --- cPluginSky ------------------------------------------------------------
class cPluginSky : public cPlugin {
private:
// Add any member variables or functions you may need here.
public:
cPluginSky(void);
virtual ~cPluginSky();
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Start(void);
virtual void Housekeeping(void);
virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value);
};
cPluginSky::cPluginSky(void)
{
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
}
cPluginSky::~cPluginSky()
{
// Clean up after yourself!
}
const char *cPluginSky::CommandLineHelp(void)
{
// Return a string that describes all known command line options.
return NULL;
}
bool cPluginSky::ProcessArgs(int argc, char *argv[])
{
// Implement command line argument processing here if applicable.
return true;
}
bool cPluginSky::Start(void)
{
// Start any background activities the plugin shall perform.
new cDigiboxDevice;
return true;
}
void cPluginSky::Housekeeping(void)
{
// Perform any cleanup or other regular tasks.
}