2002-05-09 16:26:56 +02:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
# newplugin: Initializing a new plugin source directory
|
|
|
|
#
|
|
|
|
# Creates a new plugin source directory from which to start implementing
|
|
|
|
# a plugin for VDR.
|
|
|
|
# See the file PLUGINS.html for detailed instructions on how to
|
|
|
|
# write a plugin.
|
|
|
|
#
|
|
|
|
# Usage: newplugin <name>
|
|
|
|
#
|
|
|
|
# See the main source file 'vdr.c' for copyright information and
|
|
|
|
# how to reach the author.
|
|
|
|
#
|
2008-01-13 11:49:55 +01:00
|
|
|
# $Id: newplugin 1.40 2008/01/13 11:49:08 kls Exp $
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
|
|
|
|
|
|
|
|
die "Please use only lowercase letters and digits in the plugin name\n" if ($PLUGIN_NAME =~ tr/a-z0-9//c);
|
|
|
|
|
|
|
|
$PLUGIN_CLASS = ucfirst($PLUGIN_NAME);
|
|
|
|
|
|
|
|
$PLUGIN_VERSION = "0.0.1";
|
|
|
|
$PLUGIN_DESCRIPTION = "Enter description for '$PLUGIN_NAME' plugin";
|
|
|
|
$PLUGIN_MAINENTRY = $PLUGIN_CLASS;
|
|
|
|
|
|
|
|
$PLUGINS_SRC = "PLUGINS/src";
|
|
|
|
|
|
|
|
$README = qq
|
|
|
|
{This is a "plugin" for the Video Disk Recorder (VDR).
|
|
|
|
|
|
|
|
Written by: Your Name <email\@host.dom>
|
|
|
|
|
|
|
|
Project's homepage: URL
|
|
|
|
|
|
|
|
Latest version available at: URL
|
|
|
|
|
2007-08-12 11:13:43 +02:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
See the file COPYING for more information.
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
Description:
|
|
|
|
};
|
|
|
|
|
|
|
|
$HISTORY_TITLE = "VDR Plugin '$PLUGIN_NAME' Revision History";
|
|
|
|
$HISTORY_LINE = '-' x length($HISTORY_TITLE);
|
|
|
|
$HISTORY_DATE = sprintf("%4d-%02d-%02d", (localtime)[5] + 1900, (localtime)[4] + 1, (localtime)[3]);
|
|
|
|
$HISTORY = qq
|
|
|
|
{$HISTORY_TITLE
|
|
|
|
$HISTORY_LINE
|
|
|
|
|
|
|
|
$HISTORY_DATE: Version $PLUGIN_VERSION
|
|
|
|
|
|
|
|
- Initial revision.
|
|
|
|
};
|
|
|
|
|
|
|
|
$MAKEFILE = qq
|
|
|
|
{#
|
|
|
|
# Makefile for a Video Disk Recorder plugin
|
|
|
|
#
|
|
|
|
# \$Id\$
|
|
|
|
|
|
|
|
# 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.
|
2007-04-28 14:49:05 +02:00
|
|
|
# IMPORTANT: the presence of this macro is important for the Make.config
|
2006-06-24 09:15:17 +02:00
|
|
|
# file. So it must be defined, even if it is not used here!
|
2002-05-09 16:26:56 +02:00
|
|
|
#
|
|
|
|
PLUGIN = $PLUGIN_NAME
|
|
|
|
|
|
|
|
### The version number of this plugin (taken from the main source file):
|
|
|
|
|
2002-05-17 16:29:02 +02:00
|
|
|
VERSION = \$(shell grep 'static const char \\*VERSION *=' \$(PLUGIN).c | awk '{ print \$\$6 }' | sed -e 's/[";]//g')
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2002-11-01 14:05:36 +01:00
|
|
|
### The C++ compiler and options:
|
|
|
|
|
2002-12-13 15:06:52 +01:00
|
|
|
CXX ?= g++
|
2005-11-11 13:22:02 +01:00
|
|
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
2002-11-01 14:05:36 +01:00
|
|
|
|
2002-05-09 16:26:56 +02:00
|
|
|
### The directory environment:
|
|
|
|
|
|
|
|
VDRDIR = ../../..
|
|
|
|
LIBDIR = ../../lib
|
|
|
|
TMPDIR = /tmp
|
|
|
|
|
2002-11-01 14:05:36 +01:00
|
|
|
### Allow user defined options to overwrite defaults:
|
|
|
|
|
|
|
|
-include \$(VDRDIR)/Make.config
|
|
|
|
|
2006-04-16 09:36:10 +02:00
|
|
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2006-04-24 17:53:19 +02:00
|
|
|
APIVERSION = \$(shell sed -ne '/define APIVERSION/s/^.*"\\(.*\\)".*\$\$/\\1/p' \$(VDRDIR)/config.h)
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
### The name of the distribution archive:
|
|
|
|
|
2002-05-12 15:12:12 +02:00
|
|
|
ARCHIVE = \$(PLUGIN)-\$(VERSION)
|
|
|
|
PACKAGE = vdr-\$(ARCHIVE)
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
### Includes and Defines (add further entries here):
|
|
|
|
|
2006-04-15 12:39:35 +02:00
|
|
|
INCLUDES += -I\$(VDRDIR)/include
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2003-12-22 13:29:24 +01:00
|
|
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"\$(PLUGIN)"'
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
### The object files (add further files here):
|
|
|
|
|
|
|
|
OBJS = \$(PLUGIN).o
|
|
|
|
|
2007-08-15 13:20:04 +02:00
|
|
|
### The main target:
|
|
|
|
|
|
|
|
all: libvdr-\$(PLUGIN).so i18n
|
|
|
|
|
2002-05-09 16:26:56 +02:00
|
|
|
### Implicit rules:
|
|
|
|
|
|
|
|
%.o: %.c
|
|
|
|
\$(CXX) \$(CXXFLAGS) -c \$(DEFINES) \$(INCLUDES) \$<
|
|
|
|
|
2007-08-11 12:39:06 +02:00
|
|
|
### Dependencies:
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2004-10-16 12:14:31 +02:00
|
|
|
MAKEDEP = \$(CXX) -MM -MG
|
2002-05-09 16:26:56 +02:00
|
|
|
DEPFILE = .dependencies
|
|
|
|
\$(DEPFILE): Makefile
|
|
|
|
\@\$(MAKEDEP) \$(DEFINES) \$(INCLUDES) \$(OBJS:%.o=%.c) > \$\@
|
|
|
|
|
2002-05-17 16:29:02 +02:00
|
|
|
-include \$(DEPFILE)
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2007-08-11 12:39:06 +02:00
|
|
|
### Internationalization (I18N):
|
|
|
|
|
|
|
|
PODIR = po
|
|
|
|
LOCALEDIR = \$(VDRDIR)/locale
|
|
|
|
I18Npo = \$(wildcard \$(PODIR)/*.po)
|
2007-11-04 11:00:16 +01:00
|
|
|
I18Nmsgs = \$(addprefix \$(LOCALEDIR)/, \$(addsuffix /LC_MESSAGES/vdr-\$(PLUGIN).mo, \$(notdir \$(foreach file, \$(I18Npo), \$(basename \$(file))))))
|
2007-08-11 12:39:06 +02:00
|
|
|
I18Npot = \$(PODIR)/\$(PLUGIN).pot
|
|
|
|
|
|
|
|
%.mo: %.po
|
|
|
|
msgfmt -c -o \$\@ \$<
|
|
|
|
|
|
|
|
\$(I18Npot): \$(wildcard *.c)
|
2007-11-04 11:00:16 +01:00
|
|
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o \$\@ \$^
|
2007-08-11 12:39:06 +02:00
|
|
|
|
2007-11-04 11:00:16 +01:00
|
|
|
%.po: \$(I18Npot)
|
2007-10-13 09:54:09 +02:00
|
|
|
msgmerge -U --no-wrap --no-location --backup=none -q \$\@ \$<
|
2007-11-04 11:00:16 +01:00
|
|
|
\@touch \$\@
|
2007-08-11 12:39:06 +02:00
|
|
|
|
2007-11-04 11:00:16 +01:00
|
|
|
\$(I18Nmsgs): \$(LOCALEDIR)/%/LC_MESSAGES/vdr-\$(PLUGIN).mo: \$(PODIR)/%.mo
|
|
|
|
\@mkdir -p \$(dir \$@)
|
|
|
|
cp \$< \$\@
|
|
|
|
|
|
|
|
.PHONY: i18n
|
2008-01-13 11:49:55 +01:00
|
|
|
i18n: \$(I18Nmsgs) \$(I18Npot)
|
2007-08-11 12:39:06 +02:00
|
|
|
|
2002-05-09 16:26:56 +02:00
|
|
|
### Targets:
|
|
|
|
|
|
|
|
libvdr-\$(PLUGIN).so: \$(OBJS)
|
|
|
|
\$(CXX) \$(CXXFLAGS) -shared \$(OBJS) -o \$\@
|
2006-09-10 14:10:51 +02:00
|
|
|
\@cp --remove-destination \$\@ \$(LIBDIR)/\$\@.\$(APIVERSION)
|
2002-05-09 16:26:56 +02:00
|
|
|
|
2002-08-28 19:32:29 +02:00
|
|
|
dist: clean
|
2002-05-09 16:26:56 +02:00
|
|
|
\@-rm -rf \$(TMPDIR)/\$(ARCHIVE)
|
|
|
|
\@mkdir \$(TMPDIR)/\$(ARCHIVE)
|
|
|
|
\@cp -a * \$(TMPDIR)/\$(ARCHIVE)
|
2002-05-12 15:12:12 +02:00
|
|
|
\@tar czf \$(PACKAGE).tgz -C \$(TMPDIR) \$(ARCHIVE)
|
2002-05-09 16:26:56 +02:00
|
|
|
\@-rm -rf \$(TMPDIR)/\$(ARCHIVE)
|
2002-05-12 15:12:12 +02:00
|
|
|
\@echo Distribution package created as \$(PACKAGE).tgz
|
2002-05-09 16:26:56 +02:00
|
|
|
|
|
|
|
clean:
|
2007-08-11 12:39:06 +02:00
|
|
|
\@-rm -f \$(OBJS) \$(DEPFILE) *.so *.tgz core* *~ \$(PODIR)/*.mo \$(PODIR)/*.pot
|
2002-05-09 16:26:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
$MAIN = qq
|
|
|
|
{/*
|
|
|
|
* $PLUGIN_NAME.c: A plugin for the Video Disk Recorder
|
|
|
|
*
|
|
|
|
* See the README file for copyright information and how to reach the author.
|
|
|
|
*
|
|
|
|
* \$Id\$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <vdr/plugin.h>
|
|
|
|
|
|
|
|
static const char *VERSION = "$PLUGIN_VERSION";
|
|
|
|
static const char *DESCRIPTION = "$PLUGIN_DESCRIPTION";
|
|
|
|
static const char *MAINMENUENTRY = "$PLUGIN_MAINENTRY";
|
|
|
|
|
|
|
|
class cPlugin$PLUGIN_CLASS : public cPlugin {
|
|
|
|
private:
|
|
|
|
// Add any member variables or functions you may need here.
|
|
|
|
public:
|
|
|
|
cPlugin$PLUGIN_CLASS(void);
|
|
|
|
virtual ~cPlugin$PLUGIN_CLASS();
|
|
|
|
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[]);
|
2003-05-09 15:27:46 +02:00
|
|
|
virtual bool Initialize(void);
|
2002-05-12 09:24:45 +02:00
|
|
|
virtual bool Start(void);
|
2005-01-30 14:23:01 +01:00
|
|
|
virtual void Stop(void);
|
2002-05-12 10:20:17 +02:00
|
|
|
virtual void Housekeeping(void);
|
2006-04-17 10:02:18 +02:00
|
|
|
virtual void MainThreadHook(void);
|
2006-04-15 11:18:36 +02:00
|
|
|
virtual cString Active(void);
|
2007-02-25 10:56:29 +01:00
|
|
|
virtual time_t WakeupTime(void);
|
2002-05-09 16:26:56 +02:00
|
|
|
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
2002-11-24 10:45:39 +01:00
|
|
|
virtual cOsdObject *MainMenuAction(void);
|
2002-05-09 16:26:56 +02:00
|
|
|
virtual cMenuSetupPage *SetupMenu(void);
|
|
|
|
virtual bool SetupParse(const char *Name, const char *Value);
|
2005-08-21 10:44:29 +02:00
|
|
|
virtual bool Service(const char *Id, void *Data = NULL);
|
2005-08-27 16:42:28 +02:00
|
|
|
virtual const char **SVDRPHelpPages(void);
|
|
|
|
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
|
2002-05-09 16:26:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
cPlugin${PLUGIN_CLASS}::cPlugin$PLUGIN_CLASS(void)
|
|
|
|
{
|
2002-10-26 14:34:53 +02:00
|
|
|
// Initialize any member variables here.
|
2002-05-09 16:26:56 +02:00
|
|
|
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
|
|
|
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
|
|
|
}
|
|
|
|
|
|
|
|
cPlugin${PLUGIN_CLASS}::~cPlugin$PLUGIN_CLASS()
|
|
|
|
{
|
|
|
|
// Clean up after yourself!
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *cPlugin${PLUGIN_CLASS}::CommandLineHelp(void)
|
|
|
|
{
|
|
|
|
// Return a string that describes all known command line options.
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::ProcessArgs(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
// Implement command line argument processing here if applicable.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2003-05-09 15:27:46 +02:00
|
|
|
bool cPlugin${PLUGIN_CLASS}::Initialize(void)
|
|
|
|
{
|
|
|
|
// Initialize any background activities the plugin shall perform.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2002-05-12 09:24:45 +02:00
|
|
|
bool cPlugin${PLUGIN_CLASS}::Start(void)
|
2002-05-09 16:26:56 +02:00
|
|
|
{
|
|
|
|
// Start any background activities the plugin shall perform.
|
2002-05-12 09:24:45 +02:00
|
|
|
return true;
|
2002-05-09 16:26:56 +02:00
|
|
|
}
|
|
|
|
|
2005-01-30 14:23:01 +01:00
|
|
|
void cPlugin${PLUGIN_CLASS}::Stop(void)
|
|
|
|
{
|
2007-04-28 14:49:05 +02:00
|
|
|
// Stop any background activities the plugin is performing.
|
2005-01-30 14:23:01 +01:00
|
|
|
}
|
|
|
|
|
2002-05-12 10:20:17 +02:00
|
|
|
void cPlugin${PLUGIN_CLASS}::Housekeeping(void)
|
|
|
|
{
|
|
|
|
// Perform any cleanup or other regular tasks.
|
|
|
|
}
|
|
|
|
|
2006-04-17 10:02:18 +02:00
|
|
|
void cPlugin${PLUGIN_CLASS}::MainThreadHook(void)
|
|
|
|
{
|
|
|
|
// Perform actions in the context of the main program thread.
|
|
|
|
// WARNING: Use with great care - see PLUGINS.html!
|
|
|
|
}
|
|
|
|
|
2006-04-15 11:18:36 +02:00
|
|
|
cString cPlugin${PLUGIN_CLASS}::Active(void)
|
|
|
|
{
|
|
|
|
// Return a message string if shutdown should be postponed
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2007-02-25 10:56:29 +01:00
|
|
|
time_t cPlugin${PLUGIN_CLASS}::WakeupTime(void)
|
|
|
|
{
|
|
|
|
// Return custom wakeup time for shutdown script
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-11-24 10:45:39 +01:00
|
|
|
cOsdObject *cPlugin${PLUGIN_CLASS}::MainMenuAction(void)
|
2002-05-09 16:26:56 +02:00
|
|
|
{
|
|
|
|
// Perform the action when selected from the main VDR menu.
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cMenuSetupPage *cPlugin${PLUGIN_CLASS}::SetupMenu(void)
|
|
|
|
{
|
|
|
|
// Return a setup menu in case the plugin supports one.
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::SetupParse(const char *Name, const char *Value)
|
|
|
|
{
|
|
|
|
// Parse your own setup parameters and store their values.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2005-08-21 10:44:29 +02:00
|
|
|
bool cPlugin${PLUGIN_CLASS}::Service(const char *Id, void *Data)
|
|
|
|
{
|
|
|
|
// Handle custom service requests from other plugins
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2005-09-14 16:04:09 +02:00
|
|
|
const char **cPlugin${PLUGIN_CLASS}::SVDRPHelpPages(void)
|
2005-08-27 16:42:28 +02:00
|
|
|
{
|
|
|
|
// Return help text for SVDRP commands this plugin implements
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-09-14 16:04:09 +02:00
|
|
|
cString cPlugin${PLUGIN_CLASS}::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
|
2005-08-27 16:42:28 +02:00
|
|
|
{
|
|
|
|
// Process SVDRP commands this plugin implements
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2002-05-09 16:26:56 +02:00
|
|
|
VDRPLUGINCREATOR(cPlugin$PLUGIN_CLASS); // Don't touch this!
|
|
|
|
};
|
|
|
|
|
|
|
|
$PLUGINDIR = "$PLUGINS_SRC/$PLUGIN_NAME";
|
|
|
|
|
|
|
|
die "The directory $PLUGINS_SRC doesn't exist!\n" unless (-d "$PLUGINS_SRC");
|
|
|
|
die "A plugin named '$PLUGIN_NAME' already exists in $PLUGINS_SRC!\n" if (-e "$PLUGINDIR");
|
|
|
|
mkdir("$PLUGINDIR") || die "$!";
|
|
|
|
|
|
|
|
CreateFile("README", $README);
|
|
|
|
CreateFile("HISTORY", $HISTORY);
|
|
|
|
CreateFile("Makefile", $MAKEFILE);
|
|
|
|
CreateFile("$PLUGIN_NAME.c", $MAIN);
|
|
|
|
`cp COPYING "$PLUGINDIR"` if (-e "COPYING");
|
|
|
|
|
|
|
|
print qq{
|
|
|
|
The new plugin source directory has been created in "$PLUGINDIR".
|
|
|
|
|
|
|
|
The next steps you should perform now are:
|
|
|
|
|
|
|
|
* edit the file "README" to adjust it to your specific implementation
|
|
|
|
* fill in the code skeleton in "$PLUGIN_NAME.c" to implement your plugin function
|
|
|
|
* add further source files if necessary
|
|
|
|
* adapt the "Makefile" if necessary
|
|
|
|
* do "make plugins" from the VDR source directory to build your plugin
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
sub CreateFile
|
|
|
|
{
|
|
|
|
my ($Name, $Content) = @_;
|
|
|
|
open(FILE, ">$PLUGINDIR/$Name") || die "$Name: $!\n";
|
|
|
|
print FILE $Content;
|
|
|
|
close(FILE);
|
|
|
|
}
|
|
|
|
|