added initial version of the scheduler product
This commit is contained in:
parent
628c515e6c
commit
6a6518dbca
|
@ -0,0 +1,87 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
#
|
||||||
|
# This file is part of the LiveSupport project.
|
||||||
|
# http://livesupport.campware.org/
|
||||||
|
# To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
#
|
||||||
|
# LiveSupport 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.
|
||||||
|
#
|
||||||
|
# LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with LiveSupport; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Author : $Author: maroy $
|
||||||
|
# Version : $Revision: 1.1 $
|
||||||
|
# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/bin/autogen.sh,v $
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Run this to set up the build system: configure, makefiles, etc.
|
||||||
|
# (based on the version in enlightenment's cvs)
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package="Scheduler"
|
||||||
|
|
||||||
|
# assume we're in $basedir/bin
|
||||||
|
basedir=`dirname $0`/..
|
||||||
|
test -z "$basedir" && basedir=.
|
||||||
|
|
||||||
|
tmpdir=$basedir/tmp
|
||||||
|
|
||||||
|
cd "$tmpdir"
|
||||||
|
DIE=0
|
||||||
|
|
||||||
|
# look at all other directories as seen from ${basedir}/tmp
|
||||||
|
tmpdir=.
|
||||||
|
bindir=../bin
|
||||||
|
etcdir=../etc
|
||||||
|
|
||||||
|
(autoheader --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "You must have autoconf installed to compile $package."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "You must have autoconf installed to compile $package."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
if test "$DIE" -eq 1; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$*"; then
|
||||||
|
echo "I am going to run ./configure with no arguments - if you wish "
|
||||||
|
echo "to pass any to it, please specify them on the $0 command line."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Generating configuration files for $package, please wait...."
|
||||||
|
|
||||||
|
configure_ac=${etcdir}/configure.ac
|
||||||
|
configure=${tmpdir}/configure
|
||||||
|
|
||||||
|
#echo " aclocal $ACLOCAL_FLAGS"
|
||||||
|
#aclocal $ACLOCAL_FLAGS
|
||||||
|
echo " autoheader ${configure_ac}"
|
||||||
|
autoheader ${configure_ac}
|
||||||
|
echo " autoconf -o ${configure} ${configure_ac}"
|
||||||
|
autoconf -o ${configure} ${configure_ac}
|
||||||
|
|
||||||
|
${configure} "$@" && echo
|
|
@ -0,0 +1 @@
|
||||||
|
keep me
|
|
@ -0,0 +1,185 @@
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
#
|
||||||
|
# This file is part of the LiveSupport project.
|
||||||
|
# http://livesupport.campware.org/
|
||||||
|
# To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
#
|
||||||
|
# LiveSupport 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.
|
||||||
|
#
|
||||||
|
# LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with LiveSupport; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Author : $Author: maroy $
|
||||||
|
# Version : $Revision: 1.1 $
|
||||||
|
# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/etc/Makefile.in,v $
|
||||||
|
#
|
||||||
|
# @configure_input@
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# General command definitions
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
MKDIR = mkdir -p
|
||||||
|
RM = rm -f
|
||||||
|
RMDIR = rm -rf
|
||||||
|
DOXYGEN = doxygen
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Basic directory and file definitions
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
BASE_DIR = @builddir@
|
||||||
|
DOC_DIR = ${BASE_DIR}/doc
|
||||||
|
DOXYGEN_DIR = ${DOC_DIR}/doxygen
|
||||||
|
ETC_DIR = ${BASE_DIR}/etc
|
||||||
|
SRC_DIR = ${BASE_DIR}/src
|
||||||
|
TMP_DIR = ${BASE_DIR}/tmp
|
||||||
|
|
||||||
|
USR_DIR = ${BASE_DIR}/../../usr
|
||||||
|
USR_INCLUDE_DIR = ${USR_DIR}/include
|
||||||
|
USR_LIB_DIR = ${USR_DIR}/lib
|
||||||
|
BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_31
|
||||||
|
LIBXMLPP_INCLUDE_DIR = ${USR_INCLUDE_DIR}/libxml++-1.0
|
||||||
|
|
||||||
|
VPATH = ${SRC_DIR}
|
||||||
|
|
||||||
|
MODULES_DIR = ${BASE_DIR}/../../modules
|
||||||
|
|
||||||
|
CORE_DIR = ${MODULES_DIR}/core
|
||||||
|
CORE_INCLUDE_DIR = ${CORE_DIR}/include
|
||||||
|
CORE_LIB_DIR = ${CORE_DIR}/lib
|
||||||
|
CORE_LIB = livesupport_core
|
||||||
|
CORE_LIB_FILE = ${CORE_LIB_DIR}/lib${CORE_LIB}.a
|
||||||
|
|
||||||
|
DB_DIR = ${MODULES_DIR}/db
|
||||||
|
DB_INCLUDE_DIR = ${DB_DIR}/include
|
||||||
|
DB_LIB_DIR = ${DB_DIR}/lib
|
||||||
|
DB_LIB = livesupport_db
|
||||||
|
DB_LIB_FILE = ${DB_LIB_DIR}/lib${DB_LIB}.a
|
||||||
|
|
||||||
|
STORAGE_DIR = ${MODULES_DIR}/storage
|
||||||
|
STORAGE_INCLUDE_DIR = ${STORAGE_DIR}/include
|
||||||
|
STORAGE_LIB_DIR = ${STORAGE_DIR}/lib
|
||||||
|
STORAGE_LIB = livesupport_storage
|
||||||
|
STORAGE_LIB_FILE = ${STORAGE_LIB_DIR}/lib${STORAGE_LIB}.a
|
||||||
|
|
||||||
|
SCHEDULER_EXE = ${TMP_DIR}/scheduler
|
||||||
|
TEST_RUNNER = ${TMP_DIR}/testRunner
|
||||||
|
|
||||||
|
DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Configuration parameters
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXXFLAGS = @CXXFLAGS@ @DEFS@ -pedantic -Wall -Wno-long-long \
|
||||||
|
-I${USR_INCLUDE_DIR} \
|
||||||
|
-I${BOOST_INCLUDE_DIR} \
|
||||||
|
-I${LIBXMLPP_INCLUDE_DIR} \
|
||||||
|
-I${CORE_INCLUDE_DIR} \
|
||||||
|
-I${DB_INCLUDE_DIR} \
|
||||||
|
-I${STORAGE_INCLUDE_DIR} \
|
||||||
|
-I${TMP_DIR}
|
||||||
|
LDFLAGS = @LDFLAGS@ -L${USR_LIB_DIR} \
|
||||||
|
-L${CORE_LIB_DIR} \
|
||||||
|
-L${DB_LIB_DIR} \
|
||||||
|
-L${STORAGE_LIB_DIR}
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Dependencies
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
SCHEDULER_OBJS = ${TMP_DIR}/SignalDispatcher.o \
|
||||||
|
${TMP_DIR}/XmlRpcDaemon.o \
|
||||||
|
${TMP_DIR}/SchedulerDaemon.o \
|
||||||
|
${TMP_DIR}/UploadPlaylistMethod.o \
|
||||||
|
${TMP_DIR}/ScheduleFactory.o \
|
||||||
|
${TMP_DIR}/PostgresqlSchedule.o
|
||||||
|
|
||||||
|
SCHEDULER_EXE_OBJS = ${SCHEDULER_OBJS} \
|
||||||
|
${TMP_DIR}/main.o
|
||||||
|
SCHEDULER_EXE_LIBS = -l${STORAGE_LIB} -l${DB_LIB} -l${CORE_LIB} \
|
||||||
|
-lodbc++ -lboost_date_time-gcc \
|
||||||
|
-lxmlrpc++ -lssl -lxml++-1.0
|
||||||
|
|
||||||
|
TEST_RUNNER_OBJS = ${SCHEDULER_OBJS} \
|
||||||
|
${TMP_DIR}/SchedulerDaemonTest.o \
|
||||||
|
${TMP_DIR}/UploadPlaylistMethodTest.o \
|
||||||
|
${TMP_DIR}/PostgresqlScheduleTest.o \
|
||||||
|
${TMP_DIR}/TestRunner.o
|
||||||
|
TEST_RUNNER_LIBS = ${SCHEDULER_EXE_LIBS} -lcppunit -ldl
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Targets
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
.PHONY: all dir_setup doc clean docclean depclean distclean
|
||||||
|
|
||||||
|
all: dir_setup ${SCHEDULER_EXE}
|
||||||
|
|
||||||
|
dir_setup: ${TMP_DIR} ${DOXYGEN_DIR}
|
||||||
|
|
||||||
|
doc:
|
||||||
|
${DOXYGEN} ${DOXYGEN_CONFIG}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
${RM} ${SCHEDULER_EXE_OBJS} ${SCHEDULER_EXE}
|
||||||
|
${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER}
|
||||||
|
|
||||||
|
docclean:
|
||||||
|
${RMDIR} ${DOXYGEN_DIR}/html
|
||||||
|
|
||||||
|
depclean: clean
|
||||||
|
|
||||||
|
distclean: clean docclean
|
||||||
|
${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te*
|
||||||
|
|
||||||
|
check: all ${TEST_RUNNER}
|
||||||
|
LD_LIBRARY_PATH=${USR_LIB_DIR} ${TEST_RUNNER}
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Specific targets
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
${SCHEDULER_EXE}: ${CORE_LIB_FILE} ${DB_LIB_FILE} ${STORAGE_LIB_FILE} \
|
||||||
|
${SCHEDULER_EXE_OBJS}
|
||||||
|
${CXX} ${LDFLAGS} -o $@ $^ ${SCHEDULER_EXE_LIBS}
|
||||||
|
|
||||||
|
${TMP_DIR}:
|
||||||
|
${MKDIR} ${TMP_DIR}
|
||||||
|
|
||||||
|
${DOXYGEN_DIR}:
|
||||||
|
${MKDIR} ${DOXYGEN_DIR}
|
||||||
|
|
||||||
|
${TEST_RUNNER}: ${CORE_LIB_FILE} ${DB_LIB_FILE} ${STORAGE_LIB_FILE} \
|
||||||
|
${TEST_RUNNER_OBJS}
|
||||||
|
${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS}
|
||||||
|
|
||||||
|
${CORE_LIB_FILE}:
|
||||||
|
${MAKE} -C ${CORE_DIR}
|
||||||
|
|
||||||
|
${DB_LIB_FILE}:
|
||||||
|
${MAKE} -C ${DB_DIR}
|
||||||
|
|
||||||
|
${STORAGE_LIB_FILE}:
|
||||||
|
${MAKE} -C ${STORAGE_DIR}
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Pattern rules
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx
|
||||||
|
${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $<
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
dnl Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
dnl
|
||||||
|
dnl This file is part of the LiveSupport project.
|
||||||
|
dnl http://livesupport.campware.org/
|
||||||
|
dnl To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
dnl
|
||||||
|
dnl LiveSupport is free software; you can redistribute it and/or modify
|
||||||
|
dnl it under the terms of the GNU General Public License as published by
|
||||||
|
dnl the Free Software Foundation; either version 2 of the License, or
|
||||||
|
dnl (at your option) any later version.
|
||||||
|
dnl
|
||||||
|
dnl LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
dnl GNU General Public License for more details.
|
||||||
|
dnl
|
||||||
|
dnl You should have received a copy of the GNU General Public License
|
||||||
|
dnl along with LiveSupport; if not, write to the Free Software
|
||||||
|
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl Author : $Author: maroy $
|
||||||
|
dnl Version : $Revision: 1.1 $
|
||||||
|
dnl Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/etc/configure.ac,v $
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
dnl NOTE: Run all configure related scripts from the tmp directory of the
|
||||||
|
dnl project.
|
||||||
|
dnl This is due to the fact that configure spreads a lot of trash around,
|
||||||
|
dnl like atom4te cache directories, config.* files, etc. into the directory
|
||||||
|
dnl it is being run from. We clearly don't want these in our base directory.
|
||||||
|
dnl-----------------------------------------------------------------------------
|
||||||
|
AC_INIT(Scheduler, 0.1, bugs@campware.org)
|
||||||
|
AC_PREREQ(2.59)
|
||||||
|
AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL])
|
||||||
|
AC_REVISION($Revision: 1.1 $)
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR(../src/main.cxx)
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS(configure.h)
|
||||||
|
AC_PROG_CXX()
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS(sys/types.h unistd.h getopt.h signal.h sys/stat.h time.h)
|
||||||
|
|
||||||
|
AC_CONFIG_FILES(../Makefile:../etc/Makefile.in)
|
||||||
|
|
||||||
|
AC_OUTPUT()
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE connectionManagerFactory [
|
||||||
|
|
||||||
|
<!ELEMENT connectionManagerFactory (simpleConnectionManager) >
|
||||||
|
|
||||||
|
<!ELEMENT simpleConnectionManager EMPTY >
|
||||||
|
<!ATTLIST simpleConnectionManager dsn CDATA #REQUIRED >
|
||||||
|
<!ATTLIST simpleConnectionManager userName CDATA #REQUIRED >
|
||||||
|
<!ATTLIST simpleConnectionManager password CDATA #REQUIRED >
|
||||||
|
]>
|
||||||
|
<connectionManagerFactory>
|
||||||
|
<simpleConnectionManager dsn = "LiveSupport-test"
|
||||||
|
userName = "test"
|
||||||
|
password = "test"
|
||||||
|
/>
|
||||||
|
</connectionManagerFactory>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE scheduleFactory [
|
||||||
|
|
||||||
|
<!ELEMENT scheduleFactory (postgresqlSchedule) >
|
||||||
|
|
||||||
|
<!ELEMENT postgresqlSchedule EMPTY >
|
||||||
|
]>
|
||||||
|
<scheduleFactory>
|
||||||
|
<postgresqlSchedule/>
|
||||||
|
</scheduleFactory>
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE scheduler [
|
||||||
|
|
||||||
|
<!ELEMENT scheduler (xmlRpcDaemon) >
|
||||||
|
|
||||||
|
<!ELEMENT xmlRpcDaemon EMPTY >
|
||||||
|
<!ATTLIST xmlRpcDaemon xmlRpcHost CDATA #REQUIRED >
|
||||||
|
<!ATTLIST xmlRpcDaemon xmlRpcPort NMTOKEN #REQUIRED >
|
||||||
|
<!ATTLIST xmlRpcDaemon pidFileName CDATA #REQUIRED >
|
||||||
|
<!ATTLIST xmlRpcDaemon background (true|false) "true" >
|
||||||
|
|
||||||
|
]>
|
||||||
|
<scheduler>
|
||||||
|
<xmlRpcDaemon xmlRpcHost = "localhost"
|
||||||
|
xmlRpcPort = "3344"
|
||||||
|
pidFileName = "tmp/scheduler.pid"
|
||||||
|
/>
|
||||||
|
</scheduler>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE storageClientFactory [
|
||||||
|
|
||||||
|
<!ELEMENT storageClientFactory (testStorage?) >
|
||||||
|
|
||||||
|
<!ELEMENT testStorage (playlist*) >
|
||||||
|
|
||||||
|
<!ELEMENT playlist EMPTY >
|
||||||
|
<!ATTLIST playlist id NMTOKEN #REQUIRED >
|
||||||
|
<!ATTLIST playlist playlength NMTOKEN #REQUIRED >
|
||||||
|
]>
|
||||||
|
<storageClientFactory>
|
||||||
|
<testStorage>
|
||||||
|
<playlist id="1" playlength="01:00:00.000"/>
|
||||||
|
</testStorage>
|
||||||
|
</storageClientFactory>
|
|
@ -0,0 +1,251 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlSchedule.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <odbc++/statement.h>
|
||||||
|
#include <odbc++/preparedstatement.h>
|
||||||
|
#include <odbc++/resultset.h>
|
||||||
|
|
||||||
|
#include "LiveSupport/Db/Conversion.h"
|
||||||
|
#include "PostgresqlSchedule.h"
|
||||||
|
|
||||||
|
using namespace odbc;
|
||||||
|
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
using namespace LiveSupport::Db;
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The name of the config element for this class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string PostgresqlSchedule::configElementNameStr =
|
||||||
|
"postgresqlSchedule";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The SQL create statement, used for installation.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string PostgresqlSchedule::createStmt =
|
||||||
|
"CREATE TABLE schedule\n"
|
||||||
|
"(\n"
|
||||||
|
" id INT NOT NULL,\n"
|
||||||
|
" playlist INT NOT NULL,\n"
|
||||||
|
" starts TIMESTAMP NOT NULL,\n"
|
||||||
|
" ends TIMESTAMP NOT NULL,\n"
|
||||||
|
"\n"
|
||||||
|
" PRIMARY KEY(id)\n"
|
||||||
|
");";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The SQL create statement, used for installation.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string PostgresqlSchedule::dropStmt =
|
||||||
|
"DROP TABLE schedule;";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The SQL statement for querying if a timeframe is available.
|
||||||
|
* The parameters for this call are: starts, starts, ends, ends, starts, ends,
|
||||||
|
* and returns the number of items falling into the quieried timeframe.
|
||||||
|
* Basically checks if the starts or ends value falls within the queried frame
|
||||||
|
* or starts before and ends after the queried timeframe.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string PostgresqlSchedule::isTimeframaAvailableStmt =
|
||||||
|
"SELECT COUNT(*) FROM schedule WHERE "
|
||||||
|
"((starts <= ? AND ? < ends) OR (starts < ? AND ? <= ends)) "
|
||||||
|
"OR (? <= starts AND ends <= ?)";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The SQL statement for scheduling a playlist.
|
||||||
|
* It's a simple insert.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string PostgresqlSchedule::schedulePlaylistStmt =
|
||||||
|
"INSERT INTO schedule(id, playlist, starts, ends) VALUES(?, ?, ?, ?)";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Configure the schedule.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlSchedule :: configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error)
|
||||||
|
{
|
||||||
|
if (element.get_name() != configElementNameStr) {
|
||||||
|
std::string eMsg = "Bad configuration element ";
|
||||||
|
eMsg += element.get_name();
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// nothing to do here, really
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Install the PostgresqlSchedule.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlSchedule :: install(void) throw (std::exception)
|
||||||
|
{
|
||||||
|
Ptr<Connection>::Ref conn;
|
||||||
|
try {
|
||||||
|
conn = cm->getConnection();
|
||||||
|
Ptr<Statement>::Ref stmt(conn->createStatement());
|
||||||
|
stmt->execute(createStmt);
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
if (conn) {
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
}
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Uninstall the PostgresqlSchedule.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlSchedule :: uninstall(void) throw (std::exception)
|
||||||
|
{
|
||||||
|
Ptr<Connection>::Ref conn;
|
||||||
|
try {
|
||||||
|
conn = cm->getConnection();
|
||||||
|
Ptr<Statement>::Ref stmt(conn->createStatement());
|
||||||
|
stmt->execute(dropStmt);
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
if (conn) {
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
}
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Check if a timeframe is available.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
PostgresqlSchedule :: isTimeframeAvailable(
|
||||||
|
Ptr<ptime>::Ref from,
|
||||||
|
Ptr<ptime>::Ref to) throw ()
|
||||||
|
{
|
||||||
|
Ptr<Connection>::Ref conn;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
conn = cm->getConnection();
|
||||||
|
Ptr<Timestamp>::Ref timestamp;
|
||||||
|
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
|
||||||
|
isTimeframaAvailableStmt));
|
||||||
|
timestamp = Conversion::ptimeToTimestamp(from);
|
||||||
|
pstmt->setTimestamp(1, *timestamp);
|
||||||
|
pstmt->setTimestamp(2, *timestamp);
|
||||||
|
pstmt->setTimestamp(5, *timestamp);
|
||||||
|
|
||||||
|
timestamp = Conversion::ptimeToTimestamp(to);
|
||||||
|
pstmt->setTimestamp(3, *timestamp);
|
||||||
|
pstmt->setTimestamp(4, *timestamp);
|
||||||
|
pstmt->setTimestamp(6, *timestamp);
|
||||||
|
|
||||||
|
Ptr<ResultSet>::Ref rs(pstmt->executeQuery());
|
||||||
|
result = (rs->next()) ? (rs->getInt(1) == 0) : false;
|
||||||
|
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
if (conn) {
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Schedule a playlist
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlSchedule :: schedulePlaylist(
|
||||||
|
Ptr<Playlist>::Ref playlist,
|
||||||
|
Ptr<ptime>::Ref playtime)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
{
|
||||||
|
Ptr<Connection>::Ref conn;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
conn = cm->getConnection();
|
||||||
|
Ptr<Timestamp>::Ref timestamp;
|
||||||
|
Ptr<UniqueId>::Ref id;
|
||||||
|
Ptr<ptime>::Ref ends;
|
||||||
|
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
|
||||||
|
schedulePlaylistStmt));
|
||||||
|
id = UniqueId::generateId();
|
||||||
|
pstmt->setInt(1, id->getId());
|
||||||
|
|
||||||
|
pstmt->setInt(2, playlist->getId()->getId());
|
||||||
|
|
||||||
|
timestamp = Conversion::ptimeToTimestamp(playtime);
|
||||||
|
pstmt->setTimestamp(3, *timestamp);
|
||||||
|
|
||||||
|
ends.reset(new ptime((*playtime) + *(playlist->getPlaylength())));
|
||||||
|
timestamp = Conversion::ptimeToTimestamp(ends);
|
||||||
|
pstmt->setTimestamp(4, *timestamp);
|
||||||
|
|
||||||
|
result = pstmt->executeUpdate() == 1;
|
||||||
|
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
if (conn) {
|
||||||
|
cm->returnConnection(conn);
|
||||||
|
}
|
||||||
|
throw std::invalid_argument(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
throw std::invalid_argument("couldn't insert into database");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,221 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlSchedule.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef PostresqlSchedule_h
|
||||||
|
#define PostresqlSchedule_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "LiveSupport/Core/Ptr.h"
|
||||||
|
#include "LiveSupport/Core/Configurable.h"
|
||||||
|
#include "LiveSupport/Db/ConnectionManagerInterface.h"
|
||||||
|
#include "ScheduleInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An object containing the schedule of events in a PostreSQL database.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class PostgresqlSchedule : public Configurable,
|
||||||
|
public ScheduleInterface
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The name of the configuration XML elmenent used by this object.
|
||||||
|
*/
|
||||||
|
static const std::string configElementNameStr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SQL create statement used in the installation step.
|
||||||
|
*/
|
||||||
|
static const std::string createStmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SQL drop statement used in the uninstallation step.
|
||||||
|
*/
|
||||||
|
static const std::string dropStmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SQL statement for querying if a time frame is available.
|
||||||
|
*/
|
||||||
|
static const std::string isTimeframaAvailableStmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SQL statement for scheduling a playlist.
|
||||||
|
*/
|
||||||
|
static const std::string schedulePlaylistStmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The database connection manager to use for connecting the
|
||||||
|
* database.
|
||||||
|
*/
|
||||||
|
Ptr<Db::ConnectionManagerInterface>::Ref cm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default constructor.
|
||||||
|
*/
|
||||||
|
PostgresqlSchedule(void) throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Construct a PostgresqlSchedule.
|
||||||
|
*
|
||||||
|
* @param cm the connection manager the PostgresqlSchedule will use to
|
||||||
|
* connect to the database.
|
||||||
|
*/
|
||||||
|
PostgresqlSchedule(Ptr<Db::ConnectionManagerInterface>::Ref cm)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
this->cm = cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A virtual destructor, as this class has virtual functions.
|
||||||
|
*/
|
||||||
|
virtual
|
||||||
|
~PostgresqlSchedule(void) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the name of the XML element this object expects
|
||||||
|
* to be sent to a call to configure().
|
||||||
|
*
|
||||||
|
* @return the name of the expected XML configuration element.
|
||||||
|
*/
|
||||||
|
static const std::string
|
||||||
|
getConfigElementName(void) throw ()
|
||||||
|
{
|
||||||
|
return configElementNameStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the object based on the XML element supplied.
|
||||||
|
* The supplied element is expected to be of the name
|
||||||
|
* returned by configElementName().
|
||||||
|
*
|
||||||
|
* @param element the XML element to configure the object from.
|
||||||
|
* @exception std::invalid_argument if the supplied XML element
|
||||||
|
* contains bad configuraiton information
|
||||||
|
* @exception std::logic_error if the object has already
|
||||||
|
* been configured, and can not be reconfigured.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install the component.
|
||||||
|
* This step involves creating the environment in which the component
|
||||||
|
* will run. This may be creation of coniguration files,
|
||||||
|
* database tables, etc.
|
||||||
|
*
|
||||||
|
* @exception std::exception on installation problems.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
install(void) throw (std::exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uninstall the component.
|
||||||
|
* Removes all the resources created in the install step.
|
||||||
|
*
|
||||||
|
* @exception std::exception on unistallation problems.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
uninstall(void) throw (std::exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a timeframe is available for scheduling.
|
||||||
|
*
|
||||||
|
* @param from the start time of the timeframe.
|
||||||
|
* @param to the end time of the timeframe.
|
||||||
|
* @return true if the timeframe is available, false otherwise.
|
||||||
|
*/
|
||||||
|
virtual bool
|
||||||
|
isTimeframeAvailable(Ptr<ptime>::Ref from,
|
||||||
|
Ptr<ptime>::Ref to) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a playlist.
|
||||||
|
*
|
||||||
|
* @param playlist the playlist to schedule.
|
||||||
|
* @param playtime the time to schedule the playlist for.
|
||||||
|
* @exception std::invalid_argument if the there is something
|
||||||
|
* already scheduled for the duration of the playlist.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
schedulePlaylist(Ptr<Playlist>::Ref playlist,
|
||||||
|
Ptr<ptime>::Ref playtime)
|
||||||
|
throw (std::invalid_argument);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // PostresqlSchedule_h
|
||||||
|
|
|
@ -0,0 +1,228 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlScheduleTest.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "LiveSupport/Db/ConnectionManagerFactory.h"
|
||||||
|
#include "PostgresqlSchedule.h"
|
||||||
|
#include "PostgresqlScheduleTest.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
CPPUNIT_TEST_SUITE_REGISTRATION(PostgresqlScheduleTest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the connection manager factory.
|
||||||
|
*/
|
||||||
|
static const std::string configFileName = "etc/connectionManagerFactory.xml";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlScheduleTest :: setUp(void) throw ()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Ptr<xmlpp::DomParser>::Ref parser(
|
||||||
|
new xmlpp::DomParser(configFileName, true));
|
||||||
|
const xmlpp::Document * document = parser->get_document();
|
||||||
|
const xmlpp::Element * root = document->get_root_node();
|
||||||
|
|
||||||
|
Ptr<ConnectionManagerFactory>::Ref cmf =
|
||||||
|
ConnectionManagerFactory::getInstance();
|
||||||
|
cmf->configure(*root);
|
||||||
|
cm = cmf->getConnectionManager();
|
||||||
|
|
||||||
|
schedule.reset(new PostgresqlSchedule(cm));
|
||||||
|
schedule->install();
|
||||||
|
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
CPPUNIT_FAIL("semantic error in configuration file");
|
||||||
|
} catch (xmlpp::exception &e) {
|
||||||
|
CPPUNIT_FAIL("error parsing configuration file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Clean up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlScheduleTest :: tearDown(void) throw ()
|
||||||
|
{
|
||||||
|
schedule->uninstall();
|
||||||
|
schedule.reset();
|
||||||
|
cm.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Test for an available timeframe in an empty schedule database.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlScheduleTest :: firstTest(void)
|
||||||
|
throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
// check with any two arbitary dates, the timeframe should be available
|
||||||
|
Ptr<ptime>::Ref from(new ptime(time_from_string("2004-07-23 10:00:00")));
|
||||||
|
Ptr<ptime>::Ref to(new ptime(time_from_string("2004-07-23 11:00:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Schedule a single playlist.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlScheduleTest :: simpleScheduleTest(void)
|
||||||
|
throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
// create a 1 hour long playlist, from 10 o'clock 2004-07-23
|
||||||
|
Ptr<UniqueId>::Ref id = UniqueId::generateId();
|
||||||
|
Ptr<time_duration>::Ref playlength(new time_duration(1, 0, 0));
|
||||||
|
Ptr<Playlist>::Ref playlist(new Playlist(id, playlength));
|
||||||
|
Ptr<ptime>::Ref from(new ptime(time_from_string(
|
||||||
|
"2004-07-23 10:00:00")));
|
||||||
|
|
||||||
|
try {
|
||||||
|
schedule->schedulePlaylist(playlist, from);
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
CPPUNIT_ASSERT(e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Schedule a single playlist, and then query for available timeframes
|
||||||
|
* around it.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
PostgresqlScheduleTest :: scheduleAndQueryTest(void)
|
||||||
|
throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
// create a 1 hour long playlist, from 10 o'clock 2004-07-23
|
||||||
|
Ptr<UniqueId>::Ref id = UniqueId::generateId();
|
||||||
|
Ptr<time_duration>::Ref playlength(new time_duration(1, 0, 0));
|
||||||
|
Ptr<Playlist>::Ref playlist(new Playlist(id, playlength));
|
||||||
|
Ptr<ptime>::Ref from(new ptime(time_from_string(
|
||||||
|
"2004-07-23 10:00:00")));
|
||||||
|
|
||||||
|
try {
|
||||||
|
schedule->schedulePlaylist(playlist, from);
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
CPPUNIT_ASSERT(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for available timeframes around the inserted one
|
||||||
|
Ptr<ptime>::Ref to;
|
||||||
|
|
||||||
|
// this is the exact same timeframe as the scheduled playlist
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 10:00:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 11:00:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe before our playlist
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 09:00:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 09:50:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe after our playlist
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 11:10:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 12:00:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe inside ours
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 10:10:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 10:50:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe encapsulating ours
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 09:50:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 11:10:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe starting earlier, but flowing into ours
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 09:00:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 10:10:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe starting inside ours, and continuing afterwards
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 10:50:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 11:50:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(!schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe ending exaclty when ours starts, which is OK
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 09:00:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 10:00:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to));
|
||||||
|
|
||||||
|
// a timeframe starting exactly when ours ends, which is OK
|
||||||
|
from.reset(new ptime(time_from_string("2004-07-23 11:00:00")));
|
||||||
|
to.reset(new ptime(time_from_string("2004-07-23 12:00:00")));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(schedule->isTimeframeAvailable(from, to));
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlScheduleTest.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef PostgresqlScheduleTest_h
|
||||||
|
#define PostgresqlScheduleTest_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
#include "LiveSupport/Db/ConnectionManagerInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Db;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for the PostgresqlSchedule class.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
* @see PostgresqlSchedule
|
||||||
|
*/
|
||||||
|
class PostgresqlScheduleTest : public CPPUNIT_NS::TestFixture
|
||||||
|
{
|
||||||
|
CPPUNIT_TEST_SUITE(PostgresqlScheduleTest);
|
||||||
|
CPPUNIT_TEST(firstTest);
|
||||||
|
CPPUNIT_TEST(simpleScheduleTest);
|
||||||
|
CPPUNIT_TEST(scheduleAndQueryTest);
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The connection manager used for testing.
|
||||||
|
*/
|
||||||
|
Ptr<ConnectionManagerInterface>::Ref cm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The schedule used for testing.
|
||||||
|
*/
|
||||||
|
Ptr<PostgresqlSchedule>::Ref schedule;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for an available timeframe in an empty schedule database.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
firstTest(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a single playlist.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
simpleScheduleTest(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a single playlist, and then query for available timeframes
|
||||||
|
* around it.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
scheduleAndQueryTest(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the environment for the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setUp(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up the environment after the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tearDown(void) throw ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // PostgresqlScheduleTest_h
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/ScheduleFactory.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "LiveSupport/Db/ConnectionManagerFactory.h"
|
||||||
|
#include "PostgresqlSchedule.h"
|
||||||
|
#include "ScheduleFactory.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
using namespace LiveSupport::Db;
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The name of the config element for this class
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string ScheduleFactory::configElementNameStr =
|
||||||
|
"scheduleFactory";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The singleton instance of Scheduleactory
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Ptr<ScheduleFactory>::Ref ScheduleFactory::singleton;
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Return the singleton instance to ScheduleFactory
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Ptr<ScheduleFactory>::Ref
|
||||||
|
ScheduleFactory :: getInstance(void) throw ()
|
||||||
|
{
|
||||||
|
if (!singleton.get()) {
|
||||||
|
singleton.reset(new ScheduleFactory());
|
||||||
|
}
|
||||||
|
|
||||||
|
return singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Configure the schedule factory.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ScheduleFactory :: configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error)
|
||||||
|
{
|
||||||
|
if (element.get_name() != configElementNameStr) {
|
||||||
|
std::string eMsg = "Bad configuration element ";
|
||||||
|
eMsg += element.get_name();
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
schedule.reset();
|
||||||
|
|
||||||
|
Ptr<ConnectionManagerFactory>::Ref cmf =
|
||||||
|
ConnectionManagerFactory::getInstance();
|
||||||
|
Ptr<ConnectionManagerInterface>::Ref cm = cmf->getConnectionManager();
|
||||||
|
|
||||||
|
// try to look for a PostgresqlSchedule configuration element
|
||||||
|
xmlpp::Node::NodeList nodes =
|
||||||
|
element.get_children(PostgresqlSchedule::getConfigElementName());
|
||||||
|
if (nodes.size() >= 1) {
|
||||||
|
const xmlpp::Element * configElement =
|
||||||
|
dynamic_cast<const xmlpp::Element*> (*(nodes.begin()));
|
||||||
|
Ptr<PostgresqlSchedule>::Ref dbs(new PostgresqlSchedule(cm));
|
||||||
|
dbs->configure(*configElement);
|
||||||
|
schedule = dbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!schedule) {
|
||||||
|
throw std::invalid_argument("no storage client factories to configure");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/ScheduleFactory.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef ScheduleFactory_h
|
||||||
|
#define ScheduleFactory_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "LiveSupport/Core/Configurable.h"
|
||||||
|
#include "ScheduleInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The factory to create appropriate Schedule objects.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class ScheduleFactory :
|
||||||
|
virtual public Configurable
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The name of the configuration XML elmenent used by this object.
|
||||||
|
*/
|
||||||
|
static const std::string configElementNameStr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance of this object.
|
||||||
|
*/
|
||||||
|
static Ptr<ScheduleFactory>::Ref singleton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The schedule created by this factory.
|
||||||
|
*/
|
||||||
|
Ptr<ScheduleInterface>::Ref schedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default constructor.
|
||||||
|
*/
|
||||||
|
ScheduleFactory(void) throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* A virtual destructor, as this class has virtual functions.
|
||||||
|
*/
|
||||||
|
virtual
|
||||||
|
~ScheduleFactory(void) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the name of the XML element this object expects
|
||||||
|
* to be sent to a call to configure().
|
||||||
|
*
|
||||||
|
* @return the name of the expected XML configuration element.
|
||||||
|
*/
|
||||||
|
static const std::string
|
||||||
|
configElementName(void) throw ()
|
||||||
|
{
|
||||||
|
return configElementNameStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the singleton instance of this object.
|
||||||
|
*
|
||||||
|
* @return the singleton instance of this object.
|
||||||
|
*/
|
||||||
|
static Ptr<ScheduleFactory>::Ref
|
||||||
|
getInstance() throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the object based on the XML element supplied.
|
||||||
|
*
|
||||||
|
* @param element the XML element to configure the object from.
|
||||||
|
* @exception std::invalid_argument if the supplied XML element
|
||||||
|
* contains bad configuraiton information
|
||||||
|
* @exception std::logic_error if the object has already
|
||||||
|
* been configured, and can not be reconfigured.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a schedule.
|
||||||
|
*
|
||||||
|
* @return the appropriate schedule, according to the
|
||||||
|
* configuration of this factory.
|
||||||
|
*/
|
||||||
|
Ptr<ScheduleInterface>::Ref
|
||||||
|
getSchedule(void) throw ()
|
||||||
|
{
|
||||||
|
return schedule;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Storage
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // ScheduleFactory_h
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/ScheduleInterface.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef ScheduleInterface_h
|
||||||
|
#define ScheduleInterface_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
|
||||||
|
#include "LiveSupport/Core/Ptr.h"
|
||||||
|
#include "LiveSupport/Core/Installable.h"
|
||||||
|
#include "LiveSupport/Core/Playlist.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The generic interface for the component scheduling events.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class ScheduleInterface : virtual public Installable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Check if a timeframe is available for scheduling.
|
||||||
|
*
|
||||||
|
* @param from the start time of the timeframe.
|
||||||
|
* @param to the end time of the timeframe.
|
||||||
|
* @return true if the timeframe is available, false otherwise.
|
||||||
|
*/
|
||||||
|
virtual bool
|
||||||
|
isTimeframeAvailable(Ptr<ptime>::Ref from,
|
||||||
|
Ptr<ptime>::Ref to) throw ()
|
||||||
|
= 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule a playlist.
|
||||||
|
*
|
||||||
|
* @param playlist the playlist to schedule.
|
||||||
|
* @param playtime the time to schedule the playlist for.
|
||||||
|
* @exception std::invalid_argument if the there is something
|
||||||
|
* already scheduled for the duration of the playlist.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
schedulePlaylist(Ptr<Playlist>::Ref playlist,
|
||||||
|
Ptr<ptime>::Ref playtime)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
= 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // ScheduleInterface_h
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemon.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#else
|
||||||
|
#error "Need signal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SYS_STAT_H
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#else
|
||||||
|
#error "Need sys/stat.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "SchedulerDaemon.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance of the Scheduler daemon object.
|
||||||
|
*/
|
||||||
|
SchedulerDaemon * SchedulerDaemon::schedulerDaemon = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration element for the Scheduler daemon.
|
||||||
|
*/
|
||||||
|
static const std::string confElement = "scheduler";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration element for the XmlRpcDaemon inside.
|
||||||
|
*/
|
||||||
|
static const std::string xmlRpcDaemonConfElement = "xmlRpcDaemon";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Return the singleton instnace.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class SchedulerDaemon *
|
||||||
|
SchedulerDaemon :: getInstance (void) throw ()
|
||||||
|
{
|
||||||
|
if (!schedulerDaemon) {
|
||||||
|
schedulerDaemon = new SchedulerDaemon();
|
||||||
|
}
|
||||||
|
|
||||||
|
return schedulerDaemon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Configure the scheduler daemon
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SchedulerDaemon :: configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error)
|
||||||
|
{
|
||||||
|
if (element.get_name() != confElement) {
|
||||||
|
std::string eMsg = "Bad configuration element ";
|
||||||
|
eMsg += element.get_name();
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlpp::Node::NodeList nodes =
|
||||||
|
element.get_children(xmlRpcDaemonConfElement);
|
||||||
|
if (nodes.size() < 1) {
|
||||||
|
throw std::invalid_argument("no xmlRpcDaemon element");
|
||||||
|
}
|
||||||
|
configureXmlRpcDaemon( *((const xmlpp::Element*) *(nodes.begin())) );
|
||||||
|
}
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemon.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef SchedulerDaemon_h
|
||||||
|
#define SchedulerDaemon_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#else
|
||||||
|
#error "Need sys/types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <libxml++/libxml++.h>
|
||||||
|
#include <XmlRpc.h>
|
||||||
|
|
||||||
|
#include "XmlRpcDaemon.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scheduler daemon main class.
|
||||||
|
* This class is responsible for starting, running and stopping the
|
||||||
|
* Scheduler daemon.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class SchedulerDaemon : public XmlRpcDaemon
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance of the scheduler daemon.
|
||||||
|
*/
|
||||||
|
static SchedulerDaemon * schedulerDaemon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
|
SchedulerDaemon (void) throw ()
|
||||||
|
: XmlRpcDaemon()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register your XML-RPC functions by implementing this function.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
registerXmlRpcFunctions(XmlRpc::XmlRpcServer & xmlRpcServer)
|
||||||
|
throw (std::logic_error)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a pointer to the singleton instance of SchedulerDaemon.
|
||||||
|
*
|
||||||
|
* @return a pointer to the singleton instance of SchedulerDaemon
|
||||||
|
*/
|
||||||
|
static SchedulerDaemon *
|
||||||
|
getInstance (void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the scheduler daemon based on the XML element
|
||||||
|
* supplied.
|
||||||
|
*
|
||||||
|
* @param element the XML element to configure the scheduler
|
||||||
|
* daemon from.
|
||||||
|
* @exception std::invalid_argument if the supplied XML element
|
||||||
|
* contains bad configuraiton information
|
||||||
|
* @exception std::logic_error if the scheduler daemon has already
|
||||||
|
* been configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // SchedulerDaemon_h
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemonTest.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "SchedulerDaemon.h"
|
||||||
|
#include "SchedulerDaemonTest.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
//CPPUNIT_TEST_SUITE_REGISTRATION(SchedulerDaemonTest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the scheduler daemon.
|
||||||
|
*/
|
||||||
|
static const std::string configFileName = "etc/scheduler.xml";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SchedulerDaemonTest :: setUp(void) throw ()
|
||||||
|
{
|
||||||
|
SchedulerDaemon * daemon = SchedulerDaemon::getInstance();
|
||||||
|
|
||||||
|
if (!daemon->isConfigured()) {
|
||||||
|
try {
|
||||||
|
std::auto_ptr<xmlpp::DomParser>
|
||||||
|
parser(new xmlpp::DomParser(configFileName, true));
|
||||||
|
const xmlpp::Document * document = parser->get_document();
|
||||||
|
daemon->configure(*(document->get_root_node()));
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
CPPUNIT_FAIL("semantic error in configuration file");
|
||||||
|
} catch (xmlpp::exception &e) {
|
||||||
|
CPPUNIT_FAIL("error parsing configuration file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Clean up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SchedulerDaemonTest :: tearDown(void) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Test to see if the singleton Hello object is accessible
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SchedulerDaemonTest :: getSingleton(void) throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
CPPUNIT_ASSERT( SchedulerDaemon::getInstance() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Test to see if the scheduler starts and stops OK
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SchedulerDaemonTest :: testStartStop(void) throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
SchedulerDaemon * daemon = SchedulerDaemon::getInstance();
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT( daemon );
|
||||||
|
CPPUNIT_ASSERT( !(daemon->isRunning()) );
|
||||||
|
daemon->start();
|
||||||
|
sleep(3);
|
||||||
|
CPPUNIT_ASSERT( daemon->isRunning() );
|
||||||
|
daemon->stop();
|
||||||
|
sleep(3);
|
||||||
|
CPPUNIT_ASSERT( !(daemon->isRunning()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemonTest.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef SchedulerDaemonTest_h
|
||||||
|
#define SchedulerDaemonTest_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for the SchedulerDaemon class.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
* @see SchedulerDaemon
|
||||||
|
*/
|
||||||
|
class SchedulerDaemonTest : public CPPUNIT_NS::TestFixture
|
||||||
|
{
|
||||||
|
CPPUNIT_TEST_SUITE(SchedulerDaemonTest);
|
||||||
|
CPPUNIT_TEST(getSingleton);
|
||||||
|
CPPUNIT_TEST(testStartStop);
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple test to see if the singleton Hello object is accessible.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
getSingleton(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test to see if the daemon starts an stops OK.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
testStartStop(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the environment for the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setUp(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up the environment after the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tearDown(void) throw ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // SchedulerDaemonTest_h
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SignalDispatcher.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#else
|
||||||
|
#error "Need signal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SYS_STAT_H
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#else
|
||||||
|
#error "Need sys/stat.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "SignalDispatcher.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The singleton isntnace of SignalDispatcher.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
SignalDispatcher * SignalDispatcher::instance = 0;
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The signal handlers.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
SignalHandler * SignalDispatcher::handlers[NSIG];
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Return the singleton instnace.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
class SignalDispatcher *
|
||||||
|
SignalDispatcher :: getInstance (void) throw ()
|
||||||
|
{
|
||||||
|
if (!instance) {
|
||||||
|
instance = new SignalDispatcher();
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Register a signal handler
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SignalDispatcher :: registerHandler(
|
||||||
|
int signal,
|
||||||
|
SignalHandler * signalHandler)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
{
|
||||||
|
if (signal < 0 || signal >= NSIG) {
|
||||||
|
throw std::invalid_argument("invalid signal value");
|
||||||
|
}
|
||||||
|
if (!signalHandler) {
|
||||||
|
throw std::invalid_argument("signalHandler is 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
handlers[signal] = signalHandler;
|
||||||
|
|
||||||
|
// register our dispatcher for this signal
|
||||||
|
::signal(signal, dispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Remove a signal handler
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SignalDispatcher :: removeHandler(
|
||||||
|
int signal)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
{
|
||||||
|
if (signal < 0 || signal >= NSIG) {
|
||||||
|
throw std::invalid_argument("invalid signal value");
|
||||||
|
}
|
||||||
|
|
||||||
|
handlers[signal] = 0;
|
||||||
|
|
||||||
|
::signal(signal, SIG_DFL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Our signal dispatcher
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
SignalDispatcher :: dispatcher(int signal) throw ()
|
||||||
|
{
|
||||||
|
handlers[signal]->handleSignal(signal);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SignalDispatcher.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef SignalDispatcher_h
|
||||||
|
#define SignalDispatcher_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#else
|
||||||
|
#error "Need signal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "SignalHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to dispatch signals.
|
||||||
|
* See http://www.cs.wustl.edu/~schmidt/signal-patterns.html for details.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class SignalDispatcher
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The singleton instance of this class.
|
||||||
|
*/
|
||||||
|
static SignalDispatcher * instance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array of registered signal handlers,
|
||||||
|
* of size NSIG defined in signal.h
|
||||||
|
*/
|
||||||
|
static SignalHandler * handlers[NSIG];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
|
SignalDispatcher(void) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The function registered to handle signals.
|
||||||
|
*
|
||||||
|
* @param signal the signal being handled.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dispatcher(int signal) throw ();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the singleton instance of SignalDispatcher.
|
||||||
|
*
|
||||||
|
* @return the singleton instance of SignalDispatcher.
|
||||||
|
*/
|
||||||
|
static SignalDispatcher *
|
||||||
|
getInstance(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a signal handler for a specific signal.
|
||||||
|
*
|
||||||
|
* @param signal the signal to register for.
|
||||||
|
* @param signalHandler the signal handler to register.
|
||||||
|
* @exception std::invalid_argument if signal is out of range,
|
||||||
|
* or if signalHandler is 0.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
registerHandler(int signal,
|
||||||
|
SignalHandler * signalHandler)
|
||||||
|
throw (std::invalid_argument);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a signal handler for a specific signal.
|
||||||
|
* Restores the original system signal handling.
|
||||||
|
*
|
||||||
|
* @param signal the signal to remove the handler for.
|
||||||
|
* @exception std::invalid_argument if signal is out of range.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
removeHandler(int signal) throw (std::invalid_argument);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // SignalDispatcher_h
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SignalHandler.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef SignalHandler_h
|
||||||
|
#define SignalHandler_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to handle a signal.
|
||||||
|
* Register subclasses of this class at SignalDispatcher.
|
||||||
|
* See http://www.cs.wustl.edu/~schmidt/signal-patterns.html for details.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
* @see SignalDispatcher
|
||||||
|
*/
|
||||||
|
class SignalHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Handle the signal.
|
||||||
|
*
|
||||||
|
* @param signal the actual signal received.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
handleSignal(int signal) throw () = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // SignalHandler_h
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/TestRunner.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cppunit/BriefTestProgressListener.h>
|
||||||
|
#include <cppunit/CompilerOutputter.h>
|
||||||
|
#include <cppunit/extensions/TestFactoryRegistry.h>
|
||||||
|
#include <cppunit/TestResult.h>
|
||||||
|
#include <cppunit/TestResultCollector.h>
|
||||||
|
#include <cppunit/TestRunner.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Run all tests
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
main( int argc,
|
||||||
|
char * argv[] ) throw ()
|
||||||
|
{
|
||||||
|
// Create the event manager and test controller
|
||||||
|
CPPUNIT_NS::TestResult controller;
|
||||||
|
|
||||||
|
// Add a listener that colllects test result
|
||||||
|
CPPUNIT_NS::TestResultCollector result;
|
||||||
|
controller.addListener( &result );
|
||||||
|
|
||||||
|
// Add a listener that print dots as test run.
|
||||||
|
CPPUNIT_NS::BriefTestProgressListener progress;
|
||||||
|
controller.addListener( &progress );
|
||||||
|
|
||||||
|
// Add the top suite to the test runner
|
||||||
|
CPPUNIT_NS::TestRunner runner;
|
||||||
|
runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
|
||||||
|
runner.run( controller );
|
||||||
|
|
||||||
|
// Print test in a compiler compatible format.
|
||||||
|
CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr );
|
||||||
|
outputter.setLocationFormat("%p:%l:");
|
||||||
|
outputter.write();
|
||||||
|
|
||||||
|
return result.wasSuccessful() ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethod.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_TIME_H
|
||||||
|
#include <time.h>
|
||||||
|
#else
|
||||||
|
#error need time.h
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "LiveSupport/Core/StorageClientInterface.h"
|
||||||
|
#include "LiveSupport/Storage/StorageClientFactory.h"
|
||||||
|
#include "ScheduleInterface.h"
|
||||||
|
#include "ScheduleFactory.h"
|
||||||
|
#include "UploadPlaylistMethod.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
using namespace LiveSupport::Storage;
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The name of this XML-RPC method.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string UploadPlaylistMethod::methodName = "stop";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The name of the playlist id member in the XML-RPC parameter
|
||||||
|
* structure.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string UploadPlaylistMethod::playlistIdName = "playlistId";
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* The name of the playlength member in the XML-RPC parameter
|
||||||
|
* structure.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
const std::string UploadPlaylistMethod::playlengthName = "playlength";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Construct the StopXmlRpcMethod and register it right away.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
UploadPlaylistMethod :: UploadPlaylistMethod (
|
||||||
|
Ptr<XmlRpc::XmlRpcServer>::Ref xmlRpcServer) throw()
|
||||||
|
: XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Extract the UniqueId from an XML-RPC function call parameter
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Ptr<UniqueId>::Ref
|
||||||
|
UploadPlaylistMethod :: extractPlaylistId(
|
||||||
|
XmlRpc::XmlRpcValue & xmlRpcValue)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
{
|
||||||
|
if (!xmlRpcValue.hasMember(playlistIdName)) {
|
||||||
|
throw std::invalid_argument("no playlist id in parameter structure");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ptr<UniqueId>::Ref id(new UniqueId((int) xmlRpcValue[playlistIdName]));
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Extract the playtime from an XML-RPC function call parameter
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
Ptr<ptime>::Ref
|
||||||
|
UploadPlaylistMethod :: extractPlayschedule(
|
||||||
|
XmlRpc::XmlRpcValue & xmlRpcValue)
|
||||||
|
throw (std::invalid_argument)
|
||||||
|
{
|
||||||
|
if (!xmlRpcValue.hasMember(playlengthName)) {
|
||||||
|
throw std::invalid_argument("no playlength in parameter structure");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm & tm = (struct tm &) xmlRpcValue[playlengthName];
|
||||||
|
time_t time = mktime(&tm);
|
||||||
|
Ptr<ptime>::Ref ptime(new ptime(from_time_t(time)));
|
||||||
|
|
||||||
|
return ptime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Execute the stop XML-RPC function call.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethod :: execute( XmlRpc::XmlRpcValue & parameters,
|
||||||
|
XmlRpc::XmlRpcValue & returnValue)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Ptr<UniqueId>::Ref id = extractPlaylistId(parameters);
|
||||||
|
Ptr<ptime>::Ref playschedule = extractPlayschedule(parameters);
|
||||||
|
|
||||||
|
Ptr<StorageClientFactory>::Ref scf;
|
||||||
|
Ptr<StorageClientInterface>::Ref storage;
|
||||||
|
|
||||||
|
scf = StorageClientFactory::getInstance();
|
||||||
|
storage = scf->getStorageClient();
|
||||||
|
|
||||||
|
if (!storage->existsPlaylist(id)) {
|
||||||
|
// TODO: mark error
|
||||||
|
returnValue = XmlRpc::XmlRpcValue(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ptr<Playlist>::Ref playlist = storage->getPlaylist(id);
|
||||||
|
Ptr<ptime>::Ref until(new ptime(*playschedule
|
||||||
|
+ *(playlist->getPlaylength())));
|
||||||
|
|
||||||
|
Ptr<ScheduleFactory>::Ref sf = ScheduleFactory::getInstance();
|
||||||
|
Ptr<ScheduleInterface>::Ref schedule = sf->getSchedule();
|
||||||
|
|
||||||
|
if (!schedule->isTimeframeAvailable(playschedule, until)) {
|
||||||
|
// TODO: mark error;
|
||||||
|
returnValue = XmlRpc::XmlRpcValue(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
schedule->schedulePlaylist(playlist, playschedule);
|
||||||
|
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
// TODO: mark error
|
||||||
|
returnValue = XmlRpc::XmlRpcValue(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
returnValue = XmlRpc::XmlRpcValue(true);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,160 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethod.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef UploadPlaylistMetohd_h
|
||||||
|
#define UploadPlaylistMethod_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <XmlRpcServerMethod.h>
|
||||||
|
#include <XmlRpcValue.h>
|
||||||
|
|
||||||
|
#include "LiveSupport/Core/Ptr.h"
|
||||||
|
#include "LiveSupport/Core/UniqueId.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An XML-RPC method object to accept a playlist for upload,
|
||||||
|
* and schedule it in the scheduler.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class UploadPlaylistMethod : public XmlRpc::XmlRpcServerMethod
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The name of this method, as it will be registered into the
|
||||||
|
* XML-RPC server.
|
||||||
|
*/
|
||||||
|
static const std::string methodName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the playlist id member in the XML-RPC parameter
|
||||||
|
* structure.
|
||||||
|
*/
|
||||||
|
static const std::string playlistIdName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the playlength member in the XML-RPC parameter
|
||||||
|
* structure.
|
||||||
|
*/
|
||||||
|
static const std::string playlengthName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the playlist id from the XML-RPC parameters.
|
||||||
|
*
|
||||||
|
* @param xmlRpcValue the XML-RPC parameter to extract from.
|
||||||
|
* @return a UniqueId that was found in the XML-RPC parameter.
|
||||||
|
* @exception std::invalid_argument if there was no UniqueId
|
||||||
|
* in xmlRpcValue
|
||||||
|
*/
|
||||||
|
Ptr<UniqueId>::Ref
|
||||||
|
extractPlaylistId(XmlRpc::XmlRpcValue & xmlRpcValue)
|
||||||
|
throw (std::invalid_argument);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the playtime from the XML-RPC parameters.
|
||||||
|
*
|
||||||
|
* @param xmlRpcValue the XML-RPC parameter to extract from.
|
||||||
|
* @return the playing time, as stored in the XML-RPC parameter
|
||||||
|
* @exception std::invalid_argument if there was no playtime
|
||||||
|
* in xmlRpcValue
|
||||||
|
*/
|
||||||
|
Ptr<boost::posix_time::ptime>::Ref
|
||||||
|
extractPlayschedule(XmlRpc::XmlRpcValue & xmlRpcValue)
|
||||||
|
throw (std::invalid_argument);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* A default constructor, for testing purposes.
|
||||||
|
*/
|
||||||
|
UploadPlaylistMethod(void) throw ()
|
||||||
|
: XmlRpc::XmlRpcServerMethod(methodName)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constuctor that registers the method with the server right away.
|
||||||
|
*
|
||||||
|
* @param xmlRpcServer the XML-RPC server to register with.
|
||||||
|
*/
|
||||||
|
UploadPlaylistMethod(
|
||||||
|
Ptr<XmlRpc::XmlRpcServer>::Ref xmlRpcServer)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the upload playlist command on the Scheduler daemon.
|
||||||
|
*
|
||||||
|
* @param parameters XML-RPC function call parameters
|
||||||
|
* @param returnValue the return value of the call (out parameter)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
execute( XmlRpc::XmlRpcValue & parameters,
|
||||||
|
XmlRpc::XmlRpcValue & returnValue) throw ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // UploadPlaylistMetohd_h
|
||||||
|
|
|
@ -0,0 +1,214 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethodTest.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <XmlRpcValue.h>
|
||||||
|
|
||||||
|
#include "LiveSupport/Db/ConnectionManagerFactory.h"
|
||||||
|
#include "LiveSupport/Storage/StorageClientFactory.h"
|
||||||
|
#include "ScheduleFactory.h"
|
||||||
|
#include "UploadPlaylistMethod.h"
|
||||||
|
#include "UploadPlaylistMethodTest.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Db;
|
||||||
|
using namespace LiveSupport::Storage;
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
CPPUNIT_TEST_SUITE_REGISTRATION(UploadPlaylistMethodTest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the storage client factory.
|
||||||
|
*/
|
||||||
|
const std::string UploadPlaylistMethodTest::storageClientConfig =
|
||||||
|
"etc/storageClient.xml";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the connection manager factory.
|
||||||
|
*/
|
||||||
|
const std::string UploadPlaylistMethodTest::connectionManagerConfig =
|
||||||
|
"etc/connectionManagerFactory.xml";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the schedule factory.
|
||||||
|
*/
|
||||||
|
const std::string UploadPlaylistMethodTest::scheduleConfig =
|
||||||
|
"etc/scheduleFactory.xml";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Configure a Configurable with an XML file.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethodTest :: configure(
|
||||||
|
Ptr<Configurable>::Ref configurable,
|
||||||
|
const std::string fileName)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
xmlpp::exception)
|
||||||
|
{
|
||||||
|
Ptr<xmlpp::DomParser>::Ref parser(new xmlpp::DomParser(fileName, true));
|
||||||
|
const xmlpp::Document * document = parser->get_document();
|
||||||
|
const xmlpp::Element * root = document->get_root_node();
|
||||||
|
|
||||||
|
configurable->configure(*root);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Set up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethodTest :: setUp(void) throw ()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Ptr<StorageClientFactory>::Ref scf
|
||||||
|
= StorageClientFactory::getInstance();
|
||||||
|
configure(scf, storageClientConfig);
|
||||||
|
|
||||||
|
Ptr<ConnectionManagerFactory>::Ref cmf
|
||||||
|
= ConnectionManagerFactory::getInstance();
|
||||||
|
configure(cmf, connectionManagerConfig);
|
||||||
|
|
||||||
|
Ptr<ScheduleFactory>::Ref sf = ScheduleFactory::getInstance();
|
||||||
|
configure(sf, scheduleConfig);
|
||||||
|
|
||||||
|
schedule = sf->getSchedule();
|
||||||
|
schedule->install();
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
CPPUNIT_FAIL("semantic error in configuration file");
|
||||||
|
} catch (xmlpp::exception &e) {
|
||||||
|
CPPUNIT_FAIL("error parsing configuration file");
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
CPPUNIT_FAIL(e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Clean up the test environment
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethodTest :: tearDown(void) throw ()
|
||||||
|
{
|
||||||
|
schedule->uninstall();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Test to see if the singleton Hello object is accessible
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethodTest :: firstTest(void)
|
||||||
|
throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
Ptr<UploadPlaylistMethod>::Ref method(new UploadPlaylistMethod());
|
||||||
|
XmlRpc::XmlRpcValue parameters;
|
||||||
|
XmlRpc::XmlRpcValue result;
|
||||||
|
struct tm time;
|
||||||
|
|
||||||
|
// set up a structure for the parameters
|
||||||
|
parameters["playlistId"] = 1;
|
||||||
|
strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &time);
|
||||||
|
parameters["playlength"] = &time;
|
||||||
|
|
||||||
|
method->execute(parameters, result);
|
||||||
|
CPPUNIT_ASSERT(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Try to upload overlapping playlists, and see them fail.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
UploadPlaylistMethodTest :: overlappingPlaylists(void)
|
||||||
|
throw (CPPUNIT_NS::Exception)
|
||||||
|
{
|
||||||
|
Ptr<UploadPlaylistMethod>::Ref method(new UploadPlaylistMethod());
|
||||||
|
XmlRpc::XmlRpcValue parameters;
|
||||||
|
XmlRpc::XmlRpcValue result;
|
||||||
|
struct tm time;
|
||||||
|
|
||||||
|
// load the first playlist, this will succeed
|
||||||
|
parameters["playlistId"] = 1;
|
||||||
|
strptime("2001-11-12 10:00:00", "%Y-%m-%d %H:%M:%S", &time);
|
||||||
|
parameters["playlength"] = &time;
|
||||||
|
|
||||||
|
method->execute(parameters, result);
|
||||||
|
CPPUNIT_ASSERT(result);
|
||||||
|
|
||||||
|
// try to load the same one, but in an overlapping time region
|
||||||
|
// (we know that playlist with id 1 in 1 hour long)
|
||||||
|
parameters["playlistId"] = 1;
|
||||||
|
strptime("2001-11-12 10:30:00", "%Y-%m-%d %H:%M:%S", &time);
|
||||||
|
parameters["playlength"] = &time;
|
||||||
|
|
||||||
|
method->execute(parameters, result);
|
||||||
|
CPPUNIT_ASSERT(!result);
|
||||||
|
|
||||||
|
// try to load the same one, but now in good timing
|
||||||
|
parameters["playlistId"] = 1;
|
||||||
|
strptime("2001-11-12 11:30:00", "%Y-%m-%d %H:%M:%S", &time);
|
||||||
|
parameters["playlength"] = &time;
|
||||||
|
|
||||||
|
method->execute(parameters, result);
|
||||||
|
CPPUNIT_ASSERT(result);
|
||||||
|
|
||||||
|
// try to load the same one, this time overlapping both previos instnaces
|
||||||
|
parameters["playlistId"] = 1;
|
||||||
|
strptime("2001-11-12 10:45:00", "%Y-%m-%d %H:%M:%S", &time);
|
||||||
|
parameters["playlength"] = &time;
|
||||||
|
|
||||||
|
method->execute(parameters, result);
|
||||||
|
CPPUNIT_ASSERT(!result);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethodTest.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef UploadPlaylistMethodTest_h
|
||||||
|
#define UploadPlaylistMethodTest_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
using namespace LiveSupport;
|
||||||
|
using namespace LiveSupport::Core;
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for the UploadPlaylistMetohd class.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
* @see UploadPlaylistMethod
|
||||||
|
*/
|
||||||
|
class UploadPlaylistMethodTest : public CPPUNIT_NS::TestFixture
|
||||||
|
{
|
||||||
|
CPPUNIT_TEST_SUITE(UploadPlaylistMethodTest);
|
||||||
|
CPPUNIT_TEST(firstTest);
|
||||||
|
CPPUNIT_TEST(overlappingPlaylists);
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the storage client factory.
|
||||||
|
*/
|
||||||
|
static const std::string storageClientConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the connection manager
|
||||||
|
* factory.
|
||||||
|
*/
|
||||||
|
static const std::string connectionManagerConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the configuration file for the schedule factory.
|
||||||
|
*/
|
||||||
|
static const std::string scheduleConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The schedule used during the test.
|
||||||
|
*/
|
||||||
|
Ptr<ScheduleInterface>::Ref schedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure a configurable with an XML file.
|
||||||
|
*
|
||||||
|
* @param configurable configure this
|
||||||
|
* @param fileName the name of the XML file to configure with.
|
||||||
|
* @exception std::invalid_argument on configuration errors.
|
||||||
|
* @exception xmlpp::exception on XML parsing errors.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
configure(Ptr<Configurable>::Ref configurable,
|
||||||
|
std::string fileName)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
xmlpp::exception);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple test.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
firstTest(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to upload overlapping playlists, and see them fail.
|
||||||
|
*
|
||||||
|
* @exception CPPUNIT_NS::Exception on test failures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
overlappingPlaylists(void) throw (CPPUNIT_NS::Exception);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the environment for the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setUp(void) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up the environment after the test case.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tearDown(void) throw ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // UploadPlaylistMethodTest_h
|
||||||
|
|
|
@ -0,0 +1,298 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/XmlRpcDaemon.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#else
|
||||||
|
#error "Need signal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SYS_STAT_H
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#else
|
||||||
|
#error "Need sys/stat.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "SignalDispatcher.h"
|
||||||
|
#include "XmlRpcDaemonShutdownSignalHandler.h"
|
||||||
|
#include "XmlRpcDaemon.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration element for the Scheduler daemon.
|
||||||
|
*/
|
||||||
|
static const std::string confElement = "xmlRpcDaemon";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration attribute for the XML-RPC host name.
|
||||||
|
*/
|
||||||
|
static const std::string confXmlRpcHostAttr = "xmlRpcHost";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration attribute for the XML-RPC port.
|
||||||
|
*/
|
||||||
|
static const std::string confXmlRpcPortAttr = "xmlRpcPort";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the XML configuration attribute for the process id file.
|
||||||
|
*/
|
||||||
|
static const std::string confPidFileNameAttr = "pidFileName";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The umask used by the daemon for file creations
|
||||||
|
*/
|
||||||
|
static const mode_t uMask = 027;
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Configure the Scheder daemon according to an XML element
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: configureXmlRpcDaemon(
|
||||||
|
const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error)
|
||||||
|
{
|
||||||
|
if (configured) {
|
||||||
|
throw std::logic_error("already configured");
|
||||||
|
}
|
||||||
|
|
||||||
|
const xmlpp::Attribute * attribute;
|
||||||
|
std::stringstream strStr;
|
||||||
|
|
||||||
|
if (element.get_name() != confElement) {
|
||||||
|
std::string eMsg = "Bad configuration element ";
|
||||||
|
eMsg += element.get_name();
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(attribute = element.get_attribute(confXmlRpcHostAttr))) {
|
||||||
|
std::string eMsg = "Missing attribute ";
|
||||||
|
eMsg += confXmlRpcHostAttr;
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
xmlRpcHost = attribute->get_value();
|
||||||
|
|
||||||
|
if (!(attribute = element.get_attribute(confXmlRpcPortAttr))) {
|
||||||
|
std::string eMsg = "Missing attribute ";
|
||||||
|
eMsg += confXmlRpcPortAttr;
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
strStr.str(attribute->get_value());
|
||||||
|
strStr >> xmlRpcPort;
|
||||||
|
|
||||||
|
if (!(attribute = element.get_attribute(confPidFileNameAttr))) {
|
||||||
|
std::string eMsg = "Missing attribute ";
|
||||||
|
eMsg += confPidFileNameAttr;
|
||||||
|
throw std::invalid_argument(eMsg);
|
||||||
|
}
|
||||||
|
pidFileName = attribute->get_value();
|
||||||
|
|
||||||
|
configured = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Do all the necessary work of becoming a daemon.
|
||||||
|
* See http://www.enderunix.org/docs/eng/daemon.php and
|
||||||
|
* http://www.linuxprofilm.com/articles/linux-daemon-howto.html
|
||||||
|
* for hints.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: daemonize(void) throw (std::runtime_error)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (getppid() == 1) {
|
||||||
|
// we're already a daemon
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = fork();
|
||||||
|
if (i < 0) {
|
||||||
|
throw std::runtime_error("fork error");
|
||||||
|
} else if (i > 0) {
|
||||||
|
// this is the parent, simply return
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we're in the child process
|
||||||
|
|
||||||
|
// obtain a new process group
|
||||||
|
setsid();
|
||||||
|
|
||||||
|
// change the umask
|
||||||
|
umask(uMask);
|
||||||
|
|
||||||
|
// close standard file descriptors
|
||||||
|
/* TODO: don't close these until we don't have logging
|
||||||
|
std::cin.close();
|
||||||
|
std::cout.close();
|
||||||
|
std::cerr.close();
|
||||||
|
*/
|
||||||
|
|
||||||
|
// save the process id
|
||||||
|
savePid();
|
||||||
|
|
||||||
|
// ignore some signals
|
||||||
|
/* TODO
|
||||||
|
signal(SIGCHLD,SIG_IGN);
|
||||||
|
signal(SIGTSTP,SIG_IGN);
|
||||||
|
signal(SIGTTOU,SIG_IGN);
|
||||||
|
signal(SIGTTIN,SIG_IGN);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// register our signal hanlder
|
||||||
|
SignalDispatcher * signalDispatcher = SignalDispatcher::getInstance();
|
||||||
|
XmlRpcDaemonShutdownSignalHandler * handler =
|
||||||
|
new XmlRpcDaemonShutdownSignalHandler(this);
|
||||||
|
signalDispatcher->registerHandler(SIGHUP, handler);
|
||||||
|
signalDispatcher->registerHandler(SIGTERM, handler);
|
||||||
|
// FIXME: this signal handler will not be deleted by anyone,
|
||||||
|
// poddible memory leak
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Save the current process id.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: savePid(void) throw ()
|
||||||
|
{
|
||||||
|
std::ofstream pidFile(pidFileName.c_str());
|
||||||
|
pidFile << getpid();
|
||||||
|
pidFile.flush();
|
||||||
|
pidFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Return the saved process id.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
pid_t
|
||||||
|
XmlRpcDaemon :: loadPid(void) throw ()
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
std::ifstream pidFile(pidFileName.c_str());
|
||||||
|
if (pidFile.fail()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pidFile >> pid;
|
||||||
|
pidFile.close();
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Start the daemon.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: start (void) throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
|
||||||
|
if (background) {
|
||||||
|
daemonize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// and now our own XML-RPC methods
|
||||||
|
registerXmlRpcFunctions(xmlRpcServer);
|
||||||
|
|
||||||
|
// bind & run
|
||||||
|
XmlRpc::setVerbosity(5);
|
||||||
|
xmlRpcServer.bindAndListen(xmlRpcPort);
|
||||||
|
xmlRpcServer.work(-1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Tell if the daemon is running.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool
|
||||||
|
XmlRpcDaemon :: isRunning (void) throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
|
||||||
|
return loadPid();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Stop the daemon.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: stop (void) throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
|
||||||
|
pid_t pid = loadPid();
|
||||||
|
kill(pid, SIGTERM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Shut down the daemon.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
XmlRpcDaemon :: shutdown (void) throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
|
||||||
|
xmlRpcServer.shutdown();
|
||||||
|
remove(pidFileName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,397 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/XmlRpcDaemon.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef XmlRpcDaemon_h
|
||||||
|
#define XmlRpcDaemon_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#else
|
||||||
|
#error "Need sys/types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <libxml++/libxml++.h>
|
||||||
|
#include <XmlRpc.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic XML-RPC daemon, that has to be sublclassed to provide
|
||||||
|
* real functionality.
|
||||||
|
*
|
||||||
|
* To use this class, subclass it, and override the configure() and
|
||||||
|
* registerXmlRpcFunctions() functions.
|
||||||
|
*
|
||||||
|
* The typical usage of the XmlRpcDaemon is as follows. To start the
|
||||||
|
* daemon:
|
||||||
|
* <ol>
|
||||||
|
* <li>create an instance of a subclass of XmlRpcDaemon</li>
|
||||||
|
* <li>call the configure() method with a proper XML element</li>
|
||||||
|
* <li>optionally call setBackground()</li>
|
||||||
|
* <li>call start() to start the daemon</li>
|
||||||
|
* </ol>
|
||||||
|
* Stopping the daemon is similar:
|
||||||
|
* <ol>
|
||||||
|
* <li>create an instance of a subclass of XmlRpcDaemon</li>
|
||||||
|
* <li>call the configure() method with a proper XML element
|
||||||
|
* if it has not yet been configured</li>
|
||||||
|
* <li>call stop() to stop the daemon</li>
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* The structure of the XML configuration element used to configure the
|
||||||
|
* XML-RPC daemon is as follows:
|
||||||
|
*
|
||||||
|
* <pre><code>
|
||||||
|
* <xmlRpcDaemon xmlRpcHost = "hostname"
|
||||||
|
* xmlRpcPort = "portnumber"
|
||||||
|
* pidFileName = "pidfilename"
|
||||||
|
* background = "true"
|
||||||
|
* />
|
||||||
|
* </code></pre>
|
||||||
|
*
|
||||||
|
* The DTD for the above is:
|
||||||
|
* <pre><code>
|
||||||
|
* <!ELEMENT xmlRpcDaemon EMPTY >
|
||||||
|
* <!ATTLIST xmlRpcDaemon xmlRpcHost CDATA #REQUIRED >
|
||||||
|
* <!ATTLIST xmlRpcDaemon xmlRpcPort NMTOKEN #REQUIRED >
|
||||||
|
* <!ATTLIST xmlRpcDaemon pidFileName CDATA #REQUIRED >
|
||||||
|
* <!ATTLIST xmlRpcDaemon background (true|false) "true" >
|
||||||
|
* </code></pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
*/
|
||||||
|
class XmlRpcDaemon
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The host the XML-RPC server the daemon is
|
||||||
|
* listening on.
|
||||||
|
*/
|
||||||
|
std::string xmlRpcHost;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The port the XML-RPC server the daemon is
|
||||||
|
* listening on.
|
||||||
|
*/
|
||||||
|
unsigned int xmlRpcPort;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the file where the daemon saves it's process id when
|
||||||
|
* running.
|
||||||
|
*/
|
||||||
|
std::string pidFileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag indicating if the singleton instnace has been
|
||||||
|
* configured already.
|
||||||
|
*/
|
||||||
|
bool configured;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag indicating wether to fork into background as a daemon
|
||||||
|
* or don't (good for debugging, for example).
|
||||||
|
* Defaults to true.
|
||||||
|
*/
|
||||||
|
bool background;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The XML-RPC server running within the Scheduler Daemon.
|
||||||
|
*/
|
||||||
|
XmlRpc::XmlRpcServer xmlRpcServer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do all the necessary tasks of becoming a daemon.
|
||||||
|
*
|
||||||
|
* @exception std::runtime_error on forking errors
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
daemonize(void) throw (std::runtime_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current process id to the process id file
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
savePid(void) throw();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the saved process id.
|
||||||
|
*
|
||||||
|
* @return the saved process id of the daemon, or 0 if none saved.
|
||||||
|
*/
|
||||||
|
pid_t
|
||||||
|
loadPid(void) throw();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
|
XmlRpcDaemon (void) throw ()
|
||||||
|
{
|
||||||
|
background = true;
|
||||||
|
configured = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual destructor.
|
||||||
|
*/
|
||||||
|
virtual
|
||||||
|
~XmlRpcDaemon(void) throw ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the daemon has already been configured,
|
||||||
|
* and raise an exception if not so.
|
||||||
|
*
|
||||||
|
* @exception std::logic_error if the daemon has not yet been
|
||||||
|
* configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
checkForConfiguration(void) const throw (std::logic_error)
|
||||||
|
{
|
||||||
|
if (!configured) {
|
||||||
|
throw std::logic_error("not yet configured");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the XML-RPC daemon itself. Pass an <xmlRpcDaemon>
|
||||||
|
* element to this function.
|
||||||
|
*
|
||||||
|
* @param element the XML element to configure the XML-RPC
|
||||||
|
* daemon from.
|
||||||
|
* @exception std::invalid_argument if the supplied XML element
|
||||||
|
* contains bad configuraiton information
|
||||||
|
* @exception std::logic_error if the daemon has already
|
||||||
|
* been configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
configureXmlRpcDaemon(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register your XML-RPC functions by implementing this function.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
registerXmlRpcFunctions(XmlRpc::XmlRpcServer & xmlRpcServer)
|
||||||
|
throw (std::logic_error)
|
||||||
|
= 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if the daemon has already been configured.
|
||||||
|
* If so, an attempt to configure it again will result in an
|
||||||
|
* exception.
|
||||||
|
*
|
||||||
|
* @return true if the daemon has already been
|
||||||
|
* configured, false otherwise.
|
||||||
|
*/
|
||||||
|
const bool
|
||||||
|
isConfigured(void) const throw ()
|
||||||
|
{
|
||||||
|
return configured;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the XML-RPC server should fork into background.
|
||||||
|
*
|
||||||
|
* @param background if true, the XML-RPC server will fork into
|
||||||
|
* background, otherwise not (good for debugging).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
setBackground(const bool background) throw ()
|
||||||
|
{
|
||||||
|
this->background = background;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if the XML-RPC server will fork into background.
|
||||||
|
*
|
||||||
|
* @return if true, the XML-RPC server will fork into
|
||||||
|
* background, otherwise not (good for debugging).
|
||||||
|
*/
|
||||||
|
const bool
|
||||||
|
getBackground(void) const throw ()
|
||||||
|
{
|
||||||
|
return background;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the daemon based on the XML element
|
||||||
|
* supplied.
|
||||||
|
* Implemtors should call the funtion configureXmlRpcDaemon
|
||||||
|
* from here with a proper <xmlRpcDaemon> element.
|
||||||
|
*
|
||||||
|
* @param element the XML element to configure the
|
||||||
|
* daemon from.
|
||||||
|
* @exception std::invalid_argument if the supplied XML element
|
||||||
|
* contains bad configuraiton information
|
||||||
|
* @exception std::logic_error if the daemon has already
|
||||||
|
* been configured.
|
||||||
|
* @see #configureXmlRpcDaemon
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
configure(const xmlpp::Element & element)
|
||||||
|
throw (std::invalid_argument,
|
||||||
|
std::logic_error)
|
||||||
|
= 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell the host name of the XML-RPC server the
|
||||||
|
* daemon is listening on.
|
||||||
|
*
|
||||||
|
* @return the host name of the XML-RPC server the
|
||||||
|
* daemon is listening on.
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
const std::string
|
||||||
|
getXmlRpcHost(void) const throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
return xmlRpcHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell the port of the XML-RPC server the
|
||||||
|
* daemon is listening on.
|
||||||
|
*
|
||||||
|
* @return the port of the XML-RPC server the
|
||||||
|
* daemon is listening on.
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
const unsigned int
|
||||||
|
getXmlRpcPort(void) const throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
return xmlRpcPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell the file name where the daemon stores its process id.
|
||||||
|
*
|
||||||
|
* @return the name of the file where the process id is stored.
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
const std::string
|
||||||
|
getPidFileName(void) const throw (std::logic_error)
|
||||||
|
{
|
||||||
|
checkForConfiguration();
|
||||||
|
return pidFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the daemon.
|
||||||
|
*
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
start (void) throw (std::logic_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if the deamon is running.
|
||||||
|
*
|
||||||
|
* @return true of the deamon is running, false otherwise.
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
isRunning (void) throw (std::logic_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the daemon.
|
||||||
|
*
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
stop (void) throw (std::logic_error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shut down the daemon.
|
||||||
|
* This function is public only because the signal handler
|
||||||
|
* needs visibility to this function, which will call it.
|
||||||
|
*
|
||||||
|
* @exception std::logic_error if the daemon has not
|
||||||
|
* yet been configured.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shutdown (void) throw (std::logic_error);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // XmlRpcDaemon_h
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/XmlRpcDaemonShutdownSignalHandler.h,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
#ifndef XmlRpcDaemonShutdownSignalHandler_h
|
||||||
|
#define XmlRpcDaemonShutdownSignalHandler_h
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#error This is a C++ include file
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "SignalHandler.h"
|
||||||
|
#include "XmlRpcDaemon.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LiveSupport {
|
||||||
|
namespace Scheduler {
|
||||||
|
|
||||||
|
/* ================================================================ constants */
|
||||||
|
|
||||||
|
|
||||||
|
/* =================================================================== macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================== data types */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal handler to shut down an XmlRpcDaemon.
|
||||||
|
*
|
||||||
|
* @author $Author: maroy $
|
||||||
|
* @version $Revision: 1.1 $
|
||||||
|
* @see XmlRpcDaemon
|
||||||
|
*/
|
||||||
|
class XmlRpcDaemonShutdownSignalHandler : public SignalHandler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* The XmlRpcDaemon to shut down.
|
||||||
|
*/
|
||||||
|
XmlRpcDaemon * xmlRpcDaemon;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param xmlRpcDaemon the XmlRpcDaemon to shut down when the
|
||||||
|
* handler is invoked.
|
||||||
|
*/
|
||||||
|
XmlRpcDaemonShutdownSignalHandler(
|
||||||
|
XmlRpcDaemon * xmlRpcDaemon)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
this->xmlRpcDaemon = xmlRpcDaemon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the signal. Shuts down the XmlRpcDaemon used to
|
||||||
|
* construct this handler.
|
||||||
|
*
|
||||||
|
* @param signal the actual signal received.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
handleSignal(int signal) throw ()
|
||||||
|
{
|
||||||
|
xmlRpcDaemon->shutdown();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================= external data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================== function prototypes */
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Scheduler
|
||||||
|
} // namespace LiveSupport
|
||||||
|
|
||||||
|
#endif // XmlRpcDaemonShutdownSignalHandler_h
|
||||||
|
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2004 Media Development Loan Fund
|
||||||
|
|
||||||
|
This file is part of the LiveSupport project.
|
||||||
|
http://livesupport.campware.org/
|
||||||
|
To report bugs, send an e-mail to bugs@campware.org
|
||||||
|
|
||||||
|
LiveSupport 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.
|
||||||
|
|
||||||
|
LiveSupport is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LiveSupport; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Author : $Author: maroy $
|
||||||
|
Version : $Revision: 1.1 $
|
||||||
|
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/main.cxx,v $
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains the main entry point to the Scheduler daemon.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ============================================================ include files */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "configure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#else
|
||||||
|
#error "Need unistd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_GETOPT_H
|
||||||
|
#include <getopt.h>
|
||||||
|
#else
|
||||||
|
#error "Need getopt.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "SchedulerDaemon.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace LiveSupport::Scheduler;
|
||||||
|
|
||||||
|
/* =================================================== local data structures */
|
||||||
|
|
||||||
|
|
||||||
|
/* ================================================ local constants & macros */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our copyright notice, should be at most 80 columns
|
||||||
|
*/
|
||||||
|
static const char copyrightNotice[] =
|
||||||
|
"Copyright (c) 2004 Media Development Loan Fund under the GNU GPL";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String describing the short options.
|
||||||
|
*/
|
||||||
|
static const char options[] = "c:dhv";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure describing the long options
|
||||||
|
*/
|
||||||
|
static const struct option longOptions[] = {
|
||||||
|
{ "config", required_argument, 0, 'c' },
|
||||||
|
{ "debug", no_argument, 0, 'd' },
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
{ "version", no_argument, 0, 'v' },
|
||||||
|
{ 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The start command: "start"
|
||||||
|
*/
|
||||||
|
static const std::string startCommand = "start";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status command: "status"
|
||||||
|
*/
|
||||||
|
static const std::string statusCommand = "status";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The stop command: "stop"
|
||||||
|
*/
|
||||||
|
static const std::string stopCommand = "stop";
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================== local function prototypes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print program version.
|
||||||
|
*
|
||||||
|
* @param os the std::ostream to print to.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printVersion ( std::ostream & os );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print program usage information.
|
||||||
|
*
|
||||||
|
* @param invocation the command line command used to invoke this program.
|
||||||
|
* @param os the std::ostream to print to.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printUsage ( const char invocation[],
|
||||||
|
std::ostream & os );
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================= module code */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Program entry point.
|
||||||
|
*
|
||||||
|
* @param argc the number of command line arguments passed by the user.
|
||||||
|
* @param argv the command line arguments passed by the user.
|
||||||
|
* @return 0 on success, non-0 on failure.
|
||||||
|
*/
|
||||||
|
int main ( int argc,
|
||||||
|
char * argv[] )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
std::string configFileName;
|
||||||
|
bool debugMode = false;
|
||||||
|
|
||||||
|
while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) {
|
||||||
|
switch (i) {
|
||||||
|
case 'c':
|
||||||
|
configFileName = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
debugMode = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'h':
|
||||||
|
printUsage(argv[0], std::cout);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case 'v':
|
||||||
|
printVersion(std::cout);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printUsage(argv[0], std::cout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 1) {
|
||||||
|
printUsage(argv[0], std::cout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "using config file '" << configFileName << '\'' << std::endl;
|
||||||
|
|
||||||
|
SchedulerDaemon * daemon = SchedulerDaemon::getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::auto_ptr<xmlpp::DomParser>
|
||||||
|
parser(new xmlpp::DomParser(configFileName, true));
|
||||||
|
const xmlpp::Document * document = parser->get_document();
|
||||||
|
daemon->configure(*(document->get_root_node()));
|
||||||
|
} catch (std::invalid_argument &e) {
|
||||||
|
std::cerr << "semantic error in configuration file" << std::endl
|
||||||
|
<< e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
} catch (xmlpp::exception &e) {
|
||||||
|
std::cerr << "error parsing configuration file" << std::endl
|
||||||
|
<< e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
daemon->setBackground(!debugMode);
|
||||||
|
|
||||||
|
if (startCommand == argv[optind]) {
|
||||||
|
daemon->start();
|
||||||
|
} else if (statusCommand == argv[optind]) {
|
||||||
|
std::cout << "The Scheduler Daemon is "
|
||||||
|
<< (daemon->isRunning() ? "" : "not ")
|
||||||
|
<< "running" << std::endl;
|
||||||
|
} else if (stopCommand == argv[optind]) {
|
||||||
|
daemon->stop();
|
||||||
|
} else {
|
||||||
|
printUsage(argv[0], std::cout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Print program version.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
printVersion ( std::ostream & os )
|
||||||
|
{
|
||||||
|
os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl
|
||||||
|
<< copyrightNotice << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Print program usage.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
printUsage ( const char invocation[],
|
||||||
|
std::ostream & os )
|
||||||
|
{
|
||||||
|
os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl
|
||||||
|
<< std::endl
|
||||||
|
<< "Usage: " << invocation << " [OPTION] COMMAND"
|
||||||
|
<< std::endl
|
||||||
|
<< " COMMAND is one of: start, stop or status" << std::endl
|
||||||
|
<< std::endl
|
||||||
|
<< " mandatory options:" << std::endl
|
||||||
|
<< " -c, --config=file.name scheduler configuration file" << std::endl
|
||||||
|
<< " optional options:" << std::endl
|
||||||
|
<< " -d, --debug don't fork into background" << std::endl
|
||||||
|
<< " -h, --help display this help and exit" << std::endl
|
||||||
|
<< " -v, --version display version information and exit"
|
||||||
|
<< std::endl
|
||||||
|
<< std::endl
|
||||||
|
<< "Report bugs to " << PACKAGE_BUGREPORT << std::endl;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
keep me
|
Loading…
Reference in New Issue